You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2014/11/22 15:58:25 UTC

[2/2] cayenne git commit: cleanup, no change

cleanup, no change


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/3c51a773
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/3c51a773
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/3c51a773

Branch: refs/heads/master
Commit: 3c51a773ce64be713295157cf77d8fa72379ab91
Parents: 5ce09a7
Author: aadamchik <aa...@apache.org>
Authored: Sat Nov 22 17:56:11 2014 +0300
Committer: aadamchik <aa...@apache.org>
Committed: Sat Nov 22 17:58:06 2014 +0300

----------------------------------------------------------------------
 .../configuration/ConfigurationNameMapper.java  |  35 +-
 .../configuration/DataChannelDescriptor.java    | 268 ++++---
 .../DefaultConfigurationNameMapper.java         | 186 +++--
 .../XMLDataChannelDescriptorLoader.java         | 761 +++++++++----------
 4 files changed, 589 insertions(+), 661 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/3c51a773/cayenne-server/src/main/java/org/apache/cayenne/configuration/ConfigurationNameMapper.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/ConfigurationNameMapper.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/ConfigurationNameMapper.java
index 47982fd..2b7dc51 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/ConfigurationNameMapper.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/ConfigurationNameMapper.java
@@ -25,24 +25,23 @@ import org.apache.cayenne.resource.Resource;
  */
 public interface ConfigurationNameMapper {
 
-    /**
-     * Returns the name of a configuration resource based on a naming convention for a
-     * given node type.
-     */
-    String configurationLocation(ConfigurationNode node);
+	/**
+	 * Returns the name of a configuration resource based on a naming convention
+	 * for a given node type.
+	 */
+	String configurationLocation(ConfigurationNode node);
 
-    /**
-     * Returns the name of a configuration resource based on a naming convention for a
-     * given node type.
-     */
-    String configurationLocation(Class<? extends ConfigurationNode> type, String nodeName);
+	/**
+	 * Returns the name of a configuration resource based on a naming convention
+	 * for a given node type.
+	 */
+	String configurationLocation(Class<? extends ConfigurationNode> type, String nodeName);
 
-    /**
-     * Returns a node name for a given configuration type and a configuration resource.
-     * This operation is the opposite of the {@link #configurationLocation(Class, String)}
-     * . May return null if the resource name is not following the expected naming format.
-     */
-    String configurationNodeName(
-            Class<? extends ConfigurationNode> type,
-            Resource resource);
+	/**
+	 * Returns a node name for a given configuration type and a configuration
+	 * resource. This operation is the opposite of the
+	 * {@link #configurationLocation(Class, String)} . May return null if the
+	 * resource name is not following the expected naming format.
+	 */
+	String configurationNodeName(Class<? extends ConfigurationNode> type, Resource resource);
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3c51a773/cayenne-server/src/main/java/org/apache/cayenne/configuration/DataChannelDescriptor.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/DataChannelDescriptor.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/DataChannelDescriptor.java
index 34b14b8..a64fb51 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/DataChannelDescriptor.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/DataChannelDescriptor.java
@@ -36,139 +36,137 @@ import org.apache.cayenne.util.XMLSerializable;
  * 
  * @since 3.1
  */
-public class DataChannelDescriptor implements ConfigurationNode, Serializable,
-        XMLSerializable {
-
-    protected String name;
-    protected Map<String, String> properties;
-    protected Collection<DataMap> dataMaps;
-    protected Collection<DataNodeDescriptor> nodeDescriptors;
-    protected Resource configurationSource;
-    protected String defaultNodeName;
-
-    public DataChannelDescriptor() {
-        properties = new HashMap<String, String>();
-        dataMaps = new ArrayList<DataMap>(5);
-        nodeDescriptors = new ArrayList<DataNodeDescriptor>(3);
-    }
-
-    public void encodeAsXML(XMLEncoder encoder) {
-
-        encoder.print("<domain");
-        encoder.printProjectVersion();
-        encoder.println(">");
-
-        encoder.indent(1);
-        boolean breakNeeded = false;
-
-        if (!properties.isEmpty()) {
-            breakNeeded = true;
-
-            List<String> keys = new ArrayList<String>(properties.keySet());
-            Collections.sort(keys);
-
-            for (String key : keys) {
-                encoder.printProperty(key, properties.get(key));
-            }
-        }
-
-        if (!dataMaps.isEmpty()) {
-            if (breakNeeded) {
-                encoder.println();
-            }
-            else {
-                breakNeeded = true;
-            }
-
-            List<DataMap> maps = new ArrayList<DataMap>(this.dataMaps);
-            Collections.sort(maps);
-
-            for (DataMap dataMap : maps) {
-
-                encoder.print("<map");
-                encoder.printAttribute("name", dataMap.getName().trim());
-                encoder.println("/>");
-            }
-        }
-
-        if (!nodeDescriptors.isEmpty()) {
-            if (breakNeeded) {
-                encoder.println();
-            }
-            else {
-                breakNeeded = true;
-            }
-
-            List<DataNodeDescriptor> nodes = new ArrayList<DataNodeDescriptor>(
-                    nodeDescriptors);
-            Collections.sort(nodes);
-            encoder.print(nodes);
-        }
-
-        encoder.indent(-1);
-        encoder.println("</domain>");
-    }
-
-    public <T> T acceptVisitor(ConfigurationNodeVisitor<T> visitor) {
-        return visitor.visitDataChannelDescriptor(this);
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public Map<String, String> getProperties() {
-        return properties;
-    }
-
-    public Collection<DataMap> getDataMaps() {
-        return dataMaps;
-    }
-
-    public DataMap getDataMap(String name) {
-        for (DataMap map : dataMaps) {
-            if (name.equals(map.getName())) {
-                return map;
-            }
-        }
-        return null;
-    }
-
-    public Collection<DataNodeDescriptor> getNodeDescriptors() {
-        return nodeDescriptors;
-    }
-
-    public DataNodeDescriptor getNodeDescriptor(String name) {
-        for (DataNodeDescriptor node : nodeDescriptors) {
-            if (name.equals(node.getName())) {
-                return node;
-            }
-        }
-
-        return null;
-    }
-
-    public Resource getConfigurationSource() {
-        return configurationSource;
-    }
-
-    public void setConfigurationSource(Resource configurationSource) {
-        this.configurationSource = configurationSource;
-    }
-
-    /**
-     * Returns the name of the DataNode that should be used as the default if a DataMap is
-     * not explicitly linked to a node.
-     */
-    public String getDefaultNodeName() {
-        return defaultNodeName;
-    }
-
-    public void setDefaultNodeName(String defaultDataNodeName) {
-        this.defaultNodeName = defaultDataNodeName;
-    }
+public class DataChannelDescriptor implements ConfigurationNode, Serializable, XMLSerializable {
+
+	private static final long serialVersionUID = 6567527544207035602L;
+	
+	protected String name;
+	protected Map<String, String> properties;
+	protected Collection<DataMap> dataMaps;
+	protected Collection<DataNodeDescriptor> nodeDescriptors;
+	protected Resource configurationSource;
+	protected String defaultNodeName;
+
+	public DataChannelDescriptor() {
+		properties = new HashMap<String, String>();
+		dataMaps = new ArrayList<DataMap>(5);
+		nodeDescriptors = new ArrayList<DataNodeDescriptor>(3);
+	}
+
+	public void encodeAsXML(XMLEncoder encoder) {
+
+		encoder.print("<domain");
+		encoder.printProjectVersion();
+		encoder.println(">");
+
+		encoder.indent(1);
+		boolean breakNeeded = false;
+
+		if (!properties.isEmpty()) {
+			breakNeeded = true;
+
+			List<String> keys = new ArrayList<String>(properties.keySet());
+			Collections.sort(keys);
+
+			for (String key : keys) {
+				encoder.printProperty(key, properties.get(key));
+			}
+		}
+
+		if (!dataMaps.isEmpty()) {
+			if (breakNeeded) {
+				encoder.println();
+			} else {
+				breakNeeded = true;
+			}
+
+			List<DataMap> maps = new ArrayList<DataMap>(this.dataMaps);
+			Collections.sort(maps);
+
+			for (DataMap dataMap : maps) {
+
+				encoder.print("<map");
+				encoder.printAttribute("name", dataMap.getName().trim());
+				encoder.println("/>");
+			}
+		}
+
+		if (!nodeDescriptors.isEmpty()) {
+			if (breakNeeded) {
+				encoder.println();
+			} else {
+				breakNeeded = true;
+			}
+
+			List<DataNodeDescriptor> nodes = new ArrayList<DataNodeDescriptor>(nodeDescriptors);
+			Collections.sort(nodes);
+			encoder.print(nodes);
+		}
+
+		encoder.indent(-1);
+		encoder.println("</domain>");
+	}
+
+	public <T> T acceptVisitor(ConfigurationNodeVisitor<T> visitor) {
+		return visitor.visitDataChannelDescriptor(this);
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Map<String, String> getProperties() {
+		return properties;
+	}
+
+	public Collection<DataMap> getDataMaps() {
+		return dataMaps;
+	}
+
+	public DataMap getDataMap(String name) {
+		for (DataMap map : dataMaps) {
+			if (name.equals(map.getName())) {
+				return map;
+			}
+		}
+		return null;
+	}
+
+	public Collection<DataNodeDescriptor> getNodeDescriptors() {
+		return nodeDescriptors;
+	}
+
+	public DataNodeDescriptor getNodeDescriptor(String name) {
+		for (DataNodeDescriptor node : nodeDescriptors) {
+			if (name.equals(node.getName())) {
+				return node;
+			}
+		}
+
+		return null;
+	}
+
+	public Resource getConfigurationSource() {
+		return configurationSource;
+	}
+
+	public void setConfigurationSource(Resource configurationSource) {
+		this.configurationSource = configurationSource;
+	}
+
+	/**
+	 * Returns the name of the DataNode that should be used as the default if a
+	 * DataMap is not explicitly linked to a node.
+	 */
+	public String getDefaultNodeName() {
+		return defaultNodeName;
+	}
+
+	public void setDefaultNodeName(String defaultDataNodeName) {
+		this.defaultNodeName = defaultDataNodeName;
+	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3c51a773/cayenne-server/src/main/java/org/apache/cayenne/configuration/DefaultConfigurationNameMapper.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/DefaultConfigurationNameMapper.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/DefaultConfigurationNameMapper.java
index ba7dcd4..ffe2868 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/DefaultConfigurationNameMapper.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/DefaultConfigurationNameMapper.java
@@ -26,100 +26,94 @@ import org.apache.cayenne.resource.Resource;
  */
 public class DefaultConfigurationNameMapper implements ConfigurationNameMapper {
 
-    private static final String CAYENNE_PREFIX = "cayenne-";
-    private static final String CAYENNE_SUFFIX = ".xml";
-
-    private static final String DATA_MAP_SUFFIX = ".map.xml";
-
-    protected ConfigurationNodeVisitor<String> nameMapper;
-
-    public DefaultConfigurationNameMapper() {
-        nameMapper = new NameMapper();
-    }
-
-    public String configurationLocation(ConfigurationNode node) {
-        return node.acceptVisitor(nameMapper);
-    }
-
-    public String configurationLocation(
-            Class<? extends ConfigurationNode> type,
-            String name) {
-        if (DataChannelDescriptor.class.isAssignableFrom(type)) {
-            return getDataChannelName(name);
-        }
-        else if (DataMap.class.isAssignableFrom(type)) {
-            return getDataMapName(name);
-        }
-
-        throw new IllegalArgumentException("Unrecognized configuration type: "
-                + type.getName());
-    }
-
-    public String configurationNodeName(
-            Class<? extends ConfigurationNode> type,
-            Resource resource) {
-
-        String path = resource.getURL().getPath();
-        if (path == null || path.length() == 0) {
-            return null;
-        }
-
-        int lastSlash = path.lastIndexOf('/');
-        if (lastSlash >= 0) {
-
-            if (lastSlash == path.length() - 1) {
-                return null;
-            }
-
-            path = path.substring(lastSlash + 1);
-
-        }
-
-        if (DataChannelDescriptor.class.isAssignableFrom(type)) {
-            if (!path.startsWith(CAYENNE_PREFIX) || !path.endsWith(CAYENNE_SUFFIX)) {
-                return null;
-            }
-
-            return path.substring(CAYENNE_PREFIX.length(), path.length()
-                    - CAYENNE_SUFFIX.length());
-        }
-        else if (DataMap.class.isAssignableFrom(type)) {
-            if (!path.endsWith(DATA_MAP_SUFFIX)) {
-                return null;
-            }
-            return path.substring(0, path.length() - DATA_MAP_SUFFIX.length());
-        }
-
-        throw new IllegalArgumentException("Unrecognized configuration type: "
-                + type.getName());
-    }
-
-    protected String getDataChannelName(String name) {
-        if (name == null) {
-            throw new NullPointerException("Null DataChannelDescriptor name");
-        }
-
-        return CAYENNE_PREFIX + name + CAYENNE_SUFFIX;
-    }
-
-    protected String getDataMapName(String name) {
-        if (name == null) {
-            throw new NullPointerException("Null DataMap name");
-        }
-
-        return name + DATA_MAP_SUFFIX;
-    }
-
-    final class NameMapper extends BaseConfigurationNodeVisitor<String> {
-
-        @Override
-        public String visitDataChannelDescriptor(DataChannelDescriptor descriptor) {
-            return getDataChannelName(descriptor.getName());
-        }
-
-        @Override
-        public String visitDataMap(DataMap dataMap) {
-            return getDataMapName(dataMap.getName());
-        }
-    }
+	private static final String CAYENNE_PREFIX = "cayenne-";
+	private static final String CAYENNE_SUFFIX = ".xml";
+
+	private static final String DATA_MAP_SUFFIX = ".map.xml";
+
+	protected ConfigurationNodeVisitor<String> nameMapper;
+
+	public DefaultConfigurationNameMapper() {
+		nameMapper = new NameMapper();
+	}
+
+	@Override
+	public String configurationLocation(ConfigurationNode node) {
+		return node.acceptVisitor(nameMapper);
+	}
+
+	@Override
+	public String configurationLocation(Class<? extends ConfigurationNode> type, String name) {
+		if (DataChannelDescriptor.class.isAssignableFrom(type)) {
+			return getDataChannelName(name);
+		} else if (DataMap.class.isAssignableFrom(type)) {
+			return getDataMapName(name);
+		}
+
+		throw new IllegalArgumentException("Unrecognized configuration type: " + type.getName());
+	}
+
+	@Override
+	public String configurationNodeName(Class<? extends ConfigurationNode> type, Resource resource) {
+
+		String path = resource.getURL().getPath();
+		if (path == null || path.length() == 0) {
+			return null;
+		}
+
+		int lastSlash = path.lastIndexOf('/');
+		if (lastSlash >= 0) {
+
+			if (lastSlash == path.length() - 1) {
+				return null;
+			}
+
+			path = path.substring(lastSlash + 1);
+
+		}
+
+		if (DataChannelDescriptor.class.isAssignableFrom(type)) {
+			if (!path.startsWith(CAYENNE_PREFIX) || !path.endsWith(CAYENNE_SUFFIX)) {
+				return null;
+			}
+
+			return path.substring(CAYENNE_PREFIX.length(), path.length() - CAYENNE_SUFFIX.length());
+		} else if (DataMap.class.isAssignableFrom(type)) {
+			if (!path.endsWith(DATA_MAP_SUFFIX)) {
+				return null;
+			}
+			return path.substring(0, path.length() - DATA_MAP_SUFFIX.length());
+		}
+
+		throw new IllegalArgumentException("Unrecognized configuration type: " + type.getName());
+	}
+
+	protected String getDataChannelName(String name) {
+		if (name == null) {
+			throw new NullPointerException("Null DataChannelDescriptor name");
+		}
+
+		return CAYENNE_PREFIX + name + CAYENNE_SUFFIX;
+	}
+
+	protected String getDataMapName(String name) {
+		if (name == null) {
+			throw new NullPointerException("Null DataMap name");
+		}
+
+		return name + DATA_MAP_SUFFIX;
+	}
+
+	final class NameMapper extends BaseConfigurationNodeVisitor<String> {
+
+		@Override
+		public String visitDataChannelDescriptor(DataChannelDescriptor descriptor) {
+			return getDataChannelName(descriptor.getName());
+		}
+
+		@Override
+		public String visitDataMap(DataMap dataMap) {
+			return getDataMapName(dataMap.getName());
+		}
+	}
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/3c51a773/cayenne-server/src/main/java/org/apache/cayenne/configuration/XMLDataChannelDescriptorLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/XMLDataChannelDescriptorLoader.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/XMLDataChannelDescriptorLoader.java
index 7231dfe..420c43c 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/XMLDataChannelDescriptorLoader.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/XMLDataChannelDescriptorLoader.java
@@ -44,416 +44,353 @@ import org.xml.sax.XMLReader;
  */
 public class XMLDataChannelDescriptorLoader implements DataChannelDescriptorLoader {
 
-    private static Log logger = LogFactory.getLog(XMLDataChannelDescriptorLoader.class);
-
-    static final String DOMAIN_TAG = "domain";
-    static final String MAP_TAG = "map";
-    static final String NODE_TAG = "node";
-    static final String PROPERTY_TAG = "property";
-    static final String MAP_REF_TAG = "map-ref";
-    static final String DATA_SOURCE_TAG = "data-source";
-
-    /**
-     * @deprecated the caller should use password resolving strategy instead of resolving
-     *             the password on the spot. For one thing this can be used in the Modeler
-     *             and no password may be available.
-     */
-    @Deprecated
-    private static String passwordFromURL(URL url) {
-        InputStream inputStream = null;
-        String password = null;
-
-        try {
-            inputStream = url.openStream();
-            password = passwordFromInputStream(inputStream);
-        }
-        catch (IOException exception) {
-            // Log the error while trying to open the stream. A null
-            // password will be returned as a result.
-            logger.warn(exception);
-        }
-
-        return password;
-    }
-
-    /**
-     * @deprecated the caller should use password resolving strategy instead of resolving
-     *             the password on the spot. For one thing this can be used in the Modeler
-     *             and no password may be available.
-     */
-    @Deprecated
-    private static String passwordFromInputStream(InputStream inputStream) {
-        BufferedReader bufferedReader = null;
-        String password = null;
-
-        try {
-            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
-            password = bufferedReader.readLine();
-        }
-        catch (IOException exception) {
-            logger.warn(exception);
-        }
-        finally {
-            try {
-                if (bufferedReader != null) {
-                    bufferedReader.close();
-                }
-            }
-            catch (Exception exception) {
-            }
-
-            try {
-                inputStream.close();
-            }
-            catch (IOException exception) {
-            }
-        }
-
-        return password;
-    }
-
-    @Inject
-    protected DataMapLoader dataMapLoader;
-
-    @Inject
-    protected ConfigurationNameMapper nameMapper;
-    
-    @Inject
-    protected AdhocObjectFactory objectFactory;
-
-    public ConfigurationTree<DataChannelDescriptor> load(Resource configurationResource)
-            throws ConfigurationException {
-
-        if (configurationResource == null) {
-            throw new NullPointerException("Null configurationResource");
-        }
-
-        URL configurationURL = configurationResource.getURL();
-
-        logger.info("Loading XML configuration resource from " + configurationURL);
-
-        DataChannelDescriptor descriptor = new DataChannelDescriptor();
-        descriptor.setConfigurationSource(configurationResource);
-        descriptor.setName(nameMapper.configurationNodeName(
-                DataChannelDescriptor.class,
-                configurationResource));
-
-        DataChannelHandler rootHandler;
-
-        InputStream in = null;
-
-        try {
-            in = configurationURL.openStream();
-            XMLReader parser = Util.createXmlReader();
-
-            rootHandler = new DataChannelHandler(descriptor, parser);
-            parser.setContentHandler(rootHandler);
-            parser.setErrorHandler(rootHandler);
-            parser.parse(new InputSource(in));
-        }
-        catch (Exception e) {
-            throw new ConfigurationException(
-                    "Error loading configuration from %s",
-                    e,
-                    configurationURL);
-        }
-        finally {
-            try {
-                if (in != null) {
-                    in.close();
-                }
-            }
-            catch (IOException ioex) {
-                logger.info("failure closing input stream for "
-                        + configurationURL
-                        + ", ignoring", ioex);
-            }
-        }
-
-        // TODO: andrus 03/10/2010 - actually provide load failures here...
-        return new ConfigurationTree<DataChannelDescriptor>(descriptor, null);
-    }
-
-    final class DataChannelHandler extends SAXNestedTagHandler {
-
-        private DataChannelDescriptor descriptor;
-
-        DataChannelHandler(DataChannelDescriptor dataChannelDescriptor, XMLReader parser) {
-            super(parser, null);
-            this.descriptor = dataChannelDescriptor;
-        }
-
-        @Override
-        protected ContentHandler createChildTagHandler(
-                String namespaceURI,
-                String localName,
-                String name,
-                Attributes attributes) {
-
-            if (localName.equals(DOMAIN_TAG)) {
-                return new DataChannelChildrenHandler(parser, this);
-            }
-
-            logger.info(unexpectedTagMessage(localName, DOMAIN_TAG));
-            return super.createChildTagHandler(namespaceURI, localName, name, attributes);
-        }
-    }
-
-    final class DataChannelChildrenHandler extends SAXNestedTagHandler {
-
-        private DataChannelDescriptor descriptor;
-
-        DataChannelChildrenHandler(XMLReader parser, DataChannelHandler parentHandler) {
-            super(parser, parentHandler);
-            this.descriptor = parentHandler.descriptor;
-        }
-
-        @Override
-        protected ContentHandler createChildTagHandler(
-                String namespaceURI,
-                String localName,
-                String name,
-                Attributes attributes) {
-
-            if (localName.equals(PROPERTY_TAG)) {
-
-                String key = attributes.getValue("", "name");
-                String value = attributes.getValue("", "value");
-                if (key != null && value != null) {
-                    descriptor.getProperties().put(key, value);
-                }
-            }
-            else if (localName.equals(MAP_TAG)) {
-
-                String dataMapName = attributes.getValue("", "name");
-                Resource baseResource = descriptor.getConfigurationSource();
-
-                String dataMapLocation = nameMapper.configurationLocation(
-                        DataMap.class,
-                        dataMapName);
-
-                Resource dataMapResource = baseResource
-                        .getRelativeResource(dataMapLocation);
-
-                logger.info("Loading XML DataMap resource from " + dataMapResource.getURL());
-
-                DataMap dataMap = dataMapLoader.load(dataMapResource);
-                dataMap.setName(dataMapName);
-                dataMap.setLocation(dataMapLocation);
-                dataMap.setConfigurationSource(dataMapResource);
-                dataMap.setDataChannelDescriptor(descriptor);
-
-                descriptor.getDataMaps().add(dataMap);
-            }
-            else if (localName.equals(NODE_TAG)) {
-
-                String nodeName = attributes.getValue("", "name");
-                if (nodeName == null) {
-                    throw new ConfigurationException("Error: <node> without 'name'.");
-                }
-
-                DataNodeDescriptor nodeDescriptor = new DataNodeDescriptor();
-                nodeDescriptor
-                        .setConfigurationSource(descriptor.getConfigurationSource());
-                descriptor.getNodeDescriptors().add(nodeDescriptor);
-
-                nodeDescriptor.setName(nodeName);
-                nodeDescriptor.setAdapterType(attributes.getValue("", "adapter"));
-
-                String parameters = attributes.getValue("", "parameters");
-                nodeDescriptor.setParameters(parameters);
-
-                String dataSourceFactory = attributes.getValue("", "factory");
-                nodeDescriptor.setDataSourceFactoryType(dataSourceFactory);
-                nodeDescriptor.setSchemaUpdateStrategyType(attributes.getValue(
-                        "",
-                        "schema-update-strategy"));
-                nodeDescriptor.setDataChannelDescriptor(descriptor);
-
-                return new DataNodeChildrenHandler(parser, this, nodeDescriptor);
-            }
-
-            return super.createChildTagHandler(namespaceURI, localName, name, attributes);
-        }
-    }
-
-    final class DataNodeChildrenHandler extends SAXNestedTagHandler {
-
-        private DataNodeDescriptor nodeDescriptor;
-
-        DataNodeChildrenHandler(XMLReader parser, SAXNestedTagHandler parentHandler,
-                DataNodeDescriptor nodeDescriptor) {
-            super(parser, parentHandler);
-            this.nodeDescriptor = nodeDescriptor;
-        }
-
-        @Override
-        protected ContentHandler createChildTagHandler(
-                String namespaceURI,
-                String localName,
-                String name,
-                Attributes attributes) {
-
-            if (localName.equals(MAP_REF_TAG)) {
-
-                String mapName = attributes.getValue("", "name");
-                nodeDescriptor.getDataMapNames().add(mapName);
-            }
-            else if (localName.equals(DATA_SOURCE_TAG)) {
-
-                DataSourceInfo dataSourceDescriptor = new DataSourceInfo();
-                nodeDescriptor.setDataSourceDescriptor(dataSourceDescriptor);
-                return new DataSourceChildrenHandler(parser, this, dataSourceDescriptor);
-            }
-
-            return super.createChildTagHandler(namespaceURI, localName, name, attributes);
-        }
-    }
-
-    class DataSourceChildrenHandler extends SAXNestedTagHandler {
-
-        private DataSourceInfo dataSourceDescriptor;
-
-        DataSourceChildrenHandler(XMLReader parser,
-                DataNodeChildrenHandler parentHandler, DataSourceInfo dataSourceDescriptor) {
-            super(parser, parentHandler);
-            this.dataSourceDescriptor = dataSourceDescriptor;
-        }
-
-        @Override
-        protected ContentHandler createChildTagHandler(
-                String namespaceURI,
-                String localName,
-                String name,
-                Attributes attributes) {
-
-            if (localName.equals("driver")) {
-                String className = attributes.getValue("", "value");
-                dataSourceDescriptor.setJdbcDriver(className);
-            }
-            else if (localName.equals("login")) {
-
-                logger.info("loading user name and password.");
-
-                String encoderClass = attributes.getValue("encoderClass");
-
-                String encoderKey = attributes.getValue("encoderKey");
-                if (encoderKey == null) {
-                    encoderKey = attributes.getValue("encoderSalt");
-                }
-
-                String password = attributes.getValue("password");
-                String passwordLocation = attributes.getValue("passwordLocation");
-                String passwordSource = attributes.getValue("passwordSource");
-                if (passwordSource == null) {
-                    passwordSource = DataSourceInfo.PASSWORD_LOCATION_MODEL;
-                }
-
-                String username = attributes.getValue("userName");
-
-                dataSourceDescriptor.setPasswordEncoderClass(encoderClass);
-                dataSourceDescriptor.setPasswordEncoderKey(encoderKey);
-                dataSourceDescriptor.setPasswordLocation(passwordLocation);
-                dataSourceDescriptor.setPasswordSource(passwordSource);
-                dataSourceDescriptor.setUserName(username);
-
-                // Replace {} in passwordSource with encoderSalt -- useful for EXECUTABLE
-                // & URL options
-                if (encoderKey != null) {
-                    passwordSource = passwordSource.replaceAll("\\{\\}", encoderKey);
-                }
-
-                String encoderType = dataSourceDescriptor.getPasswordEncoderClass();
-                PasswordEncoding passwordEncoder = null;
-                if (encoderType != null) {
-                    passwordEncoder = objectFactory.newInstance(PasswordEncoding.class, encoderType);
-                }
-
-                if (passwordLocation != null) {
-                    if (passwordLocation
-                            .equals(DataSourceInfo.PASSWORD_LOCATION_CLASSPATH)) {
-
-                        ClassLoader classLoader = Thread
-                                .currentThread()
-                                .getContextClassLoader();
-                        URL url = classLoader.getResource(username);
-                        if (url != null) {
-                            password = passwordFromURL(url);
-                        }
-                        else {
-                            logger.error("Could not find resource in CLASSPATH: "
-                                    + passwordSource);
-                        }
-                    }
-                    else if (passwordLocation
-                            .equals(DataSourceInfo.PASSWORD_LOCATION_URL)) {
-                        try {
-                            password = passwordFromURL(new URL(passwordSource));
-                        }
-                        catch (MalformedURLException exception) {
-                            logger.warn(exception);
-                        }
-                    }
-                    else if (passwordLocation
-                            .equals(DataSourceInfo.PASSWORD_LOCATION_EXECUTABLE)) {
-                        if (passwordSource != null) {
-                            try {
-                                Process process = Runtime.getRuntime().exec(
-                                        passwordSource);
-                                password = passwordFromInputStream(process
-                                        .getInputStream());
-                                process.waitFor();
-                            }
-                            catch (IOException exception) {
-                                logger.warn(exception);
-                            }
-                            catch (InterruptedException exception) {
-                                logger.warn(exception);
-                            }
-                        }
-                    }
-                }
-
-                if (password != null && passwordEncoder != null) {
-                    dataSourceDescriptor.setPassword(passwordEncoder.decodePassword(
-                            password,
-                            encoderKey));
-                }
-            }
-            else if (localName.equals("url")) {
-                dataSourceDescriptor.setDataSourceUrl(attributes.getValue("value"));
-            }
-            else if (localName.equals("connectionPool")) {
-                String min = attributes.getValue("min");
-                if (min != null) {
-                    try {
-                        dataSourceDescriptor.setMinConnections(Integer.parseInt(min));
-                    }
-                    catch (NumberFormatException nfex) {
-                        logger.info("Non-numeric 'min' attribute", nfex);
-                        throw new ConfigurationException(
-                                "Non-numeric 'min' attribute '%s'",
-                                nfex,
-                                min);
-                    }
-                }
-
-                String max = attributes.getValue("max");
-                if (max != null) {
-                    try {
-                        dataSourceDescriptor.setMaxConnections(Integer.parseInt(max));
-                    }
-                    catch (NumberFormatException nfex) {
-                        logger.info("Non-numeric 'max' attribute", nfex);
-                        throw new ConfigurationException(
-                                "Non-numeric 'max' attribute '%s'",
-                                nfex,
-                                max);
-                    }
-                }
-            }
-
-            return super.createChildTagHandler(namespaceURI, localName, name, attributes);
-        }
-    }
+	private static Log logger = LogFactory.getLog(XMLDataChannelDescriptorLoader.class);
+
+	static final String DOMAIN_TAG = "domain";
+	static final String MAP_TAG = "map";
+	static final String NODE_TAG = "node";
+	static final String PROPERTY_TAG = "property";
+	static final String MAP_REF_TAG = "map-ref";
+	static final String DATA_SOURCE_TAG = "data-source";
+
+	/**
+	 * @deprecated the caller should use password resolving strategy instead of
+	 *             resolving the password on the spot. For one thing this can be
+	 *             used in the Modeler and no password may be available.
+	 */
+	@Deprecated
+	private static String passwordFromURL(URL url) {
+		InputStream inputStream = null;
+		String password = null;
+
+		try {
+			inputStream = url.openStream();
+			password = passwordFromInputStream(inputStream);
+		} catch (IOException exception) {
+			// Log the error while trying to open the stream. A null
+			// password will be returned as a result.
+			logger.warn(exception);
+		}
+
+		return password;
+	}
+
+	/**
+	 * @deprecated the caller should use password resolving strategy instead of
+	 *             resolving the password on the spot. For one thing this can be
+	 *             used in the Modeler and no password may be available.
+	 */
+	@Deprecated
+	private static String passwordFromInputStream(InputStream inputStream) {
+		BufferedReader bufferedReader = null;
+		String password = null;
+
+		try {
+			bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
+			password = bufferedReader.readLine();
+		} catch (IOException exception) {
+			logger.warn(exception);
+		} finally {
+			try {
+				if (bufferedReader != null) {
+					bufferedReader.close();
+				}
+			} catch (Exception exception) {
+			}
+
+			try {
+				inputStream.close();
+			} catch (IOException exception) {
+			}
+		}
+
+		return password;
+	}
+
+	@Inject
+	protected DataMapLoader dataMapLoader;
+
+	@Inject
+	protected ConfigurationNameMapper nameMapper;
+
+	@Inject
+	protected AdhocObjectFactory objectFactory;
+
+	@Override
+	public ConfigurationTree<DataChannelDescriptor> load(Resource configurationResource) throws ConfigurationException {
+
+		if (configurationResource == null) {
+			throw new NullPointerException("Null configurationResource");
+		}
+
+		URL configurationURL = configurationResource.getURL();
+
+		logger.info("Loading XML configuration resource from " + configurationURL);
+
+		DataChannelDescriptor descriptor = new DataChannelDescriptor();
+		descriptor.setConfigurationSource(configurationResource);
+		descriptor.setName(nameMapper.configurationNodeName(DataChannelDescriptor.class, configurationResource));
+
+		DataChannelHandler rootHandler;
+
+		InputStream in = null;
+
+		try {
+			in = configurationURL.openStream();
+			XMLReader parser = Util.createXmlReader();
+
+			rootHandler = new DataChannelHandler(descriptor, parser);
+			parser.setContentHandler(rootHandler);
+			parser.setErrorHandler(rootHandler);
+			parser.parse(new InputSource(in));
+		} catch (Exception e) {
+			throw new ConfigurationException("Error loading configuration from %s", e, configurationURL);
+		} finally {
+			try {
+				if (in != null) {
+					in.close();
+				}
+			} catch (IOException ioex) {
+				logger.info("failure closing input stream for " + configurationURL + ", ignoring", ioex);
+			}
+		}
+
+		// TODO: andrus 03/10/2010 - actually provide load failures here...
+		return new ConfigurationTree<DataChannelDescriptor>(descriptor, null);
+	}
+
+	final class DataChannelHandler extends SAXNestedTagHandler {
+
+		private DataChannelDescriptor descriptor;
+
+		DataChannelHandler(DataChannelDescriptor dataChannelDescriptor, XMLReader parser) {
+			super(parser, null);
+			this.descriptor = dataChannelDescriptor;
+		}
+
+		@Override
+		protected ContentHandler createChildTagHandler(String namespaceURI, String localName, String name,
+				Attributes attributes) {
+
+			if (localName.equals(DOMAIN_TAG)) {
+				return new DataChannelChildrenHandler(parser, this);
+			}
+
+			logger.info(unexpectedTagMessage(localName, DOMAIN_TAG));
+			return super.createChildTagHandler(namespaceURI, localName, name, attributes);
+		}
+	}
+
+	final class DataChannelChildrenHandler extends SAXNestedTagHandler {
+
+		private DataChannelDescriptor descriptor;
+
+		DataChannelChildrenHandler(XMLReader parser, DataChannelHandler parentHandler) {
+			super(parser, parentHandler);
+			this.descriptor = parentHandler.descriptor;
+		}
+
+		@Override
+		protected ContentHandler createChildTagHandler(String namespaceURI, String localName, String name,
+				Attributes attributes) {
+
+			if (localName.equals(PROPERTY_TAG)) {
+
+				String key = attributes.getValue("", "name");
+				String value = attributes.getValue("", "value");
+				if (key != null && value != null) {
+					descriptor.getProperties().put(key, value);
+				}
+			} else if (localName.equals(MAP_TAG)) {
+
+				String dataMapName = attributes.getValue("", "name");
+				Resource baseResource = descriptor.getConfigurationSource();
+
+				String dataMapLocation = nameMapper.configurationLocation(DataMap.class, dataMapName);
+
+				Resource dataMapResource = baseResource.getRelativeResource(dataMapLocation);
+
+				logger.info("Loading XML DataMap resource from " + dataMapResource.getURL());
+
+				DataMap dataMap = dataMapLoader.load(dataMapResource);
+				dataMap.setName(dataMapName);
+				dataMap.setLocation(dataMapLocation);
+				dataMap.setConfigurationSource(dataMapResource);
+				dataMap.setDataChannelDescriptor(descriptor);
+
+				descriptor.getDataMaps().add(dataMap);
+			} else if (localName.equals(NODE_TAG)) {
+
+				String nodeName = attributes.getValue("", "name");
+				if (nodeName == null) {
+					throw new ConfigurationException("Error: <node> without 'name'.");
+				}
+
+				DataNodeDescriptor nodeDescriptor = new DataNodeDescriptor();
+				nodeDescriptor.setConfigurationSource(descriptor.getConfigurationSource());
+				descriptor.getNodeDescriptors().add(nodeDescriptor);
+
+				nodeDescriptor.setName(nodeName);
+				nodeDescriptor.setAdapterType(attributes.getValue("", "adapter"));
+
+				String parameters = attributes.getValue("", "parameters");
+				nodeDescriptor.setParameters(parameters);
+
+				String dataSourceFactory = attributes.getValue("", "factory");
+				nodeDescriptor.setDataSourceFactoryType(dataSourceFactory);
+				nodeDescriptor.setSchemaUpdateStrategyType(attributes.getValue("", "schema-update-strategy"));
+				nodeDescriptor.setDataChannelDescriptor(descriptor);
+
+				return new DataNodeChildrenHandler(parser, this, nodeDescriptor);
+			}
+
+			return super.createChildTagHandler(namespaceURI, localName, name, attributes);
+		}
+	}
+
+	final class DataNodeChildrenHandler extends SAXNestedTagHandler {
+
+		private DataNodeDescriptor nodeDescriptor;
+
+		DataNodeChildrenHandler(XMLReader parser, SAXNestedTagHandler parentHandler, DataNodeDescriptor nodeDescriptor) {
+			super(parser, parentHandler);
+			this.nodeDescriptor = nodeDescriptor;
+		}
+
+		@Override
+		protected ContentHandler createChildTagHandler(String namespaceURI, String localName, String name,
+				Attributes attributes) {
+
+			if (localName.equals(MAP_REF_TAG)) {
+
+				String mapName = attributes.getValue("", "name");
+				nodeDescriptor.getDataMapNames().add(mapName);
+			} else if (localName.equals(DATA_SOURCE_TAG)) {
+
+				DataSourceInfo dataSourceDescriptor = new DataSourceInfo();
+				nodeDescriptor.setDataSourceDescriptor(dataSourceDescriptor);
+				return new DataSourceChildrenHandler(parser, this, dataSourceDescriptor);
+			}
+
+			return super.createChildTagHandler(namespaceURI, localName, name, attributes);
+		}
+	}
+
+	class DataSourceChildrenHandler extends SAXNestedTagHandler {
+
+		private DataSourceInfo dataSourceDescriptor;
+
+		DataSourceChildrenHandler(XMLReader parser, DataNodeChildrenHandler parentHandler,
+				DataSourceInfo dataSourceDescriptor) {
+			super(parser, parentHandler);
+			this.dataSourceDescriptor = dataSourceDescriptor;
+		}
+
+		@Override
+		protected ContentHandler createChildTagHandler(String namespaceURI, String localName, String name,
+				Attributes attributes) {
+
+			if (localName.equals("driver")) {
+				String className = attributes.getValue("", "value");
+				dataSourceDescriptor.setJdbcDriver(className);
+			} else if (localName.equals("login")) {
+
+				logger.info("loading user name and password.");
+
+				String encoderClass = attributes.getValue("encoderClass");
+
+				String encoderKey = attributes.getValue("encoderKey");
+				if (encoderKey == null) {
+					encoderKey = attributes.getValue("encoderSalt");
+				}
+
+				String password = attributes.getValue("password");
+				String passwordLocation = attributes.getValue("passwordLocation");
+				String passwordSource = attributes.getValue("passwordSource");
+				if (passwordSource == null) {
+					passwordSource = DataSourceInfo.PASSWORD_LOCATION_MODEL;
+				}
+
+				String username = attributes.getValue("userName");
+
+				dataSourceDescriptor.setPasswordEncoderClass(encoderClass);
+				dataSourceDescriptor.setPasswordEncoderKey(encoderKey);
+				dataSourceDescriptor.setPasswordLocation(passwordLocation);
+				dataSourceDescriptor.setPasswordSource(passwordSource);
+				dataSourceDescriptor.setUserName(username);
+
+				// Replace {} in passwordSource with encoderSalt -- useful for
+				// EXECUTABLE
+				// & URL options
+				if (encoderKey != null) {
+					passwordSource = passwordSource.replaceAll("\\{\\}", encoderKey);
+				}
+
+				String encoderType = dataSourceDescriptor.getPasswordEncoderClass();
+				PasswordEncoding passwordEncoder = null;
+				if (encoderType != null) {
+					passwordEncoder = objectFactory.newInstance(PasswordEncoding.class, encoderType);
+				}
+
+				if (passwordLocation != null) {
+					if (passwordLocation.equals(DataSourceInfo.PASSWORD_LOCATION_CLASSPATH)) {
+
+						ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+						URL url = classLoader.getResource(username);
+						if (url != null) {
+							password = passwordFromURL(url);
+						} else {
+							logger.error("Could not find resource in CLASSPATH: " + passwordSource);
+						}
+					} else if (passwordLocation.equals(DataSourceInfo.PASSWORD_LOCATION_URL)) {
+						try {
+							password = passwordFromURL(new URL(passwordSource));
+						} catch (MalformedURLException exception) {
+							logger.warn(exception);
+						}
+					} else if (passwordLocation.equals(DataSourceInfo.PASSWORD_LOCATION_EXECUTABLE)) {
+						if (passwordSource != null) {
+							try {
+								Process process = Runtime.getRuntime().exec(passwordSource);
+								password = passwordFromInputStream(process.getInputStream());
+								process.waitFor();
+							} catch (IOException exception) {
+								logger.warn(exception);
+							} catch (InterruptedException exception) {
+								logger.warn(exception);
+							}
+						}
+					}
+				}
+
+				if (password != null && passwordEncoder != null) {
+					dataSourceDescriptor.setPassword(passwordEncoder.decodePassword(password, encoderKey));
+				}
+			} else if (localName.equals("url")) {
+				dataSourceDescriptor.setDataSourceUrl(attributes.getValue("value"));
+			} else if (localName.equals("connectionPool")) {
+				String min = attributes.getValue("min");
+				if (min != null) {
+					try {
+						dataSourceDescriptor.setMinConnections(Integer.parseInt(min));
+					} catch (NumberFormatException nfex) {
+						logger.info("Non-numeric 'min' attribute", nfex);
+						throw new ConfigurationException("Non-numeric 'min' attribute '%s'", nfex, min);
+					}
+				}
+
+				String max = attributes.getValue("max");
+				if (max != null) {
+					try {
+						dataSourceDescriptor.setMaxConnections(Integer.parseInt(max));
+					} catch (NumberFormatException nfex) {
+						logger.info("Non-numeric 'max' attribute", nfex);
+						throw new ConfigurationException("Non-numeric 'max' attribute '%s'", nfex, max);
+					}
+				}
+			}
+
+			return super.createChildTagHandler(namespaceURI, localName, name, attributes);
+		}
+	}
 }