1   // 
2   //Copyright (c) 2003, Caltha - Gajda, Krzewski, Mach, Potempski Sp.J. 
3   //All rights reserved. 
4   //   
5   //Redistribution and use in source and binary forms, with or without modification,  
6   //are permitted provided that the following conditions are met: 
7   //   
8   //* Redistributions of source code must retain the above copyright notice,  
9   //this list of conditions and the following disclaimer. 
10  //* Redistributions in binary form must reproduce the above copyright notice,  
11  //this list of conditions and the following disclaimer in the documentation  
12  //and/or other materials provided with the distribution. 
13  //* Neither the name of the Caltha - Gajda, Krzewski, Mach, Potempski Sp.J.  
14  //nor the names of its contributors may be used to endorse or promote products  
15  //derived from this software without specific prior written permission. 
16  // 
17  //THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"  
18  //AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED  
19  //WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
20  //IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,  
21  //INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,  
22  //BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
23  //OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,  
24  //WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)  
25  //ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE  
26  //POSSIBILITY OF SUCH DAMAGE. 
27  //
28  
29  package org.objectledge.parameters.directory;
30  
31  import java.util.HashSet;
32  
33  import javax.naming.directory.Attributes;
34  import javax.naming.directory.BasicAttributes;
35  import javax.naming.directory.DirContext;
36  import javax.sql.DataSource;
37  import javax.xml.parsers.DocumentBuilder;
38  import javax.xml.parsers.DocumentBuilderFactory;
39  
40  import org.apache.log4j.LogManager;
41  import org.hsqldb.jdbc.jdbcDataSource;
42  import org.jcontainer.dna.Configuration;
43  import org.jcontainer.dna.Logger;
44  import org.jcontainer.dna.impl.Log4JLogger;
45  import org.objectledge.context.Context;
46  import org.objectledge.database.Database;
47  import org.objectledge.database.DatabaseUtils;
48  import org.objectledge.database.DefaultDatabase;
49  import org.objectledge.database.IdGenerator;
50  import org.objectledge.database.JotmTransaction;
51  import org.objectledge.database.persistence.DefaultPersistence;
52  import org.objectledge.database.persistence.Persistence;
53  import org.objectledge.filesystem.FileSystem;
54  import org.objectledge.logging.LedgeDOMConfigurator;
55  import org.objectledge.naming.ContextFactory;
56  import org.objectledge.parameters.AmbiguousParameterException;
57  import org.objectledge.parameters.DefaultParameters;
58  import org.objectledge.parameters.Parameters;
59  import org.objectledge.parameters.UndefinedParameterException;
60  import org.objectledge.utils.LedgeTestCase;
61  import org.picocontainer.defaults.DefaultPicoContainer;
62  import org.w3c.dom.Document;
63  import org.xml.sax.InputSource;
64  
65  /**
66   * @author <a href="mailto:pablo@caltha.pl">Pawel Potempski</a>
67   *
68   * To change the template for this generated type comment go to
69   * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
70   */
71  public class DirectoryParametersTest extends LedgeTestCase
72  {
73      private ContextFactory contextFactory;
74      
75      private FileSystem fs;
76  
77      public void setUp()
78      	throws Exception
79  	{
80          fs = FileSystem.getStandardFileSystem("src/test/resources");
81          InputSource source = new InputSource(fs.getInputStream(
82              "config/org.objectledge.logging.LoggingConfigurator.xml"));
83          DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
84          Document logConfig = builder.parse(source);
85          LedgeDOMConfigurator configurator = new LedgeDOMConfigurator(fs);
86          configurator.doConfigure(logConfig.getDocumentElement(), LogManager.getLoggerRepository());
87  
88          Logger logger = new Log4JLogger(org.apache.log4j.Logger.
89              getLogger(ContextFactory.class));
90          DataSource ds = getDataSource();
91          DefaultPicoContainer container = new DefaultPicoContainer();
92          IdGenerator idGenerator = new IdGenerator(ds);
93          JotmTransaction transaction = new JotmTransaction(0, 120, new Context(), logger, null);
94          Database database = new DefaultDatabase(ds, idGenerator, transaction);
95          Persistence persistence = new DefaultPersistence(database, logger);
96          container.registerComponentInstance(Persistence.class, persistence);            
97          Configuration config = getConfig("naming/dbNaming.xml");
98              contextFactory = new ContextFactory(container, config, logger);    
99  	}
100     
101     /*
102      * Test for String get(String)
103      */
104     public void testGetString()
105         throws Exception
106     {
107         DirContext ctx = contextFactory.getDirContext("people");
108         assertNotNull(ctx);
109         Attributes attrs = new BasicAttributes(true);
110         ctx.createSubcontext("bar", attrs);
111         DirContext dctx = (DirContext)ctx.lookup("bar");
112         assertNotNull(dctx);
113         Parameters parameters = new DirectoryParameters(dctx);
114         assertEquals(parameters.getParameterNames().length,0);
115         assertEquals(parameters.get("foo","foo"),"foo");
116         try
117         {
118             parameters.get("foo");
119             fail("should throw the exception");
120         }
121         catch(UndefinedParameterException e)
122         {
123             //ok!
124         }
125         parameters.add("foo","bar");
126         assertEquals(parameters.get("foo","foo"),"bar");
127         parameters.add("foo","bar2");
128         try
129         {
130             parameters.get("foo");
131             fail("should throw the exception");
132         }
133         catch(AmbiguousParameterException e)
134         {
135             //ok!
136         }
137         assertEquals(parameters.getStrings("foo").length,2);
138         assertEquals(parameters.getStrings("bar").length,0);
139         assertEquals(parameters.getParameterNames().length,1);
140         assertEquals(parameters.isDefined("foo"),true);                
141         assertEquals(parameters.isDefined("bar"),false);
142         parameters.add("bar","foo");
143         assertEquals(parameters.get("bar","bar"),"foo");
144         parameters.remove("bar");
145         assertEquals(parameters.get("bar","bar"),"bar");
146         parameters.add("bar","foo");
147         assertEquals(parameters.get("bar","bar"),"foo");
148         parameters.remove("bar", "foo");
149         assertEquals(parameters.get("bar","bar"),"bar");
150         parameters.remove();
151         assertEquals(parameters.getParameterNames().length,0);
152         parameters.add("bar","foo");
153         parameters.add("foo","bar");
154         assertEquals(parameters.getParameterNames().length,2);
155         HashSet set = new HashSet();
156         set.add("foo");
157         parameters.remove(set);
158         assertEquals(parameters.get("bar","bar"),"foo");
159         assertEquals(parameters.get("foo","foo"),"foo");
160         parameters.add("bar","foo2");
161         parameters.add("foo","bar");
162         parameters.removeExcept(set);
163         assertEquals(parameters.get("bar","bar"),"bar");
164         assertEquals(parameters.get("foo","foo"),"bar");
165         parameters.remove();
166         parameters.add("foo", new String[] { "bar" });
167         parameters.add("foo", new String[] { "foo", "buz" });
168         parameters.add("bar", new String[] { "foo" });
169         assertEquals(parameters.getParameterNames().length, 2);
170         assertEquals(parameters.getStrings("foo").length, 3);
171         
172         parameters.remove();
173         Parameters temp = new DefaultParameters();
174         temp.add("foo",2);
175         temp.add("bar",2);
176         parameters.add("foo",1);
177         parameters.add("bar",1);
178         parameters.add(temp,false);
179         assertEquals(parameters.getInts("foo").length,2);
180         assertEquals(parameters.getInts("bar").length,2);
181         parameters.remove();
182         parameters.add("foo",1);
183         parameters.add("bar",1);
184         parameters.add(temp,true);
185         assertEquals(parameters.getInts("foo").length,1);
186         assertEquals(parameters.getInts("bar").length,1);
187         assertEquals(parameters.getInt("foo"),2);
188         assertEquals(parameters.getInt("bar"),2);
189         
190         
191         parameters.remove();
192         parameters.add("foo","bar");
193         parameters.set("foo","foo");
194         assertEquals(parameters.get("foo","bar"),"foo");
195         parameters.set("foo", new String[] { "foo", "buz" });
196         assertEquals(parameters.getStrings("foo").length,2);
197         parameters.set("foo", new boolean[] {true});
198         assertEquals(parameters.getBoolean("foo"),true);
199         parameters.set("foo", new float[] {1.0F, 2.0F});
200         assertEquals(parameters.getStrings("foo").length,2);
201         parameters.set("foo", new int[] {1,2});
202         assertEquals(parameters.getStrings("foo").length,2);
203         parameters.set("foo", new long[] {1,2});
204         assertEquals(parameters.getStrings("foo").length,2);
205         parameters.toString();
206         Parameters params = parameters.getChild("bar");
207         assertEquals(params.getParameterNames().length,0);
208     }
209 
210 
211     /////////////// private 
212     private DataSource getDataSource()
213         throws Exception
214     {
215         jdbcDataSource ds = new jdbcDataSource();
216         ds.setDatabase("jdbc:hsqldb:.");
217         ds.setUser("sa");
218         ds.setPassword("");
219         if(!DatabaseUtils.hasTable(ds, "ledge_id_table"))
220         {
221             DatabaseUtils.runScript(ds, fs.getReader("sql/database/IdGeneratorTables.sql", "UTF-8"));
222         }
223         if(!DatabaseUtils.hasTable(ds, "ledge_naming_context"))
224         {
225             DatabaseUtils.runScript(ds, fs.getReader("sql/naming/db/DBNamingTables.sql", "UTF-8"));
226         }
227         DatabaseUtils.runScript(ds, fs.getReader("sql/naming/db/DBNamingTest.sql", "UTF-8"));
228         return ds;
229     }        
230 
231     private Configuration getConfig(String name)
232         throws Exception
233     {
234         return getConfig(fs, name);
235     }
236 
237 }