You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2017/08/03 07:59:54 UTC
[3/5] cayenne git commit: CAY-2340 Save additional metadata as
separate files
CAY-2340 Save additional metadata as separate files
Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/3939efe4
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/3939efe4
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/3939efe4
Branch: refs/heads/master
Commit: 3939efe42ab7fd8a3745a45e0d6721b9b789e519
Parents: 78b0a65
Author: Nikita Timofeev <st...@gmail.com>
Authored: Tue Aug 1 17:02:33 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Wed Aug 2 16:23:56 2017 +0300
----------------------------------------------------------------------
cayenne-joda/pom.xml | 7 ++
.../cayenne/project/FileProjectSaver.java | 49 ++++++--
.../project/extension/BaseNamingDelegate.java | 112 +++++++++++++++++++
.../project/extension/BaseSaverDelegate.java | 4 +
.../project/extension/ProjectExtension.java | 5 +
.../project/extension/info/InfoExtension.java | 7 ++
cayenne-server/pom.xml | 7 ++
.../xml/XMLDataChannelDescriptorLoader.java | 5 +-
.../configuration/xml/XMLDataMapLoader.java | 5 +-
modeler/cayenne-modeler/pom.xml | 7 ++
10 files changed, 196 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/cayenne-joda/pom.xml
----------------------------------------------------------------------
diff --git a/cayenne-joda/pom.xml b/cayenne-joda/pom.xml
index 2dbad8a..8cde877 100644
--- a/cayenne-joda/pom.xml
+++ b/cayenne-joda/pom.xml
@@ -76,6 +76,13 @@
<groupId>com.mockrunner</groupId>
<artifactId>mockrunner-jdbc</artifactId>
<scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <!-- this one have old Xerces dependency that clashes with JDK's one -->
+ <groupId>nekohtml</groupId>
+ <artifactId>nekohtml</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java b/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
index fe01162..e76022a 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/FileProjectSaver.java
@@ -28,6 +28,7 @@ import org.apache.cayenne.project.extension.SaverDelegate;
import org.apache.cayenne.resource.Resource;
import org.apache.cayenne.resource.URLResource;
import org.apache.cayenne.util.Util;
+import org.apache.cayenne.util.XMLEncoder;
import java.io.File;
import java.io.FileNotFoundException;
@@ -56,7 +57,8 @@ public class FileProjectSaver implements ProjectSaver {
protected ConfigurationNodeVisitor<Collection<ConfigurationNode>> saveableNodesGetter;
protected String fileEncoding;
- protected Collection<SaverDelegate> saverDelegates;
+ protected Collection<ProjectExtension> extensions;
+ protected SaverDelegate delegate;
public FileProjectSaver(@Inject List<ProjectExtension> extensions) {
resourceGetter = new ConfigurationSourceGetter();
@@ -65,21 +67,25 @@ public class FileProjectSaver implements ProjectSaver {
// this is not configurable yet... probably doesn't have to be
fileEncoding = "UTF-8";
- saverDelegates = new ArrayList<>(extensions.size());
+ this.extensions = extensions;
+ Collection<SaverDelegate> delegates = new ArrayList<>(extensions.size());
for(ProjectExtension extension : extensions) {
- SaverDelegate delegate = extension.createSaverDelegate();
- saverDelegates.add(delegate);
+ delegates.add(extension.createSaverDelegate());
}
+ delegate = new CompoundSaverDelegate(delegates);
}
+ @Override
public String getSupportedVersion() {
return String.valueOf(Project.VERSION);
}
+ @Override
public void save(Project project) {
save(project, project.getConfigurationResource(), true);
}
+ @Override
public void saveAs(Project project, Resource baseDirectory) {
if (baseDirectory == null) {
throw new NullPointerException("Null 'baseDirectory'");
@@ -91,8 +97,21 @@ public class FileProjectSaver implements ProjectSaver {
Collection<ConfigurationNode> nodes = project.getRootNode().acceptVisitor(saveableNodesGetter);
Collection<SaveUnit> units = new ArrayList<>(nodes.size());
- for (ConfigurationNode node : nodes) {
- units.add(createSaveUnit(node, baseResource));
+ for(ConfigurationNode node : nodes) {
+ String targetLocation = nameMapper.configurationLocation(node);
+ Resource targetResource = baseResource.getRelativeResource(targetLocation);
+ units.add(createSaveUnit(node, targetResource, null));
+
+ for(ProjectExtension extension : extensions) {
+ ConfigurationNodeVisitor<String> namingDelegate = extension.createNamingDelegate();
+ SaverDelegate unitSaverDelegate = extension.createSaverDelegate();
+ String fileName = node.acceptVisitor(namingDelegate);
+ if(fileName != null) {
+ // not null means that this should go to a separate file
+ targetResource = baseResource.getRelativeResource(fileName);
+ units.add(createSaveUnit(node, targetResource, unitSaverDelegate));
+ }
+ }
}
checkAccess(units);
@@ -123,10 +142,11 @@ public class FileProjectSaver implements ProjectSaver {
project.getUnusedResources().clear();
}
- SaveUnit createSaveUnit(ConfigurationNode node, Resource baseResource) {
+ SaveUnit createSaveUnit(ConfigurationNode node, Resource baseResource, SaverDelegate delegate) {
SaveUnit unit = new SaveUnit();
unit.node = node;
+ unit.delegate = delegate;
unit.sourceConfiguration = node.acceptVisitor(resourceGetter);
String targetLocation = nameMapper.configurationLocation(node);
@@ -209,9 +229,17 @@ public class FileProjectSaver implements ProjectSaver {
}
void saveToTempFile(SaveUnit unit, PrintWriter printWriter) {
- unit.node.acceptVisitor(
- new ConfigurationSaver(printWriter, getSupportedVersion(), new CompoundSaverDelegate(saverDelegates))
- );
+ ConfigurationNodeVisitor<?> visitor;
+ if(unit.delegate == null) {
+ visitor = new ConfigurationSaver(printWriter, getSupportedVersion(), delegate);
+ } else {
+ XMLEncoder encoder = new XMLEncoder(printWriter, "\t", getSupportedVersion());
+ encoder.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+ unit.delegate.setXMLEncoder(encoder);
+ visitor = unit.delegate;
+ }
+
+ unit.node.acceptVisitor(visitor);
}
void saveCommit(Collection<SaveUnit> units) {
@@ -330,6 +358,7 @@ public class FileProjectSaver implements ProjectSaver {
class SaveUnit {
private ConfigurationNode node;
+ private SaverDelegate delegate;
// source can be an abstract resource, but target is always a file...
private Resource sourceConfiguration;
http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseNamingDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseNamingDelegate.java b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseNamingDelegate.java
new file mode 100644
index 0000000..bbc4cd7
--- /dev/null
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseNamingDelegate.java
@@ -0,0 +1,112 @@
+/*****************************************************************
+ * 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.project.extension;
+
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.configuration.DataNodeDescriptor;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.EmbeddableAttribute;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.map.Procedure;
+import org.apache.cayenne.map.ProcedureParameter;
+import org.apache.cayenne.map.QueryDescriptor;
+
+/**
+ * @since 4.1
+ */
+public class BaseNamingDelegate implements ConfigurationNodeVisitor<String> {
+
+ @Override
+ public String visitDataChannelDescriptor(DataChannelDescriptor channelDescriptor) {
+ return null;
+ }
+
+ @Override
+ public String visitDataNodeDescriptor(DataNodeDescriptor nodeDescriptor) {
+ return null;
+ }
+
+ @Override
+ public String visitDataMap(DataMap dataMap) {
+ return null;
+ }
+
+ @Override
+ public String visitObjEntity(ObjEntity entity) {
+ return null;
+ }
+
+ @Override
+ public String visitDbEntity(DbEntity entity) {
+ return null;
+ }
+
+ @Override
+ public String visitEmbeddable(Embeddable embeddable) {
+ return null;
+ }
+
+ @Override
+ public String visitEmbeddableAttribute(EmbeddableAttribute attribute) {
+ return null;
+ }
+
+ @Override
+ public String visitObjAttribute(ObjAttribute attribute) {
+ return null;
+ }
+
+ @Override
+ public String visitDbAttribute(DbAttribute attribute) {
+ return null;
+ }
+
+ @Override
+ public String visitObjRelationship(ObjRelationship relationship) {
+ return null;
+ }
+
+ @Override
+ public String visitDbRelationship(DbRelationship relationship) {
+ return null;
+ }
+
+ @Override
+ public String visitProcedure(Procedure procedure) {
+ return null;
+ }
+
+ @Override
+ public String visitProcedureParameter(ProcedureParameter parameter) {
+ return null;
+ }
+
+ @Override
+ public String visitQuery(QueryDescriptor query) {
+ return null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java
index 08565b2..a9f45f2 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/BaseSaverDelegate.java
@@ -130,4 +130,8 @@ public class BaseSaverDelegate implements SaverDelegate {
public SaverDelegate getParentDelegate() {
return parentDelegate;
}
+
+ protected boolean isStandalone() {
+ return parentDelegate == null;
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/cayenne-project/src/main/java/org/apache/cayenne/project/extension/ProjectExtension.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/ProjectExtension.java b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/ProjectExtension.java
index cf0a182..319ebe1 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/ProjectExtension.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/ProjectExtension.java
@@ -19,6 +19,8 @@
package org.apache.cayenne.project.extension;
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+
/**
* <p>DataMap XML file extension mechanics.</p>
* <p>
@@ -45,4 +47,7 @@ public interface ProjectExtension {
*/
SaverDelegate createSaverDelegate();
+
+ ConfigurationNodeVisitor<String> createNamingDelegate();
+
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/cayenne-project/src/main/java/org/apache/cayenne/project/extension/info/InfoExtension.java
----------------------------------------------------------------------
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/info/InfoExtension.java b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/info/InfoExtension.java
index ecbf8f1..0915638 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/extension/info/InfoExtension.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/extension/info/InfoExtension.java
@@ -19,9 +19,11 @@
package org.apache.cayenne.project.extension.info;
+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;
@@ -49,4 +51,9 @@ public class InfoExtension implements ProjectExtension {
public SaverDelegate createSaverDelegate() {
return new InfoSaverDelegate(metaData);
}
+
+ @Override
+ public ConfigurationNodeVisitor<String> createNamingDelegate() {
+ return new BaseNamingDelegate();
+ }
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/cayenne-server/pom.xml
----------------------------------------------------------------------
diff --git a/cayenne-server/pom.xml b/cayenne-server/pom.xml
index 233c580..d5d604d 100644
--- a/cayenne-server/pom.xml
+++ b/cayenne-server/pom.xml
@@ -112,6 +112,13 @@
<groupId>com.mockrunner</groupId>
<artifactId>mockrunner-jdbc</artifactId>
<scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <!-- this one have old Xerces dependency that clashes with JDK's one -->
+ <groupId>nekohtml</groupId>
+ <artifactId>nekohtml</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<dependency>
<groupId>com.mockrunner</groupId>
http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataChannelDescriptorLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataChannelDescriptorLoader.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataChannelDescriptorLoader.java
index e9d104e..a1de6c6 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataChannelDescriptorLoader.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataChannelDescriptorLoader.java
@@ -126,6 +126,7 @@ public class XMLDataChannelDescriptorLoader implements DataChannelDescriptorLoad
try(InputStream in = configurationURL.openStream()) {
XMLReader parser = Util.createXmlReader();
+ parser.setFeature("http://apache.org/xml/features/xinclude", true);
LoaderContext loaderContext = new LoaderContext(parser, handlerFactory);
loaderContext.addDataMapListener(new DataMapLoaderListener() {
@Override
@@ -137,7 +138,9 @@ public class XMLDataChannelDescriptorLoader implements DataChannelDescriptorLoad
DataChannelHandler rootHandler = new DataChannelHandler(this, descriptor, loaderContext);
parser.setContentHandler(rootHandler);
parser.setErrorHandler(rootHandler);
- parser.parse(new InputSource(in));
+ InputSource input = new InputSource(in);
+ input.setSystemId(configurationURL.toString());
+ parser.parse(input);
} catch (Exception e) {
throw new ConfigurationException("Error loading configuration from %s", e, configurationURL);
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataMapLoader.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataMapLoader.java b/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataMapLoader.java
index 68b236d..37fe689 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataMapLoader.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/configuration/xml/XMLDataMapLoader.java
@@ -45,6 +45,7 @@ public class XMLDataMapLoader implements DataMapLoader {
public synchronized DataMap load(Resource configurationResource) throws CayenneRuntimeException {
try(InputStream in = configurationResource.getURL().openStream()) {
XMLReader parser = Util.createXmlReader();
+ parser.setFeature("http://apache.org/xml/features/xinclude", true);
LoaderContext loaderContext = new LoaderContext(parser, handlerFactory);
loaderContext.addDataMapListener(new DataMapLoaderListener() {
@Override
@@ -56,7 +57,9 @@ public class XMLDataMapLoader implements DataMapLoader {
parser.setContentHandler(rootHandler);
parser.setErrorHandler(rootHandler);
- parser.parse(new InputSource(in));
+ InputSource input = new InputSource(in);
+ input.setSystemId(configurationResource.getURL().toString());
+ parser.parse(input);
} catch (Exception e) {
throw new CayenneRuntimeException("Error loading configuration from %s", e, configurationResource.getURL());
}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/3939efe4/modeler/cayenne-modeler/pom.xml
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/pom.xml b/modeler/cayenne-modeler/pom.xml
index 107340d..6f9fc2e 100644
--- a/modeler/cayenne-modeler/pom.xml
+++ b/modeler/cayenne-modeler/pom.xml
@@ -95,6 +95,13 @@
<dependency>
<groupId>com.mockrunner</groupId>
<artifactId>mockrunner-jdbc</artifactId>
+ <exclusions>
+ <exclusion>
+ <!-- this one have old Xerces dependency that clashes with JDK's one -->
+ <groupId>nekohtml</groupId>
+ <artifactId>nekohtml</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<dependency>