/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ package complex.path_substitution; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.uno.UnoRuntime; import com.sun.star.util.XStringSubstitution; import java.util.Vector; // ---------- junit imports ----------------- import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.openoffice.test.OfficeConnection; import static org.junit.Assert.*; // ------------------------------------------ /** * */ public class PathSubstitutionTest { private static XMultiServiceFactory xMSF; // all substitution variables private VariableContainer substVars = null; /** * A function to tell the framework, which test functions are available. * Right now, it's only 'checkXStringSubstitution'. * @return All test methods. */ // public String[] getTestMethodNames() { // return new String[]{"checkXStringSubstitution"}; // } /** * Create an array with all substitution variables */ @Before public void initialize() { substVars = new VariableContainer(); substVars.add("$(prog)", true, true); substVars.add("$(inst)", true, true); substVars.add("$(user)", true, true); substVars.add("$(work)", true, true); substVars.add("$(home)", true, true); substVars.add("$(temp)", true, true); substVars.add("$(lang)", false, false); substVars.add("$(langid)", false, false); substVars.add("$(vlang)", false, false); // path won't resubstitute substVars.add("$(path)", true, false); } /** * One actual test: as the method 'getTestMethodNames()' tells. */ @Test public void checkXStringSubstitution() { xMSF = getMSF(); System.out.println("---- Testing the XStringSubstitution interface ----"); System.out.println("Create intance of test object.\n"); XStringSubstitution oObj = null; try { Object x = xMSF.createInstance( "com.sun.star.util.PathSubstitution"); oObj = UnoRuntime.queryInterface(XStringSubstitution.class, x); if (oObj == null) { throw new com.sun.star.uno.Exception(); } } catch (com.sun.star.uno.Exception e) { System.out.println(e.getClass().getName()); System.out.println("Message: " + e.getMessage()); fail("Could not create an instance of the test object."); return; } for (int i = 0; i < substVars.size(); i++) { String var = substVars.getVariable(i); System.out.println("Testing var '" + var + "'"); try { String substVal = oObj.getSubstituteVariableValue(var); System.out.println("\tvalue '" + substVal + "'"); substVars.putValue(i, substVal); // simple check: let path in a string replace String substString = var + "/additional/path"; System.out.println("Substitute '" + substString + "'"); String newValue = oObj.substituteVariables(substString, true); System.out.println("Return value '" + newValue + "'"); // 2do: better check for correct substitution assertTrue("Did not substitute '" + substString + "' to '" + newValue + "' correctly:", newValue.startsWith(substVal)); // simple check part two: //make substitution backwards if possible if (substVars.canReSubstitute(i)) { substString = substVal + "/additional/path"; System.out.println("Substitute backwards '" + substString + "'"); newValue = oObj.reSubstituteVariables(substString); System.out.println("Return value '" + newValue + "'"); // 2do: better check for correct substitution assertTrue("Did not reSubstitute '" + substString + "' to '" + newValue + "' correctly:", checkResubstitute(newValue, var)); } // simple check part three: look if replace //in middle of text works substString = "file:///starting/" + var + "/path"; String sCanSubstAllPos; if (substVars.onlySubstituteAtBegin(i)) sCanSubstAllPos = "NO"; else sCanSubstAllPos = "YES"; System.out.println("Variable can substitute within string: "+sCanSubstAllPos); System.out.println("Substitute '" + substString + "'"); newValue = oObj.substituteVariables(substString, false); System.out.println("Return value '" + newValue + "'"); boolean erg = true; if (substVars.onlySubstituteAtBegin(i)) { // in this case it should not have worked erg = newValue.indexOf(substVal) == -1; } else { erg = newValue.indexOf(substVal) != -1; } assertTrue("Did not substitute '" + substString + "' to '" + newValue + "' correctly:", erg); } catch (com.sun.star.uno.Exception e) { System.out.println(e.getClass().getName()); System.out.println("Message: " + e.getMessage()); fail("Could not create an instance of the test object."); return; } System.out.println("Finish testing '" + var + "'\n"); } // check of greedy resubstitution String prog = "$(prog)"; String inst = "$(inst)"; String instPth = substVars.getValue(inst); String progPth = substVars.getValue(prog); if (progPth.startsWith(instPth) && instPth.startsWith(progPth)) { System.out.println("Greedy ReSubstitute"); String substString = progPth + "/additional/path"; String newVal = oObj.reSubstituteVariables(substString); System.out.println("String '" + substString + "' should be resubstituted with"); System.out.println("Variable '" + prog + "' instead of Variable '" + inst + "'"); assertTrue("Did not reSubstitute '" + substString + "' to '" + newVal + "' correctly:", newVal.startsWith(prog)); } System.out.println( "---- Finish testing the XStringSubstitution interface ----"); } /** * test the resubstitution * @return true, if resubstitution is correct. */ private boolean checkResubstitute(String subst, String original) { // simple: subst starts with original if (subst.startsWith(original)) { return true; } else { // hard: been resubstituted with a differernt variable. for (int i = 0; i < substVars.size(); i++) { String var = substVars.getVariable(i); if (subst.startsWith(var) && original.startsWith(original)) { return true; } } } return false; } /** * Class for containing the substitution variables with their * values and some information. */ private class VariableContainer { public Vector varName; public Vector varValue; public Vector substAtBegin; public Vector resubst; public VariableContainer() { varName = new Vector(); varValue = new Vector(); substAtBegin = new Vector(); resubst = new Vector(); } public void add(String var) { varName.add(var); substAtBegin.add(Boolean.TRUE); resubst.add(Boolean.TRUE); } public void add(String var, boolean onlySubstAtBegin, boolean canResubst) { varName.add(var); this.substAtBegin.add(new Boolean(onlySubstAtBegin)); this.resubst.add(new Boolean(canResubst)); } public void putValue(int i, String val) { varValue.add(i, val); } public int size() { return varName.size(); } public String getVariable(int i) { return (String) varName.get(i); } public String getValue(int i) { return (String) varName.get(i); } public String getValue(String var) { return (String) varValue.get(varName.indexOf(var)); } public boolean onlySubstituteAtBegin(int i) { return ((Boolean) substAtBegin.get(i)).booleanValue(); } public boolean canReSubstitute(int i) { return ((Boolean) resubst.get(i)).booleanValue(); } } private XMultiServiceFactory getMSF() { final XMultiServiceFactory xMSF1 = UnoRuntime.queryInterface(XMultiServiceFactory.class, connection.getComponentContext().getServiceManager()); return xMSF1; } // setup and close connections @BeforeClass public static void setUpConnection() throws Exception { System.out.println("setUpConnection()"); connection.setUp(); } @AfterClass public static void tearDownConnection() throws InterruptedException, com.sun.star.uno.Exception { System.out.println("tearDownConnection()"); connection.tearDown(); } private static final OfficeConnection connection = new OfficeConnection(); }