1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski package complex.path_substitution;
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski import com.sun.star.lang.XMultiServiceFactory;
26*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime;
27*b1cdbd2cSJim Jagielski import com.sun.star.util.XStringSubstitution;
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski import java.util.Vector;
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski // ---------- junit imports -----------------
32*b1cdbd2cSJim Jagielski import org.junit.After;
33*b1cdbd2cSJim Jagielski import org.junit.AfterClass;
34*b1cdbd2cSJim Jagielski import org.junit.Before;
35*b1cdbd2cSJim Jagielski import org.junit.BeforeClass;
36*b1cdbd2cSJim Jagielski import org.junit.Test;
37*b1cdbd2cSJim Jagielski import org.openoffice.test.OfficeConnection;
38*b1cdbd2cSJim Jagielski import static org.junit.Assert.*;
39*b1cdbd2cSJim Jagielski // ------------------------------------------
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski /**
42*b1cdbd2cSJim Jagielski  *
43*b1cdbd2cSJim Jagielski  */
44*b1cdbd2cSJim Jagielski public class PathSubstitutionTest
45*b1cdbd2cSJim Jagielski {
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski     private static XMultiServiceFactory xMSF;
48*b1cdbd2cSJim Jagielski     // all substitution variables
49*b1cdbd2cSJim Jagielski     private VariableContainer substVars = null;
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski     /**
52*b1cdbd2cSJim Jagielski      * A function to tell the framework, which test functions are available.
53*b1cdbd2cSJim Jagielski      * Right now, it's only 'checkXStringSubstitution'.
54*b1cdbd2cSJim Jagielski      * @return All test methods.
55*b1cdbd2cSJim Jagielski      */
56*b1cdbd2cSJim Jagielski //    public String[] getTestMethodNames() {
57*b1cdbd2cSJim Jagielski //        return new String[]{"checkXStringSubstitution"};
58*b1cdbd2cSJim Jagielski //    }
59*b1cdbd2cSJim Jagielski     /**
60*b1cdbd2cSJim Jagielski      * Create an array with all substitution variables
61*b1cdbd2cSJim Jagielski      */
initialize()62*b1cdbd2cSJim Jagielski     @Before public void initialize()
63*b1cdbd2cSJim Jagielski     {
64*b1cdbd2cSJim Jagielski         substVars = new VariableContainer();
65*b1cdbd2cSJim Jagielski         substVars.add("$(prog)", true, true);
66*b1cdbd2cSJim Jagielski         substVars.add("$(inst)", true, true);
67*b1cdbd2cSJim Jagielski         substVars.add("$(user)", true, true);
68*b1cdbd2cSJim Jagielski         substVars.add("$(work)", true, true);
69*b1cdbd2cSJim Jagielski         substVars.add("$(home)", true, true);
70*b1cdbd2cSJim Jagielski         substVars.add("$(temp)", true, true);
71*b1cdbd2cSJim Jagielski         substVars.add("$(lang)", false, false);
72*b1cdbd2cSJim Jagielski         substVars.add("$(langid)", false, false);
73*b1cdbd2cSJim Jagielski         substVars.add("$(vlang)", false, false);
74*b1cdbd2cSJim Jagielski         // path won't resubstitute
75*b1cdbd2cSJim Jagielski         substVars.add("$(path)", true, false);
76*b1cdbd2cSJim Jagielski     }
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski     /**
79*b1cdbd2cSJim Jagielski      * One actual test: as the method 'getTestMethodNames()' tells.
80*b1cdbd2cSJim Jagielski      */
checkXStringSubstitution()81*b1cdbd2cSJim Jagielski     @Test public void checkXStringSubstitution()
82*b1cdbd2cSJim Jagielski     {
83*b1cdbd2cSJim Jagielski         xMSF = getMSF();
84*b1cdbd2cSJim Jagielski         System.out.println("---- Testing the XStringSubstitution interface ----");
85*b1cdbd2cSJim Jagielski         System.out.println("Create intance of test object.\n");
86*b1cdbd2cSJim Jagielski         XStringSubstitution oObj = null;
87*b1cdbd2cSJim Jagielski         try
88*b1cdbd2cSJim Jagielski         {
89*b1cdbd2cSJim Jagielski             Object x = xMSF.createInstance(
90*b1cdbd2cSJim Jagielski                     "com.sun.star.util.PathSubstitution");
91*b1cdbd2cSJim Jagielski             oObj = UnoRuntime.queryInterface(XStringSubstitution.class, x);
92*b1cdbd2cSJim Jagielski             if (oObj == null)
93*b1cdbd2cSJim Jagielski             {
94*b1cdbd2cSJim Jagielski                 throw new com.sun.star.uno.Exception();
95*b1cdbd2cSJim Jagielski             }
96*b1cdbd2cSJim Jagielski         }
97*b1cdbd2cSJim Jagielski         catch (com.sun.star.uno.Exception e)
98*b1cdbd2cSJim Jagielski         {
99*b1cdbd2cSJim Jagielski             System.out.println(e.getClass().getName());
100*b1cdbd2cSJim Jagielski             System.out.println("Message: " + e.getMessage());
101*b1cdbd2cSJim Jagielski             fail("Could not create an instance of the test object.");
102*b1cdbd2cSJim Jagielski             return;
103*b1cdbd2cSJim Jagielski         }
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski         for (int i = 0; i < substVars.size(); i++)
106*b1cdbd2cSJim Jagielski         {
107*b1cdbd2cSJim Jagielski             String var = substVars.getVariable(i);
108*b1cdbd2cSJim Jagielski             System.out.println("Testing var '" + var + "'");
109*b1cdbd2cSJim Jagielski             try
110*b1cdbd2cSJim Jagielski             {
111*b1cdbd2cSJim Jagielski                 String substVal = oObj.getSubstituteVariableValue(var);
112*b1cdbd2cSJim Jagielski                 System.out.println("\tvalue '" + substVal + "'");
113*b1cdbd2cSJim Jagielski                 substVars.putValue(i, substVal);
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski                 // simple check: let path in a string replace
116*b1cdbd2cSJim Jagielski                 String substString = var + "/additional/path";
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski                 System.out.println("Substitute '" + substString + "'");
119*b1cdbd2cSJim Jagielski                 String newValue = oObj.substituteVariables(substString, true);
120*b1cdbd2cSJim Jagielski                 System.out.println("Return value '" + newValue + "'");
121*b1cdbd2cSJim Jagielski                 // 2do: better check for correct substitution
122*b1cdbd2cSJim Jagielski                 assertTrue("Did not substitute '"
123*b1cdbd2cSJim Jagielski                         + substString + "' to '" + newValue
124*b1cdbd2cSJim Jagielski                         + "' correctly:", newValue.startsWith(substVal));
125*b1cdbd2cSJim Jagielski 
126*b1cdbd2cSJim Jagielski                 // simple check part two:
127*b1cdbd2cSJim Jagielski                 //make substitution backwards if possible
128*b1cdbd2cSJim Jagielski                 if (substVars.canReSubstitute(i))
129*b1cdbd2cSJim Jagielski                 {
130*b1cdbd2cSJim Jagielski                     substString = substVal + "/additional/path";
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski                     System.out.println("Substitute backwards '" + substString + "'");
133*b1cdbd2cSJim Jagielski                     newValue = oObj.reSubstituteVariables(substString);
134*b1cdbd2cSJim Jagielski                     System.out.println("Return value '" + newValue + "'");
135*b1cdbd2cSJim Jagielski                     // 2do: better check for correct substitution
136*b1cdbd2cSJim Jagielski                     assertTrue("Did not reSubstitute '"
137*b1cdbd2cSJim Jagielski                             + substString + "' to '" + newValue
138*b1cdbd2cSJim Jagielski                             + "' correctly:", checkResubstitute(newValue, var));
139*b1cdbd2cSJim Jagielski                 }
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski                 // simple check part three: look if replace
142*b1cdbd2cSJim Jagielski                 //in middle of text works
143*b1cdbd2cSJim Jagielski                 substString = "file:///starting/" + var + "/path";
144*b1cdbd2cSJim Jagielski 
145*b1cdbd2cSJim Jagielski                 String sCanSubstAllPos;
146*b1cdbd2cSJim Jagielski                 if (substVars.onlySubstituteAtBegin(i))
147*b1cdbd2cSJim Jagielski                     sCanSubstAllPos = "NO";
148*b1cdbd2cSJim Jagielski                 else
149*b1cdbd2cSJim Jagielski                     sCanSubstAllPos = "YES";
150*b1cdbd2cSJim Jagielski                 System.out.println("Variable can substitute within string: "+sCanSubstAllPos);
151*b1cdbd2cSJim Jagielski                 System.out.println("Substitute '" + substString + "'");
152*b1cdbd2cSJim Jagielski                 newValue = oObj.substituteVariables(substString, false);
153*b1cdbd2cSJim Jagielski                 System.out.println("Return value '" + newValue + "'");
154*b1cdbd2cSJim Jagielski                 boolean erg = true;
155*b1cdbd2cSJim Jagielski                 if (substVars.onlySubstituteAtBegin(i))
156*b1cdbd2cSJim Jagielski                 {
157*b1cdbd2cSJim Jagielski                     // in this case it should not have worked
158*b1cdbd2cSJim Jagielski                     erg = newValue.indexOf(substVal) == -1;
159*b1cdbd2cSJim Jagielski                 }
160*b1cdbd2cSJim Jagielski                 else
161*b1cdbd2cSJim Jagielski                 {
162*b1cdbd2cSJim Jagielski                     erg = newValue.indexOf(substVal) != -1;
163*b1cdbd2cSJim Jagielski                 }
164*b1cdbd2cSJim Jagielski                 assertTrue("Did not substitute '"
165*b1cdbd2cSJim Jagielski                         + substString + "' to '" + newValue
166*b1cdbd2cSJim Jagielski                         + "' correctly:", erg);
167*b1cdbd2cSJim Jagielski 
168*b1cdbd2cSJim Jagielski             }
169*b1cdbd2cSJim Jagielski             catch (com.sun.star.uno.Exception e)
170*b1cdbd2cSJim Jagielski             {
171*b1cdbd2cSJim Jagielski                 System.out.println(e.getClass().getName());
172*b1cdbd2cSJim Jagielski                 System.out.println("Message: " + e.getMessage());
173*b1cdbd2cSJim Jagielski                 fail("Could not create an instance of the test object.");
174*b1cdbd2cSJim Jagielski                 return;
175*b1cdbd2cSJim Jagielski             }
176*b1cdbd2cSJim Jagielski             System.out.println("Finish testing '" + var + "'\n");
177*b1cdbd2cSJim Jagielski         }
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski         // check of greedy resubstitution
180*b1cdbd2cSJim Jagielski         String prog = "$(prog)";
181*b1cdbd2cSJim Jagielski         String inst = "$(inst)";
182*b1cdbd2cSJim Jagielski         String instPth = substVars.getValue(inst);
183*b1cdbd2cSJim Jagielski         String progPth = substVars.getValue(prog);
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski         if (progPth.startsWith(instPth) && instPth.startsWith(progPth))
186*b1cdbd2cSJim Jagielski         {
187*b1cdbd2cSJim Jagielski             System.out.println("Greedy ReSubstitute");
188*b1cdbd2cSJim Jagielski             String substString = progPth + "/additional/path";
189*b1cdbd2cSJim Jagielski             String newVal = oObj.reSubstituteVariables(substString);
190*b1cdbd2cSJim Jagielski             System.out.println("String '" + substString
191*b1cdbd2cSJim Jagielski                     + "' should be resubstituted with");
192*b1cdbd2cSJim Jagielski             System.out.println("Variable '" + prog + "' instead of Variable '"
193*b1cdbd2cSJim Jagielski                     + inst + "'");
194*b1cdbd2cSJim Jagielski             assertTrue("Did not reSubstitute '" + substString
195*b1cdbd2cSJim Jagielski                     + "' to '" + newVal + "' correctly:",
196*b1cdbd2cSJim Jagielski                     newVal.startsWith(prog));
197*b1cdbd2cSJim Jagielski         }
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski         System.out.println(
200*b1cdbd2cSJim Jagielski                 "---- Finish testing the XStringSubstitution interface ----");
201*b1cdbd2cSJim Jagielski     }
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski     /**
204*b1cdbd2cSJim Jagielski      * test the resubstitution
205*b1cdbd2cSJim Jagielski      * @return true, if resubstitution is correct.
206*b1cdbd2cSJim Jagielski      */
checkResubstitute(String subst, String original)207*b1cdbd2cSJim Jagielski     private boolean checkResubstitute(String subst, String original)
208*b1cdbd2cSJim Jagielski     {
209*b1cdbd2cSJim Jagielski         // simple: subst starts with original
210*b1cdbd2cSJim Jagielski         if (subst.startsWith(original))
211*b1cdbd2cSJim Jagielski         {
212*b1cdbd2cSJim Jagielski             return true;
213*b1cdbd2cSJim Jagielski         }
214*b1cdbd2cSJim Jagielski         else
215*b1cdbd2cSJim Jagielski         {                             // hard: been resubstituted with a differernt variable.
216*b1cdbd2cSJim Jagielski             for (int i = 0; i < substVars.size(); i++)
217*b1cdbd2cSJim Jagielski             {
218*b1cdbd2cSJim Jagielski                 String var = substVars.getVariable(i);
219*b1cdbd2cSJim Jagielski                 if (subst.startsWith(var) && original.startsWith(original))
220*b1cdbd2cSJim Jagielski                 {
221*b1cdbd2cSJim Jagielski                     return true;
222*b1cdbd2cSJim Jagielski                 }
223*b1cdbd2cSJim Jagielski             }
224*b1cdbd2cSJim Jagielski         }
225*b1cdbd2cSJim Jagielski         return false;
226*b1cdbd2cSJim Jagielski     }
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski     /**
229*b1cdbd2cSJim Jagielski      * Class for containing the substitution variables with their
230*b1cdbd2cSJim Jagielski      * values and some information.
231*b1cdbd2cSJim Jagielski      */
232*b1cdbd2cSJim Jagielski     private class VariableContainer
233*b1cdbd2cSJim Jagielski     {
234*b1cdbd2cSJim Jagielski 
235*b1cdbd2cSJim Jagielski         public Vector varName;
236*b1cdbd2cSJim Jagielski         public Vector varValue;
237*b1cdbd2cSJim Jagielski         public Vector substAtBegin;
238*b1cdbd2cSJim Jagielski         public Vector resubst;
239*b1cdbd2cSJim Jagielski 
VariableContainer()240*b1cdbd2cSJim Jagielski         public VariableContainer()
241*b1cdbd2cSJim Jagielski         {
242*b1cdbd2cSJim Jagielski             varName = new Vector();
243*b1cdbd2cSJim Jagielski             varValue = new Vector();
244*b1cdbd2cSJim Jagielski             substAtBegin = new Vector();
245*b1cdbd2cSJim Jagielski             resubst = new Vector();
246*b1cdbd2cSJim Jagielski         }
247*b1cdbd2cSJim Jagielski 
add(String var)248*b1cdbd2cSJim Jagielski         public void add(String var)
249*b1cdbd2cSJim Jagielski         {
250*b1cdbd2cSJim Jagielski             varName.add(var);
251*b1cdbd2cSJim Jagielski             substAtBegin.add(Boolean.TRUE);
252*b1cdbd2cSJim Jagielski             resubst.add(Boolean.TRUE);
253*b1cdbd2cSJim Jagielski         }
254*b1cdbd2cSJim Jagielski 
add(String var, boolean onlySubstAtBegin, boolean canResubst)255*b1cdbd2cSJim Jagielski         public void add(String var, boolean onlySubstAtBegin,
256*b1cdbd2cSJim Jagielski                 boolean canResubst)
257*b1cdbd2cSJim Jagielski         {
258*b1cdbd2cSJim Jagielski             varName.add(var);
259*b1cdbd2cSJim Jagielski             this.substAtBegin.add(new Boolean(onlySubstAtBegin));
260*b1cdbd2cSJim Jagielski             this.resubst.add(new Boolean(canResubst));
261*b1cdbd2cSJim Jagielski         }
262*b1cdbd2cSJim Jagielski 
putValue(int i, String val)263*b1cdbd2cSJim Jagielski         public void putValue(int i, String val)
264*b1cdbd2cSJim Jagielski         {
265*b1cdbd2cSJim Jagielski             varValue.add(i, val);
266*b1cdbd2cSJim Jagielski         }
267*b1cdbd2cSJim Jagielski 
size()268*b1cdbd2cSJim Jagielski         public int size()
269*b1cdbd2cSJim Jagielski         {
270*b1cdbd2cSJim Jagielski             return varName.size();
271*b1cdbd2cSJim Jagielski         }
272*b1cdbd2cSJim Jagielski 
getVariable(int i)273*b1cdbd2cSJim Jagielski         public String getVariable(int i)
274*b1cdbd2cSJim Jagielski         {
275*b1cdbd2cSJim Jagielski             return (String) varName.get(i);
276*b1cdbd2cSJim Jagielski         }
277*b1cdbd2cSJim Jagielski 
getValue(int i)278*b1cdbd2cSJim Jagielski         public String getValue(int i)
279*b1cdbd2cSJim Jagielski         {
280*b1cdbd2cSJim Jagielski             return (String) varName.get(i);
281*b1cdbd2cSJim Jagielski         }
282*b1cdbd2cSJim Jagielski 
getValue(String var)283*b1cdbd2cSJim Jagielski         public String getValue(String var)
284*b1cdbd2cSJim Jagielski         {
285*b1cdbd2cSJim Jagielski             return (String) varValue.get(varName.indexOf(var));
286*b1cdbd2cSJim Jagielski         }
287*b1cdbd2cSJim Jagielski 
onlySubstituteAtBegin(int i)288*b1cdbd2cSJim Jagielski         public boolean onlySubstituteAtBegin(int i)
289*b1cdbd2cSJim Jagielski         {
290*b1cdbd2cSJim Jagielski             return ((Boolean) substAtBegin.get(i)).booleanValue();
291*b1cdbd2cSJim Jagielski         }
292*b1cdbd2cSJim Jagielski 
canReSubstitute(int i)293*b1cdbd2cSJim Jagielski         public boolean canReSubstitute(int i)
294*b1cdbd2cSJim Jagielski         {
295*b1cdbd2cSJim Jagielski             return ((Boolean) resubst.get(i)).booleanValue();
296*b1cdbd2cSJim Jagielski         }
297*b1cdbd2cSJim Jagielski     }
298*b1cdbd2cSJim Jagielski 
getMSF()299*b1cdbd2cSJim Jagielski     private XMultiServiceFactory getMSF()
300*b1cdbd2cSJim Jagielski     {
301*b1cdbd2cSJim Jagielski         final XMultiServiceFactory xMSF1 = UnoRuntime.queryInterface(XMultiServiceFactory.class, connection.getComponentContext().getServiceManager());
302*b1cdbd2cSJim Jagielski         return xMSF1;
303*b1cdbd2cSJim Jagielski     }
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski     // setup and close connections
306*b1cdbd2cSJim Jagielski     @BeforeClass
setUpConnection()307*b1cdbd2cSJim Jagielski     public static void setUpConnection() throws Exception
308*b1cdbd2cSJim Jagielski     {
309*b1cdbd2cSJim Jagielski         System.out.println("setUpConnection()");
310*b1cdbd2cSJim Jagielski         connection.setUp();
311*b1cdbd2cSJim Jagielski     }
312*b1cdbd2cSJim Jagielski 
313*b1cdbd2cSJim Jagielski     @AfterClass
tearDownConnection()314*b1cdbd2cSJim Jagielski     public static void tearDownConnection()
315*b1cdbd2cSJim Jagielski             throws InterruptedException, com.sun.star.uno.Exception
316*b1cdbd2cSJim Jagielski     {
317*b1cdbd2cSJim Jagielski         System.out.println("tearDownConnection()");
318*b1cdbd2cSJim Jagielski         connection.tearDown();
319*b1cdbd2cSJim Jagielski     }
320*b1cdbd2cSJim Jagielski     private static final OfficeConnection connection = new OfficeConnection();
321*b1cdbd2cSJim Jagielski }
322