Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,9 @@

import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
import org.apache.cayenne.configuration.xml.DataChannelMetaData;
import org.apache.cayenne.configuration.xml.ProjectVersion;
import org.apache.cayenne.configuration.xml.Schema;
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;
Expand All @@ -32,7 +33,7 @@
*/
public class CgenExtension implements ProjectExtension {

public static final String NAMESPACE = "http://cayenne.apache.org/schema/" + Project.VERSION + "/cgen";
public static final String NAMESPACE = Schema.buildNamespace(ProjectVersion.getCurrent(), "cgen");

@Inject
private DataChannelMetaData metaData;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@

import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
import org.apache.cayenne.configuration.xml.DataChannelMetaData;
import org.apache.cayenne.configuration.xml.ProjectVersion;
import org.apache.cayenne.configuration.xml.Schema;
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;
Expand All @@ -33,7 +34,7 @@
*/
public class DbImportExtension implements ProjectExtension {

public static final String NAMESPACE = "http://cayenne.apache.org/schema/" + Project.VERSION + "/dbimport";
public static final String NAMESPACE = Schema.buildNamespace(ProjectVersion.getCurrent(), "dbimport");

@Inject
private DataChannelMetaData metaData;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

import org.apache.cayenne.configuration.BaseConfigurationNodeVisitor;
import org.apache.cayenne.configuration.DataChannelDescriptor;
import org.apache.cayenne.configuration.xml.ProjectVersion;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.project.extension.SaverDelegate;
import org.apache.cayenne.util.XMLEncoder;
Expand All @@ -33,10 +34,10 @@
class ConfigurationSaver extends BaseConfigurationNodeVisitor<Void> {

private PrintWriter printWriter;
private String version;
private ProjectVersion version;
private SaverDelegate delegate;

ConfigurationSaver(PrintWriter printWriter, String version, SaverDelegate delegate) {
ConfigurationSaver(PrintWriter printWriter, ProjectVersion version, SaverDelegate delegate) {
this.printWriter = printWriter;
this.version = version;
this.delegate = delegate;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.apache.cayenne.configuration.ConfigurationNameMapper;
import org.apache.cayenne.configuration.ConfigurationNode;
import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
import org.apache.cayenne.configuration.xml.ProjectVersion;
import org.apache.cayenne.di.Inject;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.project.extension.ProjectExtension;
Expand Down Expand Up @@ -77,8 +78,8 @@ public FileProjectSaver(@Inject List<ProjectExtension> extensions) {
}

@Override
public String getSupportedVersion() {
return String.valueOf(Project.VERSION);
public ProjectVersion getSupportedVersion() {
return ProjectVersion.getCurrent();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.apache.cayenne.configuration.ConfigurationNode;
import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
import org.apache.cayenne.configuration.ConfigurationTree;
import org.apache.cayenne.configuration.xml.ProjectVersion;
import org.apache.cayenne.resource.Resource;

/**
Expand All @@ -41,8 +42,10 @@ public class Project {
* Used by different parsers and savers of project's XML files.
*
* @since 4.1
* @deprecated since 5.0 use {@link ProjectVersion#getCurrent()} instead
*/
static public final int VERSION = 11;
@Deprecated(since = "5.0", forRemoval = true)
public static final int VERSION = (int) ProjectVersion.getCurrent().getAsDouble();

protected boolean modified;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
****************************************************************/
package org.apache.cayenne.project;

import org.apache.cayenne.configuration.xml.ProjectVersion;
import org.apache.cayenne.resource.Resource;

/**
Expand All @@ -30,7 +31,7 @@ public interface ProjectSaver {
/**
* Returns a version of the project configuration supported by the current runtime.
*/
String getSupportedVersion();
ProjectVersion getSupportedVersion();

/**
* Saves project in the location of its current configuration sources. Since resource
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,9 @@

import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
import org.apache.cayenne.configuration.xml.DataChannelMetaData;
import org.apache.cayenne.configuration.xml.ProjectVersion;
import org.apache.cayenne.configuration.xml.Schema;
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;
Expand All @@ -37,7 +38,7 @@
*/
public class InfoExtension implements ProjectExtension {

static final String NAMESPACE = "http://cayenne.apache.org/schema/" + Project.VERSION + "/info";
static final String NAMESPACE = Schema.buildNamespace(ProjectVersion.getCurrent(), "info");

@Inject
private DataChannelMetaData metaData;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
Expand All @@ -42,6 +41,7 @@
import org.apache.cayenne.configuration.ConfigurationTree;
import org.apache.cayenne.configuration.DataChannelDescriptor;
import org.apache.cayenne.configuration.DataChannelDescriptorLoader;
import org.apache.cayenne.configuration.xml.ProjectVersion;
import org.apache.cayenne.di.Inject;
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.map.EntityResolver;
Expand All @@ -61,8 +61,6 @@
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;

import static org.apache.cayenne.util.Util.isBlank;

/**
*
* Upgrade service sequence is following:
Expand All @@ -89,10 +87,9 @@ public class DefaultUpgradeService implements UpgradeService {

private static final Logger logger = LoggerFactory.getLogger(DefaultUpgradeService.class);

public static final String UNKNOWN_VERSION = "0";
public static final String MIN_SUPPORTED_VERSION = "6";
public static final ProjectVersion MIN_SUPPORTED_VERSION = ProjectVersion.V6;

TreeMap<String, UpgradeHandler> handlers = new TreeMap<>(VersionComparator.INSTANCE);
TreeMap<ProjectVersion, UpgradeHandler> handlers = new TreeMap<>();

@Inject
private ProjectSaver projectSaver;
Expand All @@ -101,7 +98,7 @@ public class DefaultUpgradeService implements UpgradeService {
private DataChannelDescriptorLoader loader;

public DefaultUpgradeService(@Inject List<UpgradeHandler> handlerList) {
for(UpgradeHandler handler : handlerList) {
for (UpgradeHandler handler : handlerList) {
handlers.put(handler.getVersion(), handler);
}
}
Expand All @@ -110,44 +107,34 @@ public DefaultUpgradeService(@Inject List<UpgradeHandler> handlerList) {
public UpgradeMetaData getUpgradeType(Resource resource) {
UpgradeMetaData metaData = new UpgradeMetaData();

String version = loadProjectVersion(resource);
metaData.setProjectVersion(version);
metaData.setSupportedVersion(String.valueOf(Project.VERSION));
ProjectVersion version = loadProjectVersion(resource);
metaData.setProjectVersion(version.getAsString());
metaData.setSupportedVersion(ProjectVersion.getCurrent().getAsString());

int c1 = VersionComparator.INSTANCE.compare(version, MIN_SUPPORTED_VERSION);
if (c1 < 0) {
metaData.setIntermediateUpgradeVersion(MIN_SUPPORTED_VERSION);
if (version.compareTo(MIN_SUPPORTED_VERSION) < 0) {
metaData.setIntermediateUpgradeVersion(MIN_SUPPORTED_VERSION.getAsString());
metaData.setUpgradeType(UpgradeType.INTERMEDIATE_UPGRADE_NEEDED);
return metaData;
}

int c2 = VersionComparator.INSTANCE.compare(String.valueOf(Project.VERSION), version);
if (c2 < 0) {
int comparison = ProjectVersion.getCurrent().compareTo(version);
if (comparison < 0) {
metaData.setUpgradeType(UpgradeType.DOWNGRADE_NEEDED);
} else if (c2 == 0) {
} else if (comparison == 0) {
metaData.setUpgradeType(UpgradeType.UPGRADE_NOT_NEEDED);
} else {
metaData.setUpgradeType(UpgradeType.UPGRADE_NEEDED);
}
return metaData;
}

protected List<UpgradeHandler> getHandlersForVersion(String version) {
boolean found = MIN_SUPPORTED_VERSION.equals(version);
protected List<UpgradeHandler> getHandlersForVersion(ProjectVersion version) {
List<UpgradeHandler> handlerList = new ArrayList<>();

for(Map.Entry<String, UpgradeHandler> entry : handlers.entrySet()) {
if(entry.getKey().equals(version)) {
found = true;
continue;
for (Map.Entry<ProjectVersion, UpgradeHandler> entry : handlers.entrySet()) {
if(entry.getKey().compareTo(version) > 0) {
handlerList.add(entry.getValue());
}
if(!found) {
continue;
}

handlerList.add(entry.getValue());
}

return handlerList;
}

Expand Down Expand Up @@ -263,7 +250,7 @@ protected void saveDocument(UpgradeUnit upgradeUnit) {
* A default method for quick extraction of the project version from an XML
* file.
*/
protected String loadProjectVersion(Resource resource) {
protected ProjectVersion loadProjectVersion(Resource resource) {

RootTagHandler rootHandler = new RootTagHandler();
URL url = resource.getURL();
Expand All @@ -278,44 +265,7 @@ protected String loadProjectVersion(Resource resource) {
throw new ConfigurationException("Error reading configuration from %s", e, url);
}

return rootHandler.projectVersion != null ? rootHandler.projectVersion : UNKNOWN_VERSION;
}

protected static double decodeVersion(String version) {
if (version == null || isBlank(version)) {
return 0;
}

// leave the first dot, and treat remaining as a fraction
// remove all non digit chars
StringBuilder buffer = new StringBuilder(version.length());
boolean dotProcessed = false;
for (int i = 0; i < version.length(); i++) {
char nextChar = version.charAt(i);
if (nextChar == '.' && !dotProcessed) {
dotProcessed = true;
buffer.append('.');
} else if (Character.isDigit(nextChar)) {
buffer.append(nextChar);
}
}

return Double.parseDouble(buffer.toString());
}

private static class VersionComparator implements Comparator<String> {

private static final VersionComparator INSTANCE = new VersionComparator();

@Override
public int compare(String o1, String o2) {
if (o1.equals(o2)) {
return 0;
}
double v1Double = decodeVersion(o1);
double v2Double = decodeVersion(o2);
return v1Double < v2Double ? -1 : 1;
}
return ProjectVersion.fromString(rootHandler.projectVersion);
}

class RootTagHandler extends DefaultHandler {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import javax.xml.xpath.XPathFactory;

import org.apache.cayenne.configuration.DataChannelDescriptor;
import org.apache.cayenne.configuration.xml.ProjectVersion;
import org.apache.cayenne.configuration.xml.Schema;
import org.apache.cayenne.project.upgrade.UpgradeUnit;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
Expand Down Expand Up @@ -58,7 +60,7 @@ public interface UpgradeHandler {
/**
* @return target version for this handler
*/
String getVersion();
ProjectVersion getVersion();

/**
* Process DOM for the project root file (e.g. cayenne-project.xml)
Expand All @@ -84,13 +86,14 @@ default void processModel(DataChannelDescriptor dataChannelDescriptor) {
*/
default void updateDomainSchemaAndVersion(UpgradeUnit upgradeUnit) {
Element domain = upgradeUnit.getDocument().getDocumentElement();
ProjectVersion version = getVersion();
// update schema
domain.setAttribute("xmlns","http://cayenne.apache.org/schema/"+getVersion()+"/domain");
domain.setAttribute("xmlns", Schema.buildNamespace(version, "domain"));
domain.setAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
domain.setAttribute("xsi:schemaLocation", "http://cayenne.apache.org/schema/"+getVersion()+"/domain " +
"https://cayenne.apache.org/schema/"+getVersion()+"/domain.xsd");
domain.setAttribute("xsi:schemaLocation", Schema.buildNamespace(version, "domain") + " " +
Schema.buildSchemaLocation(version, "domain"));
// update version
domain.setAttribute("project-version", getVersion());
domain.setAttribute("project-version", version.getAsString());
}

/**
Expand All @@ -99,12 +102,13 @@ default void updateDomainSchemaAndVersion(UpgradeUnit upgradeUnit) {
*/
default void updateDataMapSchemaAndVersion(UpgradeUnit upgradeUnit) {
Element dataMap = upgradeUnit.getDocument().getDocumentElement();
ProjectVersion version = getVersion();
// update schema
dataMap.setAttribute("xmlns","http://cayenne.apache.org/schema/"+getVersion()+"/modelMap");
dataMap.setAttribute("xsi:schemaLocation", "http://cayenne.apache.org/schema/"+getVersion()+"/modelMap " +
"https://cayenne.apache.org/schema/"+getVersion()+"/modelMap.xsd");
dataMap.setAttribute("xmlns", Schema.buildNamespace(version, "modelMap"));
dataMap.setAttribute("xsi:schemaLocation", Schema.buildNamespace(version, "modelMap") + " " +
Schema.buildSchemaLocation(version, "modelMap"));
// update version
dataMap.setAttribute("project-version", getVersion());
dataMap.setAttribute("project-version", version.getAsString());
}

/**
Expand All @@ -123,7 +127,7 @@ default void updateExtensionSchema(UpgradeUnit upgradeUnit, String extension) {
}
for (int j = 0; j < nodes.getLength(); j++) {
Element element = (Element) nodes.item(j);
element.setAttribute("xmlns", "http://cayenne.apache.org/schema/"+getVersion()+"/"+extension.toLowerCase());
element.setAttribute("xmlns", Schema.buildNamespace(getVersion(), extension.toLowerCase()));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

package org.apache.cayenne.project.upgrade.handlers;

import org.apache.cayenne.configuration.xml.ProjectVersion;
import org.apache.cayenne.project.upgrade.UpgradeUnit;

/**
Expand All @@ -32,8 +33,8 @@
public class UpgradeHandler_V10 implements UpgradeHandler {

@Override
public String getVersion() {
return "10";
public ProjectVersion getVersion() {
return ProjectVersion.V10;
}

@Override
Expand Down
Loading