Cgen. Create saver and loader for dataMaps.
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/d489f2a5 Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/d489f2a5 Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/d489f2a5 Branch: refs/heads/master Commit: d489f2a5b45be473ffd7a07a6a18bc971940e1bc Parents: 8119ffa Author: Arseni Bulatski <ancars...@gmail.com> Authored: Mon Jun 18 15:04:56 2018 +0300 Committer: Arseni Bulatski <ancars...@gmail.com> Committed: Wed Oct 24 13:40:16 2018 +0300 ---------------------------------------------------------------------- .../cayenne/gen/ClassGenerationAction.java | 178 ++++++++++++++-- .../org/apache/cayenne/gen/DataMapArtifact.java | 1 + .../apache/cayenne/gen/EmbeddableArtifact.java | 12 +- .../org/apache/cayenne/gen/EntityArtifact.java | 11 +- .../cayenne/gen/xml/CgenConfigHandler.java | 206 +++++++++++++++++- .../apache/cayenne/gen/xml/CgenExtension.java | 5 +- .../cayenne/gen/xml/CgenLoaderDelegate.java | 6 +- .../cayenne/gen/xml/CgenSaverDelegate.java | 6 +- .../cayenne/gen/xml/EmbeddableHandler.java | 49 +++++ .../cayenne/gen/xml/ObjEntityHandler.java | 48 +++++ .../cayenne/modeler/CodeTemplateManager.java | 19 ++ .../editor/cgen/ClassesTabController.java | 22 +- .../editor/cgen/CodeGeneratorController.java | 15 +- .../cgen/CodeGeneratorControllerBase.java | 70 +++++-- .../editor/cgen/CustomModeController.java | 209 ++++++++++--------- .../modeler/editor/cgen/CustomModePanel.java | 64 ++++-- .../editor/cgen/GeneratorController.java | 110 ++++------ .../editor/cgen/GeneratorControllerPanel.java | 13 +- .../editor/cgen/GeneratorTabController.java | 3 +- .../editor/cgen/StandardPanelComponent.java | 79 ------- 20 files changed, 782 insertions(+), 344 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/cayenne-cgen/src/main/java/org/apache/cayenne/gen/ClassGenerationAction.java ---------------------------------------------------------------------- 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 0eaf66b..423fb92 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,26 +20,20 @@ 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.cayenne.configuration.ConfigurationNodeVisitor; +import org.apache.cayenne.gen.xml.CgenExtension; +import org.apache.cayenne.map.*; +import org.apache.cayenne.util.XMLEncoder; +import org.apache.cayenne.util.XMLSerializable; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.VelocityEngine; import org.slf4j.Logger; -import java.io.File; -import java.io.FileOutputStream; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; - -public class ClassGenerationAction { +import java.io.*; +import java.util.*; + +public class ClassGenerationAction implements Serializable, XMLSerializable { static final String TEMPLATES_DIR_NAME = "templates/v4_1/"; public static final String SINGLE_CLASS_TEMPLATE = TEMPLATES_DIR_NAME + "singleclass.vm"; @@ -59,6 +53,9 @@ public class ClassGenerationAction { protected Collection<Artifact> artifacts; + protected Collection<String> entityArtifacts; + protected Collection<String> embeddableArtifacts; + protected String superPkg; protected DataMap dataMap; @@ -92,6 +89,7 @@ public class ClassGenerationAction { protected Map<String, Template> templateCache; public ClassGenerationAction() { +// this.destDir = new File(System.getProperty("user.dir")); this.outputPattern = "*.java"; this.timestamp = 0L; this.usePkgPath = true; @@ -99,7 +97,13 @@ public class ClassGenerationAction { this.context = new VelocityContext(); this.templateCache = new HashMap<>(5); + this.template = SUBCLASS_TEMPLATE; + this.superTemplate = SUPERCLASS_TEMPLATE; + this.artifactsGenerationMode = ArtifactsGenerationMode.ENTITY; + this.artifacts = new ArrayList<>(); + this.entityArtifacts = new ArrayList<>(); + this.embeddableArtifacts = new ArrayList<>(); } protected String defaultTemplateName(TemplateType type) { @@ -156,14 +160,14 @@ public class ClassGenerationAction { * Returns a String used to prefix class name to create a generated * superclass. Default value is "_". */ - protected String getSuperclassPrefix() { + private String getSuperclassPrefix() { return ClassGenerationAction.SUPERCLASS_PREFIX; } /** * VelocityContext initialization method called once per artifact. */ - protected void resetContextForArtifact(Artifact artifact) { + private void resetContextForArtifact(Artifact artifact) { StringUtils stringUtils = StringUtils.getInstance(); String qualifiedClassName = artifact.getQualifiedClassName(); @@ -201,7 +205,7 @@ public class ClassGenerationAction { * VelocityContext initialization method called once per each artifact and * template type combination. */ - protected void resetContextForArtifactTemplate(Artifact artifact, TemplateType templateType) { + void resetContextForArtifactTemplate(Artifact artifact, TemplateType templateType) { context.put(Artifact.IMPORT_UTILS_KEY, new ImportUtils()); artifact.postInitContext(context); } @@ -248,7 +252,26 @@ public class ClassGenerationAction { } } - protected Template getTemplate(TemplateType type) { + public void prepareArtifacts(){ + if(!entityArtifacts.isEmpty()) { + for(String name : entityArtifacts) { + ObjEntity objEntity = dataMap.getObjEntity(name); + if(objEntity != null) { + artifacts.add(new EntityArtifact(objEntity)); + } + } + } + if(!embeddableArtifacts.isEmpty()) { + for(String name : embeddableArtifacts) { + Embeddable embeddable = dataMap.getEmbeddable(name); + if(embeddable != null) { + artifacts.add(new EmbeddableArtifact(embeddable)); + } + } + } + } + + private Template getTemplate(TemplateType type) { String templateName = customTemplateName(type); if (templateName == null) { @@ -284,7 +307,7 @@ public class ClassGenerationAction { * Throws CayenneRuntimeException if it is in an inconsistent state. * Called internally from "execute". */ - protected void validateAttributes() { + private void validateAttributes() { if (destDir == null) { throw new CayenneRuntimeException("'destDir' attribute is missing."); } @@ -391,7 +414,7 @@ public class ClassGenerationAction { * Returns a target file where a generated superclass must be saved. If null * is returned, class shouldn't be generated. */ - protected File fileForSuperclass() throws Exception { + private File fileForSuperclass() throws Exception { String packageName = (String) context.get(Artifact.SUPER_PACKAGE_KEY); String className = (String) context.get(Artifact.SUPER_CLASS_KEY); @@ -410,7 +433,7 @@ public class ClassGenerationAction { * Returns a target file where a generated class must be saved. If null is * returned, class shouldn't be generated. */ - protected File fileForClass() throws Exception { + private File fileForClass() throws Exception { String packageName = (String) context.get(Artifact.SUB_PACKAGE_KEY); String className = (String) context.get(Artifact.SUB_CLASS_KEY); @@ -470,7 +493,7 @@ public class ClassGenerationAction { * belong to <code>pkgName</code> package should reside. Creates any missing * diectories below <code>dest</code>. */ - protected File mkpath(File dest, String pkgName) throws Exception { + private File mkpath(File dest, String pkgName) throws Exception { if (!usePkgPath || pkgName == null) { return dest; @@ -550,6 +573,20 @@ public class ClassGenerationAction { } } + public void loadEntity(String name) { + if (artifactsGenerationMode == ArtifactsGenerationMode.ENTITY + || artifactsGenerationMode == ArtifactsGenerationMode.ALL) { + entityArtifacts.add(name); + } + } + + public void loadEmbeddable(String name) { + if (artifactsGenerationMode == ArtifactsGenerationMode.ENTITY + || artifactsGenerationMode == ArtifactsGenerationMode.ALL) { + embeddableArtifacts.add(name); + } + } + /** * Sets an optional shared VelocityContext. Useful with tools like VPP that * can set custom values in the context, not known to Cayenne. @@ -584,6 +621,10 @@ public class ClassGenerationAction { } } + public String getArtifactsGenerationMode(){ + return artifactsGenerationMode.getLabel(); + } + public boolean isForce() { return force; } @@ -605,4 +646,95 @@ public class ClassGenerationAction { public void setCreatePKProperties(boolean createPKProperties) { this.createPKProperties = createPKProperties; } + + public Collection<EntityArtifact> getEntityArtifacts() { + Collection<EntityArtifact> entityArtifacts = new ArrayList<>(); + for(Artifact artifact : artifacts){ + if(artifact instanceof EntityArtifact){ + entityArtifacts.add((EntityArtifact) artifact); + } + } + return entityArtifacts; + } + + public Collection<EmbeddableArtifact> getEmbeddableArtifacts() { + Collection<EmbeddableArtifact> embeddableArtifacts = new ArrayList<>(); + for(Artifact artifact : artifacts){ + if(artifact instanceof EmbeddableArtifact){ + embeddableArtifacts.add((EmbeddableArtifact) artifact); + } + } + return embeddableArtifacts; + } + + public boolean isMakePairs() { + return makePairs; + } + + public boolean isOverwrite() { + return overwrite; + } + + public boolean isUsePkgPath() { + return usePkgPath; + } + + public boolean isCreatePropertyNames() { + return createPropertyNames; + } + + public String getOutputPattern() { + return outputPattern; + } + + public String getSuperclassTemplate(){ + return superTemplate; + } + + public DataMap getDataMap() { + return dataMap; + } + + public String getDir(){ + return destDir.getAbsolutePath(); + } + + public String getTemplate() { + return template; + } + + public String getSuperPkg(){ + return superPkg; + } + + public void resetArtifacts(){ + this.artifacts = new ArrayList<>(); + } + + public Collection<String> getEntities() { + return entityArtifacts; + } + + public Collection<String> getEmbeddables() { + return embeddableArtifacts; + } + + @Override + public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) { + encoder.start("cgen") + .attribute("xmlns", CgenExtension.NAMESPACE) + .nested(this.getEntityArtifacts(), delegate) + .nested(this.getEmbeddableArtifacts(), delegate) + .simpleTag("outputDirectory", this.destDir.getAbsolutePath()) + .simpleTag("generationMode", this.artifactsGenerationMode.getLabel()) + .simpleTag("subclassTemplate", this.template) + .simpleTag("superclassTemplate", this.superTemplate) + .simpleTag("outputPattern", this.outputPattern) + .simpleTag("makePairs", Boolean.toString(this.makePairs)) + .simpleTag("usePkgPath", Boolean.toString(this.usePkgPath)) + .simpleTag("overwriteSubclasses", Boolean.toString(this.overwrite)) + .simpleTag("createPropertyNames", Boolean.toString(this.createPropertyNames)) + .simpleTag("superPkg", this.superPkg) + .end(); + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java ---------------------------------------------------------------------- diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java index 937f451..54a7426 100644 --- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java +++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapArtifact.java @@ -137,4 +137,5 @@ public class DataMapArtifact implements Artifact { public DataMap getDataMap() { return dataMap; } + } http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EmbeddableArtifact.java ---------------------------------------------------------------------- diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EmbeddableArtifact.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EmbeddableArtifact.java index 8e6ea43..fec8dae 100644 --- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EmbeddableArtifact.java +++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EmbeddableArtifact.java @@ -18,7 +18,10 @@ ****************************************************************/ package org.apache.cayenne.gen; +import org.apache.cayenne.configuration.ConfigurationNodeVisitor; import org.apache.cayenne.map.Embeddable; +import org.apache.cayenne.util.XMLEncoder; +import org.apache.cayenne.util.XMLSerializable; import org.apache.velocity.VelocityContext; /** @@ -26,7 +29,7 @@ import org.apache.velocity.VelocityContext; * * @since 3.0 */ -public class EmbeddableArtifact implements Artifact { +public class EmbeddableArtifact implements Artifact, XMLSerializable { protected Embeddable embeddable; @@ -65,4 +68,11 @@ public class EmbeddableArtifact implements Artifact { public void postInitContext(VelocityContext context) { // noop - no special keys... } + + @Override + public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) { + encoder.start("embeddable") + .simpleTag("name", embeddable.getClassName()) + .end(); + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityArtifact.java ---------------------------------------------------------------------- diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityArtifact.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityArtifact.java index 930b131..b53ee46 100644 --- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityArtifact.java +++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityArtifact.java @@ -19,7 +19,10 @@ package org.apache.cayenne.gen; import org.apache.cayenne.BaseDataObject; +import org.apache.cayenne.configuration.ConfigurationNodeVisitor; import org.apache.cayenne.map.ObjEntity; +import org.apache.cayenne.util.XMLEncoder; +import org.apache.cayenne.util.XMLSerializable; import org.apache.velocity.VelocityContext; /** @@ -27,7 +30,7 @@ import org.apache.velocity.VelocityContext; * * @since 3.0 */ -public class EntityArtifact implements Artifact { +public class EntityArtifact implements Artifact, XMLSerializable { public static String ENTITY_UTILS_KEY = "entityUtils"; @@ -95,4 +98,10 @@ public class EntityArtifact implements Artifact { context.put(ENTITY_UTILS_KEY, metadata); } + @Override + public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor delegate) { + encoder.start("objEntity") + .simpleTag("name", entity.getName()) + .end(); + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java ---------------------------------------------------------------------- diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java index 23f0ff3..fa89bf5 100644 --- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java +++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenConfigHandler.java @@ -2,22 +2,224 @@ package org.apache.cayenne.gen.xml; import org.apache.cayenne.configuration.xml.DataChannelMetaData; import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler; -import org.apache.cayenne.dbsync.xml.DbImportExtension; +import org.apache.cayenne.gen.ClassGenerationAction; import org.xml.sax.Attributes; +import org.xml.sax.ContentHandler; import org.xml.sax.SAXException; +import java.io.File; + public class CgenConfigHandler extends NamespaceAwareNestedTagHandler{ + public static final String CONFIG_TAG = "cgen"; + + private static final String OUTPUT_DIRECTORY_TAG = "outputDirectory"; + private static final String GENERATION_MODE_TAG = "generationMode"; + private static final String SUBCLASS_TEMPLATE_TAG = "subclassTemplate"; + private static final String SUPERCLASS_TEMPLATE_TAG = "superclassTemplate"; + private static final String OUTPUT_PATTERN_TAG = "outputPattern"; + private static final String MAKE_PAIRS_TAG = "makePairs"; + private static final String USE_PKG_PATH_TAG = "usePkgPath"; + private static final String OVERWRITE_SUBCLASSES_TAG = "overwriteSubclasses"; + private static final String CREATE_PROPERTY_NAMES_TAG = "createPropertyNames"; + private static final String SUPER_PKG_TAG = "superPkg"; + private static final String OBJENTITY_TAG = "objEntity"; + private static final String EMBEDDABLE_TAG = "embeddable"; + + public static final String TRUE = "true"; + private DataChannelMetaData metaData; + private ClassGenerationAction configuration; CgenConfigHandler(NamespaceAwareNestedTagHandler parentHandler, DataChannelMetaData metaData) { super(parentHandler); this.metaData = metaData; - this.targetNamespace = DbImportExtension.NAMESPACE; + this.targetNamespace = CgenExtension.NAMESPACE; } @Override protected boolean processElement(String namespaceURI, String localName, Attributes attributes) throws SAXException { + switch (localName) { + case CONFIG_TAG: + createConfig(); + return true; + } return false; } + + @Override + protected ContentHandler createChildTagHandler(String namespaceURI, String localName, + String qName, Attributes attributes) { + + if (namespaceURI.equals(targetNamespace)) { + switch (localName) { + case OBJENTITY_TAG: + return new ObjEntityHandler(this, configuration); + case EMBEDDABLE_TAG: + return new EmbeddableHandler(this, configuration); + } + } + + return super.createChildTagHandler(namespaceURI, localName, qName, attributes); + } + + @Override + protected void processCharData(String localName, String data) { + switch (localName) { + case OUTPUT_DIRECTORY_TAG: + createOutputDir(data); + break; + case GENERATION_MODE_TAG: + createGenerationMode(data); + break; + case SUBCLASS_TEMPLATE_TAG: + createSubclassTemplate(data); + break; + case SUPERCLASS_TEMPLATE_TAG: + createSuperclassTemplate(data); + break; + case OUTPUT_PATTERN_TAG: + createOutputPattern(data); + break; + case MAKE_PAIRS_TAG: + createMakePairs(data); + break; + case USE_PKG_PATH_TAG: + createUsePkgPath(data); + break; + case OVERWRITE_SUBCLASSES_TAG: + createOverwriteSubclasses(data); + break; + case CREATE_PROPERTY_NAMES_TAG: + createPropertyNamesTag(data); + break; + case SUPER_PKG_TAG: + createSuperPkg(data); + break; + } + } + + private void createOutputDir(String path) { + if(path.trim().length() == 0) { + return; + } + + if(configuration != null) { + configuration.setDestDir(new File(path)); + } + } + + private void createGenerationMode(String mode) { + if(mode.trim().length() == 0) { + return; + } + + if(configuration != null) { + configuration.setArtifactsGenerationMode(mode); + } + } + + private void createSubclassTemplate(String template) { + if(template.trim().length() == 0) { + return; + } + + if(configuration != null) { + configuration.setTemplate(template); + } + } + + private void createSuperclassTemplate(String template) { + if(template.trim().length() == 0) { + return; + } + + if(configuration != null) { + configuration.setSuperTemplate(template); + } + } + + private void createOutputPattern(String pattern) { + if(pattern.trim().length() == 0) { + return; + } + + if(configuration != null) { + configuration.setOutputPattern(pattern); + } + } + + private void createMakePairs(String makePairs) { + if (makePairs.trim().length() == 0) { + return; + } + + if (configuration != null) { + if (makePairs.equals(TRUE)) { + configuration.setMakePairs(true); + } else { + configuration.setMakePairs(false); + } + } + } + + private void createUsePkgPath(String data) { + if(data.trim().length() == 0) { + return; + } + + if(configuration != null) { + if(data.equals(TRUE)) { + configuration.setUsePkgPath(true); + } else { + configuration.setUsePkgPath(false); + } + } + } + + private void createOverwriteSubclasses(String data) { + if(data.trim().length() == 0) { + return; + } + + if(configuration != null) { + if(data.equals(TRUE)) { + configuration.setOverwrite(true); + } else { + configuration.setOverwrite(false); + } + } + } + + private void createPropertyNamesTag(String data) { + if(data.trim().length() == 0) { + return; + } + + if(configuration != null) { + if(data.equals(TRUE)) { + configuration.setCreatePropertyNames(true); + } else { + configuration.setCreatePropertyNames(false); + } + } + } + + private void createSuperPkg(String data) { + if(data.trim().length() == 0) { + return; + } + + if(configuration != null) { + configuration.setSuperPkg(data); + } + } + + private void createConfig() { + configuration = new ClassGenerationAction(); + loaderContext.addDataMapListener(dataMap -> { + CgenConfigHandler.this.metaData.add(dataMap, configuration); + configuration.setDataMap(dataMap); + }); + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenExtension.java ---------------------------------------------------------------------- diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenExtension.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenExtension.java index 619bffc..e98eca9 100644 --- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenExtension.java +++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenExtension.java @@ -4,6 +4,7 @@ import org.apache.cayenne.configuration.ConfigurationNodeVisitor; import org.apache.cayenne.configuration.xml.DataChannelMetaData; import org.apache.cayenne.di.Inject; import org.apache.cayenne.project.Project; +import org.apache.cayenne.project.extension.BaseNamingDelegate; import org.apache.cayenne.project.extension.LoaderDelegate; import org.apache.cayenne.project.extension.ProjectExtension; import org.apache.cayenne.project.extension.SaverDelegate; @@ -17,7 +18,7 @@ public class CgenExtension implements ProjectExtension { @Override public LoaderDelegate createLoaderDelegate() { - return null; + return new CgenLoaderDelegate(metaData); } @Override @@ -27,6 +28,6 @@ public class CgenExtension implements ProjectExtension { @Override public ConfigurationNodeVisitor<String> createNamingDelegate() { - return null; + return new BaseNamingDelegate(); } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenLoaderDelegate.java ---------------------------------------------------------------------- diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenLoaderDelegate.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenLoaderDelegate.java index 44438e3..8b3728f 100644 --- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenLoaderDelegate.java +++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenLoaderDelegate.java @@ -20,9 +20,9 @@ public class CgenLoaderDelegate implements LoaderDelegate { @Override public NamespaceAwareNestedTagHandler createHandler(NamespaceAwareNestedTagHandler parent, String tag) { -// if(CgenConfigHandler.CONFIG_TAG.equals(tag)) { -// return new CgenConfigHandler(parent, metaData); -// } + if(CgenConfigHandler.CONFIG_TAG.equals(tag)) { + return new CgenConfigHandler(parent, metaData); + } return null; } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenSaverDelegate.java ---------------------------------------------------------------------- diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenSaverDelegate.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenSaverDelegate.java index f9c7173..d4d4b8f 100644 --- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenSaverDelegate.java +++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/CgenSaverDelegate.java @@ -1,6 +1,7 @@ package org.apache.cayenne.gen.xml; import org.apache.cayenne.configuration.xml.DataChannelMetaData; +import org.apache.cayenne.gen.ClassGenerationAction; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.project.extension.BaseSaverDelegate; @@ -14,7 +15,10 @@ public class CgenSaverDelegate extends BaseSaverDelegate{ @Override public Void visitDataMap(DataMap dataMap) { - + ClassGenerationAction cgen = metaData.get(dataMap, ClassGenerationAction.class); + if(cgen != null){ + encoder.nested(cgen, getParentDelegate()); + } return null; } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/EmbeddableHandler.java ---------------------------------------------------------------------- diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/EmbeddableHandler.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/EmbeddableHandler.java new file mode 100644 index 0000000..4e11a6f --- /dev/null +++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/EmbeddableHandler.java @@ -0,0 +1,49 @@ +package org.apache.cayenne.gen.xml; + +import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler; +import org.apache.cayenne.gen.ClassGenerationAction; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; + +public class EmbeddableHandler extends NamespaceAwareNestedTagHandler { + + private static final String EMBEDDABLE_TAG = "embeddable"; + private static final String EMBEDDABLE_NAME_TAG = "name"; + + private ClassGenerationAction configuration; + + EmbeddableHandler(NamespaceAwareNestedTagHandler parentHandler, ClassGenerationAction configuration) { + super(parentHandler); + this.configuration = configuration; + } + + @Override + protected boolean processElement(String namespaceURI, String localName, Attributes attributes) throws SAXException { + switch (localName) { + case EMBEDDABLE_TAG: + return true; + } + + return false; + } + + @Override + protected void processCharData(String localName, String data) { + switch (localName) { + case EMBEDDABLE_NAME_TAG: + createEmbeddableEntity(data); + break; + } + } + + private void createEmbeddableEntity(String data) { + if(data.trim().length() == 0) { + return; + } + + if(configuration != null) { + configuration.loadEmbeddable(data); + } + } +} + http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/ObjEntityHandler.java ---------------------------------------------------------------------- diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/ObjEntityHandler.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/ObjEntityHandler.java new file mode 100644 index 0000000..f4ebc48 --- /dev/null +++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/xml/ObjEntityHandler.java @@ -0,0 +1,48 @@ +package org.apache.cayenne.gen.xml; + +import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler; +import org.apache.cayenne.gen.ClassGenerationAction; +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; + +public class ObjEntityHandler extends NamespaceAwareNestedTagHandler { + + private static final String OBJENTITY_TAG = "objEntity"; + private static final String OBJENTITY_NAME_TAG = "name"; + + private ClassGenerationAction configuration; + + ObjEntityHandler(NamespaceAwareNestedTagHandler parentHandler, ClassGenerationAction configuration) { + super(parentHandler); + this.configuration = configuration; + } + + @Override + protected boolean processElement(String namespaceURI, String localName, Attributes attributes) throws SAXException { + switch (localName) { + case OBJENTITY_TAG: + return true; + } + + return false; + } + + @Override + protected void processCharData(String localName, String data) { + switch (localName) { + case OBJENTITY_NAME_TAG: + createObjEntity(data); + break; + } + } + + private void createObjEntity(String data) { + if(data.trim().length() == 0) { + return; + } + + if(configuration != null) { + configuration.loadEntity(data); + } + } +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java index c72934d..1d51503 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CodeTemplateManager.java @@ -50,6 +50,8 @@ public class CodeTemplateManager { protected Map<String, String> customTemplates; protected Map<String, String> standardTemplates; + private Map<String, String> reverseStandartTemplates; + private static Logger logger = LoggerFactory.getLogger(CodeTemplateManager.class); public Preferences getTemplatePreferences(Application application) { @@ -75,6 +77,14 @@ public class CodeTemplateManager { standardTemplates.put(STANDARD_SERVER_SUBCLASS, ClassGenerationAction.SUBCLASS_TEMPLATE); standardTemplates.put(STANDARD_CLIENT_SUBCLASS, ClientClassGenerationAction.SUBCLASS_TEMPLATE); standardTemplates.put(SINGLE_SERVER_CLASS, ClassGenerationAction.SINGLE_CLASS_TEMPLATE); + + reverseStandartTemplates = new HashMap<>(); + reverseStandartTemplates.put(ClassGenerationAction.SUBCLASS_TEMPLATE, STANDARD_SERVER_SUBCLASS); + reverseStandartTemplates.put(ClientClassGenerationAction.SUBCLASS_TEMPLATE, STANDARD_CLIENT_SUBCLASS); + reverseStandartTemplates.put(ClassGenerationAction.SINGLE_CLASS_TEMPLATE, SINGLE_SERVER_CLASS); + reverseStandartTemplates.put(ClientClassGenerationAction.SUPERCLASS_TEMPLATE, STANDARD_CLIENT_SUPERCLASS); + reverseStandartTemplates.put(ClassGenerationAction.SUPERCLASS_TEMPLATE, STANDARD_SERVER_SUPERCLASS); + } /** @@ -107,6 +117,15 @@ public class CodeTemplateManager { return value != null ? value.toString() : null; } + public String getNameByPath(String name) { + if(customTemplates.containsKey(name)){ + return customTemplates.get(name).toString(); + } else { + Object value = reverseStandartTemplates.get(name); + return value != null ? value.toString() : null; + } + } + public Map<String, String> getCustomTemplates() { return customTemplates; } http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java index 2b478ac..3a63297 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/ClassesTabController.java @@ -19,7 +19,6 @@ package org.apache.cayenne.modeler.editor.cgen; -import org.apache.cayenne.map.DataMap; import org.apache.cayenne.modeler.util.CayenneController; import org.apache.cayenne.swing.BindingBuilder; import org.apache.cayenne.swing.ImageRendererColumn; @@ -36,13 +35,18 @@ public class ClassesTabController extends CayenneController { protected ClassesTabPanel view; protected ObjectBinding tableBinding; + private BindingBuilder builder; + public ClassesTabController(CodeGeneratorControllerBase parent) { super(parent); this.view = new ClassesTabPanel(); + builder = new BindingBuilder(getApplication().getBindingFactory(), this); + + builder.bindToAction(view.getCheckAll(), "checkAllAction()"); } - public void startup(DataMap dataMap){ + public void startup(){ initBindings(); } @@ -55,13 +59,6 @@ public class ClassesTabController extends CayenneController { } protected void initBindings() { - - BindingBuilder builder = new BindingBuilder( - getApplication().getBindingFactory(), - this); - - builder.bindToAction(view.getCheckAll(), "checkAllAction()"); - TableBindingBuilder tableBuilder = new TableBindingBuilder(builder); tableBuilder.addColumn( @@ -109,6 +106,7 @@ public class ClassesTabController extends CayenneController { else if (selectedCount == getParentController().getClasses().size()) { view.getCheckAll().setSelected(true); } + updateEntities(); } /** @@ -118,6 +116,12 @@ public class ClassesTabController extends CayenneController { public void checkAllAction() { if (getParentController().updateSelection(view.getCheckAll().isSelected() ? o -> true : o -> false)) { tableBinding.updateView(); + updateEntities(); } } + + private void updateEntities(){ + getParentController().updateEntities(); + getParentController().getProjectController().setDirty(true); + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java index 8163acb..45d3e51 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorController.java @@ -29,7 +29,6 @@ import org.slf4j.LoggerFactory; import javax.swing.*; import java.awt.*; -import java.util.Collection; import java.util.function.Predicate; /** @@ -58,8 +57,11 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase { private void initListeners(){ projectController.addDataMapDisplayListener(e -> { super.startup(e.getDataMap()); - classesSelector.startup(e.getDataMap()); + classesSelector.startup(); generatorSelector.startup(e.getDataMap()); + GeneratorController modeController = generatorSelector.getGeneratorController(); + ClassGenerationAction classGenerationAction = modeController.createGenerator(); + ((CustomModeController)modeController).initForm(classGenerationAction); }); } @@ -125,13 +127,10 @@ public class CodeGeneratorController extends CodeGeneratorControllerBase { } public void generateAction() { - Collection<ClassGenerationAction> generators = generatorSelector.getGenerator(); - - if (generators != null) { + ClassGenerationAction generator = generatorSelector.getGenerator(); + if (generator != null) { try { - for (ClassGenerationAction generator : generators) { - generator.execute(); - } + generator.execute(); JOptionPane.showMessageDialog( getView(), "Class generation finished"); http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java index 17196fa..d99e708 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CodeGeneratorControllerBase.java @@ -19,6 +19,7 @@ package org.apache.cayenne.modeler.editor.cgen; +import org.apache.cayenne.gen.ClassGenerationAction; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.map.Embeddable; import org.apache.cayenne.map.ObjEntity; @@ -171,14 +172,6 @@ public abstract class CodeGeneratorControllerBase extends CayenneController { return selected; } - public int getSelectedEntitiesSize() { - return selectedEntities.size(); - } - - public int getSelectedEmbeddablesSize() { - return selectedEmbeddables.size(); - } - /** * Returns the first encountered validation problem for an antity matching the name or * null if the entity is valid or the entity is not present. @@ -250,18 +243,6 @@ public abstract class CodeGeneratorControllerBase extends CayenneController { } } - public Object getCurrentClass() { - return currentClass; - } - - public void setCurrentClass(Object currentClass) { - this.currentClass = currentClass; - } - - public Collection<DataMap> getDataMaps() { - return dataMaps; - } - public JLabel getItemName(Object obj) { String className; Icon icon; @@ -279,6 +260,43 @@ public abstract class CodeGeneratorControllerBase extends CayenneController { return labelIcon; } + public void updateEntities(){ + DataMap map = getProjectController().getCurrentDataMap(); + ClassGenerationAction generator = projectController.getApplication().getMetaData().get(map, ClassGenerationAction.class); + if(generator != null) { + generator.resetArtifacts(); + LinkedList<ObjEntity> objEntities = new LinkedList<>(map.getObjEntities()); + + Collection<ObjEntity> selected = new ArrayList<>(getSelectedEntities()); + selected.removeIf(ObjEntity::isGeneric); + + objEntities.retainAll(selected); + generator.addEntities(objEntities); + + LinkedList<Embeddable> embeddables = new LinkedList<>(map.getEmbeddables()); + embeddables.retainAll(getSelectedEmbeddables()); + generator.addEmbeddables(embeddables); + + generator.addQueries(map.getQueryDescriptors()); + } + } + + public void addToSelectedEntities(Collection<String> entities) { + selectedEntities.addAll(entities); + } + + public void addToSelectedEmbeddables(Collection<String> embeddables) { + selectedEmbeddables.addAll(embeddables); + } + + public int getSelectedEntitiesSize() { + return selectedEntities.size(); + } + + public int getSelectedEmbeddablesSize() { + return selectedEmbeddables.size(); + } + public DataMap getDataMap() { return dataMap; } @@ -286,4 +304,16 @@ public abstract class CodeGeneratorControllerBase extends CayenneController { public ProjectController getProjectController() { return projectController; } + + public Object getCurrentClass() { + return currentClass; + } + + public void setCurrentClass(Object currentClass) { + this.currentClass = currentClass; + } + +// public Collection<DataMap> getDataMaps() { +// return dataMaps; +// } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java index 8f4dac9..3d07c60 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModeController.java @@ -26,9 +26,10 @@ import org.apache.cayenne.modeler.dialog.pref.PreferenceDialog; import org.apache.cayenne.modeler.pref.DataMapDefaults; import org.apache.cayenne.swing.BindingBuilder; import org.apache.cayenne.swing.ObjectBinding; -import org.apache.cayenne.util.Util; import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; import java.awt.*; import java.util.*; import java.util.List; @@ -49,14 +50,19 @@ public class CustomModeController extends GeneratorController { static final Map<String, String> modesByLabel = new HashMap<>(); + static final Map<String, String> labelByMode = new HashMap<>(); + static { modesByLabel.put(DATA_MAP_MODE_LABEL, MODE_DATAMAP); modesByLabel.put(ENTITY_MODE_LABEL, MODE_ENTITY); modesByLabel.put(ALL_MODE_LABEL, MODE_ALL); + labelByMode.put(MODE_DATAMAP, DATA_MAP_MODE_LABEL); + labelByMode.put(MODE_ENTITY, ENTITY_MODE_LABEL); + labelByMode.put(MODE_ALL, ALL_MODE_LABEL); } protected CustomModePanel view; - protected CodeTemplateManager templateManager; + private CodeTemplateManager templateManager; protected ObjectBinding superTemplate; protected ObjectBinding subTemplate; @@ -65,6 +71,8 @@ public class CustomModeController extends GeneratorController { private CustomPreferencesUpdater preferencesUpdater; + private ClassGenerationAction classGenerationAction; + public CustomPreferencesUpdater getCustomPreferencesUpdater() { return preferencesUpdater; } @@ -72,6 +80,7 @@ public class CustomModeController extends GeneratorController { public CustomModeController(CodeGeneratorControllerBase parent) { super(parent); this.view = new CustomModePanel(); + initListeners(); bind(); } @@ -80,64 +89,11 @@ public class CustomModeController extends GeneratorController { builder = new BindingBuilder(getApplication().getBindingFactory(), this); builder.bindToAction(view.getManageTemplatesLink(), "popPreferencesAction()"); - Object[] modeChoices = new Object[]{ENTITY_MODE_LABEL, DATA_MAP_MODE_LABEL, ALL_MODE_LABEL}; - view.getGenerationMode().setModel(new DefaultComboBoxModel(modeChoices)); + updateTemplates(); } public void startup(DataMap dataMap) { - super.startup(dataMap); - - // bind preferences and init defaults... - DataMapDefaults dataMapDefaults = getMapPreferences().get(getParentController().getDataMap()); - - if (Util.isEmptyString(dataMapDefaults.getSuperclassTemplate())) { - dataMapDefaults.setSuperclassTemplate(CodeTemplateManager.STANDARD_SERVER_SUPERCLASS); - } - - if (Util.isEmptyString(dataMapDefaults.getSubclassTemplate())) { - dataMapDefaults.setSubclassTemplate(CodeTemplateManager.STANDARD_SERVER_SUBCLASS); - } - - if (Util.isEmptyString(dataMapDefaults.getProperty("mode"))) { - dataMapDefaults.setProperty("mode", MODE_ENTITY); - } - - if (Util.isEmptyString(dataMapDefaults.getProperty("overwrite"))) { - dataMapDefaults.setBooleanProperty("overwrite", false); - } - - if (Util.isEmptyString(dataMapDefaults.getProperty("pairs"))) { - dataMapDefaults.setBooleanProperty("pairs", true); - } - - if (Util.isEmptyString(dataMapDefaults.getProperty("usePackagePath"))) { - dataMapDefaults.setBooleanProperty("usePackagePath", true); - } - - if (Util.isEmptyString(dataMapDefaults.getProperty("outputPattern"))) { - dataMapDefaults.setProperty("outputPattern", "*.java"); - } - - builder.bindToComboSelection(view.getGenerationMode(), "customPreferencesUpdater.mode").updateView(); - - builder.bindToStateChange(view.getOverwrite(), "customPreferencesUpdater.overwrite").updateView(); - - builder.bindToStateChange(view.getPairs(), "customPreferencesUpdater.pairs").updateView(); - - builder.bindToStateChange(view.getUsePackagePath(), "customPreferencesUpdater.usePackagePath").updateView(); - - subTemplate = builder.bindToComboSelection(view.getSubclassTemplate(), - "customPreferencesUpdater.subclassTemplate"); - - superTemplate = builder.bindToComboSelection(view.getSuperclassTemplate(), - "customPreferencesUpdater.superclassTemplate"); - - builder.bindToTextField(view.getOutputPattern(), "customPreferencesUpdater.outputPattern").updateView(); - - builder.bindToStateChange(view.getCreatePropertyNames(), "customPreferencesUpdater.createPropertyNames") - .updateView(); - - updateTemplates(); + createDefaults(); } protected void createDefaults() { @@ -159,19 +115,10 @@ public class CustomModeController extends GeneratorController { preferencesUpdater = new CustomPreferencesUpdater(map); } - protected GeneratorControllerPanel createView() { - if (getParentController().getDataMap() != view.getStandardPanelComponent().getDataMap()) { - DataMapDefaults dataMapDefaults = getMapPreferences().get(getParentController().getDataMap()); - view.getStandardPanelComponent().setDataMap(getParentController().getDataMap()); - view.getStandardPanelComponent().setPreferences(dataMapDefaults); - view.getStandardPanelComponent().getDataMapName().setText(view.getStandardPanelComponent().getDataMap().getName()); - BindingBuilder builder = new BindingBuilder(getApplication().getBindingFactory(), view.getStandardPanelComponent()); - builder.bindToTextField(view.getStandardPanelComponent().getSuperclassPackage(), "preferences.superclassPackage").updateView(); - } - return view; - } - protected void updateTemplates() { + Object[] modeChoices = new Object[]{ENTITY_MODE_LABEL, DATA_MAP_MODE_LABEL, ALL_MODE_LABEL}; + view.getGenerationMode().setModel(new DefaultComboBoxModel(modeChoices)); + this.templateManager = getApplication().getCodeTemplateManager(); List<String> customTemplates = new ArrayList<>(templateManager.getCustomTemplates().keySet()); @@ -187,43 +134,12 @@ public class CustomModeController extends GeneratorController { this.view.getSubclassTemplate().setModel(new DefaultComboBoxModel(subTemplates.toArray())); this.view.getSuperclassTemplate().setModel(new DefaultComboBoxModel(superTemplates.toArray())); - - superTemplate.updateView(); - subTemplate.updateView(); } public Component getView() { return view; } - public Collection<ClassGenerationAction> createGenerator() { - - mode = modesByLabel.get(view.getGenerationMode().getSelectedItem()).toString(); - - Collection<ClassGenerationAction> generators = super.createGenerator(); - - String superKey = view.getSuperclassTemplate().getSelectedItem().toString(); - String superTemplate = templateManager.getTemplatePath(superKey); - - String subKey = view.getSubclassTemplate().getSelectedItem().toString(); - String subTemplate = templateManager.getTemplatePath(subKey); - - for (ClassGenerationAction generator : generators) { - generator.setSuperTemplate(superTemplate); - generator.setTemplate(subTemplate); - generator.setOverwrite(view.getOverwrite().isSelected()); - generator.setUsePkgPath(view.getUsePackagePath().isSelected()); - generator.setMakePairs(view.getPairs().isSelected()); - generator.setCreatePropertyNames(view.getCreatePropertyNames().isSelected()); - - if (!Util.isEmptyString(view.getOutputPattern().getText())) { - generator.setOutputPattern(view.getOutputPattern().getText()); - } - } - - return generators; - } - public void popPreferencesAction() { new PreferenceDialog(getApplication().getFrameController()).startupAction(PreferenceDialog.TEMPLATES_KEY); updateTemplates(); @@ -235,4 +151,97 @@ public class CustomModeController extends GeneratorController { getApplication().getInjector().injectMembers(action); return action; } + + private void initListeners(){ + view.getOutputFolder().getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + classGenerationAction.setDestDir(view.getOutputDir()); + getParentController().getProjectController().setDirty(true); + } + @Override + public void removeUpdate(DocumentEvent e) {} + + @Override + public void changedUpdate(DocumentEvent e) {} + }); + + view.getPairs().addActionListener(val -> { + classGenerationAction.setMakePairs(view.getPairs().isSelected()); + getParentController().getProjectController().setDirty(true); + }); + + view.getOverwrite().addActionListener(val -> { + classGenerationAction.setOverwrite(view.getOverwrite().isSelected()); + getParentController().getProjectController().setDirty(true); + }); + + view.getCreatePropertyNames().addActionListener(val -> { + classGenerationAction.setCreatePropertyNames(view.getCreatePropertyNames().isSelected()); + getParentController().getProjectController().setDirty(true); + }); + + view.getUsePackagePath().addActionListener(val -> { + classGenerationAction.setUsePkgPath(view.getUsePackagePath().isSelected()); + getParentController().getProjectController().setDirty(true); + }); + + view.getSubclassTemplate().addActionListener(val -> { + classGenerationAction.setTemplate(getApplication().getCodeTemplateManager().getTemplatePath(String.valueOf(view.getSubclassTemplate().getSelectedItem()))); + getParentController().getProjectController().setDirty(true); + }); + + view.getSuperclassTemplate().addActionListener(val -> { + classGenerationAction.setSuperTemplate(getApplication().getCodeTemplateManager().getTemplatePath(String.valueOf(view.getSuperclassTemplate().getSelectedItem()))); + getParentController().getProjectController().setDirty(true); + }); + + view.getGenerationMode().addActionListener(val -> { + classGenerationAction.setArtifactsGenerationMode(modesByLabel.get(view.getGenerationMode().getSelectedItem())); + getParentController().getProjectController().setDirty(true); + }); + + view.getOutputPattern().getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + classGenerationAction.setOutputPattern(view.getOutputPattern().getText()); + getParentController().getProjectController().setDirty(true); + } + + @Override + public void removeUpdate(DocumentEvent e) {} + + @Override + public void changedUpdate(DocumentEvent e) {} + }); + + view.getSuperclassPackage().getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + classGenerationAction.setSuperPkg(view.getSuperclassPackage().getText()); + getParentController().getProjectController().setDirty(true); + } + + @Override + public void removeUpdate(DocumentEvent e) {} + + @Override + public void changedUpdate(DocumentEvent e) {} + }); + } + + public void initForm(ClassGenerationAction classGenerationAction){ + this.classGenerationAction = classGenerationAction; + view.setOutputFolder(classGenerationAction.getDir()); + view.setGenerationMode(labelByMode.get(classGenerationAction.getArtifactsGenerationMode())); + view.setTemplate(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getTemplate())); + view.setSuperclassTemplate(getApplication().getCodeTemplateManager().getNameByPath(classGenerationAction.getSuperclassTemplate())); + view.setDataMapName(classGenerationAction.getDataMap().getName()); + view.setOutputPattern(classGenerationAction.getOutputPattern()); + view.setPairs(classGenerationAction.isMakePairs()); + view.setUsePackagePath(classGenerationAction.isUsePkgPath()); + view.setOverwrite(classGenerationAction.isOverwrite()); + view.setCreatePropertyNames(classGenerationAction.isCreatePropertyNames()); + view.setSuperclassPackage(classGenerationAction.getSuperPkg()); + } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java index 538ff64..720c521 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/CustomModePanel.java @@ -36,6 +36,7 @@ public class CustomModePanel extends GeneratorControllerPanel { protected JCheckBox usePackagePath; protected JTextField outputPattern; protected JCheckBox createPropertyNames; + private JTextField superclassPackage; private JTextField additionalMaps; private JButton selectAdditionalMaps; @@ -49,8 +50,6 @@ public class CustomModePanel extends GeneratorControllerPanel { protected ActionLink manageTemplatesLink; - private StandardPanelComponent standardPanelComponent; - public CustomModePanel() { this.generationMode = new JComboBox(); @@ -62,9 +61,8 @@ public class CustomModePanel extends GeneratorControllerPanel { this.outputPattern = new JTextField(); this.createPropertyNames = new JCheckBox(); this.manageTemplatesLink = new ActionLink("Customize Templates..."); - manageTemplatesLink.setFont(manageTemplatesLink.getFont().deriveFont(10f)); - - this.standardPanelComponent = new StandardPanelComponent(); + this.manageTemplatesLink.setFont(manageTemplatesLink.getFont().deriveFont(10f)); + this.superclassPackage = new JTextField(); this.additionalMaps = new JTextField(); this.selectAdditionalMaps = new JButton("Select"); @@ -129,7 +127,10 @@ public class CustomModePanel extends GeneratorControllerPanel { builder.append("Client", client); builder.nextLine(); - builder.append(standardPanelComponent, 4); + builder.append(dataMapName); + builder.nextLine(); + + builder.append("Superclass package", superclassPackage); setLayout(new BorderLayout()); add(builder.getPanel(), BorderLayout.CENTER); @@ -141,12 +142,6 @@ public class CustomModePanel extends GeneratorControllerPanel { add(builder.getPanel(), BorderLayout.CENTER); } - public void addDataMapLine(StandardPanelComponent dataMapLine) { - dataMapLines.add(dataMapLine); - builder.append(dataMapLine, 4); - builder.nextLine(); - } - public JComboBox getGenerationMode() { return generationMode; } @@ -183,7 +178,48 @@ public class CustomModePanel extends GeneratorControllerPanel { return createPropertyNames; } - public StandardPanelComponent getStandardPanelComponent() { - return standardPanelComponent; + + public JTextField getSuperclassPackage() { + return superclassPackage; + } + + public void setDataMapName(String mapName){ + dataMapName.setText(mapName); + } + + public void setSuperclassPackage(String pack) { + superclassPackage.setText(pack); + } + + public void setPairs(boolean val){ + pairs.setSelected(val); + } + + public void setOverwrite(boolean val){ + overwrite.setSelected(val); + } + + public void setUsePackagePath(boolean val) { + usePackagePath.setSelected(val); + } + + public void setCreatePropertyNames(boolean val) { + createPropertyNames.setSelected(val); + } + + public void setOutputPattern(String pattern){ + outputPattern.setText(pattern); + } + + public void setSuperclassTemplate(String template){ + superclassTemplate.setSelectedItem(template); + } + + public void setTemplate(String template) { + subclassTemplate.setSelectedItem(template); + } + + public void setGenerationMode(String mode) { + generationMode.setSelectedItem(mode); } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java index 9370e3b..a1ccf8f 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorController.java @@ -48,7 +48,7 @@ import java.util.prefs.Preferences; */ public abstract class GeneratorController extends CayenneController { - protected String mode = ArtifactsGenerationMode.ALL.getLabel(); + protected String mode = ArtifactsGenerationMode.ENTITY.getLabel(); protected Map<DataMap, DataMapDefaults> mapPreferences; private String outputPath; @@ -56,12 +56,6 @@ public abstract class GeneratorController extends CayenneController { super(parent); } - public void startup(DataMap dataMap){ - createDefaults(); - createView(); -// initBindings(new BindingBuilder(getApplication().getBindingFactory(), this)); - } - public String getOutputPath() { return outputPath; } @@ -94,25 +88,14 @@ public abstract class GeneratorController extends CayenneController { } protected void initBindings(BindingBuilder bindingBuilder) { - - initOutputFolder(); - - JTextField outputFolder = ((GeneratorControllerPanel) getView()).getOutputFolder(); JButton outputSelect = ((GeneratorControllerPanel) getView()).getSelectOutputFolder(); - - outputFolder.setText(getOutputPath()); bindingBuilder.bindToAction(outputSelect, "selectOutputFolderAction()"); - bindingBuilder.bindToTextField(outputFolder, "outputPath"); } protected CodeGeneratorControllerBase getParentController() { return (CodeGeneratorControllerBase) getParent(); } - protected abstract GeneratorControllerPanel createView(); - - protected abstract void createDefaults(); - /** * Creates an appropriate subclass of {@link ClassGenerationAction}, * returning it in an unconfigured state. Configuration is performed by @@ -123,76 +106,57 @@ public abstract class GeneratorController extends CayenneController { /** * Creates a class generator for provided selections. */ - public Collection<ClassGenerationAction> createGenerator() { - - File outputDir = getOutputDir(); + public ClassGenerationAction createGenerator() { + DataMap map = getParentController().getProjectController().getCurrentDataMap(); - // no destination folder - if (outputDir == null) { - JOptionPane.showMessageDialog(this.getView(), "Select directory for source files."); - return null; + ClassGenerationAction generator = getParentController().projectController.getApplication().getMetaData().get(map, ClassGenerationAction.class); + if(generator != null){ + generator.prepareArtifacts(); + getParentController().addToSelectedEntities(generator.getEntities()); + getParentController().addToSelectedEmbeddables(generator.getEmbeddables()); + return generator; } - // no such folder - if (!outputDir.exists() && !outputDir.mkdirs()) { - JOptionPane.showMessageDialog(this.getView(), "Can't create directory " + outputDir - + ". Select a different one."); - return null; - } - - // not a directory - if (!outputDir.isDirectory()) { - JOptionPane.showMessageDialog(this.getView(), outputDir + " is not a valid directory."); - return null; - } - - // remove generic entities... - Collection<ObjEntity> selectedEntities = new ArrayList<>(getParentController().getSelectedEntities()); - selectedEntities.removeIf(ObjEntity::isGeneric); - - Collection<ClassGenerationAction> generators = new ArrayList<>(); - Collection<StandardPanelComponent> dataMapLines = ((GeneratorControllerPanel) getView()).getDataMapLines(); - DataMap map = getParentController().getDataMap(); try { - ClassGenerationAction generator = newGenerator(); - generator.setArtifactsGenerationMode(mode); + generator = newGenerator(); generator.setDataMap(map); + initOutputFolder(); + File outputDir = new File(outputPath); - LinkedList<ObjEntity> objEntities = new LinkedList<>(map.getObjEntities()); - objEntities.retainAll(selectedEntities); - generator.addEntities(objEntities); - - LinkedList<Embeddable> embeddables = new LinkedList<>(map.getEmbeddables()); - embeddables.retainAll(getParentController().getSelectedEmbeddables()); - generator.addEmbeddables(embeddables); - - generator.addQueries(map.getQueryDescriptors()); + // no destination folder + if (outputDir == null) { + JOptionPane.showMessageDialog(this.getView(), "Select directory for source files."); + return null; + } - Preferences preferences = application.getPreferencesNode(GeneralPreferences.class, ""); + // no such folder + if (!outputDir.exists() && !outputDir.mkdirs()) { + JOptionPane.showMessageDialog(this.getView(), "Can't create directory " + outputDir + + ". Select a different one."); + return null; + } - if (preferences != null) { - generator.setEncoding(preferences.get(GeneralPreferences.ENCODING_PREFERENCE, null)); + // not a directory + if (!outputDir.isDirectory()) { + JOptionPane.showMessageDialog(this.getView(), outputDir + " is not a valid directory."); + return null; } generator.setDestDir(outputDir); - generator.setMakePairs(true); - generator.setForce(true); - for (StandardPanelComponent dataMapLine : dataMapLines) { - if (dataMapLine.getDataMap() == map && !Util.isEmptyString(dataMapLine.getSuperclassPackage().getText())) { - generator.setSuperPkg(dataMapLine.getSuperclassPackage().getText()); - break; - } - } + Preferences preferences = application.getPreferencesNode(GeneralPreferences.class, ""); - generators.add(generator); - } catch (CayenneRuntimeException exception) { - JOptionPane.showMessageDialog(this.getView(), exception.getUnlabeledMessage()); - return null; + if (preferences != null) { + generator.setEncoding(preferences.get(GeneralPreferences.ENCODING_PREFERENCE, null)); } + getParentController().projectController.getApplication().getMetaData().add(map, generator); + } catch (CayenneRuntimeException exception) { + JOptionPane.showMessageDialog(this.getView(), exception.getUnlabeledMessage()); + return null; + } - return generators; + return generator; } public void validateEmbeddable(ValidationResult validationBuffer, Embeddable embeddable) { @@ -520,7 +484,7 @@ public abstract class GeneratorController extends CayenneController { // update model String path = selected.getAbsolutePath(); outputFolder.setText(path); - setOutputPath(path); +// setOutputPath(path); } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorControllerPanel.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorControllerPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorControllerPanel.java index 9b836bd..7f1f689 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorControllerPanel.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorControllerPanel.java @@ -20,8 +20,7 @@ package org.apache.cayenne.modeler.editor.cgen; import javax.swing.*; -import java.util.ArrayList; -import java.util.Collection; +import java.io.File; /** * A generic panel that is a superclass of generator panels, defining common fields. @@ -29,12 +28,10 @@ import java.util.Collection; */ public class GeneratorControllerPanel extends JPanel { - protected Collection<StandardPanelComponent> dataMapLines; protected JTextField outputFolder; protected JButton selectOutputFolder; public GeneratorControllerPanel() { - this.dataMapLines = new ArrayList<>(); this.outputFolder = new JTextField(); this.selectOutputFolder = new JButton("Select"); } @@ -43,11 +40,15 @@ public class GeneratorControllerPanel extends JPanel { return outputFolder; } + public File getOutputDir(){ + return new File(outputFolder.getText()); + } + public JButton getSelectOutputFolder() { return selectOutputFolder; } - public Collection<StandardPanelComponent> getDataMapLines() { - return dataMapLines; + public void setOutputFolder(String folder) { + this.outputFolder.setText(folder); } } http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java index c3fff72..1e338eb 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/GeneratorTabController.java @@ -25,7 +25,6 @@ import org.apache.cayenne.modeler.util.CayenneController; import org.apache.cayenne.pref.PreferenceDetail; import java.awt.*; -import java.util.Collection; /** */ @@ -64,7 +63,7 @@ public class GeneratorTabController extends CayenneController { return customModeController; } - public Collection<ClassGenerationAction> getGenerator() { + public ClassGenerationAction getGenerator() { GeneratorController modeController = getGeneratorController(); return (modeController != null) ? modeController.createGenerator() : null; } http://git-wip-us.apache.org/repos/asf/cayenne/blob/d489f2a5/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardPanelComponent.java ---------------------------------------------------------------------- diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardPanelComponent.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardPanelComponent.java deleted file mode 100644 index 71d95e4..0000000 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/cgen/StandardPanelComponent.java +++ /dev/null @@ -1,79 +0,0 @@ -/***************************************************************** - * 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. - ****************************************************************/ - -package org.apache.cayenne.modeler.editor.cgen; - -import com.jgoodies.forms.builder.DefaultFormBuilder; -import com.jgoodies.forms.layout.FormLayout; -import org.apache.cayenne.map.DataMap; -import org.apache.cayenne.modeler.pref.DataMapDefaults; - -import javax.swing.*; -import java.awt.*; - -public class StandardPanelComponent extends JComponent { - - private DataMap dataMap; - private DataMapDefaults preferences; - private JLabel dataMapName; - private JTextField superclassPackage; - private DefaultFormBuilder builder; - - public StandardPanelComponent() { - super(); - dataMapName = new JLabel(); - dataMapName.setFont(dataMapName.getFont().deriveFont(1)); - superclassPackage = new JTextField(); - - FormLayout layout = new FormLayout( - "right:77dlu, 3dlu, fill:200:grow, 3dlu", ""); - builder = new DefaultFormBuilder(layout); - builder.append(dataMapName); - builder.nextLine(); - builder.append("Superclass Package:", superclassPackage); - - setLayout(new BorderLayout()); - add(builder.getPanel(), BorderLayout.CENTER); - } - - public DataMap getDataMap() { - return dataMap; - } - - public void setDataMap(DataMap dataMap) { - this.dataMap = dataMap; - } - - public DataMapDefaults getPreferences() { - return preferences; - } - - public void setPreferences(DataMapDefaults preferences) { - this.preferences = preferences; - } - - public JLabel getDataMapName() { - return dataMapName; - } - - public JTextField getSuperclassPackage() { - return superclassPackage; - } - -}