From e92b485cc868be1515cacd6db0b24f6f9f392857 Mon Sep 17 00:00:00 2001 From: ivannikitka Date: Thu, 20 Jan 2022 11:16:38 +0300 Subject: [PATCH] Fix bug with custom template's relative paths in modeler --- .../cayenne/gen/ClassGenerationAction.java | 3 ++ .../gen/ClassGeneratorResourceLoader.java | 28 +++++++++++++------ 2 files changed, 22 insertions(+), 9 deletions(-) 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 1c2ec70b5e..53e594a101 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 @@ -39,6 +39,7 @@ import org.apache.cayenne.map.QueryDescriptor; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; import org.apache.velocity.app.VelocityEngine; import org.slf4j.Logger; @@ -290,6 +291,8 @@ private Template getTemplate(TemplateType type) { VelocityEngine velocityEngine = new VelocityEngine(); velocityEngine.init(props); + Velocity.setProperty("cayenne.cgen.rootpath", cgenConfiguration.getDataMap().getConfigurationSource()); + template = velocityEngine.getTemplate(templateName); templateCache.put(templateName, template); } 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 44f5d195da..cbfb3506d3 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 @@ -26,7 +26,12 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.nio.file.Paths; +import org.apache.cayenne.resource.Resource; +import org.apache.velocity.app.Velocity; import org.apache.velocity.exception.ResourceNotFoundException; import org.apache.velocity.runtime.resource.loader.FileResourceLoader; @@ -40,6 +45,8 @@ // instantiated via reflection by Velocity public class ClassGeneratorResourceLoader extends FileResourceLoader { + private static final String CGEN_ROOT_PATH ="cayenne.cgen.rootpath"; + /** * Returns resource as InputStream. First calls super implementation. If resource * wasn't found, it attempts to load it from current directory or as an absolute path. @@ -48,38 +55,41 @@ public class ClassGeneratorResourceLoader extends FileResourceLoader { public synchronized Reader getResourceReader(String name, String charset) throws ResourceNotFoundException { - Reader stream = loadFromRelativePath(name, charset); + Reader stream; + stream = loadFromThreadClassLoader(name); if (stream != null) { return stream; } - stream = loadFromAbsPath(name); + stream = loadFromThisClassLoader(name); if (stream != null) { return stream; } - stream = loadFromThreadClassLoader(name); + stream= loadFromRelativePath(name); if (stream != null) { return stream; } - stream = loadFromThisClassLoader(name); + stream = loadFromAbsPath(name); if (stream != null) { return stream; } - throw new ResourceNotFoundException("Couldn't find resource '" + name + "'. Searched filesystem path and classpath"); } - protected Reader loadFromRelativePath(String name, String charset) { + protected Reader loadFromRelativePath(String name) { + Resource rootPath = (Resource) Velocity.getProperty(CGEN_ROOT_PATH); + Path datamapPath; try { - return super.getResourceReader(name, charset); - } - catch (ResourceNotFoundException rnfex) { + datamapPath = Paths.get(rootPath.getURL().toURI()).getParent(); + } catch (URISyntaxException use) { return null; } + Path absolutePath = datamapPath.resolve(name).normalize(); + return loadFromAbsPath(absolutePath.toString()); } protected Reader loadFromAbsPath(String name) {