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:24 UTC
[1/2] cayenne git commit: javadocs
Repository: cayenne
Updated Branches:
refs/heads/master 84b751436 -> 3c51a773c
javadocs
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/5ce09a7b
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/5ce09a7b
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/5ce09a7b
Branch: refs/heads/master
Commit: 5ce09a7b7b708a6310e96ae4b18a887fea8baa02
Parents: 84b7514
Author: aadamchik <aa...@apache.org>
Authored: Sat Nov 22 17:45:50 2014 +0300
Committer: aadamchik <aa...@apache.org>
Committed: Sat Nov 22 17:47:13 2014 +0300
----------------------------------------------------------------------
.../server/ServerRuntimeBuilder.java | 310 ++++++++++---------
1 file changed, 166 insertions(+), 144 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/5ce09a7b/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/ServerRuntimeBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/ServerRuntimeBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/ServerRuntimeBuilder.java
index 8b0263d..01115b7 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/ServerRuntimeBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/ServerRuntimeBuilder.java
@@ -40,148 +40,170 @@ import org.apache.cayenne.di.Module;
*/
public class ServerRuntimeBuilder {
- private Collection<String> configs;
- private List<Module> modules;
- private DataSourceFactory dataSourceFactory;
- private String jdbcUrl;
- private String jdbcDriver;
- private String jdbcUser;
- private String jdbcPassword;
- private int jdbcMinConnections;
- private int jdbcMaxConnections;
-
- public ServerRuntimeBuilder() {
- this.configs = new LinkedHashSet<String>();
- this.modules = new ArrayList<Module>();
- }
-
- public ServerRuntimeBuilder(String configurationLocation) {
- this();
- addConfig(configurationLocation);
- }
-
- /**
- * Sets a DataSource that will override any DataSources found in the
- * mapping. Moreover if the mapping contains no DataNodes, and the
- * DataSource is set with this method, the builder would create a single
- * default DataNode.
- */
- public ServerRuntimeBuilder dataSource(DataSource dataSource) {
- this.dataSourceFactory = new FixedDataSourceFactory(dataSource);
- return this;
- }
-
- public ServerRuntimeBuilder jndiDataSource(String location) {
- this.dataSourceFactory = new FixedJNDIDataSourceFactory(location);
- return this;
- }
-
- public ServerRuntimeBuilder url(String url) {
- this.jdbcUrl = url;
- return this;
- }
-
- public ServerRuntimeBuilder jdbcDriver(String driver) {
- // TODO: guess the driver from URL
- this.jdbcDriver = driver;
- return this;
- }
-
- public ServerRuntimeBuilder user(String user) {
- this.jdbcUser = user;
- return this;
- }
-
- public ServerRuntimeBuilder password(String password) {
- this.jdbcPassword = password;
- return this;
- }
-
- public ServerRuntimeBuilder minConnections(int minConnections) {
- this.jdbcMinConnections = minConnections;
- return this;
- }
-
- public ServerRuntimeBuilder maxConnections(int maxConnections) {
- this.jdbcMaxConnections = maxConnections;
- return this;
- }
-
- public ServerRuntimeBuilder addConfig(String configurationLocation) {
- configs.add(configurationLocation);
- return this;
- }
-
- public ServerRuntimeBuilder addConfigs(Collection<String> configurationLocations) {
- configs.addAll(configurationLocations);
- return this;
- }
-
- public ServerRuntimeBuilder addModule(Module module) {
- modules.add(module);
- return this;
- }
-
- public ServerRuntimeBuilder addModules(Collection<Module> modules) {
- this.modules.addAll(modules);
- return this;
- }
-
- public ServerRuntime build() {
-
- buildModules();
-
- String[] configs = this.configs.toArray(new String[this.configs.size()]);
- Module[] modules = this.modules.toArray(new Module[this.modules.size()]);
- return new ServerRuntime(configs, modules);
- }
-
- private void buildModules() {
-
- if (dataSourceFactory != null) {
-
- prepend(new Module() {
- @Override
- public void configure(Binder binder) {
- binder.bind(DataDomain.class).toProvider(SyntheticNodeDataDomainProvider.class);
- binder.bind(DataSourceFactory.class).toInstance(dataSourceFactory);
- }
- });
-
- }
- // URL and driver are the minimal requirement for
- // DelegatingDataSourceFactory to work
- else if (jdbcUrl != null && jdbcDriver != null) {
- prepend(new Module() {
- @Override
- public void configure(Binder binder) {
- binder.bind(DataDomain.class).toProvider(SyntheticNodeDataDomainProvider.class);
- MapBuilder<Object> props = binder.bindMap(Constants.PROPERTIES_MAP)
- .put(Constants.JDBC_DRIVER_PROPERTY, jdbcDriver).put(Constants.JDBC_URL_PROPERTY, jdbcUrl);
-
- if (jdbcUser != null) {
- props.put(Constants.JDBC_USERNAME_PROPERTY, jdbcUser);
- }
-
- if (jdbcPassword != null) {
- props.put(Constants.JDBC_PASSWORD_PROPERTY, jdbcPassword);
- }
-
- if (jdbcMinConnections > 0) {
- props.put(Constants.JDBC_MIN_CONNECTIONS_PROPERTY, Integer.toString(jdbcMinConnections));
- }
-
- if (jdbcMaxConnections > 0) {
- props.put(Constants.JDBC_MAX_CONNECTIONS_PROPERTY, Integer.toString(jdbcMaxConnections));
- }
- }
- });
- }
- }
-
- private void prepend(Module module) {
- // prepend any special modules BEFORE custom modules, to allow callers
- // to override our stuff
- modules.add(0, module);
- }
+ private Collection<String> configs;
+ private List<Module> modules;
+ private DataSourceFactory dataSourceFactory;
+ private String jdbcUrl;
+ private String jdbcDriver;
+ private String jdbcUser;
+ private String jdbcPassword;
+ private int jdbcMinConnections;
+ private int jdbcMaxConnections;
+
+ /**
+ * Creates an empty builder.
+ */
+ public ServerRuntimeBuilder() {
+ this.configs = new LinkedHashSet<String>();
+ this.modules = new ArrayList<Module>();
+ }
+
+ /**
+ * An equivalent to creating builder with default constructor and calling
+ * {@link #addConfig(String)}.
+ */
+ public ServerRuntimeBuilder(String configurationLocation) {
+ this();
+ addConfig(configurationLocation);
+ }
+
+ /**
+ * Sets a DataSource that will override any DataSources found in the
+ * mapping. Moreover if the mapping contains no DataNodes, and the
+ * DataSource is set with this method, the builder would create a single
+ * default DataNode.
+ */
+ public ServerRuntimeBuilder dataSource(DataSource dataSource) {
+ this.dataSourceFactory = new FixedDataSourceFactory(dataSource);
+ return this;
+ }
+
+ /**
+ * Sets JNDI location for the default DataSource.
+ */
+ public ServerRuntimeBuilder jndiDataSource(String location) {
+ this.dataSourceFactory = new FixedJNDIDataSourceFactory(location);
+ return this;
+ }
+
+ /**
+ * Sets a database URL for the default DataSource.
+ */
+ public ServerRuntimeBuilder url(String url) {
+ this.jdbcUrl = url;
+ return this;
+ }
+
+ /**
+ * Sets a driver Java class for the default DataSource.
+ */
+ public ServerRuntimeBuilder jdbcDriver(String driver) {
+ // TODO: guess the driver from URL
+ this.jdbcDriver = driver;
+ return this;
+ }
+
+ /**
+ * Sets a user name for the default DataSource.
+ */
+ public ServerRuntimeBuilder user(String user) {
+ this.jdbcUser = user;
+ return this;
+ }
+
+ /**
+ * Sets a password for the default DataSource.
+ */
+ public ServerRuntimeBuilder password(String password) {
+ this.jdbcPassword = password;
+ return this;
+ }
+
+ public ServerRuntimeBuilder minConnections(int minConnections) {
+ this.jdbcMinConnections = minConnections;
+ return this;
+ }
+
+ public ServerRuntimeBuilder maxConnections(int maxConnections) {
+ this.jdbcMaxConnections = maxConnections;
+ return this;
+ }
+
+ public ServerRuntimeBuilder addConfig(String configurationLocation) {
+ configs.add(configurationLocation);
+ return this;
+ }
+
+ public ServerRuntimeBuilder addConfigs(Collection<String> configurationLocations) {
+ configs.addAll(configurationLocations);
+ return this;
+ }
+
+ public ServerRuntimeBuilder addModule(Module module) {
+ modules.add(module);
+ return this;
+ }
+
+ public ServerRuntimeBuilder addModules(Collection<Module> modules) {
+ this.modules.addAll(modules);
+ return this;
+ }
+
+ public ServerRuntime build() {
+
+ buildModules();
+
+ String[] configs = this.configs.toArray(new String[this.configs.size()]);
+ Module[] modules = this.modules.toArray(new Module[this.modules.size()]);
+ return new ServerRuntime(configs, modules);
+ }
+
+ private void buildModules() {
+
+ if (dataSourceFactory != null) {
+
+ prepend(new Module() {
+ @Override
+ public void configure(Binder binder) {
+ binder.bind(DataDomain.class).toProvider(SyntheticNodeDataDomainProvider.class);
+ binder.bind(DataSourceFactory.class).toInstance(dataSourceFactory);
+ }
+ });
+
+ }
+ // URL and driver are the minimal requirement for
+ // DelegatingDataSourceFactory to work
+ else if (jdbcUrl != null && jdbcDriver != null) {
+ prepend(new Module() {
+ @Override
+ public void configure(Binder binder) {
+ binder.bind(DataDomain.class).toProvider(SyntheticNodeDataDomainProvider.class);
+ MapBuilder<Object> props = binder.bindMap(Constants.PROPERTIES_MAP)
+ .put(Constants.JDBC_DRIVER_PROPERTY, jdbcDriver).put(Constants.JDBC_URL_PROPERTY, jdbcUrl);
+
+ if (jdbcUser != null) {
+ props.put(Constants.JDBC_USERNAME_PROPERTY, jdbcUser);
+ }
+
+ if (jdbcPassword != null) {
+ props.put(Constants.JDBC_PASSWORD_PROPERTY, jdbcPassword);
+ }
+
+ if (jdbcMinConnections > 0) {
+ props.put(Constants.JDBC_MIN_CONNECTIONS_PROPERTY, Integer.toString(jdbcMinConnections));
+ }
+
+ if (jdbcMaxConnections > 0) {
+ props.put(Constants.JDBC_MAX_CONNECTIONS_PROPERTY, Integer.toString(jdbcMaxConnections));
+ }
+ }
+ });
+ }
+ }
+
+ private void prepend(Module module) {
+ // prepend any special modules BEFORE custom modules, to allow callers
+ // to override our stuff
+ modules.add(0, module);
+ }
}
[2/2] cayenne git commit: cleanup, no change
Posted by aa...@apache.org.
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);
+ }
+ }
}