This is an automated email from the ASF dual-hosted git repository. ntimofeev pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cayenne.git
The following commit(s) were added to refs/heads/master by this push: new e77663894 CAY-2751 Simplify DataNode configuration - drop password encoding - simplify DataNode editor, remove tabs - cleanup and rename DataSourceInfo - deprecate JNDIDataSourceFactory e77663894 is described below commit e77663894e565699d337020563fd249129be0ac7 Author: Nikita Timofeev <stari...@gmail.com> AuthorDate: Tue Jul 12 18:52:05 2022 +0300 CAY-2751 Simplify DataNode configuration - drop password encoding - simplify DataNode editor, remove tabs - cleanup and rename DataSourceInfo - deprecate JNDIDataSourceFactory --- .../org/apache/cayenne/tools/DbImporterTask.java | 4 +- .../configuration/DriverDataSourceFactory.java | 12 +- .../reverse/dbimport/DbImportConfiguration.java | 8 +- .../java/org/apache/cayenne/access/DataNode.java | 1 - .../org/apache/cayenne/access/DbGenerator.java | 35 +- .../cayenne/configuration/DataNodeDescriptor.java | 9 +- .../configuration/DataSourceDescriptor.java | 133 +++++++ .../server/FixedJNDIDataSourceFactory.java | 1 + .../server/JNDIDataSourceFactory.java | 2 + .../configuration/server/ServerRuntimeBuilder.java | 1 + .../server/XMLPoolingDataSourceFactory.java | 19 +- .../configuration/xml/DataNodeChildrenHandler.java | 6 +- .../xml/DataSourceChildrenHandler.java | 76 +--- .../org/apache/cayenne/conn/DataSourceInfo.java | 423 --------------------- .../server/DefaultDataSourceFactoryLoaderTest.java | 6 +- .../server/ServerRuntimeBuilderIT.java | 4 +- .../apache/cayenne/conn/DataSourceInfoTest.java | 66 ---- .../datasource/BasePoolingDataSourceIT.java | 4 +- ...PoolingDataSource_FailingValidationQueryIT.java | 4 +- .../cayenne/unit/UnitDataSourceDescriptor.java | 40 +- .../unit/di/server/ConnectionProperties.java | 20 +- ...=> ServerCaseDataSourceDescriptorProvider.java} | 37 +- .../di/server/ServerCaseDataSourceFactory.java | 6 +- .../di/server/ServerCaseDbAdapterProvider.java | 8 +- .../cayenne/unit/di/server/ServerCaseModule.java | 17 +- .../server/ServerCaseSharedDataSourceFactory.java | 1 + .../unit/di/server/UnitDbAdapterProvider.java | 17 +- .../cayenne/modeler/action/CreateNodeAction.java | 6 +- .../modeler/action/ImportEOModelAction.java | 15 +- .../modeler/editor/datanode/AdapterEditor.java | 112 ------ .../modeler/editor/datanode/AdapterView.java | 56 --- .../editor/datanode/DBCP2DataSourceEditor.java | 51 --- .../editor/datanode/DBCP2DataSourceView.java | 54 --- .../modeler/editor/datanode/DataNodeEditor.java | 2 - .../modeler/editor/datanode/DataSourceEditor.java | 2 - .../editor/datanode/JDBCDataSourceEditor.java | 18 +- .../editor/datanode/JNDIDataSourceView.java | 56 --- .../editor/datanode/MainDataNodeEditor.java | 30 +- .../modeler/editor/datanode/MainDataNodeView.java | 23 +- .../editor/datanode/PasswordEncoderEditor.java | 200 ---------- .../editor/datanode/PasswordEncoderView.java | 182 --------- .../cayenne/modeler/pref/DBConnectionInfo.java | 6 +- .../modeler/action/CreateNodeActionTest.java | 11 +- 43 files changed, 299 insertions(+), 1485 deletions(-) diff --git a/cayenne-ant/src/main/java/org/apache/cayenne/tools/DbImporterTask.java b/cayenne-ant/src/main/java/org/apache/cayenne/tools/DbImporterTask.java index e331f2362..55cb506dc 100644 --- a/cayenne-ant/src/main/java/org/apache/cayenne/tools/DbImporterTask.java +++ b/cayenne-ant/src/main/java/org/apache/cayenne/tools/DbImporterTask.java @@ -22,9 +22,9 @@ import javax.sql.DataSource; import java.io.File; import org.apache.cayenne.configuration.DataNodeDescriptor; +import org.apache.cayenne.configuration.DataSourceDescriptor; import org.apache.cayenne.configuration.server.DataSourceFactory; import org.apache.cayenne.configuration.server.DbAdapterFactory; -import org.apache.cayenne.conn.DataSourceInfo; import org.apache.cayenne.dba.DbAdapter; import org.apache.cayenne.dbsync.DbSyncModule; import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator; @@ -184,7 +184,7 @@ public class DbImporterTask extends Task { error.append("The 'map' attribute must be set.\n"); } - DataSourceInfo dataSourceInfo = config.getDataSourceInfo(); + DataSourceDescriptor dataSourceInfo = config.getDataSourceInfo(); if (dataSourceInfo.getJdbcDriver() == null) { error.append("The 'driver' attribute must be set.\n"); } diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/DriverDataSourceFactory.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/DriverDataSourceFactory.java index 23a2eb2d2..ed182d2d2 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/DriverDataSourceFactory.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/configuration/DriverDataSourceFactory.java @@ -24,8 +24,8 @@ import java.sql.Driver; import javax.sql.DataSource; import org.apache.cayenne.configuration.DataNodeDescriptor; +import org.apache.cayenne.configuration.DataSourceDescriptor; import org.apache.cayenne.configuration.server.DataSourceFactory; -import org.apache.cayenne.conn.DataSourceInfo; import org.apache.cayenne.datasource.DriverDataSource; import org.apache.cayenne.di.AdhocObjectFactory; import org.apache.cayenne.di.Inject; @@ -42,13 +42,13 @@ public class DriverDataSourceFactory implements DataSourceFactory { } public DataSource getDataSource(DataNodeDescriptor nodeDescriptor) throws Exception { - DataSourceInfo properties = nodeDescriptor.getDataSourceDescriptor(); - if (properties == null) { + DataSourceDescriptor dataSourceDescriptor = nodeDescriptor.getDataSourceDescriptor(); + if (dataSourceDescriptor == null) { throw new IllegalArgumentException("'nodeDescriptor' contains no datasource descriptor"); } - Driver driver = (Driver)objectFactory.getJavaClass(properties.getJdbcDriver()).getDeclaredConstructor().newInstance(); - return new DriverDataSource(driver, properties.getDataSourceUrl(), properties.getUserName(), - properties.getPassword()); + Driver driver = (Driver)objectFactory.getJavaClass(dataSourceDescriptor.getJdbcDriver()).getDeclaredConstructor().newInstance(); + return new DriverDataSource(driver, dataSourceDescriptor.getDataSourceUrl(), dataSourceDescriptor.getUserName(), + dataSourceDescriptor.getPassword()); } } diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportConfiguration.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportConfiguration.java index cd7026bd5..f4e076faf 100644 --- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportConfiguration.java +++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbimport/DbImportConfiguration.java @@ -23,7 +23,7 @@ import java.util.regex.Pattern; import org.apache.cayenne.CayenneRuntimeException; import org.apache.cayenne.configuration.DataNodeDescriptor; -import org.apache.cayenne.conn.DataSourceInfo; +import org.apache.cayenne.configuration.DataSourceDescriptor; import org.apache.cayenne.dba.DbAdapter; import org.apache.cayenne.dbsync.filter.NameFilter; import org.apache.cayenne.dbsync.filter.NamePatternMatcher; @@ -48,7 +48,7 @@ public class DbImportConfiguration { private static final String DATA_MAP_LOCATION_SUFFIX = ".map.xml"; - private final DataSourceInfo dataSourceInfo; + private final DataSourceDescriptor dataSourceInfo; private final DbLoaderConfiguration dbLoaderConfiguration; private File targetDataMap; private String defaultPackage; @@ -65,7 +65,7 @@ public class DbImportConfiguration { private File cayenneProject; public DbImportConfiguration() { - this.dataSourceInfo = new DataSourceInfo(); + this.dataSourceInfo = new DataSourceDescriptor(); this.dbLoaderConfiguration = new DbLoaderConfiguration(); } @@ -288,7 +288,7 @@ public class DbImportConfiguration { return res.toString(); } - public DataSourceInfo getDataSourceInfo() { + public DataSourceDescriptor getDataSourceInfo() { return dataSourceInfo; } diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DataNode.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DataNode.java index cb9f30831..1b5b8c10e 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/DataNode.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DataNode.java @@ -66,7 +66,6 @@ public class DataNode implements QueryEngine { protected String name; protected DataSource dataSource; protected DbAdapter adapter; - protected String dataSourceLocation; protected String dataSourceFactory; protected EntityResolver entityResolver; protected SchemaUpdateStrategy schemaUpdateStrategy; diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/DbGenerator.java b/cayenne-server/src/main/java/org/apache/cayenne/access/DbGenerator.java index 5858b590b..022cc367b 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/access/DbGenerator.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/access/DbGenerator.java @@ -20,8 +20,6 @@ package org.apache.cayenne.access; import org.apache.cayenne.ashwood.AshwoodEntitySorter; -import org.apache.cayenne.conn.DataSourceInfo; -import org.apache.cayenne.datasource.DriverDataSource; import org.apache.cayenne.dba.DbAdapter; import org.apache.cayenne.dba.PkGenerator; import org.apache.cayenne.dba.TypesMapping; @@ -40,7 +38,6 @@ import org.slf4j.LoggerFactory; import javax.sql.DataSource; import java.sql.Connection; -import java.sql.Driver; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; @@ -58,7 +55,7 @@ import java.util.Map; */ public class DbGenerator { - private static final Logger logObj = LoggerFactory.getLogger(DbGenerator.class); + private static final Logger LOGGER = LoggerFactory.getLogger(DbGenerator.class); protected DbAdapter adapter; protected DataMap map; @@ -95,7 +92,7 @@ public class DbGenerator { * @since 3.1 */ public DbGenerator(DbAdapter adapter, DataMap map, JdbcEventLogger logger) { - this(adapter, map, logger, Collections.<DbEntity> emptyList()); + this(adapter, map, logger, Collections.emptyList()); } /** @@ -240,26 +237,6 @@ public class DbGenerator { return list; } - /** - * Creates a temporary DataSource out of DataSourceInfo and invokes - * <code>public void runGenerator(DataSource ds)</code>. - */ - public void runGenerator(DataSourceInfo dsi) throws Exception { - this.failures = null; - - // do a pre-check. Maybe there is no need to run anything - // and therefore no need to create a connection - if (isEmpty(true)) { - return; - } - - Driver driver = (Driver) Class.forName(dsi.getJdbcDriver()).getDeclaredConstructor().newInstance(); - DataSource dataSource = new DriverDataSource(driver, dsi.getDataSourceUrl(), dsi.getUserName(), - dsi.getPassword()); - - runGenerator(dataSource); - } - /** * Executes a set of commands to drop/create database objects. This is the * main worker method of DbGenerator. Command set is built based on @@ -341,7 +318,7 @@ public class DbGenerator { * * @since 1.1 */ - protected boolean safeExecute(Connection connection, String sql) throws SQLException { + protected boolean safeExecute(Connection connection, String sql) { try (Statement statement = connection.createStatement()) { jdbcEventLogger.log(sql); @@ -395,7 +372,7 @@ public class DbGenerator { DbRelationship reverse = rel.getReverseRelationship(); if (reverse != null && !reverse.isToMany() && !reverse.isToPK()) { - String unique = getAdapter().createUniqueConstraint((DbEntity) rel.getSourceEntity(), + String unique = getAdapter().createUniqueConstraint(rel.getSourceEntity(), rel.getSourceAttributes()); if (unique != null) { list.add(unique); @@ -501,7 +478,7 @@ public class DbGenerator { // tables with no columns are not included if (nextEntity.getAttributes().size() == 0) { - logObj.info("Skipping entity with no attributes: " + nextEntity.getName()); + LOGGER.info("Skipping entity with no attributes: " + nextEntity.getName()); continue; } @@ -514,7 +491,7 @@ public class DbGenerator { boolean invalidAttributes = false; for (final DbAttribute attr : nextEntity.getAttributes()) { if (attr.getType() == TypesMapping.NOT_DEFINED) { - logObj.info("Skipping entity, attribute type is undefined: " + nextEntity.getName() + "." + LOGGER.info("Skipping entity, attribute type is undefined: " + nextEntity.getName() + "." + attr.getName()); invalidAttributes = true; break; diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/DataNodeDescriptor.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/DataNodeDescriptor.java index 236f459b7..07dbb58fb 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/DataNodeDescriptor.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/DataNodeDescriptor.java @@ -20,7 +20,6 @@ package org.apache.cayenne.configuration; import org.apache.cayenne.access.DataNode; import org.apache.cayenne.configuration.server.XMLPoolingDataSourceFactory; -import org.apache.cayenne.conn.DataSourceInfo; import org.apache.cayenne.resource.Resource; import org.apache.cayenne.util.XMLEncoder; import org.apache.cayenne.util.XMLSerializable; @@ -47,9 +46,7 @@ public class DataNodeDescriptor implements ConfigurationNode, XMLSerializable, protected String dataSourceFactoryType; protected String schemaUpdateStrategyType; - // TODO: andrus, 12.13.2009: replace funky DataSourceInfo with a cleaner new class - // (DataSourceDescriptor?) - protected DataSourceInfo dataSourceDescriptor; + protected DataSourceDescriptor dataSourceDescriptor; protected transient Resource configurationSource; @@ -181,11 +178,11 @@ public class DataNodeDescriptor implements ConfigurationNode, XMLSerializable, this.schemaUpdateStrategyType = schemaUpdateStrategyClass; } - public DataSourceInfo getDataSourceDescriptor() { + public DataSourceDescriptor getDataSourceDescriptor() { return dataSourceDescriptor; } - public void setDataSourceDescriptor(DataSourceInfo dataSourceDescriptor) { + public void setDataSourceDescriptor(DataSourceDescriptor dataSourceDescriptor) { this.dataSourceDescriptor = dataSourceDescriptor; } diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/DataSourceDescriptor.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/DataSourceDescriptor.java new file mode 100644 index 000000000..9e6ab1973 --- /dev/null +++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/DataSourceDescriptor.java @@ -0,0 +1,133 @@ +/***************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ****************************************************************/ + +package org.apache.cayenne.configuration; + +import java.io.Serializable; +import java.util.Objects; + +import org.apache.cayenne.util.XMLEncoder; +import org.apache.cayenne.util.XMLSerializable; + +/** + * Helper JavaBean class that holds DataSource information for the Cayenne-managed DataSource. + * @since 4.3 + */ +public class DataSourceDescriptor implements Serializable, XMLSerializable { + + protected String jdbcDriver; + protected String dataSourceUrl; + protected String userName; + protected String password; + protected int minConnections = 1; + protected int maxConnections = 1; + + public String getJdbcDriver() { + return jdbcDriver; + } + + public void setJdbcDriver(String jdbcDriver) { + this.jdbcDriver = jdbcDriver; + } + + public String getDataSourceUrl() { + return dataSourceUrl; + } + + public void setDataSourceUrl(String dataSourceUrl) { + this.dataSourceUrl = dataSourceUrl; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public int getMinConnections() { + return minConnections; + } + + public void setMinConnections(int minConnections) { + this.minConnections = minConnections; + } + + public int getMaxConnections() { + return maxConnections; + } + + public void setMaxConnections(int maxConnections) { + this.maxConnections = maxConnections; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DataSourceDescriptor that = (DataSourceDescriptor) o; + return minConnections == that.minConnections + && maxConnections == that.maxConnections + && Objects.equals(jdbcDriver, that.jdbcDriver) + && Objects.equals(dataSourceUrl, that.dataSourceUrl) + && Objects.equals(userName, that.userName) + && Objects.equals(password, that.password); + } + + @Override + public int hashCode() { + return Objects.hash(jdbcDriver, dataSourceUrl, userName, password, minConnections, maxConnections); + } + + @SuppressWarnings("rawtypes") + @Override + public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) { + encoder.start("data-source") + .start("driver").attribute("value", jdbcDriver).end() + .start("url").attribute("value", dataSourceUrl).end() + .start("login") + .attribute("userName", userName) + .attribute("password", password).end() + .start("connectionPool") + .attribute("min", minConnections) + .attribute("max", maxConnections).end() + .end(); + } + + @Override + public String toString() { + return "[" + getClass().getName() + ":" + + "\n driver: " + jdbcDriver + + "\n url: " + dataSourceUrl + + "\n user name: " + userName + + "\n password: " + "**********" + + "\n min. connections: " + minConnections + + "\n max. connections: " + maxConnections + + "\n]"; + } +} diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/FixedJNDIDataSourceFactory.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/FixedJNDIDataSourceFactory.java index 78b535df6..5b81472fd 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/FixedJNDIDataSourceFactory.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/FixedJNDIDataSourceFactory.java @@ -23,6 +23,7 @@ import org.apache.cayenne.configuration.DataNodeDescriptor; /** * @since 4.0 */ +@Deprecated class FixedJNDIDataSourceFactory extends JNDIDataSourceFactory { private String location; diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/JNDIDataSourceFactory.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/JNDIDataSourceFactory.java index 38716b600..fa1f47611 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/JNDIDataSourceFactory.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/JNDIDataSourceFactory.java @@ -32,7 +32,9 @@ import org.slf4j.LoggerFactory; * Locates DataSource mapped via JNDI. * * @since 3.1 + * @deprecated since 4.3, unused by Cayenne */ +@Deprecated public class JNDIDataSourceFactory implements DataSourceFactory { private static final Logger LOGGER = LoggerFactory.getLogger(JNDIDataSourceFactory.class); 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 f08655435..79556a6d2 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 @@ -100,6 +100,7 @@ public class ServerRuntimeBuilder { * DataNodes, and the DataSource is set with this method, the builder would * create a single default DataNode. */ + @Deprecated public ServerRuntimeBuilder jndiDataSource(String location) { this.dataSourceFactory = new FixedJNDIDataSourceFactory(location); return this; diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/XMLPoolingDataSourceFactory.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/XMLPoolingDataSourceFactory.java index c17511cc1..b08d78cc7 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/XMLPoolingDataSourceFactory.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/server/XMLPoolingDataSourceFactory.java @@ -25,8 +25,8 @@ import javax.sql.DataSource; import org.apache.cayenne.ConfigurationException; import org.apache.cayenne.configuration.Constants; import org.apache.cayenne.configuration.DataNodeDescriptor; +import org.apache.cayenne.configuration.DataSourceDescriptor; import org.apache.cayenne.configuration.RuntimeProperties; -import org.apache.cayenne.conn.DataSourceInfo; import org.apache.cayenne.datasource.DataSourceBuilder; import org.apache.cayenne.datasource.UnmanagedPoolingDataSource; import org.apache.cayenne.di.AdhocObjectFactory; @@ -56,23 +56,26 @@ public class XMLPoolingDataSourceFactory implements DataSourceFactory { @Override public DataSource getDataSource(DataNodeDescriptor nodeDescriptor) throws Exception { - DataSourceInfo descriptor = nodeDescriptor.getDataSourceDescriptor(); - + DataSourceDescriptor descriptor = nodeDescriptor.getDataSourceDescriptor(); if (descriptor == null) { String message = "Null dataSourceDescriptor for nodeDescriptor '" + nodeDescriptor.getName() + "'"; logger.info(message); throw new ConfigurationException(message); } - long maxQueueWaitTime = properties.getLong(Constants.JDBC_MAX_QUEUE_WAIT_TIME, - UnmanagedPoolingDataSource.MAX_QUEUE_WAIT_DEFAULT); + long maxQueueWaitTime = properties + .getLong(Constants.JDBC_MAX_QUEUE_WAIT_TIME, UnmanagedPoolingDataSource.MAX_QUEUE_WAIT_DEFAULT); - Driver driver = (Driver)objectFactory.getJavaClass(descriptor.getJdbcDriver()).getDeclaredConstructor().newInstance(); + Driver driver = (Driver)objectFactory.getJavaClass(descriptor.getJdbcDriver()) + .getDeclaredConstructor().newInstance(); - return DataSourceBuilder.url(descriptor.getDataSourceUrl()).driver(driver).userName(descriptor.getUserName()) + return DataSourceBuilder.url(descriptor.getDataSourceUrl()) + .driver(driver) + .userName(descriptor.getUserName()) .password(descriptor.getPassword()) .pool(descriptor.getMinConnections(), descriptor.getMaxConnections()) - .maxQueueWaitTime(maxQueueWaitTime).build(); + .maxQueueWaitTime(maxQueueWaitTime) + .build(); } } diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/DataNodeChildrenHandler.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/DataNodeChildrenHandler.java index 116a30aa6..4a7f0b365 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/DataNodeChildrenHandler.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/DataNodeChildrenHandler.java @@ -20,7 +20,7 @@ package org.apache.cayenne.configuration.xml; import org.apache.cayenne.configuration.DataNodeDescriptor; -import org.apache.cayenne.conn.DataSourceInfo; +import org.apache.cayenne.configuration.DataSourceDescriptor; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; @@ -35,7 +35,7 @@ final class DataNodeChildrenHandler extends NamespaceAwareNestedTagHandler { private XMLDataChannelDescriptorLoader xmlDataChannelDescriptorLoader; private DataNodeDescriptor nodeDescriptor; - private DataSourceInfo dataSourceDescriptor; + private DataSourceDescriptor dataSourceDescriptor; DataNodeChildrenHandler(XMLDataChannelDescriptorLoader xmlDataChannelDescriptorLoader, NamespaceAwareNestedTagHandler parentHandler, DataNodeDescriptor nodeDescriptor) { super(parentHandler); @@ -62,7 +62,7 @@ final class DataNodeChildrenHandler extends NamespaceAwareNestedTagHandler { protected ContentHandler createChildTagHandler(String namespaceURI, String localName, String name, Attributes attributes) { if (DATA_SOURCE_TAG.equals(localName)) { - dataSourceDescriptor = new DataSourceInfo(); + dataSourceDescriptor = new DataSourceDescriptor(); return new DataSourceChildrenHandler(xmlDataChannelDescriptorLoader, this, dataSourceDescriptor); } diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/DataSourceChildrenHandler.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/DataSourceChildrenHandler.java index a0bf91fdb..950b7fc8b 100644 --- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/DataSourceChildrenHandler.java +++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/DataSourceChildrenHandler.java @@ -19,13 +19,8 @@ package org.apache.cayenne.configuration.xml; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; - import org.apache.cayenne.ConfigurationException; -import org.apache.cayenne.configuration.PasswordEncoding; -import org.apache.cayenne.conn.DataSourceInfo; +import org.apache.cayenne.configuration.DataSourceDescriptor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xml.sax.Attributes; @@ -44,11 +39,11 @@ class DataSourceChildrenHandler extends NamespaceAwareNestedTagHandler { private XMLDataChannelDescriptorLoader xmlDataChannelDescriptorLoader; - private DataSourceInfo dataSourceDescriptor; + private DataSourceDescriptor dataSourceDescriptor; DataSourceChildrenHandler(XMLDataChannelDescriptorLoader xmlDataChannelDescriptorLoader, DataNodeChildrenHandler parentHandler, - DataSourceInfo dataSourceDescriptor) { + DataSourceDescriptor dataSourceDescriptor) { super(parentHandler); this.xmlDataChannelDescriptorLoader = xmlDataChannelDescriptorLoader; this.dataSourceDescriptor = dataSourceDescriptor; @@ -78,73 +73,10 @@ class DataSourceChildrenHandler extends NamespaceAwareNestedTagHandler { } void configureCredentials(Attributes attributes) { - 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 = xmlDataChannelDescriptorLoader.objectFactory.newInstance(PasswordEncoding.class, encoderType); - } - - if (passwordLocation != null) { - switch (passwordLocation) { - case DataSourceInfo.PASSWORD_LOCATION_CLASSPATH: - - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - URL url = classLoader.getResource(username); - if (url != null) { - password = XMLDataChannelDescriptorLoader.passwordFromURL(url); - } else { - logger.error("Could not find resource in CLASSPATH: " + passwordSource); - } - break; - case DataSourceInfo.PASSWORD_LOCATION_URL: - try { - password = XMLDataChannelDescriptorLoader.passwordFromURL(new URL(passwordSource)); - } catch (MalformedURLException exception) { - logger.warn(exception.getMessage(), exception); - } - break; - case DataSourceInfo.PASSWORD_LOCATION_EXECUTABLE: - try { - Process process = Runtime.getRuntime().exec(passwordSource); - password = XMLDataChannelDescriptorLoader.passwordFromInputStream(process.getInputStream()); - process.waitFor(); - } catch (IOException | InterruptedException exception) { - logger.warn(exception.getMessage(), exception); - } - break; - } - } - - if (password != null && passwordEncoder != null) { - dataSourceDescriptor.setPassword(passwordEncoder.decodePassword(password, encoderKey)); - } + dataSourceDescriptor.setPassword(password); } void configureConnectionPool(Attributes attributes) { diff --git a/cayenne-server/src/main/java/org/apache/cayenne/conn/DataSourceInfo.java b/cayenne-server/src/main/java/org/apache/cayenne/conn/DataSourceInfo.java deleted file mode 100644 index 05b65e1eb..000000000 --- a/cayenne-server/src/main/java/org/apache/cayenne/conn/DataSourceInfo.java +++ /dev/null @@ -1,423 +0,0 @@ -/***************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - ****************************************************************/ - -package org.apache.cayenne.conn; - -import java.io.Serializable; -import java.util.Objects; - -import org.apache.cayenne.configuration.ConfigurationNodeVisitor; -import org.apache.cayenne.configuration.PasswordEncoding; -import org.apache.cayenne.configuration.PlainTextPasswordEncoder; -import org.apache.cayenne.di.DIRuntimeException; -import org.apache.cayenne.util.Util; -import org.apache.cayenne.util.XMLEncoder; -import org.apache.cayenne.util.XMLSerializable; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Helper JavaBean class that holds DataSource login information. - */ -public class DataSourceInfo implements Cloneable, Serializable, XMLSerializable { - - private static final long serialVersionUID = 3748394113864532902L; - - private static final Logger logger = LoggerFactory.getLogger(DataSourceInfo.class); - - public static final String PASSWORD_LOCATION_CLASSPATH = "classpath"; - public static final String PASSWORD_LOCATION_EXECUTABLE = "executable"; - public static final String PASSWORD_LOCATION_MODEL = "model"; - public static final String PASSWORD_LOCATION_URL = "url"; - - protected String userName; - protected String password; - protected String jdbcDriver; - protected String dataSourceUrl; - protected String adapterClassName; - protected int minConnections = 1; - protected int maxConnections = 1; - protected String passwordEncoderClass = PlainTextPasswordEncoder.class.getName(); - protected String passwordEncoderKey = ""; - protected String passwordLocation = PASSWORD_LOCATION_MODEL; - protected String passwordSourceExecutable = ""; - protected String passwordSourceFilename = ""; - protected final String passwordSourceModel = "Not Applicable"; - protected String passwordSourceUrl = ""; - - @Override - public boolean equals(Object obj) { - - if (obj == this) { - return true; - } - - if (obj == null) { - return false; - } - - if (obj.getClass() != this.getClass()) { - return false; - } - - DataSourceInfo dsi = (DataSourceInfo) obj; - - if (!Util.nullSafeEquals(this.userName, dsi.userName)) { - return false; - } - - if (!Util.nullSafeEquals(this.password, dsi.password)) { - return false; - } - - if (!Util.nullSafeEquals(this.jdbcDriver, dsi.jdbcDriver)) { - return false; - } - - if (!Util.nullSafeEquals(this.dataSourceUrl, dsi.dataSourceUrl)) { - return false; - } - - if (!Util.nullSafeEquals(this.adapterClassName, dsi.adapterClassName)) { - return false; - } - - if (this.minConnections != dsi.minConnections) { - return false; - } - - if (this.maxConnections != dsi.maxConnections) { - return false; - } - - if (!Util.nullSafeEquals(this.passwordEncoderClass, dsi.passwordEncoderClass)) { - return false; - } - - if (!Util.nullSafeEquals(this.passwordEncoderKey, dsi.passwordEncoderKey)) { - return false; - } - - if (!Util.nullSafeEquals(this.passwordSourceFilename, dsi.passwordSourceFilename)) { - return false; - } - - if (!Util.nullSafeEquals(this.passwordSourceModel, dsi.passwordSourceModel)) { - return false; - } - - if (!Util.nullSafeEquals(this.passwordSourceUrl, dsi.passwordSourceUrl)) { - return false; - } - - if (!Util.nullSafeEquals(this.passwordLocation, dsi.passwordLocation)) { - return false; - } - - return true; - } - - @Override - public int hashCode() { - return Objects.hash(userName, password, jdbcDriver, - dataSourceUrl, adapterClassName, minConnections, - maxConnections, passwordEncoderClass, passwordEncoderKey, - passwordLocation, passwordSourceFilename, passwordSourceModel, - passwordSourceUrl); - } - - /** - * @since 3.1 - */ - @Override - public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) { - encoder.start("data-source"); - - encoder.start("driver").attribute("value", jdbcDriver).end(); - encoder.start("url").attribute("value", dataSourceUrl).end(); - - encoder.start("connectionPool") - .attribute("min", minConnections) - .attribute("max", String.valueOf(maxConnections)) - .end(); - - encoder.start("login").attribute("userName", userName); - - if (DataSourceInfo.PASSWORD_LOCATION_MODEL.equals(passwordLocation)) { - PasswordEncoding passwordEncoder = getPasswordEncoder(); - if (passwordEncoder != null) { - String passwordEncoded = passwordEncoder.encodePassword(password, passwordEncoderKey); - encoder.attribute("password", passwordEncoded); - } - } - - if (!PlainTextPasswordEncoder.class.getName().equals(passwordEncoderClass)) { - encoder.attribute("encoderClass", passwordEncoderClass); - } - - encoder.attribute("encoderKey", passwordEncoderKey); - - if (!DataSourceInfo.PASSWORD_LOCATION_MODEL.equals(passwordLocation)) { - encoder.attribute("passwordLocation", passwordLocation); - } - - // TODO: this is very not nice... we need to clean up the whole - // DataSourceInfo to avoid returning arbitrary labels... - String passwordSource = getPasswordSource(); - if (!"Not Applicable".equals(passwordSource)) { - encoder.attribute("passwordSource", passwordSource); - } - - encoder.end().end(); - } - - public DataSourceInfo cloneInfo() { - try { - return (DataSourceInfo) super.clone(); - } catch (CloneNotSupportedException ex) { - throw new RuntimeException("Cloning error", ex); - } - } - - public String getAdapterClassName() { - return adapterClassName; - } - - public void setAdapterClassName(String adapterClassName) { - this.adapterClassName = adapterClassName; - } - - public void setMinConnections(int minConnections) { - this.minConnections = minConnections; - } - - public int getMinConnections() { - return minConnections; - } - - public void setMaxConnections(int maxConnections) { - this.maxConnections = maxConnections; - } - - public int getMaxConnections() { - return maxConnections; - } - - public void setUserName(String userName) { - this.userName = userName; - } - - public String getUserName() { - return userName; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getPassword() { - return password; - } - - public void setJdbcDriver(String jdbcDriver) { - this.jdbcDriver = jdbcDriver; - } - - public String getJdbcDriver() { - return jdbcDriver; - } - - public void setDataSourceUrl(String dataSourceUrl) { - this.dataSourceUrl = dataSourceUrl; - } - - public String getDataSourceUrl() { - return dataSourceUrl; - } - - /** - * @deprecated since 4.0 as class loading should not happen here. - */ - @Deprecated - public PasswordEncoding getPasswordEncoder() { - try { - return (PasswordEncoding) Util.getJavaClass(getPasswordEncoderClass()).newInstance(); - } catch (InstantiationException | IllegalAccessException | ClassNotFoundException | DIRuntimeException e) { - ; // Swallow it -- no need to throw/etc. - } - - logger.error("Failed to obtain specified Password Encoder '" + getPasswordEncoderClass() + "'"); - return null; - } - - /** - * @return the passwordEncoderClass - */ - public String getPasswordEncoderClass() { - return passwordEncoderClass; - } - - /** - * @param passwordEncoderClass - * the passwordEncoderClass to set - */ - public void setPasswordEncoderClass(String passwordEncoderClass) { - if (passwordEncoderClass == null) { - this.passwordEncoderClass = PasswordEncoding.standardEncoders[0]; - } else { - this.passwordEncoderClass = passwordEncoderClass; - } - } - - /** - * @return the passwordEncoderKey - */ - public String getPasswordEncoderKey() { - return passwordEncoderKey; - } - - /** - * @param passwordEncoderKey - * the passwordEncoderKey to set - */ - public void setPasswordEncoderKey(String passwordEncoderKey) { - this.passwordEncoderKey = passwordEncoderKey; - } - - /** - * @return the passwordLocationFilename - */ - public String getPasswordSourceFilename() { - return passwordSourceFilename; - } - - /** - * @param passwordSourceFilename - * the passwordSourceFilename to set - */ - public void setPasswordSourceFilename(String passwordSourceFilename) { - this.passwordSourceFilename = passwordSourceFilename; - } - - /** - * @return the passwordLocationModel - */ - public String getPasswordSourceModel() { - return passwordSourceModel; - } - - /** - * @return the passwordLocationUrl - */ - public String getPasswordSourceUrl() { - return passwordSourceUrl; - } - - /** - * @param passwordSourceUrl - * the passwordSourceUrl to set - */ - public void setPasswordSourceUrl(String passwordSourceUrl) { - this.passwordSourceUrl = passwordSourceUrl; - } - - /** - * @return the passwordLocationExecutable - */ - public String getPasswordSourceExecutable() { - return passwordSourceExecutable; - } - - /** - * @param passwordSourceExecutable - * the passwordSourceExecutable to set - */ - public void setPasswordSourceExecutable(String passwordSourceExecutable) { - this.passwordSourceExecutable = passwordSourceExecutable; - } - - public String getPasswordSource() { - if (getPasswordLocation().equals(PASSWORD_LOCATION_CLASSPATH)) { - return getPasswordSourceFilename(); - } else if (getPasswordLocation().equals(PASSWORD_LOCATION_EXECUTABLE)) { - return getPasswordSourceExecutable(); - } else if (getPasswordLocation().equals(PASSWORD_LOCATION_MODEL)) { - return getPasswordSourceModel(); - } else if (getPasswordLocation().equals(PASSWORD_LOCATION_URL)) { - return getPasswordSourceUrl(); - } - - throw new RuntimeException("Invalid password source detected"); - } - - public void setPasswordSource(String passwordSource) { - // The location for the model is omitted since it cannot change - if (getPasswordLocation().equals(PASSWORD_LOCATION_CLASSPATH)) { - setPasswordSourceFilename(passwordSource); - } else if (getPasswordLocation().equals(PASSWORD_LOCATION_EXECUTABLE)) { - setPasswordSourceExecutable(passwordSource); - } else if (getPasswordLocation().equals(PASSWORD_LOCATION_URL)) { - setPasswordSourceUrl(passwordSource); - } - } - - /** - * @return the passwordLocation - */ - public String getPasswordLocation() { - return passwordLocation; - } - - /** - * @param passwordLocation - * the passwordLocation to set - */ - public void setPasswordLocation(String passwordLocation) { - if (passwordLocation == null) { - this.passwordLocation = DataSourceInfo.PASSWORD_LOCATION_MODEL; - } else { - this.passwordLocation = passwordLocation; - } - } - - @Override - public String toString() { - StringBuilder buffer = new StringBuilder(); - buffer.append("[").append(getClass().getName()).append(":").append("\n user name: ").append(userName) - .append("\n password: "); - - buffer.append("**********"); - buffer.append("\n driver: ").append(jdbcDriver).append("\n db adapter class: ").append(adapterClassName) - .append("\n url: ").append(dataSourceUrl).append("\n min. connections: ").append(minConnections) - .append("\n max. connections: ").append(maxConnections); - - if (!PlainTextPasswordEncoder.class.getName().equals(passwordEncoderClass)) { - buffer.append("\n encoder class: ").append(passwordEncoderClass).append("\n encoder key: ") - .append(passwordEncoderKey); - } - - if (!PASSWORD_LOCATION_MODEL.equals(passwordLocation)) { - buffer.append("\n password location: ").append(passwordLocation).append("\n password source: ") - .append(getPasswordSource()); - } - - buffer.append("\n]"); - return buffer.toString(); - } -} diff --git a/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DefaultDataSourceFactoryLoaderTest.java b/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DefaultDataSourceFactoryLoaderTest.java index 3f718668f..3bc339401 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DefaultDataSourceFactoryLoaderTest.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/DefaultDataSourceFactoryLoaderTest.java @@ -21,9 +21,9 @@ package org.apache.cayenne.configuration.server; import org.apache.cayenne.configuration.Constants; import org.apache.cayenne.configuration.DataChannelDescriptor; import org.apache.cayenne.configuration.DataNodeDescriptor; +import org.apache.cayenne.configuration.DataSourceDescriptor; import org.apache.cayenne.configuration.RuntimeProperties; import org.apache.cayenne.configuration.mock.MockDataSourceFactory1; -import org.apache.cayenne.conn.DataSourceInfo; import org.apache.cayenne.di.AdhocObjectFactory; import org.apache.cayenne.di.ClassLoaderManager; import org.apache.cayenne.di.DIBootstrap; @@ -65,11 +65,11 @@ public class DefaultDataSourceFactoryLoaderTest { } @Test - public void testGetDataSourceFactory_Implicit() throws Exception { + public void testGetDataSourceFactory_Implicit() { DataNodeDescriptor nodeDescriptor = new DataNodeDescriptor(); nodeDescriptor.setName("node1"); - nodeDescriptor.setDataSourceDescriptor(new DataSourceInfo()); + nodeDescriptor.setDataSourceDescriptor(new DataSourceDescriptor()); DelegatingDataSourceFactory factoryLoader = new DelegatingDataSourceFactory(); injector.injectMembers(factoryLoader); diff --git a/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/ServerRuntimeBuilderIT.java b/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/ServerRuntimeBuilderIT.java index 8eb4a62b0..648a92085 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/ServerRuntimeBuilderIT.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/configuration/server/ServerRuntimeBuilderIT.java @@ -29,7 +29,7 @@ import javax.sql.DataSource; import org.apache.cayenne.DataRow; import org.apache.cayenne.ObjectContext; import org.apache.cayenne.access.DataNode; -import org.apache.cayenne.conn.DataSourceInfo; +import org.apache.cayenne.configuration.DataSourceDescriptor; import org.apache.cayenne.di.Inject; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.query.SQLSelect; @@ -53,7 +53,7 @@ public class ServerRuntimeBuilderIT extends ServerCase { private ServerRuntime runtime; @Inject - private DataSourceInfo dsi; + private DataSourceDescriptor dsi; private ServerRuntime localRuntime; private DataSource dataSource; diff --git a/cayenne-server/src/test/java/org/apache/cayenne/conn/DataSourceInfoTest.java b/cayenne-server/src/test/java/org/apache/cayenne/conn/DataSourceInfoTest.java deleted file mode 100644 index e74040356..000000000 --- a/cayenne-server/src/test/java/org/apache/cayenne/conn/DataSourceInfoTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/***************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - ****************************************************************/ - -package org.apache.cayenne.conn; - -import org.apache.cayenne.util.Util; -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -public class DataSourceInfoTest { - - private DataSourceInfo dsi; - - @Before - public void setUp() throws Exception { - dsi = new DataSourceInfo(); - dsi.setUserName("a"); - dsi.setPassword("b"); - dsi.setMinConnections(1); - dsi.setMaxConnections(2); - dsi.setJdbcDriver("b"); - dsi.setDataSourceUrl("c"); - dsi.setAdapterClassName("d"); - } - - @Test - public void testDefaultValues() throws java.lang.Exception { - DataSourceInfo localDsi = new DataSourceInfo(); - assertEquals(1, localDsi.getMinConnections()); - assertTrue(localDsi.getMinConnections() <= localDsi.getMaxConnections()); - } - - @Test - public void testClone() throws java.lang.Exception { - DataSourceInfo dsiClone = dsi.cloneInfo(); - assertEquals(dsi, dsiClone); - assertTrue(dsi != dsiClone); - } - - @Test - public void testSerialize() throws java.lang.Exception { - DataSourceInfo dsiUnserialized = Util.cloneViaSerialization(dsi); - assertEquals(dsi, dsiUnserialized); - assertTrue(dsi != dsiUnserialized); - } - -} diff --git a/cayenne-server/src/test/java/org/apache/cayenne/datasource/BasePoolingDataSourceIT.java b/cayenne-server/src/test/java/org/apache/cayenne/datasource/BasePoolingDataSourceIT.java index 0100f77e7..25be1e62e 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/datasource/BasePoolingDataSourceIT.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/datasource/BasePoolingDataSourceIT.java @@ -21,7 +21,7 @@ package org.apache.cayenne.datasource; import java.sql.Driver; import java.sql.SQLException; -import org.apache.cayenne.conn.DataSourceInfo; +import org.apache.cayenne.configuration.DataSourceDescriptor; import org.apache.cayenne.di.AdhocObjectFactory; import org.apache.cayenne.di.Inject; import org.apache.cayenne.unit.di.server.CayenneProjects; @@ -36,7 +36,7 @@ public class BasePoolingDataSourceIT extends ServerCase { protected static final long QUEUE_WAIT_TIME = 1000L; @Inject - private DataSourceInfo dataSourceInfo; + private DataSourceDescriptor dataSourceInfo; @Inject private AdhocObjectFactory objectFactory; diff --git a/cayenne-server/src/test/java/org/apache/cayenne/datasource/PoolingDataSource_FailingValidationQueryIT.java b/cayenne-server/src/test/java/org/apache/cayenne/datasource/PoolingDataSource_FailingValidationQueryIT.java index e0749c1fb..b4de09fb9 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/datasource/PoolingDataSource_FailingValidationQueryIT.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/datasource/PoolingDataSource_FailingValidationQueryIT.java @@ -21,7 +21,7 @@ package org.apache.cayenne.datasource; import java.sql.Driver; import org.apache.cayenne.CayenneRuntimeException; -import org.apache.cayenne.conn.DataSourceInfo; +import org.apache.cayenne.configuration.DataSourceDescriptor; import org.apache.cayenne.di.AdhocObjectFactory; import org.apache.cayenne.di.Inject; import org.apache.cayenne.unit.di.server.CayenneProjects; @@ -33,7 +33,7 @@ import org.junit.Test; public class PoolingDataSource_FailingValidationQueryIT extends ServerCase { @Inject - private DataSourceInfo dataSourceInfo; + private DataSourceDescriptor dataSourceInfo; @Inject private AdhocObjectFactory objectFactory; diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JNDIDataSourceEditor.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDataSourceDescriptor.java similarity index 50% rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JNDIDataSourceEditor.java rename to cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDataSourceDescriptor.java index 1b6c5c0be..9f2e85cb9 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JNDIDataSourceEditor.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/UnitDataSourceDescriptor.java @@ -17,36 +17,34 @@ * under the License. ****************************************************************/ -package org.apache.cayenne.modeler.editor.datanode; +package org.apache.cayenne.unit; -import java.awt.Component; - -import org.apache.cayenne.modeler.ProjectController; -import org.apache.cayenne.swing.BindingBuilder; -import org.apache.cayenne.swing.BindingDelegate; -import org.apache.cayenne.swing.ObjectBinding; +import org.apache.cayenne.configuration.DataSourceDescriptor; /** + * Extension of the {@link DataSourceDescriptor} for tests that adds adapterClassName field to it. */ -public class JNDIDataSourceEditor extends DataSourceEditor { +public class UnitDataSourceDescriptor extends DataSourceDescriptor { - protected JNDIDataSourceView view; + protected String adapterClassName; - public JNDIDataSourceEditor(ProjectController parent, - BindingDelegate nodeChangeProcessor) { - super(parent, nodeChangeProcessor); + public String getAdapterClassName() { + return adapterClassName; } - public Component getView() { - return view; + public void setAdapterClassName(String adapterClassName) { + this.adapterClassName = adapterClassName; } - protected void prepareBindings(BindingBuilder builder) { - this.view = new JNDIDataSourceView(); - - fieldAdapters = new ObjectBinding[1]; - fieldAdapters[0] = builder.bindToTextField( - view.getJndiPath(), - "node.parameters"); + public UnitDataSourceDescriptor copy() { + UnitDataSourceDescriptor copy = new UnitDataSourceDescriptor(); + copy.setDataSourceUrl(getDataSourceUrl()); + copy.setJdbcDriver(getJdbcDriver()); + copy.setUserName(getUserName()); + copy.setPassword(getPassword()); + copy.setAdapterClassName(getAdapterClassName()); + copy.setMinConnections(getMinConnections()); + copy.setMaxConnections(getMaxConnections()); + return copy; } } diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ConnectionProperties.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ConnectionProperties.java index e974b459e..b8d8796b3 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ConnectionProperties.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ConnectionProperties.java @@ -19,7 +19,7 @@ package org.apache.cayenne.unit.di.server; -import org.apache.cayenne.conn.DataSourceInfo; +import org.apache.cayenne.unit.UnitDataSourceDescriptor; import java.util.ArrayList; import java.util.HashMap; @@ -45,15 +45,15 @@ class ConnectionProperties { private static final String URL_KEY = "jdbc.url"; private static final String DRIVER_KEY = "jdbc.driver"; - private Map<String, DataSourceInfo> connectionInfos; + private Map<String, UnitDataSourceDescriptor> connectionDescriptors; /** * Constructor for ConnectionProperties. */ ConnectionProperties(Map<String, String> props) { - connectionInfos = new HashMap<>(); + connectionDescriptors = new HashMap<>(); for (String name : extractNames(props)) { - DataSourceInfo dsi = buildDataSourceInfo( + UnitDataSourceDescriptor dsi = buildDataSourceDescriptor( props.entrySet().stream() .filter(e -> e.getKey().startsWith(name + '.')) .collect(Collectors.toMap( @@ -64,27 +64,27 @@ class ConnectionProperties { Map.Entry::getValue )) ); - connectionInfos.put(name, dsi); + connectionDescriptors.put(name, dsi); } } int size() { - return connectionInfos.size(); + return connectionDescriptors.size(); } /** * Returns DataSourceInfo object for a symbolic name. If name does not match * an existing object, returns null. */ - DataSourceInfo getConnection(String name) { - return connectionInfos.get(name); + UnitDataSourceDescriptor getConnection(String name) { + return connectionDescriptors.get(name); } /** * Creates a DataSourceInfo object from a set of properties. */ - private DataSourceInfo buildDataSourceInfo(Map<String, String> props) { - DataSourceInfo dsi = new DataSourceInfo(); + private UnitDataSourceDescriptor buildDataSourceDescriptor(Map<String, String> props) { + UnitDataSourceDescriptor dsi = new UnitDataSourceDescriptor(); String adapter = props.get(ADAPTER_KEY); diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceInfoProvider.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceDescriptorProvider.java similarity index 85% rename from cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceInfoProvider.java rename to cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceDescriptorProvider.java index 9c8186c64..d887703de 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceInfoProvider.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceDescriptorProvider.java @@ -19,13 +19,13 @@ package org.apache.cayenne.unit.di.server; import org.apache.cayenne.ConfigurationException; -import org.apache.cayenne.conn.DataSourceInfo; import org.apache.cayenne.dba.derby.DerbyAdapter; import org.apache.cayenne.dba.h2.H2Adapter; import org.apache.cayenne.dba.hsqldb.HSQLDBAdapter; import org.apache.cayenne.dba.sqlite.SQLiteAdapter; import org.apache.cayenne.di.Inject; import org.apache.cayenne.di.Provider; +import org.apache.cayenne.unit.UnitDataSourceDescriptor; import org.apache.cayenne.unit.testcontainers.TestContainerProvider; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,26 +38,25 @@ import java.util.HashMap; import java.util.Map; import java.util.Properties; -public class ServerCaseDataSourceInfoProvider implements Provider<DataSourceInfo> { +public class ServerCaseDataSourceDescriptorProvider implements Provider<UnitDataSourceDescriptor> { - private static Logger logger = LoggerFactory.getLogger(ServerCaseDataSourceInfoProvider.class); + private static final Logger logger = LoggerFactory.getLogger(ServerCaseDataSourceDescriptorProvider.class); private static final String PROPERTIES_FILE = "connection.properties"; private static final String CONNECTION_NAME_KEY = "cayenneTestConnection"; private static final String CONNECTION_DB_VERSION = "cayenneTestDbVersion"; - private static final String ADAPTER_KEY_MAVEN = "cayenneAdapter"; private static final String USER_NAME_KEY_MAVEN = "cayenneJdbcUsername"; private static final String PASSWORD_KEY_MAVEN = "cayenneJdbcPassword"; private static final String URL_KEY_MAVEN = "cayenneJdbcUrl"; private static final String DRIVER_KEY_MAVEN = "cayenneJdbcDriver"; - private Map<String, DataSourceInfo> inMemoryDataSources; + private Map<String, UnitDataSourceDescriptor> inMemoryDataSources; private ConnectionProperties connectionProperties; private final Map<String, TestContainerProvider> testContainerProviders; - public ServerCaseDataSourceInfoProvider(@Inject Map<String, TestContainerProvider> testContainerProviders) + public ServerCaseDataSourceDescriptorProvider(@Inject Map<String, TestContainerProvider> testContainerProviders) throws IOException { this.testContainerProviders = testContainerProviders; @@ -77,7 +76,7 @@ public class ServerCaseDataSourceInfoProvider implements Provider<DataSourceInfo // preload default in-memory DataSources. Will use them as defaults if // nothing is configured in ~/.cayenne/connection.properties - DataSourceInfo hsqldb = new DataSourceInfo(); + UnitDataSourceDescriptor hsqldb = new UnitDataSourceDescriptor(); hsqldb.setAdapterClassName(HSQLDBAdapter.class.getName()); hsqldb.setUserName("sa"); hsqldb.setPassword(""); @@ -87,7 +86,7 @@ public class ServerCaseDataSourceInfoProvider implements Provider<DataSourceInfo hsqldb.setMaxConnections(ConnectionProperties.MAX_CONNECTIONS); inMemoryDataSources.put("hsql", hsqldb); - DataSourceInfo h2 = new DataSourceInfo(); + UnitDataSourceDescriptor h2 = new UnitDataSourceDescriptor(); h2.setAdapterClassName(H2Adapter.class.getName()); h2.setUserName("sa"); h2.setPassword(""); @@ -97,7 +96,7 @@ public class ServerCaseDataSourceInfoProvider implements Provider<DataSourceInfo h2.setMaxConnections(ConnectionProperties.MAX_CONNECTIONS); inMemoryDataSources.put("h2", h2); - DataSourceInfo derby = new DataSourceInfo(); + UnitDataSourceDescriptor derby = new UnitDataSourceDescriptor(); derby.setAdapterClassName(DerbyAdapter.class.getName()); derby.setUserName("sa"); derby.setPassword(""); @@ -107,7 +106,7 @@ public class ServerCaseDataSourceInfoProvider implements Provider<DataSourceInfo derby.setMaxConnections(ConnectionProperties.MAX_CONNECTIONS); inMemoryDataSources.put("derby", derby); - DataSourceInfo sqlite = new DataSourceInfo(); + UnitDataSourceDescriptor sqlite = new UnitDataSourceDescriptor(); sqlite.setAdapterClassName(SQLiteAdapter.class.getName()); sqlite.setUserName("sa"); sqlite.setPassword(""); @@ -119,7 +118,7 @@ public class ServerCaseDataSourceInfoProvider implements Provider<DataSourceInfo } @Override - public DataSourceInfo get() throws ConfigurationException { + public UnitDataSourceDescriptor get() throws ConfigurationException { String connectionKey = property(CONNECTION_NAME_KEY); if (connectionKey == null) { @@ -127,7 +126,7 @@ public class ServerCaseDataSourceInfoProvider implements Provider<DataSourceInfo } logger.info("Connection key: " + connectionKey); - DataSourceInfo connectionInfo = connectionProperties.getConnection(connectionKey); + UnitDataSourceDescriptor connectionInfo = connectionProperties.getConnection(connectionKey); // attempt default if invalid key is specified if (connectionInfo == null) { @@ -148,7 +147,7 @@ public class ServerCaseDataSourceInfoProvider implements Provider<DataSourceInfo return connectionInfo; } - private DataSourceInfo checkTestContainersDataSource(String connectionKey) { + private UnitDataSourceDescriptor checkTestContainersDataSource(String connectionKey) { // special case for the testcontainers profile if (!connectionKey.endsWith("-tc")) { return null; @@ -164,7 +163,7 @@ public class ServerCaseDataSourceInfoProvider implements Provider<DataSourceInfo String version = property(CONNECTION_DB_VERSION); JdbcDatabaseContainer<?> container = testContainerProvider.startContainer(version); - DataSourceInfo sourceInfo = new DataSourceInfo(); + UnitDataSourceDescriptor sourceInfo = new UnitDataSourceDescriptor(); sourceInfo.setAdapterClassName(testContainerProvider.getAdapterClass().getName()); sourceInfo.setUserName(container.getUsername()); sourceInfo.setPassword(container.getPassword()); @@ -184,12 +183,16 @@ public class ServerCaseDataSourceInfoProvider implements Provider<DataSourceInfo return new File(homeDir, ".cayenne"); } - private DataSourceInfo applyOverrides(DataSourceInfo connectionInfo) { + private UnitDataSourceDescriptor applyOverrides(UnitDataSourceDescriptor connectionInfo) { String adapter = property(ADAPTER_KEY_MAVEN); String user = property(USER_NAME_KEY_MAVEN); String pass = property(PASSWORD_KEY_MAVEN); String url = property(URL_KEY_MAVEN); String driver = property(DRIVER_KEY_MAVEN); + // no overrides, do nothing + if(adapter == null && user == null && pass == null && url == null && driver == null) { + return connectionInfo; + } if (connectionInfo == null) { // only create a brand new DSI if overrides contains a DB url... @@ -197,12 +200,12 @@ public class ServerCaseDataSourceInfoProvider implements Provider<DataSourceInfo return null; } - connectionInfo = new DataSourceInfo(); + connectionInfo = new UnitDataSourceDescriptor(); connectionInfo.setMinConnections(ConnectionProperties.MIN_CONNECTIONS); connectionInfo.setMaxConnections(ConnectionProperties.MAX_CONNECTIONS); } - connectionInfo = connectionInfo.cloneInfo(); + connectionInfo = connectionInfo.copy(); if (adapter != null) { connectionInfo.setAdapterClassName(adapter); } diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceFactory.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceFactory.java index 0c387b6d0..8950b5f71 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceFactory.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDataSourceFactory.java @@ -27,7 +27,7 @@ import java.util.Set; import javax.sql.DataSource; -import org.apache.cayenne.conn.DataSourceInfo; +import org.apache.cayenne.configuration.DataSourceDescriptor; import org.apache.cayenne.datasource.DataSourceBuilder; import org.apache.cayenne.di.AdhocObjectFactory; import org.apache.cayenne.di.Inject; @@ -35,12 +35,12 @@ import org.apache.cayenne.di.Inject; public class ServerCaseDataSourceFactory { private DataSource sharedDataSource; - private DataSourceInfo dataSourceInfo; + private DataSourceDescriptor dataSourceInfo; private Map<String, DataSource> dataSources; private Set<String> mapsWithDedicatedDataSource; private AdhocObjectFactory objectFactory; - public ServerCaseDataSourceFactory(@Inject DataSourceInfo dataSourceInfo, @Inject AdhocObjectFactory objectFactory) { + public ServerCaseDataSourceFactory(@Inject DataSourceDescriptor dataSourceInfo, @Inject AdhocObjectFactory objectFactory) { this.objectFactory = objectFactory; this.dataSourceInfo = dataSourceInfo; diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDbAdapterProvider.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDbAdapterProvider.java index ef8e9246d..c24887bd6 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDbAdapterProvider.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseDbAdapterProvider.java @@ -20,23 +20,21 @@ package org.apache.cayenne.unit.di.server; import org.apache.cayenne.ConfigurationException; import org.apache.cayenne.configuration.server.PkGeneratorFactoryProvider; -import org.apache.cayenne.conn.DataSourceInfo; import org.apache.cayenne.dba.DbAdapter; import org.apache.cayenne.dba.JdbcAdapter; import org.apache.cayenne.dba.PkGenerator; import org.apache.cayenne.di.AdhocObjectFactory; import org.apache.cayenne.di.Inject; import org.apache.cayenne.di.Provider; +import org.apache.cayenne.unit.UnitDataSourceDescriptor; public class ServerCaseDbAdapterProvider implements Provider<JdbcAdapter> { - - private DataSourceInfo dataSourceInfo; + private UnitDataSourceDescriptor dataSourceInfo; private AdhocObjectFactory objectFactory; - private PkGeneratorFactoryProvider pkGeneratorProvider; public ServerCaseDbAdapterProvider( - @Inject DataSourceInfo dataSourceInfo, + @Inject UnitDataSourceDescriptor dataSourceInfo, @Inject AdhocObjectFactory objectFactory, @Inject PkGeneratorFactoryProvider pkGeneratorProvider) { this.dataSourceInfo = dataSourceInfo; diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseModule.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseModule.java index 2429cbc05..70f064e04 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseModule.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseModule.java @@ -58,6 +58,7 @@ import org.apache.cayenne.access.types.VoidType; import org.apache.cayenne.configuration.ConfigurationNameMapper; import org.apache.cayenne.configuration.Constants; import org.apache.cayenne.configuration.DataMapLoader; +import org.apache.cayenne.configuration.DataSourceDescriptor; import org.apache.cayenne.configuration.DefaultConfigurationNameMapper; import org.apache.cayenne.configuration.DefaultObjectStoreFactory; import org.apache.cayenne.configuration.DefaultRuntimeProperties; @@ -73,7 +74,6 @@ import org.apache.cayenne.configuration.xml.HandlerFactory; import org.apache.cayenne.configuration.xml.NoopDataChannelMetaData; import org.apache.cayenne.configuration.xml.XMLDataMapLoader; import org.apache.cayenne.configuration.xml.XMLReaderProvider; -import org.apache.cayenne.conn.DataSourceInfo; import org.apache.cayenne.dba.DbAdapter; import org.apache.cayenne.dba.JdbcAdapter; import org.apache.cayenne.dba.JdbcPkGenerator; @@ -104,8 +104,11 @@ import org.apache.cayenne.dba.sybase.SybasePkGenerator; import org.apache.cayenne.di.AdhocObjectFactory; import org.apache.cayenne.di.Binder; import org.apache.cayenne.di.ClassLoaderManager; +import org.apache.cayenne.di.DIRuntimeException; +import org.apache.cayenne.di.Inject; import org.apache.cayenne.di.Key; import org.apache.cayenne.di.Module; +import org.apache.cayenne.di.Provider; import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory; import org.apache.cayenne.di.spi.DefaultClassLoaderManager; import org.apache.cayenne.di.spi.DefaultScope; @@ -125,12 +128,12 @@ import org.apache.cayenne.unit.H2UnitDbAdapter; import org.apache.cayenne.unit.HSQLDBUnitDbAdapter; import org.apache.cayenne.unit.IngresUnitDbAdapter; import org.apache.cayenne.unit.MySQLUnitDbAdapter; -import org.apache.cayenne.unit.OpenBaseUnitDbAdapter; import org.apache.cayenne.unit.OracleUnitDbAdapter; import org.apache.cayenne.unit.PostgresUnitDbAdapter; import org.apache.cayenne.unit.SQLServerUnitDbAdapter; import org.apache.cayenne.unit.SQLiteUnitDbAdapter; import org.apache.cayenne.unit.SybaseUnitDbAdapter; +import org.apache.cayenne.unit.UnitDataSourceDescriptor; import org.apache.cayenne.unit.UnitDbAdapter; import org.apache.cayenne.unit.di.DataChannelInterceptor; import org.apache.cayenne.unit.di.UnitTestLifecycleManager; @@ -249,7 +252,15 @@ public class ServerCaseModule implements Module { .put("oracle", OracleContainerProvider.class) .put("db2", Db2ContainerProvider.class); - binder.bind(DataSourceInfo.class).toProvider(ServerCaseDataSourceInfoProvider.class); + binder.bind(UnitDataSourceDescriptor.class).toProvider(ServerCaseDataSourceDescriptorProvider.class); + binder.bind(DataSourceDescriptor.class).toProviderInstance(new Provider<>() { + @Inject + UnitDataSourceDescriptor unitDataSourceDescriptor; + @Override + public DataSourceDescriptor get() throws DIRuntimeException { + return unitDataSourceDescriptor; + } + }); binder.bind(DataSourceFactory.class).to(ServerCaseSharedDataSourceFactory.class); binder.bind(DbAdapter.class).toProvider(ServerCaseDbAdapterProvider.class); binder.bind(JdbcAdapter.class).toProvider(ServerCaseDbAdapterProvider.class); diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseSharedDataSourceFactory.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseSharedDataSourceFactory.java index a4acf6db8..e2f43dddb 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseSharedDataSourceFactory.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/ServerCaseSharedDataSourceFactory.java @@ -29,6 +29,7 @@ public class ServerCaseSharedDataSourceFactory implements DataSourceFactory { private ServerCaseDataSourceFactory factory; public ServerCaseSharedDataSourceFactory(@Inject ServerCaseDataSourceFactory factory) { + this.factory = factory; } public DataSource getDataSource(DataNodeDescriptor nodeDescriptor) throws Exception { diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/UnitDbAdapterProvider.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/UnitDbAdapterProvider.java index bc52b6c0e..7cc31c0b6 100644 --- a/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/UnitDbAdapterProvider.java +++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/di/server/UnitDbAdapterProvider.java @@ -23,7 +23,7 @@ import java.util.Map; import org.apache.cayenne.CayenneRuntimeException; import org.apache.cayenne.ConfigurationException; -import org.apache.cayenne.conn.DataSourceInfo; +import org.apache.cayenne.configuration.DataSourceDescriptor; import org.apache.cayenne.dba.DbAdapter; import org.apache.cayenne.di.Inject; import org.apache.cayenne.di.Injector; @@ -37,12 +37,12 @@ public class UnitDbAdapterProvider implements Provider<UnitDbAdapter> { private Injector injector; private DbAdapter adapter; - private DataSourceInfo dataSourceInfo; + private DataSourceDescriptor dataSourceInfo; private Map<String, String> adapterTypesMap; public UnitDbAdapterProvider( @Inject(TEST_ADAPTERS_MAP) Map<String, String> adapterTypesMap, - @Inject DataSourceInfo dataSourceInfo, @Inject DbAdapter adapter, + @Inject DataSourceDescriptor dataSourceInfo, @Inject DbAdapter adapter, @Inject Injector injector) { this.dataSourceInfo = dataSourceInfo; this.adapterTypesMap = adapterTypesMap; @@ -53,17 +53,15 @@ public class UnitDbAdapterProvider implements Provider<UnitDbAdapter> { public UnitDbAdapter get() throws ConfigurationException { String testAdapterType = adapterTypesMap - .get(dataSourceInfo.getAdapterClassName()); + .get(adapter.getClass().getName()); if (testAdapterType == null) { - throw new IllegalStateException("Unmapped adapter type: " - + dataSourceInfo.getAdapterClassName()); + throw new IllegalStateException("Unmapped adapter type: " + adapter.getClass().getName()); } Class<UnitDbAdapter> type; try { type = (Class<UnitDbAdapter>) Util.getJavaClass(testAdapterType); - } - catch (ClassNotFoundException e) { + } catch (ClassNotFoundException e) { throw new CayenneRuntimeException( "Invalid class %s of type AccessStackAdapter", e, @@ -81,8 +79,7 @@ public class UnitDbAdapterProvider implements Provider<UnitDbAdapter> { UnitDbAdapter unitAdapter = c.newInstance(adapter); injector.injectMembers(unitAdapter); return unitAdapter; - } - catch (Exception e) { + } catch (Exception e) { throw new ConfigurationException("Error instantiating " + testAdapterType, e); } } diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java index abf37e5fb..3085d1511 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java @@ -23,9 +23,9 @@ import org.apache.cayenne.access.dbsync.SkipSchemaUpdateStrategy; import org.apache.cayenne.configuration.ConfigurationNode; import org.apache.cayenne.configuration.DataChannelDescriptor; import org.apache.cayenne.configuration.DataNodeDescriptor; +import org.apache.cayenne.configuration.DataSourceDescriptor; import org.apache.cayenne.configuration.event.DataNodeEvent; import org.apache.cayenne.configuration.server.XMLPoolingDataSourceFactory; -import org.apache.cayenne.conn.DataSourceInfo; import org.apache.cayenne.dbsync.naming.NameBuilder; import org.apache.cayenne.map.event.MapEvent; import org.apache.cayenne.modeler.Application; @@ -87,9 +87,7 @@ public class CreateNodeAction extends CayenneAction { DataChannelDescriptor domain = (DataChannelDescriptor) mediator.getProject().getRootNode(); DataNodeDescriptor node = buildDataNode(domain); - - DataSourceInfo src = new DataSourceInfo(); - node.setDataSourceDescriptor(src); + node.setDataSourceDescriptor(new DataSourceDescriptor()); // by default create JDBC Node node.setDataSourceFactoryType(XMLPoolingDataSourceFactory.class.getName()); diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java index f2f57ba89..67c04f110 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java @@ -22,11 +22,11 @@ package org.apache.cayenne.modeler.action; import org.apache.cayenne.configuration.ConfigurationNode; import org.apache.cayenne.configuration.DataChannelDescriptor; import org.apache.cayenne.configuration.DataNodeDescriptor; +import org.apache.cayenne.configuration.DataSourceDescriptor; import org.apache.cayenne.configuration.event.DataNodeEvent; import org.apache.cayenne.configuration.event.QueryEvent; import org.apache.cayenne.configuration.server.JNDIDataSourceFactory; import org.apache.cayenne.configuration.server.XMLPoolingDataSourceFactory; -import org.apache.cayenne.conn.DataSourceInfo; import org.apache.cayenne.dba.DbAdapter; import org.apache.cayenne.dbsync.naming.NameBuilder; import org.apache.cayenne.map.DataMap; @@ -153,8 +153,7 @@ public class ImportEOModelAction extends CayenneAction { if ("JNDI".equalsIgnoreCase(adapter)) { node.setDataSourceFactoryType(JNDIDataSourceFactory.class.getName()); node.setParameters((String) connection.get("serverUrl")); - } - else { + } else { // guess adapter from plugin or driver AdapterMapping adapterDefaults = getApplication().getAdapterMapping(); String cayenneAdapter = adapterDefaults.adapterForEOFPluginOrDriver( @@ -166,18 +165,14 @@ public class ImportEOModelAction extends CayenneAction { .getClassLoadingService() .loadClass(DbAdapter.class, cayenneAdapter); node.setAdapterType(adapterClass.toString()); - } - catch (Throwable ex) { + } catch (Throwable ex) { // ignore... } } - node - .setDataSourceFactoryType(XMLPoolingDataSourceFactory.class - .getName()); - - DataSourceInfo dsi = node.getDataSourceDescriptor(); + node.setDataSourceFactoryType(XMLPoolingDataSourceFactory.class.getName()); + DataSourceDescriptor dsi = node.getDataSourceDescriptor(); dsi.setDataSourceUrl(keyAsString(connection, "URL")); dsi.setJdbcDriver(keyAsString(connection, "driver")); dsi.setPassword(keyAsString(connection, "password")); diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/AdapterEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/AdapterEditor.java deleted file mode 100644 index 29dbca9ed..000000000 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/AdapterEditor.java +++ /dev/null @@ -1,112 +0,0 @@ -/***************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - ****************************************************************/ - -package org.apache.cayenne.modeler.editor.datanode; - -import java.awt.Component; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; - -import org.apache.cayenne.configuration.DataNodeDescriptor; -import org.apache.cayenne.configuration.event.DataNodeEvent; -import org.apache.cayenne.modeler.ProjectController; -import org.apache.cayenne.modeler.event.DataNodeDisplayEvent; -import org.apache.cayenne.modeler.event.DataNodeDisplayListener; -import org.apache.cayenne.modeler.util.CayenneController; -import org.apache.cayenne.swing.BindingBuilder; -import org.apache.cayenne.swing.ObjectBinding; - -/** - */ -public class AdapterEditor extends CayenneController { - - protected AdapterView view; - protected DataNodeDescriptor node; - protected ObjectBinding adapterNameBinding; - - public AdapterEditor(CayenneController parent) { - super(parent); - - this.view = new AdapterView(); - initController(); - } - - protected void initController() { - // init bindings - BindingBuilder builder = new BindingBuilder( - getApplication().getBindingFactory(), - this); - - adapterNameBinding = builder.bindToTextField( - view.getCustomAdapter(), - "adapterName"); - - ((ProjectController) getParent()) - .addDataNodeDisplayListener(new DataNodeDisplayListener() { - - public void currentDataNodeChanged(DataNodeDisplayEvent e) { - refreshView(e.getDataNode()); - } - }); - - getView().addComponentListener(new ComponentAdapter() { - - public void componentShown(ComponentEvent e) { - refreshView(node != null ? node : ((ProjectController) getParent()) - .getCurrentDataNode()); - } - }); - } - - protected void refreshView(DataNodeDescriptor dataNodeDescriptor) { - this.node = dataNodeDescriptor; - - if (dataNodeDescriptor == null) { - getView().setVisible(false); - return; - } - - adapterNameBinding.updateView(); - } - - public Component getView() { - return view; - } - - public String getAdapterName() { - if (node == null) { - return null; - } - - return node.getAdapterType(); - } - - public void setAdapterName(String name) { - if (node == null) { - return; - } - -// ModelerDbAdapter adapter = new ModelerDbAdapter(name, node.getDataSource()); -// adapter.validate(); - node.setAdapterType(name); - - DataNodeEvent e = new DataNodeEvent(AdapterEditor.this, node); - ((ProjectController) getParent()).fireDataNodeEvent(e); - } -} diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/AdapterView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/AdapterView.java deleted file mode 100644 index 1d12ad3dc..000000000 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/AdapterView.java +++ /dev/null @@ -1,56 +0,0 @@ -/***************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - ****************************************************************/ - -package org.apache.cayenne.modeler.editor.datanode; - -import java.awt.BorderLayout; - -import javax.swing.JPanel; -import javax.swing.JTextField; - -import org.apache.cayenne.modeler.util.JTextFieldUndoable; - -import com.jgoodies.forms.builder.DefaultFormBuilder; -import com.jgoodies.forms.layout.FormLayout; - -public class AdapterView extends JPanel { - - protected JTextField customAdapter; - - public AdapterView() { - this.customAdapter = new JTextFieldUndoable(); - - // assemble - - DefaultFormBuilder topPanelBuilder = new DefaultFormBuilder(new FormLayout( - "right:pref, 3dlu, fill:200dlu", - "")); - topPanelBuilder.setDefaultDialogBorder(); - - topPanelBuilder.appendSeparator("DbAdapter Configuration"); - topPanelBuilder.append("Custom Adapter (optional):", customAdapter); - - setLayout(new BorderLayout()); - add(topPanelBuilder.getPanel(), BorderLayout.CENTER); - } - - public JTextField getCustomAdapter() { - return customAdapter; - } -} diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DBCP2DataSourceEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DBCP2DataSourceEditor.java deleted file mode 100644 index 84a5a8c9d..000000000 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DBCP2DataSourceEditor.java +++ /dev/null @@ -1,51 +0,0 @@ -/***************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - ****************************************************************/ - -package org.apache.cayenne.modeler.editor.datanode; - -import org.apache.cayenne.modeler.ProjectController; -import org.apache.cayenne.swing.BindingBuilder; -import org.apache.cayenne.swing.BindingDelegate; -import org.apache.cayenne.swing.ObjectBinding; - -import java.awt.Component; - -public class DBCP2DataSourceEditor extends DataSourceEditor { - - protected DBCP2DataSourceView view; - - public DBCP2DataSourceEditor(ProjectController controller, - BindingDelegate nodeChangeProcessor) { - super(controller, nodeChangeProcessor); - } - - protected void prepareBindings(BindingBuilder builder) { - this.view = new DBCP2DataSourceView(); - - fieldAdapters = new ObjectBinding[1]; - fieldAdapters[0] = builder.bindToTextField( - view.getPropertiesFile(), - "node.parameters"); - } - - public Component getView() { - return view; - } - -} \ No newline at end of file diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DBCP2DataSourceView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DBCP2DataSourceView.java deleted file mode 100644 index b8f1c6917..000000000 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DBCP2DataSourceView.java +++ /dev/null @@ -1,54 +0,0 @@ -/***************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - ****************************************************************/ - -package org.apache.cayenne.modeler.editor.datanode; - -import com.jgoodies.forms.builder.DefaultFormBuilder; -import com.jgoodies.forms.layout.FormLayout; -import org.apache.cayenne.modeler.util.JTextFieldUndoable; - -import javax.swing.JPanel; -import javax.swing.JTextField; -import java.awt.BorderLayout; - -public class DBCP2DataSourceView extends JPanel { - - protected JTextField propertiesFile; - - public DBCP2DataSourceView() { - - propertiesFile = new JTextFieldUndoable(); - - // assemble - FormLayout layout = new FormLayout("right:80dlu, 3dlu, fill:200dlu", ""); - DefaultFormBuilder builder = new DefaultFormBuilder(layout); - builder.setDefaultDialogBorder(); - - builder.appendSeparator("Apache DBCP2 Configuration"); - - builder.append("DBCP2 Properties File:", propertiesFile); - - setLayout(new BorderLayout()); - add(builder.getPanel(), BorderLayout.CENTER); - } - - public JTextField getPropertiesFile() { - return propertiesFile; - } -} \ No newline at end of file diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DataNodeEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DataNodeEditor.java index ab5c5496c..c26480ad8 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DataNodeEditor.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DataNodeEditor.java @@ -38,8 +38,6 @@ public class DataNodeEditor extends CayenneController { this.view = new JTabbedPane(); view.addTab("Main", new JScrollPane(new MainDataNodeEditor(parent,this).getView())); - view.addTab("Adapter", new AdapterEditor(parent).getView()); - view.addTab("Password Encoder", new PasswordEncoderEditor(parent).getView()) ; } public Component getView() { diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DataSourceEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DataSourceEditor.java index 947879d8b..051b68b9d 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DataSourceEditor.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DataSourceEditor.java @@ -42,8 +42,6 @@ public abstract class DataSourceEditor extends CayenneController { initBindings(); } - - public DataNodeDescriptor getNode() { return node; } diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JDBCDataSourceEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JDBCDataSourceEditor.java index 163e323be..473602276 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JDBCDataSourceEditor.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JDBCDataSourceEditor.java @@ -22,7 +22,7 @@ package org.apache.cayenne.modeler.editor.datanode; import java.awt.Component; import org.apache.cayenne.configuration.DataNodeDescriptor; -import org.apache.cayenne.conn.DataSourceInfo; +import org.apache.cayenne.configuration.DataSourceDescriptor; import org.apache.cayenne.modeler.CayenneModelerController; import org.apache.cayenne.modeler.ProjectController; import org.apache.cayenne.modeler.pref.DBConnectionInfo; @@ -35,10 +35,8 @@ public class JDBCDataSourceEditor extends DataSourceEditor { protected JDBCDataSourceView view; - public JDBCDataSourceEditor(ProjectController parent, - BindingDelegate nodeChangeProcessor) { + public JDBCDataSourceEditor(ProjectController parent, BindingDelegate nodeChangeProcessor) { super(parent, nodeChangeProcessor); - } public Component getView() { @@ -49,7 +47,7 @@ public class JDBCDataSourceEditor extends DataSourceEditor { public void setNode(DataNodeDescriptor node) { if (!Util.nullSafeEquals(getNode(), node)) { if (node.getDataSourceDescriptor() == null) { - node.setDataSourceDescriptor(new DataSourceInfo()); + node.setDataSourceDescriptor(new DataSourceDescriptor()); } super.setNode(node); } @@ -91,7 +89,7 @@ public class JDBCDataSourceEditor extends DataSourceEditor { return; } - DataSourceInfo projectDSI = getNode().getDataSourceDescriptor(); + DataSourceDescriptor projectDataSourceDescriptor = getNode().getDataSourceDescriptor(); ProjectController parent = (ProjectController) getParent(); String key = parent.getDataNodePreferences().getLocalDataSource(); @@ -106,16 +104,14 @@ public class JDBCDataSourceEditor extends DataSourceEditor { .getObject(key); if (dataSource != null) { - if (dataSource.copyTo(projectDSI)) { + if (dataSource.copyTo(projectDataSourceDescriptor)) { refreshView(); super.nodeChangeProcessor.modelUpdated(null, null, null); mainController.updateStatus(null); - } - else { + } else { mainController.updateStatus("DataNode is up to date..."); } - } - else { + } else { mainController.updateStatus("Invalid Local DataSource selected for node..."); } } diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JNDIDataSourceView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JNDIDataSourceView.java deleted file mode 100644 index c6a7cb79d..000000000 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JNDIDataSourceView.java +++ /dev/null @@ -1,56 +0,0 @@ -/***************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - ****************************************************************/ - -package org.apache.cayenne.modeler.editor.datanode; - -import java.awt.BorderLayout; - -import javax.swing.JPanel; -import javax.swing.JTextField; - -import org.apache.cayenne.modeler.util.JTextFieldUndoable; - -import com.jgoodies.forms.builder.DefaultFormBuilder; -import com.jgoodies.forms.layout.FormLayout; - -public class JNDIDataSourceView extends JPanel { - - protected JTextField jndiPath; - - public JNDIDataSourceView() { - - jndiPath = new JTextFieldUndoable(); - - // assemble - FormLayout layout = new FormLayout("right:80dlu, 3dlu, fill:200dlu", ""); - DefaultFormBuilder builder = new DefaultFormBuilder(layout); - builder.setDefaultDialogBorder(); - - builder.appendSeparator("JNDI Configuration"); - - builder.append("JNDI Location:", jndiPath); - - this.setLayout(new BorderLayout()); - this.add(builder.getPanel(), BorderLayout.CENTER); - } - - public JTextField getJndiPath() { - return jndiPath; - } -} diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeEditor.java index 35a6b4659..5cb47cb65 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeEditor.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeEditor.java @@ -35,7 +35,6 @@ import org.apache.cayenne.access.dbsync.ThrowOnPartialSchemaStrategy; import org.apache.cayenne.configuration.DataChannelDescriptor; import org.apache.cayenne.configuration.DataNodeDescriptor; import org.apache.cayenne.configuration.event.DataNodeEvent; -import org.apache.cayenne.configuration.server.JNDIDataSourceFactory; import org.apache.cayenne.configuration.server.XMLPoolingDataSourceFactory; import org.apache.cayenne.modeler.ProjectController; import org.apache.cayenne.modeler.dialog.pref.PreferenceDialog; @@ -55,12 +54,9 @@ import org.apache.cayenne.validation.ValidationException; public class MainDataNodeEditor extends CayenneController { protected static final String NO_LOCAL_DATA_SOURCE = "Select DataSource for Local Work..."; - public static final String DBCP_DATA_SOURCE_FACTORY = "org.apache.cayenne.configuration.server.DBCPDataSourceFactory"; private final static String[] STANDARD_DATA_SOURCE_FACTORIES = new String[] { - XMLPoolingDataSourceFactory.class.getName(), - JNDIDataSourceFactory.class.getName(), - DBCP_DATA_SOURCE_FACTORY + XMLPoolingDataSourceFactory.class.getName() }; private final static String[] STANDARD_SCHEMA_UPDATE_STRATEGY = new String[] { @@ -192,10 +188,11 @@ public class MainDataNodeEditor extends CayenneController { builder.setDelegate(nodeChangeProcessor); - bindings = new ObjectBinding[3]; + bindings = new ObjectBinding[4]; bindings[0] = builder.bindToTextField(view.getDataNodeName(), "nodeName"); bindings[1] = builder.bindToComboSelection(view.getFactories(), "factoryName"); bindings[2] = builder.bindToComboSelection(view.getSchemaUpdateStrategy(), "schemaUpdateStrategy"); + bindings[3] = builder.bindToTextField(view.getCustomAdapter(), "adapterName"); // one way bindings builder.bindToAction(view.getConfigLocalDataSources(), "dataSourceConfigAction()"); @@ -252,20 +249,13 @@ public class MainDataNodeEditor extends CayenneController { protected void showDataSourceSubview(String factoryName) { DataSourceEditor c = datasourceEditors.get(factoryName); - // create subview dynamically... if (c == null) { - if (XMLPoolingDataSourceFactory.class.getName().equals(factoryName)) { c = new JDBCDataSourceEditor((ProjectController) getParent(), nodeChangeProcessor); - } else if (JNDIDataSourceFactory.class.getName().equals(factoryName)) { - c = new JNDIDataSourceEditor((ProjectController) getParent(), nodeChangeProcessor); - } else if (DBCP_DATA_SOURCE_FACTORY.equals(factoryName)) { - c = new DBCP2DataSourceEditor((ProjectController) getParent(), nodeChangeProcessor); } else { // special case - no detail view, just show it and bail.. defaultSubeditor.setNode(node); - disabledTab("default"); view.getDataSourceDetailLayout().show(view.getDataSourceDetail(), "default"); return; } @@ -279,19 +269,15 @@ public class MainDataNodeEditor extends CayenneController { // this will refresh subview... c.setNode(node); - disabledTab(factoryName); // display the right subview... view.getDataSourceDetailLayout().show(view.getDataSourceDetail(), factoryName); - } - protected void disabledTab(String name) { - - if (name.equals(STANDARD_DATA_SOURCE_FACTORIES[0])) { - tabbedPaneController.getTabComponent().setEnabledAt(2, true); - } else { - tabbedPaneController.getTabComponent().setEnabledAt(2, false); - } + public String getAdapterName() { + return node.getAdapterType(); } + public void setAdapterName(String name) { + node.setAdapterType(name); + } } diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeView.java index 7c22c6117..86d690dd3 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeView.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeView.java @@ -26,17 +26,12 @@ import org.apache.cayenne.modeler.util.JTextFieldUndoable; import javax.swing.JButton; import javax.swing.JComboBox; -import javax.swing.JDialog; import javax.swing.JLabel; -import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Font; -import java.awt.event.ActionEvent; - -import static org.apache.cayenne.modeler.editor.datanode.MainDataNodeEditor.DBCP_DATA_SOURCE_FACTORY; /** * A view for the main DataNode editor tab. @@ -48,6 +43,7 @@ public class MainDataNodeView extends JPanel { protected JComboBox<String> factories; protected JPanel dataSourceDetail; protected CardLayout dataSourceDetailLayout; + protected JTextFieldUndoable customAdapter; protected JComboBox<String> localDataSources; protected JButton configLocalDataSources; protected JComboBox<String> schemaUpdateStrategy; @@ -59,14 +55,14 @@ public class MainDataNodeView extends JPanel { this.factories = Application.getWidgetFactory().createUndoableComboBox(); - factories.addActionListener(this::showWarningMessage); - this.localDataSources = Application.getWidgetFactory().createUndoableComboBox(); this.schemaUpdateStrategy = Application.getWidgetFactory().createUndoableComboBox(); this.dataSourceDetailLayout = new CardLayout(); this.dataSourceDetail = new JPanel(dataSourceDetailLayout); + this.customAdapter = new JTextFieldUndoable(); + this.configLocalDataSources = new JButton("..."); this.configLocalDataSources.setToolTipText("configure local DataSource"); @@ -88,8 +84,10 @@ public class MainDataNodeView extends JPanel { Font font = new Font(getFont().getName(), Font.PLAIN, getFont().getSize() - 2); label.setFont(font); builderForLabel.append(label); - topPanelBuilder.append("", builderForLabel.getPanel(), 3); + + topPanelBuilder.append("Custom Adapter (optional):", customAdapter, 3); + topPanelBuilder.append( "Local DataSource (opt.):", localDataSources, @@ -129,12 +127,7 @@ public class MainDataNodeView extends JPanel { return configLocalDataSources; } - private void showWarningMessage(ActionEvent e){ - if(DBCP_DATA_SOURCE_FACTORY.equals(factories.getSelectedItem())) { - JDialog dialog = new JOptionPane("DPCPDataSourceFactory is deprecated since 4.1", JOptionPane.WARNING_MESSAGE) - .createDialog("Warning"); - dialog.setAlwaysOnTop(true); - dialog.setVisible(true); - } + public JTextFieldUndoable getCustomAdapter() { + return customAdapter; } } diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/PasswordEncoderEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/PasswordEncoderEditor.java deleted file mode 100644 index 6ce635469..000000000 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/PasswordEncoderEditor.java +++ /dev/null @@ -1,200 +0,0 @@ -/***************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - ****************************************************************/ -package org.apache.cayenne.modeler.editor.datanode; - -import java.awt.Component; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; - -import javax.swing.JOptionPane; - -import org.apache.cayenne.configuration.DataNodeDescriptor; -import org.apache.cayenne.configuration.event.DataNodeEvent; -import org.apache.cayenne.conn.DataSourceInfo; -import org.apache.cayenne.modeler.ProjectController; -import org.apache.cayenne.modeler.event.DataNodeDisplayEvent; -import org.apache.cayenne.modeler.event.DataNodeDisplayListener; -import org.apache.cayenne.modeler.util.CayenneController; -import org.apache.cayenne.swing.BindingBuilder; -import org.apache.cayenne.swing.BindingDelegate; -import org.apache.cayenne.swing.ObjectBinding; - -public class PasswordEncoderEditor extends CayenneController { - - protected DataNodeDescriptor node; - protected ObjectBinding[] bindings; - protected PasswordEncoderView view; - protected BindingDelegate nodeChangeProcessor; - - public PasswordEncoderEditor(CayenneController parent) { - - super(parent); - - this.view = new PasswordEncoderView(); - - this.nodeChangeProcessor = new BindingDelegate() { - - public void modelUpdated( - ObjectBinding binding, - Object oldValue, - Object newValue) { - - DataNodeEvent e = new DataNodeEvent(PasswordEncoderEditor.this, node); - ((ProjectController) getParent()).fireDataNodeEvent(e); - } - }; - - initController(); - } - - protected void initController() { - BindingBuilder builder = new BindingBuilder( - getApplication().getBindingFactory(), - this); - - builder.setDelegate(nodeChangeProcessor); - - bindings = new ObjectBinding[4]; - - bindings[0] = builder.bindToComboSelection( - view.getPasswordEncoder(), - "node.dataSourceDescriptor.passwordEncoderClass"); - bindings[1] = builder.bindToTextField( - view.getPasswordKey(), - "node.dataSourceDescriptor.passwordEncoderKey"); - bindings[2] = builder.bindToComboSelection( - view.getPasswordLocation(), - "node.dataSourceDescriptor.passwordLocation"); - bindings[3] = builder.bindToTextField( - view.getPasswordSource(), - "node.dataSourceDescriptor.passwordSource"); - - ((ProjectController) getParent()) - .addDataNodeDisplayListener(new DataNodeDisplayListener() { - - public void currentDataNodeChanged(DataNodeDisplayEvent e) { - refreshView(e.getDataNode()); - } - }); - - getView().addComponentListener(new ComponentAdapter() { - - public void componentShown(ComponentEvent e) { - refreshView(node != null ? node : ((ProjectController) getParent()) - .getCurrentDataNode()); - } - }); - - builder - .bindToAction( - view.getPasswordEncoder(), - "validatePasswordEncoderAction()"); - builder.bindToAction( - view.getPasswordLocation(), - "passwordLocationChangedAction()"); - - } - - protected void refreshView(DataNodeDescriptor dataNodeDescriptor) { - this.node = dataNodeDescriptor; - - if (dataNodeDescriptor == null || dataNodeDescriptor.getDataSourceDescriptor() == null) { - getView().setVisible(false); - return; - } - - for (ObjectBinding binding : bindings) { - binding.updateView(); - } - } - - public void validatePasswordEncoderAction() { - if (node == null || node.getDataSourceDescriptor() == null) - return; - - DataSourceInfo dsi = node.getDataSourceDescriptor(); - - if (!view.getPasswordEncoder().getSelectedItem().equals(dsi.getPasswordEncoderClass())) - return; - - if (dsi.getPasswordEncoder() == null) { - JOptionPane - .showMessageDialog( - getView(), - "A valid Password Encoder should be specified (check your CLASSPATH).", - "Invalid Password Encoder", - JOptionPane.ERROR_MESSAGE); - } - } - - private void updatePasswordElements( - boolean isPasswordFieldEnabled, - boolean isPasswordLocationEnabled, - String passwordText, - String passwordLocationLabel, - String passwordLocationText) { - view.getPasswordSource().setEnabled(isPasswordLocationEnabled); - view.getPasswordSourceLabel().setText(passwordLocationLabel); - view.getPasswordSource().setText(passwordLocationText); - - } - - public void passwordLocationChangedAction() { - if (node == null || node.getDataSourceDescriptor() == null) - return; - - DataSourceInfo dsi = node.getDataSourceDescriptor(); - - String selectedItem = (String) view.getPasswordLocation().getSelectedItem(); - - if (selectedItem.equals(DataSourceInfo.PASSWORD_LOCATION_CLASSPATH)) - updatePasswordElements( - true, - true, - dsi.getPassword(), - "Password Filename:", - dsi.getPasswordSourceFilename()); - else if (selectedItem.equals(DataSourceInfo.PASSWORD_LOCATION_EXECUTABLE)) - updatePasswordElements(false, true, null, "Password Executable:", dsi - .getPasswordSourceExecutable()); - else if (selectedItem.equals(DataSourceInfo.PASSWORD_LOCATION_MODEL)) - updatePasswordElements( - true, - false, - dsi.getPassword(), - "Password Source:", - dsi.getPasswordSourceModel()); - else if (selectedItem.equals(DataSourceInfo.PASSWORD_LOCATION_URL)) - updatePasswordElements(false, true, null, "Password URL:", dsi - .getPasswordSourceUrl()); - } - - public Component getView() { - return view; - } - - public DataNodeDescriptor getNode() { - return node; - } - - public void setNode(DataNodeDescriptor node) { - this.node = node; - } - -} diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/PasswordEncoderView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/PasswordEncoderView.java deleted file mode 100644 index 421a68af3..000000000 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/PasswordEncoderView.java +++ /dev/null @@ -1,182 +0,0 @@ -/***************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - ****************************************************************/ -package org.apache.cayenne.modeler.editor.datanode; - -import java.awt.BorderLayout; -import java.awt.Component; -import java.util.Map; -import java.util.TreeMap; - -import javax.swing.DefaultComboBoxModel; -import javax.swing.DefaultListCellRenderer; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JPanel; -import javax.swing.JTextField; - -import org.apache.cayenne.configuration.PasswordEncoding; -import org.apache.cayenne.conn.DataSourceInfo; -import org.apache.cayenne.modeler.Application; -import org.apache.cayenne.modeler.util.JTextFieldUndoable; - -import com.jgoodies.forms.builder.PanelBuilder; -import com.jgoodies.forms.layout.CellConstraints; -import com.jgoodies.forms.layout.FormLayout; - -public class PasswordEncoderView extends JPanel { - - protected JComboBox passwordEncoder; - protected JComboBox passwordLocation; - protected JTextField passwordKey; - protected JTextField passwordSource; - protected JLabel passwordSourceLabel; - - private static final String PASSWORD_CLASSPATH = "Classpath Search (File System)"; - private static final String PASSWORD_EXECUTABLE = "Executable Program"; - private static final String PASSWORD_MODEL = "Cayenne Model"; - private static final String PASSWORD_URL = "URL (file:, http:, etc)"; - - private static final Object[] PASSWORD_LOCATIONS = new Object[] { - DataSourceInfo.PASSWORD_LOCATION_MODEL, - DataSourceInfo.PASSWORD_LOCATION_CLASSPATH, - DataSourceInfo.PASSWORD_LOCATION_EXECUTABLE, - DataSourceInfo.PASSWORD_LOCATION_URL - }; - - private static final Map<String, String> passwordSourceLabels = new TreeMap<String, String>(); - - static { - passwordSourceLabels.put(DataSourceInfo.PASSWORD_LOCATION_MODEL, PASSWORD_MODEL); - passwordSourceLabels.put( - DataSourceInfo.PASSWORD_LOCATION_CLASSPATH, - PASSWORD_CLASSPATH); - passwordSourceLabels.put( - DataSourceInfo.PASSWORD_LOCATION_EXECUTABLE, - PASSWORD_EXECUTABLE); - passwordSourceLabels.put(DataSourceInfo.PASSWORD_LOCATION_URL, PASSWORD_URL); - } - - final class PasswordLocationRenderer extends DefaultListCellRenderer { - - public Component getListCellRendererComponent( - JList list, - Object object, - int arg2, - boolean arg3, - boolean arg4) { - if (object != null) - object = passwordSourceLabels.get(object); - else - object = PASSWORD_MODEL; - - return super.getListCellRendererComponent(list, object, arg2, arg3, arg4); - } - } - - public PasswordEncoderView() { - - this.passwordEncoder = Application.getWidgetFactory().createUndoableComboBox(); - this.passwordLocation = Application.getWidgetFactory().createUndoableComboBox(); - this.passwordSource = new JTextFieldUndoable(); - this.passwordKey = new JTextFieldUndoable(); - - // init combo box choices - passwordEncoder.setModel(new DefaultComboBoxModel( - PasswordEncoding.standardEncoders)); - passwordEncoder.setEditable(true); - - passwordLocation = Application.getWidgetFactory().createUndoableComboBox(); - passwordLocation.setRenderer(new PasswordLocationRenderer()); - - DefaultComboBoxModel passwordLocationModel = new DefaultComboBoxModel( - PASSWORD_LOCATIONS); - - passwordLocation.setModel(passwordLocationModel); - - CellConstraints cc = new CellConstraints(); - - FormLayout layout = new FormLayout( - "right:80dlu, 3dlu, fill:50dlu, 3dlu, fill:74dlu, 3dlu, fill:70dlu", // Columns - "p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p"); // Rows - - PanelBuilder builder = new PanelBuilder(layout); - builder.setDefaultDialogBorder(); - - builder.addSeparator("Encoder", cc.xywh(1, 1, 7, 1)); - - builder.addLabel("Password Encoder:", cc.xy(1, 11)); - builder.add(passwordEncoder, cc.xywh(3, 11, 5, 1)); - - builder.addLabel("Password Encoder Key:", cc.xy(1, 13)); - builder.add(passwordKey, cc.xywh(3, 13, 5, 1)); - - builder.addLabel("Note: Cayenne supplied encoders do not use a key.", cc.xywh( - 3, - 15, - 5, - 1)); - - builder.addLabel("Password Location:", cc.xy(1, 17)); - builder.add(passwordLocation, cc.xywh(3, 17, 5, 1)); - - passwordSourceLabel = builder.addLabel("Password Source:", cc.xy(1, 19)); - builder.add(passwordSource, cc.xywh(3, 19, 5, 1)); - - this.setLayout(new BorderLayout()); - this.add(builder.getPanel(), BorderLayout.CENTER); - - } - - /** - * @return the passwordEncoder - */ - public JComboBox getPasswordEncoder() { - return passwordEncoder; - } - - /** - * @return the passwordLocation - */ - public JComboBox getPasswordLocation() { - return passwordLocation; - } - - /** - * @return the passwordKey - */ - public JTextField getPasswordKey() { - return passwordKey; - } - - /** - * @return the passwordSource - */ - public JTextField getPasswordSource() { - return passwordSource; - } - - /** - * @return the passwordLocationLabel - */ - public JLabel getPasswordSourceLabel() { - return passwordSourceLabel; - } - -} diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DBConnectionInfo.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DBConnectionInfo.java index f8eef2ad6..225c7d609 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DBConnectionInfo.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DBConnectionInfo.java @@ -25,8 +25,8 @@ import java.util.prefs.Preferences; import javax.sql.DataSource; +import org.apache.cayenne.configuration.DataSourceDescriptor; import org.apache.cayenne.configuration.server.DbAdapterFactory; -import org.apache.cayenne.conn.DataSourceInfo; import org.apache.cayenne.datasource.DriverDataSource; import org.apache.cayenne.dba.AutoAdapter; import org.apache.cayenne.dba.DbAdapter; @@ -274,7 +274,7 @@ public class DBConnectionInfo extends CayennePreference { * an adapter update here. </i> * </p> */ - public boolean copyTo(final DataSourceInfo dataSourceInfo) { + public boolean copyTo(final DataSourceDescriptor dataSourceInfo) { boolean updated = false; if (!Util.nullSafeEquals(dataSourceInfo.getDataSourceUrl(), getUrl())) { @@ -300,7 +300,7 @@ public class DBConnectionInfo extends CayennePreference { return updated; } - public boolean copyFrom(final DataSourceInfo dataSourceInfo) { + public boolean copyFrom(final DataSourceDescriptor dataSourceInfo) { boolean updated = false; if (!Util.nullSafeEquals(dataSourceInfo.getDataSourceUrl(), getUrl())) { diff --git a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/action/CreateNodeActionTest.java b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/action/CreateNodeActionTest.java index dbd91fe06..5821e3e21 100644 --- a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/action/CreateNodeActionTest.java +++ b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/action/CreateNodeActionTest.java @@ -19,10 +19,9 @@ package org.apache.cayenne.modeler.action; - import org.apache.cayenne.configuration.DataChannelDescriptor; import org.apache.cayenne.configuration.DataNodeDescriptor; -import org.apache.cayenne.conn.DataSourceInfo; +import org.apache.cayenne.configuration.DataSourceDescriptor; import org.junit.Test; import static org.junit.Assert.assertNotNull; @@ -36,8 +35,7 @@ public class CreateNodeActionTest { try { action = new CreateNodeAction(null); - } - catch (InternalError e) { + } catch (InternalError e) { // caused by headless server running the tests ... // TODO: setup test environment DISPLAY variable return; @@ -50,10 +48,9 @@ public class CreateNodeActionTest { assertNotNull(node); assertNotNull(node.getName()); - DataSourceInfo ds1 = new DataSourceInfo(); + DataSourceDescriptor ds1 = new DataSourceDescriptor(); node.setDataSourceDescriptor(ds1); - assertSame("Project DataNode must not wrap the DataSource", ds1, node - .getDataSourceDescriptor()); + assertSame("Project DataNode must not wrap the DataSource", ds1, node.getDataSourceDescriptor()); } }