[hibernate-commits] Hibernate SVN: r15014 - in search/trunk/src: test/org/hibernate/search/test/configuration and 1 other directory.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Fri Aug 1 13:10:49 EDT 2008


Author: sannegrinovero
Date: 2008-08-01 13:10:49 -0400 (Fri, 01 Aug 2008)
New Revision: 15014

Modified:
   search/trunk/src/java/org/hibernate/search/backend/configuration/MaskedProperty.java
   search/trunk/src/test/org/hibernate/search/test/configuration/MaskedPropertiesTest.java
Log:
additional fixes for HSEARCH-241: recursive listing, inclusion of fallback properties in lists, synchronization, isEmpty().

Modified: search/trunk/src/java/org/hibernate/search/backend/configuration/MaskedProperty.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/backend/configuration/MaskedProperty.java	2008-08-01 12:23:25 UTC (rev 15013)
+++ search/trunk/src/java/org/hibernate/search/backend/configuration/MaskedProperty.java	2008-08-01 17:10:49 UTC (rev 15014)
@@ -10,15 +10,13 @@
 import java.io.PrintWriter;
 import java.io.Serializable;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Enumeration;
 import java.util.InvalidPropertiesFormatException;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
+import java.util.TreeSet;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -27,7 +25,7 @@
  * A wrapper to Properties, to restrict the availability of
  * values to only those which have a key beginning with some
  * masking String.
- * Supported methods to enumerate the lsit of properties are:
+ * Supported methods to enumerate the list of properties are:
  *   - propertyNames()
  *   - keySet()
  *   - keys()
@@ -44,7 +42,7 @@
 	private final Properties masked;
 	private final Properties fallBack;
 	private final String radix;
-	private transient List<String> propertyNames;
+	private transient Set<Object> propertyNames;
 	
 	/**
 	 * Provides a view to the provided Properties hiding
@@ -143,37 +141,33 @@
 	@Override
 	public Enumeration<?> propertyNames() {
 		initPropertyNames();
-		return new PropertyNameEnumeration();
+		return Collections.enumeration( propertyNames );
 	}
 
-	private void initPropertyNames() {
+	private synchronized void initPropertyNames() {
 		if ( propertyNames != null) return;
-		propertyNames = new ArrayList<String>();
-		List<String> maskedProperties = new ArrayList<String>();
+		Set<Object> maskedProperties = new TreeSet<Object>();
 		//we use keys to be safe and avoid CCE for non String key entries
-		Enumeration maskedNames = masked.keys();
+		Enumeration<?> maskedNames = masked.propertyNames();
 		while ( maskedNames.hasMoreElements() ) {
 			Object key = maskedNames.nextElement();
 			if ( String.class.isInstance( key ) ) {
 				String maskedProperty = (String) key;
 				if ( maskedProperty.startsWith( radix ) ) {
-					maskedProperties.add(maskedProperty);
-					propertyNames.add(maskedProperty.substring( radix.length(), maskedProperty.length() ) );
+					maskedProperties.add(maskedProperty.substring( radix.length(), maskedProperty.length() ) );
 				}
 			}
 		}
 		if (fallBack != null) {
-			Enumeration fallbackKeys = fallBack.keys();
-			while ( fallbackKeys.hasMoreElements() ) {
-				Object key = fallbackKeys.nextElement();
+			Enumeration<?> fallBackNames = fallBack.propertyNames();
+			while ( fallBackNames.hasMoreElements() ) {
+				Object key = fallBackNames.nextElement();
 				if ( String.class.isInstance( key ) ) {
-					String fallbackProperty = (String) key;
-					if ( ! maskedProperties.contains( fallbackProperty )) {
-						propertyNames.add(fallbackProperty);
-					}
+					maskedProperties.add( (String) key );
 				}
 			}
 		}
+		propertyNames = Collections.unmodifiableSet( maskedProperties );
 	}
 	
 	/**
@@ -276,12 +270,8 @@
 
 	@Override
 	public boolean isEmpty() {
-		if ( fallBack==null ) {
-			return masked.isEmpty();
-		}
-		else {
-			return masked.isEmpty() && fallBack.isEmpty();
-		}
+		initPropertyNames();
+		return propertyNames.isEmpty();
 	}
 
 	/**
@@ -290,13 +280,13 @@
 	@Override
 	public Enumeration<Object> keys() {
 		initPropertyNames();
-		return new PropertyNameEnumeration();
+		return Collections.enumeration( propertyNames );
 	}
 
 	@Override
 	public Set<Object> keySet() {
 		initPropertyNames();
-		return new HashSet<Object>(propertyNames);
+		return propertyNames;
 	}
 
 	/**
@@ -393,16 +383,4 @@
 		aOutputStream.defaultWriteObject();
 	}
 
-	private class PropertyNameEnumeration implements Enumeration<Object> {
-		private int index = -1;
-
-		public boolean hasMoreElements() {
-			return index + 1 < propertyNames.size();
-		}
-
-		public Object nextElement() {
-			index++;
-			return propertyNames.get( index );
-		}
-	}
 }

Modified: search/trunk/src/test/org/hibernate/search/test/configuration/MaskedPropertiesTest.java
===================================================================
--- search/trunk/src/test/org/hibernate/search/test/configuration/MaskedPropertiesTest.java	2008-08-01 12:23:25 UTC (rev 15013)
+++ search/trunk/src/test/org/hibernate/search/test/configuration/MaskedPropertiesTest.java	2008-08-01 17:10:49 UTC (rev 15014)
@@ -59,4 +59,30 @@
 		assertEquals( "value", theCopy.getProperty( "key" ) );
 	}
 	
+	public void testListingKeys() {
+		Properties defaultProp = new Properties();
+		defaultProp.put( "some.inherited.prop", "to test standard Properties fallback behaviour" );
+		Properties rootProp = new Properties( defaultProp );
+		rootProp.put( "some.long.dotted.prop1", "hello!" );
+		rootProp.put( "hidden.long.dotted.prop2", "hello again" );
+		Properties fallbackProp = new Properties();
+		fallbackProp.put( "default.long.dotted.prop3", "hello!" );
+		Properties masked = new MaskedProperty( rootProp, "some", fallbackProp );
+		
+		assertTrue( masked.keySet().contains( "long.dotted.prop1" ) );
+		assertTrue( masked.keySet().contains( "default.long.dotted.prop3" ) );
+		assertTrue( masked.keySet().contains( "inherited.prop" ) );
+		assertFalse( masked.keySet().contains( "hidden.long.dotted.prop2" ) );
+		assertFalse( masked.keySet().contains( "long.dotted.prop2" ) );
+		
+		Properties maskedAgain = new MaskedProperty( masked, "long.dotted", masked ); //falling back to same instance for **
+		assertTrue( maskedAgain.keySet().contains( "prop1" ) );
+		assertTrue( maskedAgain.keySet().contains( "long.dotted.prop1" ) ); //**: prop 1 should be visible in both ways
+		assertTrue( maskedAgain.keySet().contains( "default.long.dotted.prop3" ) );
+		
+		Properties maskingAll = new MaskedProperty( masked, "secured" );
+		assertTrue( maskingAll.keySet().isEmpty() );
+		assertTrue( maskingAll.isEmpty() );
+	}
+	
 }




More information about the hibernate-commits mailing list