This is an automated email from the ASF dual-hosted git repository.

sgoeschl pushed a commit to branch FREEMARKER-188
in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git

commit fac87b9bda44b3c83f17d41d095547f284e3b485
Author: Siegfried Goeschl <[email protected]>
AuthorDate: Wed Sep 8 17:09:28 2021 +0200

    FREEMARKER-188 First cut of implementation is working
---
 .../generator/base/datasource/DataSource.java      |  2 +-
 .../base/datasource/DataSourcesSupplier.java       | 13 ++--
 .../generator/base/output/OutputGenerator.java     | 16 ++++-
 .../freemarker/generator/base/util/FileUtils.java  |  4 +-
 .../generator/datasource/DataSourceTest.java       |  9 ++-
 .../freemarker/generator/util/FileUtilsTest.java   |  1 +
 .../app/templates/freemarker-generator/info.ftl    | 84 +++++++++++-----------
 .../config/output/AggregatingOutputGenerator.java  |  4 +-
 .../config/output/GeneratingOutputGenerator.java   |  9 ++-
 .../generator/cli/task/FreeMarkerTask.java         | 12 ++--
 10 files changed, 88 insertions(+), 66 deletions(-)

diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSource.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSource.java
index 6383258..61c014c 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSource.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSource.java
@@ -133,7 +133,7 @@ public class DataSource implements Closeable, 
javax.activation.DataSource {
         this.group = StringUtils.emptyToNull(group);
         this.uri = requireNonNull(uri);
         this.dataSource = requireNonNull(dataSource);
-        this.relativeFilePath = relativeFilePath != null ? relativeFilePath : 
".";
+        this.relativeFilePath = relativeFilePath != null ? relativeFilePath : 
"";
         this.contentType = contentType;
         this.charset = charset;
         this.properties = properties != null ? new HashMap<>(properties) : new 
HashMap<>();
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java
index dbf94e2..8fc2e01 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/datasource/DataSourcesSupplier.java
@@ -112,13 +112,13 @@ public class DataSourcesSupplier implements 
Supplier<List<DataSource>> {
     }
 
     private static List<DataSource> resolveFileOrDirectory(String source, 
String include, String exclude, Charset charset) {
-        final NamedUri namedUri = NamedUriStringParser.parse(source);
-        final String path = namedUri.getFile().getPath();
-        final String group = namedUri.getGroupOrDefault(DEFAULT_GROUP);
-        final Charset currCharset = getCharsetOrDefault(namedUri, charset);
-        final Map<String, String> parameters = namedUri.getParameters();
+        final NamedUri sourceUri = NamedUriStringParser.parse(source);
+        final String path = sourceUri.getFile().getPath();
+        final String group = sourceUri.getGroupOrDefault(DEFAULT_GROUP);
+        final Charset currCharset = getCharsetOrDefault(sourceUri, charset);
+        final Map<String, String> parameters = sourceUri.getParameters();
         return fileSupplier(path, include, exclude).get().stream()
-                .map(file -> fromFile(namedUri, getDataSourceName(namedUri, 
file), group, file, currCharset, parameters))
+                .map(file -> fromFile(sourceUri, getDataSourceName(sourceUri, 
file), group, file, currCharset, parameters))
                 .collect(toList());
     }
 
@@ -149,7 +149,6 @@ public class DataSourcesSupplier implements 
Supplier<List<DataSource>> {
                 .build();
     }
 
-
     private static RecursiveFileSupplier fileSupplier(String source, String 
include, String exclude) {
         return new RecursiveFileSupplier(singletonList(source), 
singletonList(include), singletonList(exclude));
     }
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/output/OutputGenerator.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/output/OutputGenerator.java
index c701151..f2c4e6f 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/output/OutputGenerator.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/output/OutputGenerator.java
@@ -31,6 +31,11 @@ import static java.util.Objects.requireNonNull;
  */
 public class OutputGenerator {
 
+    public enum SeedType {
+        DATASOURCE,
+        TEMPLATE
+    }
+
     /** Source of template */
     private final TemplateSource templateSource;
 
@@ -43,15 +48,19 @@ public class OutputGenerator {
     /** Variables (as a map) used for the transformation */
     private final Map<String, Object> variables;
 
+    private final SeedType seedType;
+
     public OutputGenerator(
             TemplateSource templateSource,
             TemplateOutput templateOutput,
             List<DataSource> dataSources,
-            Map<String, Object> variables) {
+            Map<String, Object> variables,
+            SeedType seedType) {
         this.templateSource = requireNonNull(templateSource);
         this.templateOutput = requireNonNull(templateOutput);
         this.dataSources = requireNonNull(dataSources);
         this.variables = requireNonNull(variables);
+        this.seedType = requireNonNull(seedType);
     }
 
     public TemplateSource getTemplateSource() {
@@ -70,6 +79,10 @@ public class OutputGenerator {
         return variables;
     }
 
+    public SeedType getSeedType() {
+        return seedType;
+    }
+
     @Override
     public String toString() {
         return "OutputGenerator{" +
@@ -77,6 +90,7 @@ public class OutputGenerator {
                 ", templateOutput=" + templateOutput +
                 ", dataSources=" + dataSources +
                 ", variables=" + variables +
+                ", seedType=" + seedType +
                 '}';
     }
 }
diff --git 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/FileUtils.java
 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/FileUtils.java
index 8371454..b6a99bb 100644
--- 
a/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/FileUtils.java
+++ 
b/freemarker-generator-base/src/main/java/org/apache/freemarker/generator/base/util/FileUtils.java
@@ -23,8 +23,8 @@ public class FileUtils {
         final String relativePath = 
directoryPath.relativize(filePath).normalize().toString();
 
         // strip last path segment
-        if (relativePath.lastIndexOf('/') >= 0) {
-            return relativePath.substring(0, relativePath.lastIndexOf("/"));
+        if (relativePath.lastIndexOf(File.separatorChar) >= 0) {
+            return relativePath.substring(0, 
relativePath.lastIndexOf(File.separatorChar));
         } else {
             return "";
         }
diff --git 
a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceTest.java
 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceTest.java
index 38617ba..d906e48 100644
--- 
a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceTest.java
+++ 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/datasource/DataSourceTest.java
@@ -36,7 +36,6 @@ import static 
org.apache.freemarker.generator.base.datasource.DataSourceFactory.
 import static 
org.apache.freemarker.generator.base.mime.Mimetypes.MIME_TEXT_HTML;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 public class DataSourceTest {
@@ -55,7 +54,7 @@ public class DataSourceTest {
             assertEquals("", dataSource.getBaseName());
             assertEquals("", dataSource.getExtension());
             
assertTrue(dataSource.getUri().toString().startsWith("string:///"));
-            assertEquals(".", dataSource.getRelativeFilePath());
+            assertEquals("", dataSource.getRelativeFilePath());
             assertEquals(UTF_8, dataSource.getCharset());
             assertEquals("text/plain", dataSource.getContentType());
             assertTrue(dataSource.getLength() > 0);
@@ -74,7 +73,7 @@ public class DataSourceTest {
             assertEquals("xml", dataSource.getExtension());
             assertEquals(ANY_FILE.toURI().toString(), 
dataSource.getUri().toString());
             assertEquals(ANY_CHAR_SET.name(), dataSource.getCharset().name());
-            assertEquals(".", dataSource.getRelativeFilePath());
+            assertEquals("", dataSource.getRelativeFilePath());
             assertEquals("application/xml", dataSource.getContentType());
             assertTrue(dataSource.getLength() > 0);
             assertFalse(dataSource.getText().isEmpty());
@@ -94,7 +93,7 @@ public class DataSourceTest {
             assertEquals("", dataSource.getBaseName());
             assertEquals("", dataSource.getExtension());
             assertEquals("https://www.google.com/?foo=bar";, 
dataSource.getUri().toString());
-            assertNull(dataSource.getRelativeFilePath());
+            assertEquals("", dataSource.getRelativeFilePath());
             assertEquals("text/html; charset=ISO-8859-1", 
dataSource.getContentType());
             assertEquals(MIME_TEXT_HTML, dataSource.getMimeType());
             assertEquals("ISO-8859-1", dataSource.getCharset().name());
@@ -137,7 +136,7 @@ public class DataSourceTest {
             assertEquals("", metadata.get("extension"));
             assertEquals("", metadata.get("fileName"));
             assertEquals("/", metadata.get("filePath"));
-            assertEquals(".", metadata.get("relativeFilePath"));
+            assertEquals("", metadata.get("relativeFilePath"));
 
             assertEquals("default", metadata.get("group"));
             assertEquals("stdin", metadata.get("name"));
diff --git 
a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/FileUtilsTest.java
 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/FileUtilsTest.java
index f572c3b..8b3a509 100644
--- 
a/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/FileUtilsTest.java
+++ 
b/freemarker-generator-base/src/test/java/org/apache/freemarker/generator/util/FileUtilsTest.java
@@ -11,6 +11,7 @@ public class FileUtilsTest {
 
     @Test
     public void shouldGetRelativePathForSameDirectory() {
+        assertEquals("", FileUtils.getRelativePath(new File("/"), new 
File("/pom.xml")));
         assertEquals("", FileUtils.getRelativePath(new File("."), new 
File("pom.xml")));
         assertEquals("", FileUtils.getRelativePath(new File("."), new 
File("./pom.xml")));
         assertEquals("", FileUtils.getRelativePath(new File("."), new 
File("./pom.xml")));
diff --git 
a/freemarker-generator-cli/src/app/templates/freemarker-generator/info.ftl 
b/freemarker-generator-cli/src/app/templates/freemarker-generator/info.ftl
index 388bd85..8208074 100644
--- a/freemarker-generator-cli/src/app/templates/freemarker-generator/info.ftl
+++ b/freemarker-generator-cli/src/app/templates/freemarker-generator/info.ftl
@@ -1,19 +1,19 @@
 <#ftl output_format="plainText" strip_whitespace=true>
 <#--
-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
-http://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.
+  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
+    http://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.
 -->
 FreeMarker Generator Information
 ==============================================================================
@@ -30,65 +30,65 @@ FreeMarker Command-line Parameters
 ==============================================================================
 
 <#list tools.system.getCommandLineArgs() as arg>
-    [#${arg?counter}] ${arg}
+[#${arg?counter}] ${arg}
 </#list>
 
 FreeMarker Generator Template Loader Directories
 ==============================================================================
 
 <#list tools.system.getTemplateDirectories() as directory>
-    [#${directory?counter}] ${directory}
+[#${directory?counter}] ${directory}
 </#list>
 
 FreeMarker Generator Data Model
 ==============================================================================
 
 <#list .data_model?keys?sort as key>
-    - ${key}<#lt>
+- ${key}<#lt>
 </#list>
 
 FreeMarker Generator Data Sources
 ==============================================================================
 <#if dataSources?has_content>
-    <#list dataSources?values as ds>
+<#list dataSources?values as ds>
 
-        DataSource #${ds?counter}
-        
------------------------------------------------------------------------------
-        name=${ds.name}
-        group=${ds.group}
-        contentType=${ds.contentType}
-        fileName=${ds.fileName}
-        baseName=${ds.baseName}
-        extension=${ds.extension}
-        relativeFilePath=${ds.relativeFilePath}
-        charset=${ds.charset}
-        mimeType=${ds.mimeType}
-        uri=${ds.uri}
-        length=${ds.length} Bytes
-    </#list>
+DataSource #${ds?counter}
+------------------------------------------------------------------------------
+name=${ds.name}
+group=${ds.group}
+contentType=${ds.contentType}
+fileName=${ds.fileName}
+baseName=${ds.baseName}
+extension=${ds.extension}
+relativeFilePath=${ds.relativeFilePath}
+charset=${ds.charset}
+mimeType=${ds.mimeType}
+uri=${ds.uri}
+length=${ds.length} Bytes
+</#list>
 <#else>
 
-    No data sources found ...
+No data sources found ...
 </#if>
 
 FreeMarker Generator Parameters
 ==============================================================================
 
 <#if tools.system.parameters?has_content>
-    <#list tools.system.parameters as key,value>
-        <#if value?is_hash>
-            - ${key} ==> { <#list value as name,value>${name}=${value} 
</#list>}
-        <#else>
-            - ${key} ==> ${value}
-        </#if>
-    </#list>
+<#list tools.system.parameters as key,value>
+<#if value?is_hash>
+- ${key} ==> { <#list value as name,value>${name}=${value} </#list>}
+<#else>
+- ${key} ==> ${value}
+</#if>
+</#list>
 <#else>
-    No parameters found ...
+No parameters found ...
 </#if>
 
 FreeMarker Generator Tools
 ==============================================================================
 
 <#list tools?keys?sort as name>
-    - ${name?right_pad(20)} : ${tools[name]}
+- ${name?right_pad(20)} : ${tools[name]}
 </#list>
diff --git 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/AggregatingOutputGenerator.java
 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/AggregatingOutputGenerator.java
index 8959585..56fe9ea 100644
--- 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/AggregatingOutputGenerator.java
+++ 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/AggregatingOutputGenerator.java
@@ -21,6 +21,7 @@ import 
org.apache.freemarker.generator.base.datasource.DataSource;
 import org.apache.freemarker.generator.base.datasource.DataSourceFactory;
 import org.apache.freemarker.generator.base.datasource.DataSourcesSupplier;
 import org.apache.freemarker.generator.base.output.OutputGenerator;
+import org.apache.freemarker.generator.base.output.OutputGenerator.SeedType;
 import org.apache.freemarker.generator.base.template.TemplateTransformation;
 import 
org.apache.freemarker.generator.base.template.TemplateTransformationsBuilder;
 import org.apache.freemarker.generator.base.util.UriUtils;
@@ -95,7 +96,8 @@ public class AggregatingOutputGenerator implements 
Function<OutputGeneratorDefin
                     templateTransformation.getTemplateSource(),
                     templateTransformation.getTemplateOutput(),
                     dataSources(settings, definition),
-                    dataModels(definition)
+                    dataModels(definition),
+                    SeedType.TEMPLATE
             );
             result.add(outputGenerator);
         }
diff --git 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/GeneratingOutputGenerator.java
 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/GeneratingOutputGenerator.java
index c90fd64..4f6eaf8 100644
--- 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/GeneratingOutputGenerator.java
+++ 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/config/output/GeneratingOutputGenerator.java
@@ -18,6 +18,7 @@ package org.apache.freemarker.generator.cli.config.output;
 
 import org.apache.freemarker.generator.base.datasource.DataSource;
 import org.apache.freemarker.generator.base.output.OutputGenerator;
+import org.apache.freemarker.generator.base.output.OutputGenerator.SeedType;
 import org.apache.freemarker.generator.base.template.TemplateOutput;
 import org.apache.freemarker.generator.base.template.TemplateSource;
 import org.apache.freemarker.generator.base.util.ListUtils;
@@ -33,11 +34,12 @@ import 
org.apache.freemarker.generator.cli.util.TemplateSourceFactory;
 import java.io.File;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
 
+import static java.util.Collections.singletonList;
+
 public class GeneratingOutputGenerator
         extends AbstractOutputGenerator
         implements Function<OutputGeneratorDefinition, List<OutputGenerator>> {
@@ -66,8 +68,9 @@ public class GeneratingOutputGenerator
             final OutputGenerator outputGenerator = new OutputGenerator(
                     templateSource,
                     templateOutput,
-                    Collections.singletonList(dataSource),
-                    dataModels
+                    singletonList(dataSource),
+                    dataModels,
+                    SeedType.DATASOURCE
             );
             result.add(outputGenerator);
         }
diff --git 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
index ab04339..3e178bc 100644
--- 
a/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
+++ 
b/freemarker-generator-cli/src/main/java/org/apache/freemarker/generator/cli/task/FreeMarkerTask.java
@@ -23,9 +23,11 @@ import org.apache.commons.io.FileUtils;
 import org.apache.freemarker.generator.base.datasource.DataSource;
 import org.apache.freemarker.generator.base.datasource.DataSources;
 import org.apache.freemarker.generator.base.output.OutputGenerator;
+import org.apache.freemarker.generator.base.output.OutputGenerator.SeedType;
 import org.apache.freemarker.generator.base.template.TemplateOutput;
 import org.apache.freemarker.generator.base.template.TemplateSource;
 import org.apache.freemarker.generator.base.util.ListUtils;
+import org.apache.freemarker.generator.base.util.Validate;
 
 import java.io.BufferedWriter;
 import java.io.File;
@@ -106,11 +108,13 @@ public class FreeMarkerTask implements Callable<Integer> {
     }
 
     private static DataSources toDataSources(OutputGenerator outputGenerator, 
List<DataSource> sharedDataSources) {
-        // TODO FREEMARKER-188 06.09.2021 sgoeschl - make this more explicit
-        if (outputGenerator.getDataSources().isEmpty()) {
-            return new 
DataSources(ListUtils.concatenate(outputGenerator.getDataSources(), 
sharedDataSources));
+        final List<DataSource> dataSources = outputGenerator.getDataSources();
+        if (outputGenerator.getSeedType() == SeedType.TEMPLATE) {
+            return new DataSources(ListUtils.concatenate(dataSources, 
sharedDataSources));
         } else {
-            return new DataSources(outputGenerator.getDataSources());
+            // Since every data source shall generate an output there can be 
only 1 datasource supplied
+            Validate.isTrue(dataSources.size() == 1, "One data source expected 
for generation driven by data sources");
+            return new DataSources(dataSources);
         }
     }
 

Reply via email to