Return-Path: Delivered-To: apmail-incubator-directory-cvs-archive@www.apache.org Received: (qmail 29864 invoked from network); 8 Dec 2004 05:56:15 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur-2.apache.org with SMTP; 8 Dec 2004 05:56:15 -0000 Received: (qmail 42338 invoked by uid 500); 8 Dec 2004 05:56:14 -0000 Delivered-To: apmail-incubator-directory-cvs-archive@incubator.apache.org Received: (qmail 42298 invoked by uid 500); 8 Dec 2004 05:56:14 -0000 Mailing-List: contact directory-cvs-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: directory-dev@incubator.apache.org Delivered-To: mailing list directory-cvs@incubator.apache.org Received: (qmail 42281 invoked by uid 99); 8 Dec 2004 05:56:14 -0000 X-ASF-Spam-Status: No, hits=-10.0 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME X-Spam-Check-By: apache.org Received: from minotaur.apache.org (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.28) with SMTP; Tue, 07 Dec 2004 21:56:12 -0800 Received: (qmail 29843 invoked by uid 65534); 8 Dec 2004 05:56:11 -0000 Date: 8 Dec 2004 05:56:11 -0000 Message-ID: <20041208055611.29836.qmail@minotaur.apache.org> From: akarasulu@apache.org To: directory-cvs@incubator.apache.org Subject: svn commit: r111219 - /incubator/directory/eve/trunk/dib/src/java/org/apache/eve/jndi/PartitionConfigBuilder.java /incubator/directory/eve/trunk/dib/src/test/org/apache/eve/jndi/PartitionContextBuilderTest.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-Virus-Checked: Checked X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N Author: akarasulu Date: Tue Dec 7 21:56:10 2004 New Revision: 111219 URL: http://svn.apache.org/viewcvs?view=rev&rev=111219 Log: Changes ... o added partition configuration builder test cases o ran test case which now pass o made changes to builder class after finding bugs with test case Added: incubator/directory/eve/trunk/dib/src/test/org/apache/eve/jndi/PartitionContextBuilderTest.java Modified: incubator/directory/eve/trunk/dib/src/java/org/apache/eve/jndi/PartitionConfigBuilder.java Modified: incubator/directory/eve/trunk/dib/src/java/org/apache/eve/jndi/PartitionConfigBuilder.java Url: http://svn.apache.org/viewcvs/incubator/directory/eve/trunk/dib/src/java/org/apache/eve/jndi/PartitionConfigBuilder.java?view=diff&rev=111219&p1=incubator/directory/eve/trunk/dib/src/java/org/apache/eve/jndi/PartitionConfigBuilder.java&r1=111218&p2=incubator/directory/eve/trunk/dib/src/java/org/apache/eve/jndi/PartitionConfigBuilder.java&r2=111219 ============================================================================== --- incubator/directory/eve/trunk/dib/src/java/org/apache/eve/jndi/PartitionConfigBuilder.java (original) +++ incubator/directory/eve/trunk/dib/src/java/org/apache/eve/jndi/PartitionConfigBuilder.java Tue Dec 7 21:56:10 2004 @@ -20,9 +20,14 @@ import java.util.Hashtable; import java.util.Enumeration; +import javax.naming.NamingException; + import org.apache.eve.ContextPartitionConfig; import org.apache.ldap.common.message.LockableAttributesImpl; import org.apache.ldap.common.message.LockableAttributeImpl; +import org.apache.ldap.common.util.ArrayUtils; +import org.apache.ldap.common.util.StringTools; +import org.apache.ldap.common.name.LdapName; /** @@ -34,6 +39,10 @@ */ public class PartitionConfigBuilder { + /** keep this so we do not have create empty ones over and over again */ + private final static ContextPartitionConfig[] EMPTY = new ContextPartitionConfig[0]; + + /** * Extracts properties from a Hashtable and builds a configuration bean for * a ContextPartition. @@ -41,21 +50,52 @@ * @param id the id of the partition to extract configs for * @param env the Hastable containing usually JNDI environment settings * @return the extracted configuration object + * @throws NamingException if a partition suffix is malformed */ public static ContextPartitionConfig getContextPartitionConfig( String id, Hashtable env ) + throws NamingException { - StringBuffer buf = new StringBuffer(); - ContextPartitionConfig config = new ContextPartitionConfig(); - LockableAttributesImpl attrs = new LockableAttributesImpl(); + final StringBuffer buf = new StringBuffer(); + final ContextPartitionConfig config = new ContextPartitionConfig(); + final LockableAttributesImpl attrs = new LockableAttributesImpl(); + + // -------------------------------------------------------------------- + // set id, empty attributes, and lookup the suffix for config + // -------------------------------------------------------------------- config.setId( id ); - + config.setAttributes( attrs ); buf.append( EnvKeys.SUFFIX ).append( id ); - config.setSuffix( ( String ) env.get( buf.toString() ) ); + String suffix = ( String ) env.get( buf.toString() ); + + if ( suffix != null ) + { + suffix = new LdapName( suffix ).toString(); + } + + config.setSuffix( suffix ); + + // -------------------------------------------------------------------- + // extract index list and set the list of indices in config + // -------------------------------------------------------------------- buf.setLength( 0 ); buf.append( EnvKeys.INDICES ).append( id ); - config.setIndices( ( ( String ) env.get( buf.toString() ) ).split( " " ) ); + String indexList = ( ( String ) env.get( buf.toString() ) ); + + if ( indexList == null || indexList.trim().length() == 0 ) + { + config.setIndices( ArrayUtils.EMPTY_STRING_ARRAY ); + } + else + { + indexList = StringTools.deepTrim( indexList ); + config.setIndices( indexList.split( " " ) ); + } + + // -------------------------------------------------------------------- + // extract attributes and values adding them to the config + // -------------------------------------------------------------------- buf.setLength( 0 ); buf.append( EnvKeys.ATTRIBUTES ).append( id ).append( "." ); @@ -68,12 +108,24 @@ if ( attrKey.startsWith( keyBase ) ) { LockableAttributeImpl attr = new LockableAttributeImpl( attrs, - attrKey.substring( attrKey.length() ) ) ; - String[] values = ( String[] ) env.get( attrKey ); + attrKey.substring( keyBase.length() ) ) ; + String valueList = ( String ) env.get( attrKey ); + + if ( valueList == null || valueList.trim().length() == 0 ) + { + // add the empty attribute + attrs.put( attr ); + continue; + } + + valueList = StringTools.deepTrim( valueList ); + String[] values = valueList.split( " " ); for ( int ii = 0; ii < values.length; ii++ ) { attr.add( values[ii] ); } + + attrs.put( attr ); } } @@ -87,12 +139,22 @@ * * @param env the Hastable containing usually JNDI environment settings * @return all the extracted configuration objects configured + * @throws NamingException if a partition suffix is malformed */ public static ContextPartitionConfig[] getContextPartitionConfigs( Hashtable env ) + throws NamingException { - final String[] ids = ( String[] ) env.get( EnvKeys.PARTITIONS ); - final ContextPartitionConfig[] configs = new ContextPartitionConfig[ids.length]; + String idList = ( String ) env.get( EnvKeys.PARTITIONS ); + + // return empty array when we got nothin to work with! + if ( idList == null || idList.trim().length() == 0 ) + { + return EMPTY; + } + idList = StringTools.deepTrim( idList ); + final String[] ids = idList.split( " " ); + final ContextPartitionConfig[] configs = new ContextPartitionConfig[ids.length]; for ( int ii = 0; ii < configs.length; ii++ ) { configs[ii] = getContextPartitionConfig( ids[ii], env ); Added: incubator/directory/eve/trunk/dib/src/test/org/apache/eve/jndi/PartitionContextBuilderTest.java Url: http://svn.apache.org/viewcvs/incubator/directory/eve/trunk/dib/src/test/org/apache/eve/jndi/PartitionContextBuilderTest.java?view=auto&rev=111219 ============================================================================== --- (empty file) +++ incubator/directory/eve/trunk/dib/src/test/org/apache/eve/jndi/PartitionContextBuilderTest.java Tue Dec 7 21:56:10 2004 @@ -0,0 +1,362 @@ +/* + * Copyright 2004 The Apache Software Foundation + * + * Licensed 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 org.apache.eve.jndi; + + +import java.util.Hashtable; + +import javax.naming.NamingException; + +import org.apache.eve.ContextPartitionConfig; +import org.apache.ldap.common.util.ArrayUtils; +import org.apache.ldap.common.message.LockableAttributesImpl; +import org.apache.ldap.common.message.LockableAttributeImpl; + +import junit.framework.TestCase; + + +/** + * Testcase which tests the correct operation of the PartitionContextBuilder. + * + * @author Apache Directory Project + * @version $Rev$ + */ +public class PartitionContextBuilderTest extends TestCase +{ + /** + * Tests {@link PartitionConfigBuilder#getContextPartitionConfigs(Hashtable)} + * using an empty Hashtable. + */ + public void testEmptyEnvironment() throws NamingException + { + Hashtable env = new Hashtable(); + ContextPartitionConfig[] configs = null; + + configs = PartitionConfigBuilder.getContextPartitionConfigs( env ); + assertNotNull( configs ); + assertEquals( 0, configs.length ); + } + + + /** + * Tests {@link PartitionConfigBuilder#getContextPartitionConfigs(Hashtable)} + * using a Hashtable with only partition names. + */ + public void testPartialConfig() throws NamingException + { + Hashtable env = new Hashtable(); + ContextPartitionConfig[] configs = null; + + // setup everything and build config bean + env.put( EnvKeys.PARTITIONS, "apache test" ); + configs = PartitionConfigBuilder.getContextPartitionConfigs( env ); + + // start testing return values + assertNotNull( configs ); + assertEquals( 2, configs.length ); + + // test the apache config bean + assertEquals( "apache", configs[0].getId() ); + assertNull( configs[0].getSuffix() ); + assertNotNull( configs[0].getAttributes() ); + assertEquals( 0, configs[0].getAttributes().size() ); + assertTrue( ArrayUtils.isEquals( ArrayUtils.EMPTY_STRING_ARRAY, + configs[0].getIndices() ) ); + + // test the 'test' config bean + assertEquals( "test", configs[1].getId() ); + assertNull( configs[1].getSuffix() ); + assertNotNull( configs[1].getAttributes() ); + assertEquals( 0, configs[1].getAttributes().size() ); + assertTrue( ArrayUtils.isEquals( ArrayUtils.EMPTY_STRING_ARRAY, + configs[1].getIndices() ) ); + } + + + /** + * Tests {@link PartitionConfigBuilder#getContextPartitionConfigs(Hashtable)} + * using a Hashtable with only partition names but the list property has + * extra spaces in between and at the ends. + */ + public void testPartialConfigWithExtraWhitespace() throws NamingException + { + Hashtable env = new Hashtable(); + ContextPartitionConfig[] configs = null; + + // setup everything and build config bean + env.put( EnvKeys.PARTITIONS, " apache test " ); + configs = PartitionConfigBuilder.getContextPartitionConfigs( env ); + + // start testing return values + assertNotNull( configs ); + assertEquals( 2, configs.length ); + + // test the apache config bean + assertEquals( "apache", configs[0].getId() ); + assertNull( configs[0].getSuffix() ); + assertNotNull( configs[0].getAttributes() ); + assertEquals( 0, configs[0].getAttributes().size() ); + assertTrue( ArrayUtils.isEquals( ArrayUtils.EMPTY_STRING_ARRAY, + configs[0].getIndices() ) ); + + // test the 'test' config bean + assertEquals( "test", configs[1].getId() ); + assertNull( configs[1].getSuffix() ); + assertNotNull( configs[1].getAttributes() ); + assertEquals( 0, configs[1].getAttributes().size() ); + assertTrue( ArrayUtils.isEquals( ArrayUtils.EMPTY_STRING_ARRAY, + configs[1].getIndices() ) ); + } + + + /** + * Tests {@link PartitionConfigBuilder#getContextPartitionConfigs(Hashtable)} + * using a Hashtable with partitions that have a suffix. Correctness with + * whitespace varience is tested. + */ + public void testSuffixKeys() throws NamingException + { + Hashtable env = new Hashtable(); + ContextPartitionConfig[] configs = null; + + // setup everything and build config bean + env.put( EnvKeys.PARTITIONS, "apache test" ); + env.put( EnvKeys.SUFFIX + "apache", " dc= apache, dc=org" ); + env.put( EnvKeys.SUFFIX + "test", " ou = test " ); + configs = PartitionConfigBuilder.getContextPartitionConfigs( env ); + + // start testing return values + assertNotNull( configs ); + assertEquals( 2, configs.length ); + + // test the apache config bean + assertEquals( "apache", configs[0].getId() ); + assertEquals( "dc=apache,dc=org", configs[0].getSuffix() ); + assertNotNull( configs[0].getAttributes() ); + assertEquals( 0, configs[0].getAttributes().size() ); + assertTrue( ArrayUtils.isEquals( ArrayUtils.EMPTY_STRING_ARRAY, + configs[0].getIndices() ) ); + + // test the 'test' config bean + assertEquals( "test", configs[1].getId() ); + assertEquals( "ou=test", configs[1].getSuffix() ); + assertNotNull( configs[1].getAttributes() ); + assertEquals( 0, configs[1].getAttributes().size() ); + assertTrue( ArrayUtils.isEquals( ArrayUtils.EMPTY_STRING_ARRAY, + configs[1].getIndices() ) ); + } + + + /** + * Tests {@link PartitionConfigBuilder#getContextPartitionConfigs(Hashtable)} + * using a Hashtable with partitions that have malformed suffix + * distinguished names. We test for failure. + */ + public void testSuffixKeysWithMalformedDN() + { + Hashtable env = new Hashtable(); + + // setup everything and build config bean + env.put( EnvKeys.PARTITIONS, "apache test" ); + env.put( EnvKeys.SUFFIX + "apache", " dcapachedcorg" ); + + try + { + PartitionConfigBuilder.getContextPartitionConfigs( env ); + fail( "should never get here due to an exception" ); + } + catch( NamingException e ) + { + } + } + + + /** + * Tests {@link PartitionConfigBuilder#getContextPartitionConfigs(Hashtable)} + * using a Hashtable with partitions that have suffixes and indices set. + */ + public void testIndexKeys() throws NamingException + { + Hashtable env = new Hashtable(); + ContextPartitionConfig[] configs = null; + + // setup everything and build config bean + env.put( EnvKeys.PARTITIONS, "apache test" ); + env.put( EnvKeys.SUFFIX + "apache", "dc=apache,dc=org" ); + env.put( EnvKeys.SUFFIX + "test", "ou=test" ); + env.put( EnvKeys.INDICES + "apache", "ou objectClass uid" ); + env.put( EnvKeys.INDICES + "test", "ou objectClass " ); + configs = PartitionConfigBuilder.getContextPartitionConfigs( env ); + + // start testing return values + assertNotNull( configs ); + assertEquals( 2, configs.length ); + + // test the apache config bean + assertEquals( "apache", configs[0].getId() ); + assertEquals( "dc=apache,dc=org", configs[0].getSuffix() ); + assertNotNull( configs[0].getAttributes() ); + assertEquals( 0, configs[0].getAttributes().size() ); + assertEquals( 3, configs[0].getIndices().length ); + assertTrue( ArrayUtils.isEquals( new String[]{ "ou", "objectClass", "uid" }, + configs[0].getIndices() ) ); + + // test the 'test' config bean + assertEquals( "test", configs[1].getId() ); + assertEquals( "ou=test", configs[1].getSuffix() ); + assertNotNull( configs[1].getAttributes() ); + assertEquals( 0, configs[1].getAttributes().size() ); + assertEquals( 2, configs[1].getIndices().length ); + assertTrue( ArrayUtils.isEquals( new String[]{ "ou", "objectClass" }, + configs[1].getIndices() ) ); + } + + + + /** + * Tests {@link PartitionConfigBuilder#getContextPartitionConfigs(Hashtable)} + * using a Hashtable with partitions that have suffixes, indices and + * attributes set. + */ + public void testAttributeKeys() throws NamingException + { + Hashtable env = new Hashtable(); + ContextPartitionConfig[] configs = null; + + // setup everything and build config bean + env.put( EnvKeys.PARTITIONS, "apache test" ); + env.put( EnvKeys.SUFFIX + "apache", "dc=apache,dc=org" ); + env.put( EnvKeys.SUFFIX + "test", "ou=test" ); + env.put( EnvKeys.INDICES + "apache", "ou objectClass uid" ); + env.put( EnvKeys.INDICES + "test", "ou objectClass " ); + env.put( EnvKeys.ATTRIBUTES + "apache" + ".dc", "apache" ); + env.put( EnvKeys.ATTRIBUTES + "apache" + ".objectClass", "top domain extensibleObject" ); + env.put( EnvKeys.ATTRIBUTES + "test" + ".ou", "test" ); + env.put( EnvKeys.ATTRIBUTES + "test" + ".objectClass", "top extensibleObject organizationalUnit" ); + configs = PartitionConfigBuilder.getContextPartitionConfigs( env ); + + // start testing return values + assertNotNull( configs ); + assertEquals( 2, configs.length ); + + // test the apache config bean + assertEquals( "apache", configs[0].getId() ); + assertEquals( "dc=apache,dc=org", configs[0].getSuffix() ); + assertNotNull( configs[0].getAttributes() ); + assertEquals( 2, configs[0].getAttributes().size() ); + assertEquals( 3, configs[0].getIndices().length ); + assertTrue( ArrayUtils.isEquals( new String[]{ "ou", "objectClass", "uid" }, + configs[0].getIndices() ) ); + LockableAttributesImpl attrs = new LockableAttributesImpl(); + LockableAttributeImpl attr = new LockableAttributeImpl( "dc" ); + attrs.put( attr ); + attr.add( "apache" ); + attr = new LockableAttributeImpl( "objectClass" ); + attrs.put( attr ); + attr.add( "top" ); + attr.add( "domain" ); + attr.add( "extensibleObject" ); + assertTrue( attrs.equals( configs[0].getAttributes() ) ); + + // test the 'test' config bean + assertEquals( "test", configs[1].getId() ); + assertEquals( "ou=test", configs[1].getSuffix() ); + assertNotNull( configs[1].getAttributes() ); + assertEquals( 2, configs[1].getAttributes().size() ); + assertEquals( 2, configs[1].getIndices().length ); + assertTrue( ArrayUtils.isEquals( new String[]{ "ou", "objectClass" }, + configs[1].getIndices() ) ); + attrs = new LockableAttributesImpl(); + attr = new LockableAttributeImpl( "ou" ); + attrs.put( attr ); + attr.add( "test" ); + attr = new LockableAttributeImpl( "objectClass" ); + attrs.put( attr ); + attr.add( "top" ); + attr.add( "extensibleObject" ); + attr.add( "organizationalUnit" ); + assertTrue( attrs.equals( configs[1].getAttributes() ) ); + } + + + /** + * Tests {@link PartitionConfigBuilder#getContextPartitionConfigs(Hashtable)} + * using a Hashtable with partitions that have suffixes, indices and + * attributes set however values have some space variance. + */ + public void testAttributeValuesWithWhitespace() throws NamingException + { + Hashtable env = new Hashtable(); + ContextPartitionConfig[] configs = null; + + // setup everything and build config bean + env.put( EnvKeys.PARTITIONS, "apache test" ); + env.put( EnvKeys.SUFFIX + "apache", "dc=apache,dc=org" ); + env.put( EnvKeys.SUFFIX + "test", "ou=test" ); + env.put( EnvKeys.INDICES + "apache", "ou objectClass uid" ); + env.put( EnvKeys.INDICES + "test", "ou objectClass " ); + env.put( EnvKeys.ATTRIBUTES + "apache" + ".dc", "apache" ); + env.put( EnvKeys.ATTRIBUTES + "apache" + ".objectClass", + " top domain extensibleObject " ); + env.put( EnvKeys.ATTRIBUTES + "test" + ".ou", "test" ); + env.put( EnvKeys.ATTRIBUTES + "test" + ".objectClass", + "top extensibleObject organizationalUnit" ); + configs = PartitionConfigBuilder.getContextPartitionConfigs( env ); + + // start testing return values + assertNotNull( configs ); + assertEquals( 2, configs.length ); + + // test the apache config bean + assertEquals( "apache", configs[0].getId() ); + assertEquals( "dc=apache,dc=org", configs[0].getSuffix() ); + assertNotNull( configs[0].getAttributes() ); + assertEquals( 2, configs[0].getAttributes().size() ); + assertEquals( 3, configs[0].getIndices().length ); + assertTrue( ArrayUtils.isEquals( new String[]{ "ou", "objectClass", "uid" }, + configs[0].getIndices() ) ); + LockableAttributesImpl attrs = new LockableAttributesImpl(); + LockableAttributeImpl attr = new LockableAttributeImpl( "dc" ); + attrs.put( attr ); + attr.add( "apache" ); + attr = new LockableAttributeImpl( "objectClass" ); + attrs.put( attr ); + attr.add( "top" ); + attr.add( "domain" ); + attr.add( "extensibleObject" ); + assertTrue( attrs.equals( configs[0].getAttributes() ) ); + + // test the 'test' config bean + assertEquals( "test", configs[1].getId() ); + assertEquals( "ou=test", configs[1].getSuffix() ); + assertNotNull( configs[1].getAttributes() ); + assertEquals( 2, configs[1].getAttributes().size() ); + assertEquals( 2, configs[1].getIndices().length ); + assertTrue( ArrayUtils.isEquals( new String[]{ "ou", "objectClass" }, + configs[1].getIndices() ) ); + attrs = new LockableAttributesImpl(); + attr = new LockableAttributeImpl( "ou" ); + attrs.put( attr ); + attr.add( "test" ); + attr = new LockableAttributeImpl( "objectClass" ); + attrs.put( attr ); + attr.add( "top" ); + attr.add( "extensibleObject" ); + attr.add( "organizationalUnit" ); + assertTrue( attrs.equals( configs[1].getAttributes() ) ); + } +}