From a43994bff0d9017a72f7d41453e762969282f5df Mon Sep 17 00:00:00 2001 From: antelder Date: Thu, 15 Apr 2010 08:01:56 +0000 Subject: Start adding support for configureing the runtime (NodeFactory) via some properties. Also add the init method to NodeFactory class so you don't have to cast it to a NodeFactoryImpl git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@934322 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/tuscany/sca/node/NodeFactory.java | 102 +++++++++++++++++---- 1 file changed, 85 insertions(+), 17 deletions(-) (limited to 'sca-java-2.x/trunk/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java') diff --git a/sca-java-2.x/trunk/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java b/sca-java-2.x/trunk/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java index e4df78ffde..d7b487a688 100644 --- a/sca-java-2.x/trunk/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java +++ b/sca-java-2.x/trunk/modules/node-api/src/main/java/org/apache/tuscany/sca/node/NodeFactory.java @@ -21,17 +21,19 @@ package org.apache.tuscany.sca.node; import static org.apache.tuscany.sca.node.ContributionLocationHelper.getContributionLocations; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.lang.reflect.InvocationTargetException; +import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; @@ -193,27 +195,91 @@ public abstract class NodeFactory extends DefaultNodeConfigurationFactory { } return nodeFactory; } + + protected Properties properties; public static NodeFactory newInstance(Properties properties) { - Map> attributes = new HashMap>(); - for (String key : properties.stringPropertyNames()) { - int i = key.lastIndexOf('.'); - String mk, m2k; - if (i > -1) { - mk = key.substring(0, i); - m2k = key.substring(i+1); - } else { - mk = "system"; - m2k = key; + NodeFactory nodeFactory = null; + try { + Class factoryClass = getFactoryImplClass(); + nodeFactory = (NodeFactory)factoryClass.newInstance(); + nodeFactory.properties = properties; + } catch (Exception e) { + throw new ServiceRuntimeException(e); + } + return nodeFactory; + } + + public static NodeFactory newInstance(String configURI) { + Properties properties; + if (configURI == null || configURI.length() < 1) { + properties = new Properties(); + } else if (configURI.startsWith("properties:")) { + try { + properties = loadProperties(configURI); + } catch (IOException e) { + throw new ServiceRuntimeException(e); } - Map m2 = attributes.get(mk); - if (m2 == null) { - m2 = new HashMap(); - attributes.put(mk, m2); + } else if (configURI.startsWith("uri:")) { + properties = parseConfigURI(configURI); + } else { + properties = new Properties(); + properties.setProperty("configURI", configURI); + } + return newInstance(properties); + } + + /** + * Parse the config URI into a Properties object. + * The config URI has the following format: + * uri:?name=value&... + */ + private static Properties parseConfigURI(String configURI) { + Properties properties = new Properties(); + // TODO: + return properties; + } + + /** + * load the properties from external URL or a relative file + * properties: + */ + private static Properties loadProperties(String configURI) throws IOException { + + String remaining = URI.create(configURI).getSchemeSpecificPart(); + Properties properties = new Properties(); + File file = new File(remaining); + + InputStream inputStream = null; + if (file.exists()) { + inputStream = new FileInputStream(file); + } else { + URL url = null; + try { + url = new URL(remaining); + } catch (MalformedURLException e) { + inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(remaining); + if (inputStream == null) { + throw new IOException("File does not exist: " + remaining + ", could not be found on the classpath and is not a valid URL: " + e); + } + } + if (inputStream == null && url != null) { + inputStream = url.openStream(); } - m2.put(m2k, properties.getProperty(key)); } - return newInstance(attributes); + if (inputStream != null) { + properties.load(inputStream); + inputStream.close(); + } + + // append any system properties? + try { + Properties systemProperties = System.getProperties(); + properties.putAll(systemProperties); + } catch (Exception e) { + // ignore security exception + } + return properties; } /** @@ -523,4 +589,6 @@ public abstract class NodeFactory extends DefaultNodeConfigurationFactory { public abstract NodeConfiguration loadConfiguration(InputStream xml, URL base); public abstract T getExtensionPointRegistry(); + + public abstract void init(); } -- cgit v1.2.3