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 d6376569c Change method to add DataMap to the generated artifacts +
minor refactoring in cgen
d6376569c is described below
commit d6376569c28c07f94e1d772139368b28610d365a
Author: Nikita Timofeev <[email protected]>
AuthorDate: Thu Dec 8 12:19:22 2022 +0300
Change method to add DataMap to the generated artifacts
+ minor refactoring in cgen
---
.../apache/cayenne/tools/CayenneGeneratorTask.java | 2 +-
.../apache/cayenne/gen/ClassGenerationAction.java | 569 ++++++++++-----------
.../cayenne/gen/ClassGeneratorResourceLoader.java | 17 +-
.../java/org/apache/cayenne/tools/CgenTask.java | 2 +-
.../apache/cayenne/tools/CayenneGeneratorMojo.java | 2 +-
.../DataMapArtefactsConfigurator.java | 19 +-
.../templateeditor/ArtifactsConfiguratorTest.java | 2 +-
7 files changed, 296 insertions(+), 317 deletions(-)
diff --git
a/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
b/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
index 9fd856ed2..be63d2ce2 100644
---
a/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
+++
b/cayenne-ant/src/main/java/org/apache/cayenne/tools/CayenneGeneratorTask.java
@@ -137,7 +137,7 @@ public class CayenneGeneratorTask extends CayenneTask {
} else {
generatorAction.addEntities(filterEntityAction.getFilteredEntities(dataMap));
generatorAction.addEmbeddables(filterEmbeddableAction.getFilteredEmbeddables(dataMap));
- generatorAction.addQueries(dataMap.getQueryDescriptors());
+ generatorAction.addDataMap(dataMap);
}
generatorAction.execute();
}
diff --git
a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
index b31048473..07330a825 100644
---
a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
+++
b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java
@@ -20,9 +20,9 @@
package org.apache.cayenne.gen;
import org.apache.cayenne.CayenneRuntimeException;
+import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.map.Embeddable;
import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.QueryDescriptor;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
@@ -46,56 +46,55 @@ import java.nio.file.Path;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
-import java.util.Objects;
import java.util.Properties;
import java.util.stream.Collectors;
public class ClassGenerationAction {
- public static final String SUPERCLASS_PREFIX = "_";
- private static final String WILDCARD = "*";
+ public static final String SUPERCLASS_PREFIX = "_";
+ private static final String WILDCARD = "*";
private static final String CUSTOM_TEMPLATE_REPO = "customTemplateRepo";
- /**
- * @since 4.1
- */
- protected CgenConfiguration cgenConfiguration;
- protected Logger logger;
+ /**
+ * @since 4.1
+ */
+ protected CgenConfiguration cgenConfiguration;
+ protected Logger logger;
// runtime ivars
protected Context context;
protected Map<String, Template> templateCache;
private ToolsUtilsFactory utilsFactory;
- private MetadataUtils metadataUtils;
-
- /**
- Optionally allows user-defined tools besides {@link ImportUtils} for
working with velocity templates.<br/>
- To use this feature, either set the java system property {@code
-Dorg.apache.velocity.tools=tools.properties}
- or set the {@code externalToolConfig} property to "tools.properties" in
{@code CgenConfiguration}. Then
- create the file "tools.properties" in the working directory or in the
root of the classpath with content
- like this:
- <pre>
- tools.toolbox = application
- tools.application.myTool = com.mycompany.MyTool</pre>
- Then the methods in the MyTool class will be available for use in the
template like ${myTool.myMethod(arg)}
- */
- public ClassGenerationAction(CgenConfiguration cgenConfig) {
- this.cgenConfiguration = cgenConfig;
- String toolConfigFile = cgenConfig.getExternalToolConfig();
-
- if (System.getProperty("org.apache.velocity.tools") != null ||
toolConfigFile != null) {
- ToolManager manager = new ToolManager(true, true);
- if (toolConfigFile != null) {
- FactoryConfiguration config =
ConfigurationUtils.find(toolConfigFile);
- manager.getToolboxFactory().configure(config);
- }
- this.context = manager.createContext();
- } else {
- this.context = new VelocityContext();
- }
- this.templateCache = new HashMap<>(5);
- }
+ private MetadataUtils metadataUtils;
+
+ /**
+ * Optionally allows user-defined tools besides {@link ImportUtils} for
working with velocity templates.<br/>
+ * To use this feature, either set the java system property {@code
-Dorg.apache.velocity.tools=tools.properties}
+ * or set the {@code externalToolConfig} property to "tools.properties" in
{@code CgenConfiguration}. Then
+ * create the file "tools.properties" in the working directory or in the
root of the classpath with content
+ * like this:
+ * <pre>
+ * tools.toolbox = application
+ * tools.application.myTool = com.mycompany.MyTool</pre>
+ * Then the methods in the MyTool class will be available for use in the
template like ${myTool.myMethod(arg)}
+ */
+ public ClassGenerationAction(CgenConfiguration cgenConfig) {
+ this.cgenConfiguration = cgenConfig;
+ String toolConfigFile = cgenConfig.getExternalToolConfig();
+
+ if (System.getProperty("org.apache.velocity.tools") != null ||
toolConfigFile != null) {
+ ToolManager manager = new ToolManager(true, true);
+ if (toolConfigFile != null) {
+ FactoryConfiguration config =
ConfigurationUtils.find(toolConfigFile);
+ manager.getToolboxFactory().configure(config);
+ }
+ this.context = manager.createContext();
+ } else {
+ this.context = new VelocityContext();
+ }
+ this.templateCache = new HashMap<>(5);
+ }
/**
* VelocityContext initialization method called once per artifact.
@@ -134,108 +133,108 @@ public class ClassGenerationAction {
context.put(Artifact.CREATE_PK_PROPERTIES,
cgenConfiguration.isCreatePKProperties());
}
- /**
- * VelocityContext initialization method called once per each artifact
and
- * template type combination.
- */
- void resetContextForArtifactTemplate(Artifact artifact) {
+ /**
+ * VelocityContext initialization method called once per each artifact and
+ * template type combination.
+ */
+ void resetContextForArtifactTemplate(Artifact artifact) {
ImportUtils importUtils = utilsFactory.createImportUtils();
context.put(Artifact.IMPORT_UTILS_KEY, importUtils);
- context.put(Artifact.PROPERTY_UTILS_KEY,
utilsFactory.createPropertyUtils(logger, importUtils));
- context.put(Artifact.METADATA_UTILS_KEY, metadataUtils);
- artifact.postInitContext(context);
- }
-
- /**
- * Adds entities to the internal entity list.
- * @param entities collection
- *
- * @since 4.0 throws exception
- */
- public void addEntities(Collection<ObjEntity> entities) {
- if (entities != null) {
- for (ObjEntity entity : entities) {
- cgenConfiguration.addArtifact(new
EntityArtifact(entity));
- }
- }
- }
-
- public void addEmbeddables(Collection<Embeddable> embeddables) {
- if (embeddables != null) {
- for (Embeddable embeddable : embeddables) {
- cgenConfiguration.addArtifact(new
EmbeddableArtifact(embeddable));
- }
- }
- }
-
- public void addQueries(Collection<QueryDescriptor> queries) {
- if
(cgenConfiguration.getArtifactsGenerationMode().equals(ArtifactsGenerationMode.ALL.getLabel()))
{
- // TODO: andrus 10.12.2010 - why not also check for
empty query list??
- // Or create a better API for enabling DataMapArtifact
- if (queries != null) {
- Artifact artifact = new
DataMapArtifact(cgenConfiguration.getDataMap(), queries);
-
if(!cgenConfiguration.getArtifacts().contains(artifact)) {
- cgenConfiguration.addArtifact(artifact);
- }
- }
- }
- }
-
- /**
- * @since 4.1
- */
- public void prepareArtifacts() {
- cgenConfiguration.getArtifacts().clear();
- addEntities(cgenConfiguration.getEntities().stream()
- .map(entity ->
cgenConfiguration.getDataMap().getObjEntity(entity))
- .collect(Collectors.toList()));
- addEmbeddables(cgenConfiguration.getEmbeddables().stream()
- .map(embeddable ->
cgenConfiguration.getDataMap().getEmbeddable(embeddable))
- .collect(Collectors.toList()));
-
addQueries(cgenConfiguration.getDataMap().getQueryDescriptors());
+ context.put(Artifact.PROPERTY_UTILS_KEY,
utilsFactory.createPropertyUtils(logger, importUtils));
+ context.put(Artifact.METADATA_UTILS_KEY, metadataUtils);
+ artifact.postInitContext(context);
}
- /**
- * Executes class generation once per each artifact.
- */
- public void execute() throws Exception {
+ /**
+ * Adds entities to the internal entity list.
+ *
+ * @param entities collection
+ * @since 4.0 throws exception
+ */
+ public void addEntities(Collection<ObjEntity> entities) {
+ if (entities != null) {
+ for (ObjEntity entity : entities) {
+ cgenConfiguration.addArtifact(new EntityArtifact(entity));
+ }
+ }
+ }
+
+ public void addEmbeddables(Collection<Embeddable> embeddables) {
+ if (embeddables != null) {
+ for (Embeddable embeddable : embeddables) {
+ cgenConfiguration.addArtifact(new
EmbeddableArtifact(embeddable));
+ }
+ }
+ }
+
+ /**
+ * @param dataMap to add to the list of artifacts to generate
+ * @since 5.0 replaces removed {@code addQueries()} method
+ */
+ public void addDataMap(DataMap dataMap) {
+ // data map should be used only in ArtifactsGenerationMode.ALL
+ if
(!cgenConfiguration.getArtifactsGenerationMode().equals(ArtifactsGenerationMode.ALL.getLabel()))
{
+ return;
+ }
+
+ Artifact artifact = new
DataMapArtifact(cgenConfiguration.getDataMap(), dataMap.getQueryDescriptors());
+ if (!cgenConfiguration.getArtifacts().contains(artifact)) {
+ cgenConfiguration.addArtifact(artifact);
+ }
+ }
- validateAttributes();
+ /**
+ * @since 4.1
+ */
+ public void prepareArtifacts() {
+ cgenConfiguration.getArtifacts().clear();
+ addEntities(cgenConfiguration.getEntities().stream()
+ .map(entity ->
cgenConfiguration.getDataMap().getObjEntity(entity))
+ .collect(Collectors.toList()));
+ addEmbeddables(cgenConfiguration.getEmbeddables().stream()
+ .map(embeddable ->
cgenConfiguration.getDataMap().getEmbeddable(embeddable))
+ .collect(Collectors.toList()));
+ addDataMap(cgenConfiguration.getDataMap());
+ }
- try {
- for (Artifact artifact :
cgenConfiguration.getArtifacts()) {
- execute(artifact);
- }
- } finally {
- // must reset engine at the end of class generator run
to avoid
- // memory
- // leaks and stale templates
- templateCache.clear();
- }
- }
+ /**
+ * Executes class generation once per each artifact.
+ */
+ public void execute() throws Exception {
- /**
- * Executes class generation for a single artifact.
- */
- protected void execute(Artifact artifact) throws Exception {
+ validateAttributes();
- resetContextForArtifact(artifact);
+ try {
+ for (Artifact artifact : cgenConfiguration.getArtifacts()) {
+ execute(artifact);
+ }
+ } finally {
+ // must reset engine at the end of class generator run to avoid
memory leaks and stale templates
+ templateCache.clear();
+ }
+ }
- ArtifactGenerationMode artifactMode =
cgenConfiguration.isMakePairs() ? ArtifactGenerationMode.GENERATION_GAP
- : ArtifactGenerationMode.SINGLE_CLASS;
+ /**
+ * Executes class generation for a single artifact.
+ */
+ protected void execute(Artifact artifact) throws Exception {
- TemplateType[] templateTypes =
artifact.getTemplateTypes(artifactMode);
- for (TemplateType type : templateTypes) {
+ resetContextForArtifact(artifact);
- try (Writer out = openWriter(type)) {
- if (out != null) {
+ ArtifactGenerationMode artifactMode = cgenConfiguration.isMakePairs()
+ ? ArtifactGenerationMode.GENERATION_GAP
+ : ArtifactGenerationMode.SINGLE_CLASS;
-
resetContextForArtifactTemplate(artifact);
- getTemplate(type).merge(context, out);
- }
- }
- }
- }
+ TemplateType[] templateTypes = artifact.getTemplateTypes(artifactMode);
+ for (TemplateType type : templateTypes) {
+ try (Writer out = openWriter(type)) {
+ if (out != null) {
+ resetContextForArtifactTemplate(artifact);
+ getTemplate(type).merge(context, out);
+ }
+ }
+ }
+ }
protected Template getTemplate(TemplateType type) {
Properties props = new Properties();
@@ -248,198 +247,196 @@ public class ClassGenerationAction {
protected void initVelocityProperties(Properties props, TemplateType type)
{
CgenTemplate template = cgenConfiguration.getTemplateByType(type);
if (template.isFile()) {
- props.put("resource.loaders", "cayenne");
+ props.put(RuntimeConstants.RESOURCE_LOADERS, "cayenne");
props.put("resource.loader.cayenne.class",
ClassGeneratorResourceLoader.class.getName());
props.put("resource.loader.cayenne.cache", "false");
- if (cgenConfiguration.getRootPath() != null) {
- props.put("resource.loader.cayenne.root",
cgenConfiguration.getRootPath().toString());
- }
+ props.put("resource.loader.cayenne.root",
cgenConfiguration.getRootPath());
} else {
- props.setProperty(RuntimeConstants.RESOURCE_LOADERS, "string");
- props.setProperty("resource.loader.string.class",
StringResourceLoader.class.getName());
- props.setProperty("resource.loader.string.repository.name",
CUSTOM_TEMPLATE_REPO);
+ props.put(RuntimeConstants.RESOURCE_LOADERS, "string");
+ props.put("resource.loader.string.class",
StringResourceLoader.class.getName());
+ props.put("resource.loader.string.repository.name",
CUSTOM_TEMPLATE_REPO);
putTemplateTextInRepository(template);
}
}
private void putTemplateTextInRepository(CgenTemplate template) {
- StringResourceLoader.setRepository(CUSTOM_TEMPLATE_REPO, new
StringResourceRepositoryImpl());
- StringResourceRepository repo =
StringResourceLoader.getRepository(CUSTOM_TEMPLATE_REPO);
+ StringResourceRepository repo = new StringResourceRepositoryImpl();
repo.putStringResource(template.getName(), template.getData());
+ StringResourceLoader.setRepository(CUSTOM_TEMPLATE_REPO, repo);
}
- /**
- * Validates the state of this class generator.
- * Throws CayenneRuntimeException if it is in an inconsistent state.
- * Called internally from "execute".
- */
- protected void validateAttributes() {
- Path dir = cgenConfiguration.buildOutputPath();
- if (dir == null) {
- throw new CayenneRuntimeException("Output directory is
not set.");
- }
- if(Files.notExists(dir)) {
- try {
- Files.createDirectories(dir);
- } catch (IOException e) {
- throw new CayenneRuntimeException("Can't create
output directory '%s'", dir);
- }
- }
-
- if (!Files.isDirectory(dir)) {
- throw new CayenneRuntimeException("'%s' is not a
directory.", dir);
- }
-
- if (!Files.isWritable(dir)) {
- throw new CayenneRuntimeException("No write permission
for the output directory '%s'", dir);
- }
- }
-
- /**
- * Opens a Writer to write generated output. Returned Writer is mapped
to a
- * filesystem file (although subclasses may override that). File
location is
- * determined from the current state of VelocityContext and the
TemplateType
- * passed as a parameter. Writer encoding is determined from the value
of
- * the "encoding" property.
- */
- protected Writer openWriter(TemplateType templateType) throws Exception
{
-
- File outFile = (templateType.isSuperclass()) ?
fileForSuperclass() : fileForClass();
- if (outFile == null) {
- return null;
- }
-
- if (logger != null) {
- String label = templateType.isSuperclass() ?
"superclass" : "class";
- logger.info("Generating " + label + " file: " +
outFile.getCanonicalPath());
- }
-
- // return writer with specified encoding
- FileOutputStream out = new FileOutputStream(outFile);
-
- return (cgenConfiguration.getEncoding() != null) ? new
OutputStreamWriter(out, cgenConfiguration.getEncoding()) : new
OutputStreamWriter(out);
- }
-
- /**
- * Returns a target file where a generated superclass must be saved. If
null
- * is returned, class shouldn't be generated.
- */
- private File fileForSuperclass() throws Exception {
-
- String packageName = (String)
context.get(Artifact.SUPER_PACKAGE_KEY);
- String className = (String)
context.get(Artifact.SUPER_CLASS_KEY);
-
- String filename =
StringUtils.getInstance().replaceWildcardInStringWithString(WILDCARD,
cgenConfiguration.getOutputPattern(), className);
- File dest = new
File(mkpath(cgenConfiguration.buildOutputPath().toFile(), packageName),
filename);
+ /**
+ * Validates the state of this class generator.
+ * Throws CayenneRuntimeException if it is in an inconsistent state.
+ * Called internally from "execute".
+ */
+ protected void validateAttributes() {
+ Path dir = cgenConfiguration.buildOutputPath();
+ if (dir == null) {
+ throw new CayenneRuntimeException("Output directory is not set.");
+ }
+ if (Files.notExists(dir)) {
+ try {
+ Files.createDirectories(dir);
+ } catch (IOException e) {
+ throw new CayenneRuntimeException("Can't create output
directory '%s'", dir);
+ }
+ }
+
+ if (!Files.isDirectory(dir)) {
+ throw new CayenneRuntimeException("'%s' is not a directory.", dir);
+ }
+
+ if (!Files.isWritable(dir)) {
+ throw new CayenneRuntimeException("No write permission for the
output directory '%s'", dir);
+ }
+ }
+
+ /**
+ * Opens a Writer to write generated output. Returned Writer is mapped to a
+ * filesystem file (although subclasses may override that). File location
is
+ * determined from the current state of VelocityContext and the
TemplateType
+ * passed as a parameter. Writer encoding is determined from the value of
+ * the "encoding" property.
+ */
+ protected Writer openWriter(TemplateType templateType) throws Exception {
+
+ File outFile = (templateType.isSuperclass()) ? fileForSuperclass() :
fileForClass();
+ if (outFile == null) {
+ return null;
+ }
+
+ if (logger != null) {
+ String label = templateType.isSuperclass() ? "superclass" :
"class";
+ logger.info("Generating " + label + " file: " +
outFile.getCanonicalPath());
+ }
+
+ // return writer with specified encoding
+ FileOutputStream out = new FileOutputStream(outFile);
+
+ return (cgenConfiguration.getEncoding() != null) ? new
OutputStreamWriter(out, cgenConfiguration.getEncoding()) : new
OutputStreamWriter(out);
+ }
+
+ /**
+ * Returns a target file where a generated superclass must be saved. If
null
+ * is returned, class shouldn't be generated.
+ */
+ private File fileForSuperclass() throws Exception {
+
+ String packageName = (String) context.get(Artifact.SUPER_PACKAGE_KEY);
+ String className = (String) context.get(Artifact.SUPER_CLASS_KEY);
+
+ String filename =
StringUtils.getInstance().replaceWildcardInStringWithString(WILDCARD,
cgenConfiguration.getOutputPattern(), className);
+ File dest = new
File(mkpath(cgenConfiguration.buildOutputPath().toFile(), packageName),
filename);
if (dest.exists() && !fileNeedUpdate(dest,
cgenConfiguration.getSuperTemplate().getData())) {
return null;
}
- return dest;
- }
+ return dest;
+ }
- /**
- * Returns a target file where a generated class must be saved. If null
is
- * returned, class shouldn't be generated.
- */
- private File fileForClass() throws Exception {
+ /**
+ * Returns a target file where a generated class must be saved. If null is
+ * returned, class shouldn't be generated.
+ */
+ private File fileForClass() throws Exception {
- String packageName = (String)
context.get(Artifact.SUB_PACKAGE_KEY);
- String className = (String) context.get(Artifact.SUB_CLASS_KEY);
+ String packageName = (String) context.get(Artifact.SUB_PACKAGE_KEY);
+ String className = (String) context.get(Artifact.SUB_CLASS_KEY);
- String filename =
StringUtils.getInstance().replaceWildcardInStringWithString(WILDCARD,
cgenConfiguration.getOutputPattern(), className);
- File dest = new
File(mkpath(cgenConfiguration.buildOutputPath().toFile(), packageName),
filename);
+ String filename =
StringUtils.getInstance().replaceWildcardInStringWithString(WILDCARD,
cgenConfiguration.getOutputPattern(), className);
+ File dest = new
File(mkpath(cgenConfiguration.buildOutputPath().toFile(), packageName),
filename);
- if (dest.exists()) {
- // no overwrite of subclasses
- if (cgenConfiguration.isMakePairs()) {
- return null;
- }
+ if (dest.exists()) {
+ // no overwrite of subclasses
+ if (cgenConfiguration.isMakePairs()) {
+ return null;
+ }
- // skip if said so
- if (!cgenConfiguration.isOverwrite()) {
- return null;
- }
+ // skip if said so
+ if (!cgenConfiguration.isOverwrite()) {
+ return null;
+ }
if (!fileNeedUpdate(dest,
cgenConfiguration.getTemplate().getData())) {
return null;
}
}
- return dest;
- }
+ return dest;
+ }
- /**
- * Ignore if the destination is newer than the map
- * (internal timestamp), i.e. has been generated after the map was
- * last saved AND the template is older than the destination file
- */
- protected boolean fileNeedUpdate(File dest, String templateFileName) {
- if(cgenConfiguration.isForce()) {
- return true;
- }
+ /**
+ * Ignore if the destination is newer than the map
+ * (internal timestamp), i.e. has been generated after the map was
+ * last saved AND the template is older than the destination file
+ */
+ protected boolean fileNeedUpdate(File dest, String templateFileName) {
+ if (cgenConfiguration.isForce()) {
+ return true;
+ }
- if (isOld(dest)) {
+ if (isOld(dest)) {
if (templateFileName == null) {
- return false;
+ return false;
}
File templateFile = new File(templateFileName);
- return templateFile.lastModified() >=
dest.lastModified();
+ return templateFile.lastModified() >= dest.lastModified();
}
- return true;
- }
-
- /**
- * Is file modified after internal timestamp (usually equal to mtime of
datamap file)
- */
- protected boolean isOld(File file) {
- return file.lastModified() > cgenConfiguration.getTimestamp();
- }
-
- /**
- * Returns a File object corresponding to a directory where files that
- * belong to <code>pkgName</code> package should reside. Creates any
missing
- * diectories below <code>dest</code>.
- */
- private File mkpath(File dest, String pkgName) throws Exception {
-
- if (!cgenConfiguration.isUsePkgPath() || pkgName == null) {
- return dest;
- }
-
- String path = pkgName.replace('.', File.separatorChar);
- File fullPath = new File(dest, path);
- if (!fullPath.isDirectory() && !fullPath.mkdirs()) {
- throw new Exception("Error making path: " + fullPath);
- }
-
- return fullPath;
- }
-
- /**
- * Injects an optional logger that will be used to trace generated
files at
- * the info level.
- */
- public void setLogger(Logger logger) {
- this.logger = logger;
- }
-
- /**
- * @since 4.1
- */
- public CgenConfiguration getCgenConfiguration() {
- return cgenConfiguration;
- }
-
- /**
- * Sets an optional shared VelocityContext. Useful with tools like VPP
that
- * can set custom values in the context, not known to Cayenne.
- */
- public void setContext(Context context) {
- this.context = context;
- }
+ return true;
+ }
+
+ /**
+ * Is file modified after internal timestamp (usually equal to mtime of
datamap file)
+ */
+ protected boolean isOld(File file) {
+ return file.lastModified() > cgenConfiguration.getTimestamp();
+ }
+
+ /**
+ * Returns a File object corresponding to a directory where files that
+ * belong to <code>pkgName</code> package should reside. Creates any
missing
+ * diectories below <code>dest</code>.
+ */
+ private File mkpath(File dest, String pkgName) throws Exception {
+
+ if (!cgenConfiguration.isUsePkgPath() || pkgName == null) {
+ return dest;
+ }
+
+ String path = pkgName.replace('.', File.separatorChar);
+ File fullPath = new File(dest, path);
+ if (!fullPath.isDirectory() && !fullPath.mkdirs()) {
+ throw new Exception("Error making path: " + fullPath);
+ }
+
+ return fullPath;
+ }
+
+ /**
+ * Injects an optional logger that will be used to trace generated files at
+ * the info level.
+ */
+ public void setLogger(Logger logger) {
+ this.logger = logger;
+ }
+
+ /**
+ * @since 4.1
+ */
+ public CgenConfiguration getCgenConfiguration() {
+ return cgenConfiguration;
+ }
+
+ /**
+ * Sets an optional shared VelocityContext. Useful with tools like VPP that
+ * can set custom values in the context, not known to Cayenne.
+ */
+ public void setContext(Context context) {
+ this.context = context;
+ }
/**
* @since 4.1
diff --git
a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGeneratorResourceLoader.java
b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGeneratorResourceLoader.java
index 50c8d59ca..8e72b0b33 100644
---
a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGeneratorResourceLoader.java
+++
b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGeneratorResourceLoader.java
@@ -39,18 +39,14 @@ import org.apache.velocity.util.ExtProperties;
*
* @since 1.2
*/
-// must be public top-level class as it is
-// instantiated via reflection by Velocity
+// must be public top-level class as it is instantiated via reflection by
Velocity
public class ClassGeneratorResourceLoader extends FileResourceLoader {
private Path root;
@Override
public void init(ExtProperties configuration) {
- String rootPathStr = configuration.getString("root");
- if(rootPathStr != null) {
- root = Paths.get(rootPathStr);
- }
+ root = (Path)configuration.getProperty("root");
}
/**
@@ -63,8 +59,7 @@ public class ClassGeneratorResourceLoader extends
FileResourceLoader {
* </ol>
*/
@Override
- public synchronized Reader getResourceReader(String name, String charset)
- throws ResourceNotFoundException {
+ public synchronized Reader getResourceReader(String name, String charset)
throws ResourceNotFoundException {
Reader stream;
@@ -103,9 +98,9 @@ public class ClassGeneratorResourceLoader extends
FileResourceLoader {
protected Reader loadFromAbsPath(String name) {
try {
File file = new File(name);
- return (file.canRead()) ? new BufferedReader(new FileReader(file
- .getAbsolutePath())) : null;
-
+ return file.canRead()
+ ? new BufferedReader(new
FileReader(file.getAbsolutePath()))
+ : null;
} catch (FileNotFoundException fnfe) {
return null;
}
diff --git
a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
index 32c626924..35f553856 100644
--- a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
+++ b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java
@@ -290,7 +290,7 @@ public class CgenTask extends BaseCayenneTask {
} else {
generator.addEntities(filterEntityAction.getFilteredEntities(dataMap));
generator.addEmbeddables(filterEmbeddableAction.getFilteredEmbeddables(dataMap));
- generator.addQueries(dataMap.getQueryDescriptors());
+ generator.addDataMap(dataMap);
}
generator.execute();
}
diff --git
a/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
b/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
index 78b3d2d19..a85a3a4e4 100644
---
a/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
+++
b/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/CayenneGeneratorMojo.java
@@ -288,7 +288,7 @@ public class CayenneGeneratorMojo extends AbstractMojo {
} else {
generator.addEntities(filterEntityAction.getFilteredEntities(dataMap));
generator.addEmbeddables(filterEmbeddableAction.getFilteredEmbeddables(dataMap));
- generator.addQueries(dataMap.getQueryDescriptors());
+ generator.addDataMap(dataMap);
}
generator.execute();
}
diff --git
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/templateeditor/DataMapArtefactsConfigurator.java
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/templateeditor/DataMapArtefactsConfigurator.java
index df3a07af2..114cd2ca4 100644
---
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/templateeditor/DataMapArtefactsConfigurator.java
+++
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/templateeditor/DataMapArtefactsConfigurator.java
@@ -21,11 +21,9 @@ package
org.apache.cayenne.modeler.editor.cgen.templateeditor;
import org.apache.cayenne.gen.ClassGenerationAction;
import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.QueryDescriptor;
import java.util.Collections;
import java.util.List;
-import java.util.stream.Collectors;
/**
* @since 5.0
@@ -34,23 +32,12 @@ public class DataMapArtefactsConfigurator implements
ArtefactsConfigurator {
@Override
public void config(ClassGenerationAction action, String artifactName) {
-
action.addQueries(Collections.singleton(getSelectedEntity(artifactName,
action)));
+ action.addDataMap(action.getCgenConfiguration().getDataMap());
}
+ @Override
public List<String> getArtifactsNames(DataMap dataMap) {
- if (dataMap != null) {
- return dataMap.getQueryDescriptors().stream()
- .map(QueryDescriptor::getName)
- .collect(Collectors.toList());
- }
- return Collections.emptyList();
+ return Collections.singletonList(dataMap.getName());
}
- private QueryDescriptor getSelectedEntity(String artifactName,
ClassGenerationAction action) {
- DataMap dataMap = action.getCgenConfiguration().getDataMap();
- if (dataMap != null) {
- return dataMap.getQueryDescriptor(artifactName);
- }
- return null;
- }
}
diff --git
a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/editor/templateeditor/ArtifactsConfiguratorTest.java
b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/editor/templateeditor/ArtifactsConfiguratorTest.java
index d6607974a..9a583a30f 100644
---
a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/editor/templateeditor/ArtifactsConfiguratorTest.java
+++
b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/editor/templateeditor/ArtifactsConfiguratorTest.java
@@ -82,7 +82,7 @@ public class ArtifactsConfiguratorTest {
assertTrue(entityArtifactsNames.contains("objEntity"));
assertTrue(embeddableArtifactsNames.contains("embeddable"));
- assertTrue(dataMapArtifactsNames.contains("queryDescriptor"));
+ assertTrue(dataMapArtifactsNames.contains("dataMap"));
}
private DataMap configureDataMap() {