You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by si...@apache.org on 2009/05/21 19:06:46 UTC

svn commit: r777178 - in /labs/magma/trunk: beans-richtext/src/main/resources/META-INF/ beans-richtext/src/main/resources/META-INF/services/ foundation-basics/src/main/java/org/apache/magma/basics/services/ foundation-basics/src/main/java/org/apache/ma...

Author: simoneg
Date: Thu May 21 17:06:45 2009
New Revision: 777178

URL: http://svn.apache.org/viewvc?rev=777178&view=rev
Log:
LABS-366 : new ServiceFinder

Added:
    labs/magma/trunk/beans-richtext/src/main/resources/META-INF/magma.default.properties
    labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/services/
    labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/services/ServiceFinder.java
    labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/
    labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/MockService.java
    labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/MockServiceImpl1.java
    labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/MockServiceImpl2.java
    labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/ServiceFinderTest.java
    labs/magma/trunk/foundation-basics/src/test/resources/
    labs/magma/trunk/foundation-basics/src/test/resources/META-INF/
    labs/magma/trunk/foundation-basics/src/test/resources/META-INF/magma.properties
    labs/magma/trunk/foundation-beans/src/main/resources/META-INF/magma.default.properties
    labs/magma/trunk/foundation-database/src/main/resources/META-INF/magma.default.properties
    labs/magma/trunk/foundation-i18n/src/main/resources/META-INF/magma.default.properties
Removed:
    labs/magma/trunk/beans-richtext/src/main/resources/META-INF/services/
    labs/magma/trunk/foundation-beans/src/main/resources/META-INF/services/org.apache.magma.conversion.Converter
    labs/magma/trunk/foundation-database/src/main/resources/META-INF/services/
    labs/magma/trunk/foundation-i18n/src/main/resources/META-INF/services/
Modified:
    labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/settings/Settings.java
    labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/settings/SettingsHolder.java
    labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/Converters.java
    labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/Formatters.java

Added: labs/magma/trunk/beans-richtext/src/main/resources/META-INF/magma.default.properties
URL: http://svn.apache.org/viewvc/labs/magma/trunk/beans-richtext/src/main/resources/META-INF/magma.default.properties?rev=777178&view=auto
==============================================================================
--- labs/magma/trunk/beans-richtext/src/main/resources/META-INF/magma.default.properties (added)
+++ labs/magma/trunk/beans-richtext/src/main/resources/META-INF/magma.default.properties Thu May 21 17:06:45 2009
@@ -0,0 +1,2 @@
+
+org.apache.magma.conversion.Converter.richtext=org.apache.magma.conversion.richtext.RichTextConverterToString
\ No newline at end of file

Added: labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/services/ServiceFinder.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/services/ServiceFinder.java?rev=777178&view=auto
==============================================================================
--- labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/services/ServiceFinder.java (added)
+++ labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/basics/services/ServiceFinder.java Thu May 21 17:06:45 2009
@@ -0,0 +1,69 @@
+package org.apache.magma.basics.services;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.magma.settings.Settings;
+
+/**
+ * Mimics the Java service system using Settings instead of raw classpath files.
+ *
+ * @author Simone Gianni <si...@apache.org>
+ */
+public class ServiceFinder {
+
+	private static Map<Class<?>, List> providers = new HashMap<Class<?>, List>();
+	
+	/**
+	 * Find providers of the given class. This searches for settings starting with the class names, for example
+	 * if we want to configure providers for the "org.apache.magma.i18n.Formatter" class, we will add the
+	 * following settings :
+	 * 
+	 * org.apache.magma.i18n.Formatter.date=org.apache.magma.i18n.formatters.DateFormatter
+	 * org.apache.magma.i18n.Formatter.integer=org.apache.magma.i18n.formatters.IntegerFormatter
+	 * 
+	 * 
+	 * The part following the class name is not important, and is used only to provide settings override.
+	 * 
+	 * @param <T> The class we are searching providers for.
+	 * @param clazz The class we are searching providers for.
+	 * @return An Iterator (potentially empty) containing providers.
+	 */
+	public static <T> Iterator<T> findProviders(Class<T> clazz) {
+		List<T> provider = providers.get(clazz);
+		if (provider != null) {
+			return provider.iterator();
+		}
+		
+		provider = new ArrayList<T>();
+		
+		String name = clazz.getCanonicalName();
+		Map<String, String> subset = Settings.getPrefix(name);
+		for (Map.Entry<String, String> entry : subset.entrySet()) {
+			String clname = entry.getValue();
+			try {
+				Class<? extends T> provclass = (Class<? extends T>) Class.forName(clname);
+				T newInstance = provclass.newInstance();
+				provider.add(newInstance);
+			} catch (InstantiationException e) {
+				// TODO Log this
+				e.printStackTrace();
+			} catch (IllegalAccessException e) {
+				// TODO Log this
+				e.printStackTrace();
+			} catch (ClassNotFoundException e) {
+				// TODO Log this
+				e.printStackTrace();
+			}
+		}
+		if (Settings.isDeveloperEnv()) {
+			providers.put(clazz, Collections.unmodifiableList(provider));
+		}
+		return provider.iterator();
+	}
+	
+}

Modified: labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/settings/Settings.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/settings/Settings.java?rev=777178&r1=777177&r2=777178&view=diff
==============================================================================
--- labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/settings/Settings.java (original)
+++ labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/settings/Settings.java Thu May 21 17:06:45 2009
@@ -89,6 +89,16 @@
 	}
 	
 	/**
+	 * Retrieves all the setting properties beginning with the given prefix.
+	 * @param prefix The prefix to search for.
+	 * @return A map with matching setting properties.
+	 */
+	public static Map<String, String> getPrefix(String prefix) {
+		if (!holder.isInited()) init();
+		return holder.getPrefix(prefix);		
+	}
+	
+	/**
 	 * Loads the settings resources.
 	 */
 	public static void init() {

Modified: labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/settings/SettingsHolder.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/settings/SettingsHolder.java?rev=777178&r1=777177&r2=777178&view=diff
==============================================================================
--- labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/settings/SettingsHolder.java (original)
+++ labs/magma/trunk/foundation-basics/src/main/java/org/apache/magma/settings/SettingsHolder.java Thu May 21 17:06:45 2009
@@ -23,6 +23,7 @@
 import java.io.InputStream;
 import java.net.URL;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.InvalidPropertiesFormatException;
 import java.util.Map;
 import java.util.Properties;
@@ -135,5 +136,15 @@
 	public Map<String, String> getAll() {
 		return Collections.unmodifiableMap((Map) properties);
 	}
+
+	public Map<String, String> getPrefix(String prefix) {
+		Map<String, String> subset = new HashMap<String, String>();
+		for (Map.Entry<Object, Object> entry : properties.entrySet()) {
+			if (((String)entry.getKey()).startsWith(prefix)) {
+				subset.put((String)entry.getKey(), (String)entry.getValue());
+			}
+		}
+		return Collections.unmodifiableMap(subset);
+	}
 	
 }

Added: labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/MockService.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/MockService.java?rev=777178&view=auto
==============================================================================
--- labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/MockService.java (added)
+++ labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/MockService.java Thu May 21 17:06:45 2009
@@ -0,0 +1,5 @@
+package org.apache.magma.basics.services;
+
+public class MockService {
+
+}

Added: labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/MockServiceImpl1.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/MockServiceImpl1.java?rev=777178&view=auto
==============================================================================
--- labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/MockServiceImpl1.java (added)
+++ labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/MockServiceImpl1.java Thu May 21 17:06:45 2009
@@ -0,0 +1,5 @@
+package org.apache.magma.basics.services;
+
+public class MockServiceImpl1 extends MockService {
+
+}

Added: labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/MockServiceImpl2.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/MockServiceImpl2.java?rev=777178&view=auto
==============================================================================
--- labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/MockServiceImpl2.java (added)
+++ labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/MockServiceImpl2.java Thu May 21 17:06:45 2009
@@ -0,0 +1,5 @@
+package org.apache.magma.basics.services;
+
+public class MockServiceImpl2 extends MockService {
+
+}

Added: labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/ServiceFinderTest.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/ServiceFinderTest.java?rev=777178&view=auto
==============================================================================
--- labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/ServiceFinderTest.java (added)
+++ labs/magma/trunk/foundation-basics/src/test/java/org/apache/magma/basics/services/ServiceFinderTest.java Thu May 21 17:06:45 2009
@@ -0,0 +1,34 @@
+package org.apache.magma.basics.services;
+
+import static org.junit.Assert.*;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.junit.Test;
+
+
+public class ServiceFinderTest {
+
+	@Test
+	public void locateServices() throws Exception {
+		Iterator<MockService> found = ServiceFinder.findProviders(MockService.class);
+		assertTrue("Find providers returned empty", found.hasNext());
+		
+		List<Class> classes = new ArrayList<Class>();
+		while (found.hasNext()) {
+			classes.add(found.next().getClass());
+		}
+		assertTrue("MockServiceImpl1 not found", classes.contains(MockServiceImpl1.class));
+		assertTrue("MockServiceImpl2 not found", classes.contains(MockServiceImpl1.class));
+		assertEquals("Find providers did not found 2 providers",2, classes.size());
+	}
+	
+	@Test
+	public void locateNotExisting() throws Exception {
+		Iterator<ServiceFinderTest> findProviders = ServiceFinder.findProviders(ServiceFinderTest.class);
+		assertFalse("False positive from findProviders", findProviders.hasNext());
+	}
+	
+}

Added: labs/magma/trunk/foundation-basics/src/test/resources/META-INF/magma.properties
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-basics/src/test/resources/META-INF/magma.properties?rev=777178&view=auto
==============================================================================
--- labs/magma/trunk/foundation-basics/src/test/resources/META-INF/magma.properties (added)
+++ labs/magma/trunk/foundation-basics/src/test/resources/META-INF/magma.properties Thu May 21 17:06:45 2009
@@ -0,0 +1,3 @@
+
+org.apache.magma.basics.services.MockService.impl1=org.apache.magma.basics.services.MockServiceImpl1
+org.apache.magma.basics.services.MockService.impl2=org.apache.magma.basics.services.MockServiceImpl2
\ No newline at end of file

Modified: labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/Converters.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/Converters.java?rev=777178&r1=777177&r2=777178&view=diff
==============================================================================
--- labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/Converters.java (original)
+++ labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/Converters.java Thu May 21 17:06:45 2009
@@ -19,6 +19,7 @@
 import java.util.Iterator;
 
 import org.apache.commons.beanutils.MethodUtils;
+import org.apache.magma.basics.services.ServiceFinder;
 import org.apache.magma.beans.PropertyInfo;
 
 import sun.misc.Service;
@@ -39,16 +40,11 @@
 	@SuppressWarnings("unchecked")
 	public static <T> Converter<T> getConverterFor(Class<T> type) {
 		Class simpletype = MethodUtils.toNonPrimitiveClass(type);
-		Iterator providers = Service.providers(Converter.class);
+		Iterator<Converter> providers = ServiceFinder.findProviders(Converter.class);
 		while (providers.hasNext()) {
-			Converter converter = (Converter) providers.next();
+			Converter converter = providers.next();
 			if (converter.converts(simpletype)) return converter.build(type);
 		}
-		// TODO reenable this for java 1.6
-		//ServiceLoader<Converter> loader = ServiceLoader.load(Converter.class);
-		//for (Converter converter : loader) {
-		//	if (converter.converts(simpletype)) return converter.build(type);
-		//}
 		return null;
 	}
 	

Added: labs/magma/trunk/foundation-beans/src/main/resources/META-INF/magma.default.properties
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-beans/src/main/resources/META-INF/magma.default.properties?rev=777178&view=auto
==============================================================================
--- labs/magma/trunk/foundation-beans/src/main/resources/META-INF/magma.default.properties (added)
+++ labs/magma/trunk/foundation-beans/src/main/resources/META-INF/magma.default.properties Thu May 21 17:06:45 2009
@@ -0,0 +1,13 @@
+org.apache.magma.conversion.Converter.bigdecimal=org.apache.magma.conversion.string.BigDecimalConverter
+org.apache.magma.conversion.Converter.biginteger=org.apache.magma.conversion.string.BigIntegerConverter
+org.apache.magma.conversion.Converter.boolean=org.apache.magma.conversion.string.BooleanConverter
+org.apache.magma.conversion.Converter.byte=org.apache.magma.conversion.string.ByteConverter
+org.apache.magma.conversion.Converter.class=org.apache.magma.conversion.string.ClassConverter
+org.apache.magma.conversion.Converter.date=org.apache.magma.conversion.string.DateConverter
+org.apache.magma.conversion.Converter.double=org.apache.magma.conversion.string.DoubleConverter
+org.apache.magma.conversion.Converter.enum=org.apache.magma.conversion.string.EnumConverter
+org.apache.magma.conversion.Converter.float=org.apache.magma.conversion.string.FloatConverter
+org.apache.magma.conversion.Converter.integer=org.apache.magma.conversion.string.IntegerConverter
+org.apache.magma.conversion.Converter.long=org.apache.magma.conversion.string.LongConverter
+org.apache.magma.conversion.Converter.short=org.apache.magma.conversion.string.ShortConverter
+org.apache.magma.conversion.Converter.string=org.apache.magma.conversion.string.StringConverter

Added: labs/magma/trunk/foundation-database/src/main/resources/META-INF/magma.default.properties
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-database/src/main/resources/META-INF/magma.default.properties?rev=777178&view=auto
==============================================================================
--- labs/magma/trunk/foundation-database/src/main/resources/META-INF/magma.default.properties (added)
+++ labs/magma/trunk/foundation-database/src/main/resources/META-INF/magma.default.properties Thu May 21 17:06:45 2009
@@ -0,0 +1 @@
+org.apache.magma.conversion.Converter.database=org.apache.magma.database.DatabaseConverter
\ No newline at end of file

Modified: labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/Formatters.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/Formatters.java?rev=777178&r1=777177&r2=777178&view=diff
==============================================================================
--- labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/Formatters.java (original)
+++ labs/magma/trunk/foundation-i18n/src/main/java/org/apache/magma/i18n/Formatters.java Thu May 21 17:06:45 2009
@@ -3,6 +3,7 @@
 import java.util.Iterator;
 
 import org.apache.commons.beanutils.MethodUtils;
+import org.apache.magma.basics.services.ServiceFinder;
 import org.apache.magma.basics.utils.AnnotationToInstance;
 
 import sun.misc.Service;
@@ -55,18 +56,11 @@
 	 */
 	public static <T> Formatter<T> getFormatterFor(Class<T> type) {
 		Class simpletype = MethodUtils.toNonPrimitiveClass(type);
-		Iterator providers = Service.providers(Formatter.class);
+		Iterator<Formatter> providers = ServiceFinder.findProviders(Formatter.class);
 		while (providers.hasNext()) {
-			Formatter formatter = (Formatter) providers.next();
+			Formatter formatter = providers.next();
 			if (formatter.converts(simpletype)) return formatter.buildDefault(type);
 		}
-
-		
-		// TODO reenable this for java 1.6
-		//ServiceLoader<Formatter> loader = ServiceLoader.load(Formatter.class);
-		//for (Formatter formatter : loader) {
-		//	if (formatter.converts(simpletype)) return formatter.buildDefault(type);
-		//}
 		return null;
 	}	
 	

Added: labs/magma/trunk/foundation-i18n/src/main/resources/META-INF/magma.default.properties
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-i18n/src/main/resources/META-INF/magma.default.properties?rev=777178&view=auto
==============================================================================
--- labs/magma/trunk/foundation-i18n/src/main/resources/META-INF/magma.default.properties (added)
+++ labs/magma/trunk/foundation-i18n/src/main/resources/META-INF/magma.default.properties Thu May 21 17:06:45 2009
@@ -0,0 +1,4 @@
+org.apache.magma.i18n.Formatter.date=org.apache.magma.i18n.formatters.DateFormatter
+org.apache.magma.i18n.Formatter.double=org.apache.magma.i18n.formatters.DoubleFormatter
+org.apache.magma.i18n.Formatter.boolean=org.apache.magma.i18n.formatters.BooleanFormatter
+org.apache.magma.i18n.Formatter.enum=org.apache.magma.i18n.formatters.EnumFormatter



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org