Author: jbonofre
Date: Mon Aug 9 07:25:02 2010
New Revision: 983539
URL: http://svn.apache.org/viewvc?rev=983539&view=rev
Log:
[SMX4-573] Rome bundle should try to load the configure file from local bundle
classloader as a fallback.
Added:
servicemix/smx4/bundles/trunk/rome-1.0/src/main/java/com/sun/syndication/io/impl/PropertiesLoader.java
(with props)
Added:
servicemix/smx4/bundles/trunk/rome-1.0/src/main/java/com/sun/syndication/io/impl/PropertiesLoader.java
URL:
http://svn.apache.org/viewvc/servicemix/smx4/bundles/trunk/rome-1.0/src/main/java/com/sun/syndication/io/impl/PropertiesLoader.java?rev=983539&view=auto
==============================================================================
---
servicemix/smx4/bundles/trunk/rome-1.0/src/main/java/com/sun/syndication/io/impl/PropertiesLoader.java
(added)
+++
servicemix/smx4/bundles/trunk/rome-1.0/src/main/java/com/sun/syndication/io/impl/PropertiesLoader.java
Mon Aug 9 07:25:02 2010
@@ -0,0 +1,178 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 com.sun.syndication.io.impl;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.StringTokenizer;
+import java.util.WeakHashMap;
+
+/**
+ * <p>
+ * Properties loader that aggregates a master properties file and several
extra properties files,
+ * all from the current classpath.
+ * </p>
+ * <p>
+ * The master properties file has to be in a distinct location than the extra
properties file.
+ * Firs the master properties file is loaded, then all the extra properties
files in their order
+ * of appearance in the classpath.
+ * </p>
+ * <p>
+ * Current use cases (plugin manager for parsers/converters/generators for
feeds and modules and date
+ * formats) assume properties are list of tokens, that why the only method to
get property values
+ * is the getTokenizedProperty().
+ * </p>
+ *
+ * @author willem
+ * @author jbonofre
+ *
+ */
+public class PropertiesLoader {
+
+ private static final String MASTER_PLUGIN_FILE =
"com/sun/syndication/rome.properties";
+ private static final String EXTRA_PLUGIN_FILE = "rome.properties";
+
+ private static Map clMap = new WeakHashMap();
+
+ /**
+ * <p>
+ * Returns the PropertiesLoader singleton used by ROME to load plugin
components.
+ * </p>
+ *
+ * @return PropertiesLoader singleton.
+ */
+ public static PropertiesLoader getPropertiesLoader() {
+ synchronized(PropertiesLoader.class) {
+ PropertiesLoader loader = (PropertiesLoader)
clMap.get(Thread.currentThread().getContextClassLoader());
+ if (loader == null) {
+ try {
+ loader = new PropertiesLoader(MASTER_PLUGIN_FILE,
EXTRA_PLUGIN_FILE);
+ clMap.put(Thread.currentThread().getContextClassLoader(),
loader);
+ } catch (IOException ioException) {
+ throw new RuntimeException(ioException);
+ }
+ }
+ return loader;
+ }
+ }
+
+ private Properties[] _properties;
+
+ /**
+ * <p>
+ * Creates a PropertiesLoader.
+ * </p>
+ *
+ * @param masterFileLocation master file location, there must be only one.
+ * @param extraFileLocation extra file location, there may be many.
+ * @throws IOException thrown if one of the properties file could not be
read.
+ */
+ private PropertiesLoader(String masterFileLocation, String
extraFileLocation) throws IOException {
+ List propertiesList = new ArrayList();
+ ClassLoader classLoader =
Thread.currentThread().getContextClassLoader();
+
+ InputStream is = classLoader.getResourceAsStream(masterFileLocation);
+ if (is == null) {
+ classLoader = this.getClass().getClassLoader();
+ is = classLoader.getResourceAsStream(masterFileLocation);
+ }
+ if (is == null) {
+ throw new IOException("Could not load ROME master plugins file ["
+ masterFileLocation + "]");
+ }
+ Properties p = new Properties();
+ p.load(is);
+ is.close();
+ propertiesList.add(p);
+
+ classLoader = Thread.currentThread().getContextClassLoader();
+ Enumeration urls = classLoader.getResources(extraFileLocation);
+ while (urls.hasMoreElements()) {
+ URL url = (URL) urls.nextElement();
+ p = new Properties();
+ try {
+ is = url.openStream();
+ p.load(is);
+ is.close();
+ } catch (IOException ioException) {
+ IOException thrown = new IOException("Could not load ROME
extensions plugins file [" + url.toString() + "], " + ioException.getMessage());
+ thrown.setStackTrace(ioException.getStackTrace());
+ throw thrown;
+ }
+ propertiesList.add(p);
+ }
+
+ _properties = new Properties[propertiesList.size()];
+ propertiesList.toArray(_properties);
+ }
+
+ /**
+ * <p>
+ * Returns an array of tokenized values stored under a property key in all
properties files.
+ * If the master file has this property its tokens will be the first ones
in the array.
+ * </p>
+ *
+ * @param key property key to retrieve values.
+ * @param separator String will all separator characters to tokenize from
the values in all
+ * properties files.
+ * @return all the tokens for the given property key from all the
properties files.
+ */
+ public String[] getTokenizedProperty(String key, String separator) {
+ List entriesList = new ArrayList();
+ for (int i = 0; i < _properties.length; i++) {
+ String values = _properties[i].getProperty(key);
+ if (values != null) {
+ StringTokenizer st = new StringTokenizer(values, separator);
+ while (st.hasMoreTokens()) {
+ String token = st.nextToken();
+ entriesList.add(token);
+ }
+ }
+ }
+ String[] entries = new String[entriesList.size()];
+ entriesList.toArray(entries);
+ return entries;
+ }
+
+ /**
+ * <p>
+ * Returns an array of values stored under a property key in all
properties files.
+ * If the master file has this property it will be the first ones in the
array.
+ * </p>
+ *
+ * @param key property key to retrieve values.
+ * @return all the values for the given property key from all the
properties files.
+ */
+ public String[] getProperty(String key) {
+ List entriesList = new ArrayList();
+ for (int i =0; i < _properties.length; i++) {
+ String values = _properties[i].getProperty(key);
+ if (values != null) {
+ entriesList.add(values);
+ }
+ }
+ String[] entries = new String[entriesList.size()];
+ entriesList.toArray(entries);
+ return entries;
+ }
+
+}
Propchange:
servicemix/smx4/bundles/trunk/rome-1.0/src/main/java/com/sun/syndication/io/impl/PropertiesLoader.java
------------------------------------------------------------------------------
svn:mime-type = text/plain