Just to chime in on this topic, since my original question about user/password redaction I have done a lot of research and testing, and I decided to go with a modified version of Mike Kienenberger's DataSourceFactory. I also have a just plain Java application, btw. Since my needs were a bit different than his I streamlined the code a bit, and now I have a great resolution to my original quandary. By using the DataSourceFactory all implementation physical database properties are removed from the code (including the XML file),  the properties are provided at runtime, and the modeler still works great. I am including the code below in hopes that it may help you. Thanks to Mr. Kienenberger again for my ultimate solution. I note in passing that this method lets me change /which/ database I'm using at runtime as well, something I need to do but didn't mention earlier.

The DataSourceFactory class in the application is pretty simple. PurdahKeys is just a singleton POJO bean-like class:

public final class A1iciaDataSourceFactory implements DataSourceFactory {

    @Override
    public DataSource getDataSource(DataNodeDescriptor nodeDescriptor) throws Exception {
        MysqlConnectionPoolDataSource dataSource;
        PurdahKeys purdah;

        purdah = PurdahKeys.getInstance();
        dataSource = new MysqlConnectionPoolDataSource();
        dataSource.setUser(purdah.getDatabaseUser());
        dataSource.setPassword(purdah.getDatabasePassword());
        dataSource.setServerName(purdah.getDatabaseServer());
        dataSource.setPort(purdah.getDatabasePort());
        dataSource.setDatabaseName(purdah.getDatabaseName());
        dataSource.setUseSSL(purdah.getDatabaseUseSSL());
        return dataSource;
    }

}

The node definition in the XML file looks like:

    <node name="a1icia_datanode"
         factory="com.hulles.a1icia.cayenne.A1iciaDataSourceFactory"
 
schema-update-strategy="org.apache.cayenne.access.dbsync.SkipSchemaUpdateStrategy">
        <map-ref name="a1icia_datamap"/>
        <data-source>
            <url value="announcement"/>
        </data-source>
     </node>

The <data-source> <url> property isn't really used anywhere in my code, but if I take it out I get an error from the modeler saying that there are no parameters, so I include it with a dummy value.

Again, I hope this helps someone. I should add that I'm using Cayenne 4.1 M1.

-- Mark Hull



On 01/16/2018 03:22 PM, Pascal Robert wrote:
Do -Dcayenne.jdbc.username really work? I’m trying to use that (so that the 
password is not stored in Git), and the runtime is still using the login 
information from the XML file.

Cayenne 4.1.M1.
ServerRuntime mysqlRuntime = 
ServerRuntime.builder().addConfig("cayenne-mysql.xml").build();

Le 18 déc. 2017 à 11:49, Andrus Adamchik <and...@objectstyle.org> a écrit :

Hi Mark,

We've done quite a bit of work in Cayenne to avoid complex things like 
PasswordEncoding or custom DataSourceFactories. If all that is needed is to 
change / define login credentials, the simplest way is via properties [1]. [2] 
shows an example with a single DataNode. If you have more than one, you will 
need to add the project name and the DataNode name to the base property name. 
E.g.:

export MY_USER=user
export MY_PASSWORD=secret

java -Dcayenne.jdbc.username.project.mynode=$MY_USER \
     -Dcayenne.jdbc.password.project.mynode=$MY_PASSWORD \
     -jar myapp.jar


Hope this helps,
Andrus

[1] 
http://cayenne.apache.org/docs/4.0/cayenne-guide/configuration-properties.html
[2] 
https://stackoverflow.com/questions/45781378/best-practice-to-manage-apache-cayenne-project-xml-file



Reply via email to