Introduction

Implementation to transfer properties to a stream using templates to define the output format.

Basic Configuration

Add this dependency to the smartics-properties-maven-plugin:

<plugin>
  <groupId>de.smartics.properties</groupId>
  <artifactId>smartics-properties-maven-plugin</artifactId>
  <version>/add current version here/</version>
  <executions>
    ... as shown in the next sections ...
  </executions>
  <dependencies>
    <dependency>
      <groupId>de.smartics.properties</groupId>
      <artifactId>smartics-properties-transfer-templatestream</artifactId>
      <version>0.1.0</version>
    </dependency>
  </dependencies>
</plugin>

If you have more than one execution, you may move the basic configuration outside the execution block:

<plugin>
  <groupId>de.smartics.properties</groupId>
  <artifactId>smartics-properties-maven-plugin</artifactId>
  <version>/add current version here/</version>
  <executions>
    ... as shown in the next sections ...
  </executions>
  <dependencies>
    ... as shown above ...
  </dependencies>
  <configuration>
    <artifactItems>
      ... OPTIONAL: add any artifacts with property definitions here ...
    </artifactItems>
    <definitionConfigParser
      implementation="de.smartics.properties.impl.config.domain.key.rtaware.TenantUserDefinitionConfigParser" />
  </configuration>

Use the Definition Config Parser (used to parse the definition.xml) that suites your needs. The config parser has to match the namespace given in the definition.xml files.

MySQL

The following configuration generates an SQL script to run on a MySQL database:

<plugin>
  <groupId>de.smartics.properties</groupId>
  <artifactId>smartics-properties-maven-plugin</artifactId>
  <version>/add current version here/</version>
  <executions>
    <execution>
      <id>sql-export</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>properties-transfer</goal>
      </goals>
      <configuration>
        <propertySinkFactory implementation="de.smartics.properties.config.transfer.templatestream.MySqlFactory">
          <file>${project.build.directory}/mysql-export.sql</file>
        </propertySinkFactory>
      </configuration>
    </execution>
  </executions>

  <dependencies>
     ... as shown above ...
  </dependencies>

  <configuration>
     ... as shown above ...
  </configuration>
</plugin>

Here is an example output:

-- mail/configuration-mail.properties
INSERT INTO config VALUES ('//test:mail/de.smartics.sandbox:mail-server:','mail.server.gui','https://${mail.server.url}/index.html') ON DUPLICATE KEY UPDATE value = 'https://${mail.server.url}/index.html';
INSERT INTO config VALUES ('//test:mail/de.smartics.sandbox:mail-server:','mail.server.url','mail.example.com') ON DUPLICATE KEY UPDATE value = 'mail.example.com';
INSERT INTO config VALUES ('//test:mail/de.smartics.sandbox:mail-server:','mail.mailsPerPage','10') ON DUPLICATE KEY UPDATE value = '10';
-- main/configuration-announce.properties
INSERT INTO config VALUES ('//test:main/de.smartics.sandbox:app-server:','announce.directory','C\:Temp') ON DUPLICATE KEY UPDATE value = 'C\:Temp';
INSERT INTO config VALUES ('//test:main/de.smartics.sandbox:app-server:','announce.lookupIntervalMs','0') ON DUPLICATE KEY UPDATE value = '0';
-- de.smartics.sandbox/test-application-1-config/0.1.0/features.properties
INSERT INTO config VALUES ('//test:/de.smartics.sandbox:test-application:','mail.fastMail','true') ON DUPLICATE KEY UPDATE value = 'true';
INSERT INTO config VALUES ('//test:/de.smartics.sandbox:test-application:','mail.userDefinedOrder','true') ON DUPLICATE KEY UPDATE value = 'true';
-- de.smartics.sandbox/test-application-1-config/0.1.0/configuration-mail.properties
INSERT INTO config VALUES ('//test:/de.smartics.sandbox:test-application:','mail.server.gui','https://${mail.server.url}/index.html') ON DUPLICATE KEY UPDATE value = 'https://${mail.server.url}/index.html';
INSERT INTO config VALUES ('//test:/de.smartics.sandbox:test-application:','mail.server.url','mail-dev.${app.domain}') ON DUPLICATE KEY UPDATE value = 'mail-dev.${app.domain}';
INSERT INTO config VALUES ('//test:/de.smartics.sandbox:test-application:','mail.mailsPerPage','10') ON DUPLICATE KEY UPDATE value = '10';
INSERT INTO config VALUES ('//test:/de.smartics.sandbox:test-application:','mail.server.password','ETLbewAAATzBi7VNABRBRVMvQ0JDL1BLQ1M1UGFkZGluZwCAABAAENTmsLyQX5+JELL3rZbC+R4AAAAQwuGQbT93kEhfOTiTEgkyoQAUhpUXvq+ZXe8CqDOn0EZd+cLAzvg=') ON DUPLICATE KEY UPDATE value = 'ETLbewAAATzBi7VNABRBRVMvQ0JDL1BLQ1M1UGFkZGluZwCAABAAENTmsLyQX5+JELL3rZbC+R4AAAAQwuGQbT93kEhfOTiTEgkyoQAUhpUXvq+ZXe8CqDOn0EZd+cLAzvg=';
-- de.smartics.sandbox/test-application-1-config/0.1.0/configuration-announce.properties
INSERT INTO config VALUES ('//test:/de.smartics.sandbox:test-application:','announce.directory','C\:Temp') ON DUPLICATE KEY UPDATE value = 'C\:Temp';
INSERT INTO config VALUES ('//test:/de.smartics.sandbox:test-application:','announce.lookupIntervalMs','0') ON DUPLICATE KEY UPDATE value = '0';
-- de.smartics.sandbox/test-application-1-config/0.1.0/configuration.properties
INSERT INTO config VALUES ('//test:/de.smartics.sandbox:test-application:','app.additionalUrls','http://www.example.com/Transfer/external') ON DUPLICATE KEY UPDATE value = 'http://www.example.com/Transfer/external';
INSERT INTO config VALUES ('//test:/de.smartics.sandbox:test-application:','app.homePage','${app.server.url}/index.html') ON DUPLICATE KEY UPDATE value = '${app.server.url}/index.html';
INSERT INTO config VALUES ('//test:/de.smartics.sandbox:test-application:','app.server.url','http://localhost') ON DUPLICATE KEY UPDATE value = 'http://localhost';
INSERT INTO config VALUES ('//test:/de.smartics.sandbox:test-application:','app.domain','example.com') ON DUPLICATE KEY UPDATE value = 'example.com';
-- test2/features.properties
INSERT INTO config VALUES ('//test2:/::','mail.fastMail','false') ON DUPLICATE KEY UPDATE value = 'false';
INSERT INTO config VALUES ('//test2:/::','mail.userDefinedOrder','false') ON DUPLICATE KEY UPDATE value = 'false';
-- user.jane/features.properties
INSERT INTO config VALUES ('user.jane//:/::','mail.fastMail','false') ON DUPLICATE KEY UPDATE value = 'false';
INSERT INTO config VALUES ('user.jane//:/::','mail.userDefinedOrder','true') ON DUPLICATE KEY UPDATE value = 'true';

HSQL

The following configuration generates an SQL script to run on a HSQL database:

<plugin>
  <groupId>de.smartics.properties</groupId>
  <artifactId>smartics-properties-maven-plugin</artifactId>
  <version>/add current version here/</version>
  <executions>
    <execution>
      <id>sql-export</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>properties-transfer</goal>
      </goals>
      <configuration>
        <propertySinkFactory implementation="de.smartics.properties.config.transfer.templatestream.HSqlFactory">
          <file>$D:\Projekte\workspaces\projects\smartics-properties-project\smartics-properties-transfer-templatestream\target\checkout\target/mysql-export.sql</file>
        </propertySinkFactory>
      </configuration>
    </execution>
  </executions>

  <dependencies>
     ... as shown above ...
  </dependencies>

  <configuration>
     ... as shown above ...
  </configuration>
</plugin>

Here is an example output:

-- mail/configuration-mail.properties
MERGE INTO config USING (VALUES '//test:mail/de.smartics.sandbox:mail-server:','mail.server.gui','https://${mail.server.url}/index.html') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = 'https://${mail.server.url}/index.html' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('//test:mail/de.smartics.sandbox:mail-server:','mail.server.gui','https://${mail.server.url}/index.html');
MERGE INTO config USING (VALUES '//test:mail/de.smartics.sandbox:mail-server:','mail.server.url','mail.example.com') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = 'mail.example.com' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('//test:mail/de.smartics.sandbox:mail-server:','mail.server.url','mail.example.com');
MERGE INTO config USING (VALUES '//test:mail/de.smartics.sandbox:mail-server:','mail.mailsPerPage','10') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = '10' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('//test:mail/de.smartics.sandbox:mail-server:','mail.mailsPerPage','10');
-- main/configuration-announce.properties
MERGE INTO config USING (VALUES '//test:main/de.smartics.sandbox:app-server:','announce.directory','C\:Temp') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = 'C\:Temp' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('//test:main/de.smartics.sandbox:app-server:','announce.directory','C\:Temp');
MERGE INTO config USING (VALUES '//test:main/de.smartics.sandbox:app-server:','announce.lookupIntervalMs','0') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = '0' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('//test:main/de.smartics.sandbox:app-server:','announce.lookupIntervalMs','0');
-- de.smartics.sandbox/test-application-1-config/0.1.0/features.properties
MERGE INTO config USING (VALUES '//test:/de.smartics.sandbox:test-application:','mail.fastMail','true') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = 'true' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('//test:/de.smartics.sandbox:test-application:','mail.fastMail','true');
MERGE INTO config USING (VALUES '//test:/de.smartics.sandbox:test-application:','mail.userDefinedOrder','true') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = 'true' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('//test:/de.smartics.sandbox:test-application:','mail.userDefinedOrder','true');
-- de.smartics.sandbox/test-application-1-config/0.1.0/configuration-mail.properties
MERGE INTO config USING (VALUES '//test:/de.smartics.sandbox:test-application:','mail.server.gui','https://${mail.server.url}/index.html') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = 'https://${mail.server.url}/index.html' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('//test:/de.smartics.sandbox:test-application:','mail.server.gui','https://${mail.server.url}/index.html');
MERGE INTO config USING (VALUES '//test:/de.smartics.sandbox:test-application:','mail.server.url','mail-dev.${app.domain}') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = 'mail-dev.${app.domain}' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('//test:/de.smartics.sandbox:test-application:','mail.server.url','mail-dev.${app.domain}');
MERGE INTO config USING (VALUES '//test:/de.smartics.sandbox:test-application:','mail.mailsPerPage','10') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = '10' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('//test:/de.smartics.sandbox:test-application:','mail.mailsPerPage','10');
MERGE INTO config USING (VALUES '//test:/de.smartics.sandbox:test-application:','mail.server.password','ETLbewAAATzBi7VNABRBRVMvQ0JDL1BLQ1M1UGFkZGluZwCAABAAENTmsLyQX5+JELL3rZbC+R4AAAAQwuGQbT93kEhfOTiTEgkyoQAUhpUXvq+ZXe8CqDOn0EZd+cLAzvg=') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = 'ETLbewAAATzBi7VNABRBRVMvQ0JDL1BLQ1M1UGFkZGluZwCAABAAENTmsLyQX5+JELL3rZbC+R4AAAAQwuGQbT93kEhfOTiTEgkyoQAUhpUXvq+ZXe8CqDOn0EZd+cLAzvg=' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('//test:/de.smartics.sandbox:test-application:','mail.server.password','ETLbewAAATzBi7VNABRBRVMvQ0JDL1BLQ1M1UGFkZGluZwCAABAAENTmsLyQX5+JELL3rZbC+R4AAAAQwuGQbT93kEhfOTiTEgkyoQAUhpUXvq+ZXe8CqDOn0EZd+cLAzvg=');
-- de.smartics.sandbox/test-application-1-config/0.1.0/configuration-announce.properties
MERGE INTO config USING (VALUES '//test:/de.smartics.sandbox:test-application:','announce.directory','C\:Temp') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = 'C\:Temp' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('//test:/de.smartics.sandbox:test-application:','announce.directory','C\:Temp');
MERGE INTO config USING (VALUES '//test:/de.smartics.sandbox:test-application:','announce.lookupIntervalMs','0') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = '0' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('//test:/de.smartics.sandbox:test-application:','announce.lookupIntervalMs','0');
-- de.smartics.sandbox/test-application-1-config/0.1.0/configuration.properties
MERGE INTO config USING (VALUES '//test:/de.smartics.sandbox:test-application:','app.additionalUrls','http://www.example.com/Transfer/external') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = 'http://www.example.com/Transfer/external' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('//test:/de.smartics.sandbox:test-application:','app.additionalUrls','http://www.example.com/Transfer/external');
MERGE INTO config USING (VALUES '//test:/de.smartics.sandbox:test-application:','app.homePage','${app.server.url}/index.html') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = '${app.server.url}/index.html' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('//test:/de.smartics.sandbox:test-application:','app.homePage','${app.server.url}/index.html');
MERGE INTO config USING (VALUES '//test:/de.smartics.sandbox:test-application:','app.server.url','http://localhost') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = 'http://localhost' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('//test:/de.smartics.sandbox:test-application:','app.server.url','http://localhost');
MERGE INTO config USING (VALUES '//test:/de.smartics.sandbox:test-application:','app.domain','example.com') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = 'example.com' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('//test:/de.smartics.sandbox:test-application:','app.domain','example.com');
-- test2/features.properties
MERGE INTO config USING (VALUES '//test2:/::','mail.fastMail','false') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = 'false' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('//test2:/::','mail.fastMail','false');
MERGE INTO config USING (VALUES '//test2:/::','mail.userDefinedOrder','false') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = 'false' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('//test2:/::','mail.userDefinedOrder','false');
-- user.jane/features.properties
MERGE INTO config USING (VALUES 'user.jane//:/::','mail.fastMail','false') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = 'false' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('user.jane//:/::','mail.fastMail','false');
MERGE INTO config USING (VALUES 'user.jane//:/::','mail.userDefinedOrder','true') N (c,n,v) ON config.config=N.c AND config.name=N.n WHEN MATCHED THEN UPDATE SET value = 'true' WHEN NOT MATCHED THEN INSERT (config, name, value) VALUES ('user.jane//:/::','mail.userDefinedOrder','true');

CSV

The following configuration generates a CSV file:

<plugin>
  <groupId>de.smartics.properties</groupId>
  <artifactId>smartics-properties-maven-plugin</artifactId>
  <version>/add current version here/</version>
  <executions>
    <execution>
      <id>csv-export</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>properties-transfer</goal>
      </goals>
      <configuration>
        <propertySinkFactory implementation="de.smartics.properties.config.transfer.templatestream.CsvFactory">
          <file>$D:\Projekte\workspaces\projects\smartics-properties-project\smartics-properties-transfer-templatestream\target\checkout\target/export.csv</file>
          <writeHeader>true</writeHeader>
          <encoding>ISO-8859-1</encoding>
        </propertySinkFactory>
      </configuration>
    </execution>
  </executions>

  <dependencies>
     ... as shown above ...
  </dependencies>

  <configuration>
     ... as shown above ...
  </configuration>
</plugin>

Here is an example output:

config,name,value
//test:mail/de.smartics.sandbox:mail-server:,mail.server.gui,https://${mail.server.url}/index.html
//test:mail/de.smartics.sandbox:mail-server:,mail.server.url,mail.example.com
//test:mail/de.smartics.sandbox:mail-server:,mail.mailsPerPage,10
//test:main/de.smartics.sandbox:app-server:,announce.directory,C\:Temp
//test:main/de.smartics.sandbox:app-server:,announce.lookupIntervalMs,0
//test:/de.smartics.sandbox:test-application:,mail.fastMail,true
//test:/de.smartics.sandbox:test-application:,mail.userDefinedOrder,true
//test:/de.smartics.sandbox:test-application:,mail.server.gui,https://${mail.server.url}/index.html
//test:/de.smartics.sandbox:test-application:,mail.server.url,mail-dev.${app.domain}
//test:/de.smartics.sandbox:test-application:,mail.mailsPerPage,10
//test:/de.smartics.sandbox:test-application:,mail.server.password,ETLbewAAATzBi7VNABRBRVMvQ0JDL1BLQ1M1UGFkZGluZwCAABAAENTmsLyQX5+JELL3rZbC+R4AAAAQwuGQbT93kEhfOTiTEgkyoQAUhpUXvq+ZXe8CqDOn0EZd+cLAzvg=
//test:/de.smartics.sandbox:test-application:,announce.directory,C\:Temp
//test:/de.smartics.sandbox:test-application:,announce.lookupIntervalMs,0
//test:/de.smartics.sandbox:test-application:,app.additionalUrls,http://www.example.com/Transfer/external
//test:/de.smartics.sandbox:test-application:,app.homePage,${app.server.url}/index.html
//test:/de.smartics.sandbox:test-application:,app.server.url,http://localhost
//test:/de.smartics.sandbox:test-application:,app.domain,example.com
//test2:/::,mail.fastMail,false
//test2:/::,mail.userDefinedOrder,false
user.jane//:/::,mail.fastMail,false
user.jane//:/::,mail.userDefinedOrder,true

XML

The following configuration generates a XML file:

<plugin>
  <groupId>de.smartics.properties</groupId>
  <artifactId>smartics-properties-maven-plugin</artifactId>
  <version>/add current version here/</version>
  <executions>
    <execution>
      <id>xml-export</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>properties-transfer</goal>
      </goals>
      <configuration>
        <propertySinkFactory implementation="de.smartics.properties.config.transfer.templatestream.XmlFactory">
          <file>$D:\Projekte\workspaces\projects\smartics-properties-project\smartics-properties-transfer-templatestream\target\checkout\target/export.xml</file>
        </propertySinkFactory>
      </configuration>
    </execution>
  </executions>

  <dependencies>
     ... as shown above ...
  </dependencies>

  <configuration>
     ... as shown above ...
  </configuration>
</plugin>

Here is an example output:

<?xml version="1.0" encoding="UTF-8"?>

<config>
  <properties from="mail/configuration-mail.properties">
    <property config="//test:mail/de.smartics.sandbox:mail-server:" name="mail.server.gui">https://${mail.server.url}/index.html</property>
    <property config="//test:mail/de.smartics.sandbox:mail-server:" name="mail.server.url">mail.example.com</property>
    <property config="//test:mail/de.smartics.sandbox:mail-server:" name="mail.mailsPerPage">10</property>
  </properties>
  <properties from="main/configuration-announce.properties">
    <property config="//test:main/de.smartics.sandbox:app-server:" name="announce.directory">C\:Temp</property>
    <property config="//test:main/de.smartics.sandbox:app-server:" name="announce.lookupIntervalMs">0</property>
  </properties>
  <properties from="de.smartics.sandbox/test-application-1-config/0.1.0/features.properties">
    <property config="//test:/de.smartics.sandbox:test-application:" name="mail.fastMail">true</property>
    <property config="//test:/de.smartics.sandbox:test-application:" name="mail.userDefinedOrder">true</property>
  </properties>
  <properties from="de.smartics.sandbox/test-application-1-config/0.1.0/configuration-mail.properties">
    <property config="//test:/de.smartics.sandbox:test-application:" name="mail.server.gui">https://${mail.server.url}/index.html</property>
    <property config="//test:/de.smartics.sandbox:test-application:" name="mail.server.url">mail-dev.${app.domain}</property>
    <property config="//test:/de.smartics.sandbox:test-application:" name="mail.mailsPerPage">10</property>
    <property config="//test:/de.smartics.sandbox:test-application:" name="mail.server.password">ETLbewAAATzBi7VNABRBRVMvQ0JDL1BLQ1M1UGFkZGluZwCAABAAENTmsLyQX5+JELL3rZbC+R4AAAAQwuGQbT93kEhfOTiTEgkyoQAUhpUXvq+ZXe8CqDOn0EZd+cLAzvg=</property>
  </properties>
  <properties from="de.smartics.sandbox/test-application-1-config/0.1.0/configuration-announce.properties">
    <property config="//test:/de.smartics.sandbox:test-application:" name="announce.directory">C\:Temp</property>
    <property config="//test:/de.smartics.sandbox:test-application:" name="announce.lookupIntervalMs">0</property>
  </properties>
  <properties from="de.smartics.sandbox/test-application-1-config/0.1.0/configuration.properties">
    <property config="//test:/de.smartics.sandbox:test-application:" name="app.additionalUrls">http://www.example.com/Transfer/external</property>
    <property config="//test:/de.smartics.sandbox:test-application:" name="app.homePage">${app.server.url}/index.html</property>
    <property config="//test:/de.smartics.sandbox:test-application:" name="app.server.url">http://localhost</property>
    <property config="//test:/de.smartics.sandbox:test-application:" name="app.domain">example.com</property>
  </properties>
  <properties from="test2/features.properties">
    <property config="//test2:/::" name="mail.fastMail">false</property>
    <property config="//test2:/::" name="mail.userDefinedOrder">false</property>
  </properties>
  <properties from="user.jane/features.properties">
    <property config="user.jane//:/::" name="mail.fastMail">false</property>
    <property config="user.jane//:/::" name="mail.userDefinedOrder">true</property>
  </properties>
</config>

Generic

If none of the above suits your needs, you may use Factory to create a template on your own:

<configuration>
  <propertySinkFactory implementation="de.smartics.properties.config.transfer.templatestream.Factory">
    ... use setters provided by Factory ...
  </propertySinkFactory>
</configuration>

Only setters accepting a String argument are relevant for your configuration.

In your template use the following placeholders:

Placeholder Description
${table} The name of the configuration table.
${configColumn} The name of the column in the configuration table that contains the configuration key.
${nameColumn} The name of the colum in the configuration table that contains the property name.
${valueColumn} The name of the colum in the configuration table that contains the property value.
${location} The location of the property definitions.
${configKey} The configuration key that identifies the configuration the property belongs to.
${name} The name of the property.
${value} The value of the property.
${newline} Inserts a single newline (\n).

A sample template looks like this:

INSERT INTO ${table}
  VALUES ('${configKey}','${name}','${value}')
  ON DUPLICATE KEY UPDATE ${valueColumn} = '${value}';${newline}