diff options
author | Eike Stepper | 2018-04-14 21:48:02 +0000 |
---|---|---|
committer | Eike Stepper | 2018-04-14 21:48:02 +0000 |
commit | 3ebbd9b9586d44deb4f3be8792cec06980323a75 (patch) | |
tree | 0ad0412d5d6ba1b0744503de37b737eb03d0207b /plugins | |
parent | 51f5c05052ddb8e4927896d9433d6850dfe7784d (diff) | |
download | cdo-3ebbd9b9586d44deb4f3be8792cec06980323a75.tar.gz cdo-3ebbd9b9586d44deb4f3be8792cec06980323a75.tar.xz cdo-3ebbd9b9586d44deb4f3be8792cec06980323a75.zip |
[Releng] Add Ant task to transfer class members
Diffstat (limited to 'plugins')
7 files changed, 279 insertions, 149 deletions
diff --git a/plugins/org.eclipse.emf.cdo.migrator/plugin.xml b/plugins/org.eclipse.emf.cdo.migrator/plugin.xml index a721ec82f9..2355dec4a1 100644 --- a/plugins/org.eclipse.emf.cdo.migrator/plugin.xml +++ b/plugins/org.eclipse.emf.cdo.migrator/plugin.xml @@ -59,12 +59,19 @@ </extension> <extension point="org.eclipse.ant.core.antTasks"> - <antTask library="ant_tasks/cdo.ant.tasks.jar" name="cdo.ImportProject" headless="true" class="org.eclipse.emf.cdo.internal.migrator.tasks.ImportProjectTask" /> - <antTask library="ant_tasks/cdo.ant.tasks.jar" name="cdo.DeleteProject" headless="true" class="org.eclipse.emf.cdo.internal.migrator.tasks.DeleteProjectTask" /> - <antTask library="ant_tasks/cdo.ant.tasks.jar" name="cdo.MigrateModel" headless="true" class="org.eclipse.emf.cdo.internal.migrator.tasks.MigrateModelTask" /> - <antTask library="ant_tasks/cdo.ant.tasks.jar" name="cdo.GenerateModel" headless="true" class="org.eclipse.emf.cdo.internal.migrator.tasks.GenerateModelTask" /> - <antTask library="ant_tasks/cdo.ant.tasks.jar" name="cdo.ExpandTemplate" headless="true" class="org.eclipse.emf.cdo.internal.migrator.tasks.ExpandTemplateTask" /> - <antTask library="ant_tasks/cdo.ant.tasks.jar" name="cdo.TransferMembers" headless="true" class="org.eclipse.emf.cdo.internal.migrator.tasks.TransferMembersTask" /> + <antTask library="ant_tasks/cdo.ant.tasks.jar" name="cdo.importProject" class="org.eclipse.emf.cdo.internal.migrator.tasks.ImportProjectTask" /> + <antTask library="ant_tasks/cdo.ant.tasks.jar" name="cdo.deleteProject" class="org.eclipse.emf.cdo.internal.migrator.tasks.DeleteProjectTask" /> + <antTask library="ant_tasks/cdo.ant.tasks.jar" name="cdo.migrateModel" class="org.eclipse.emf.cdo.internal.migrator.tasks.MigrateModelTask" /> + <antTask library="ant_tasks/cdo.ant.tasks.jar" name="cdo.generateModel" class="org.eclipse.emf.cdo.internal.migrator.tasks.GenerateModelTask" /> + <antTask library="ant_tasks/cdo.ant.tasks.jar" name="cdo.expandTemplate" class="org.eclipse.emf.cdo.internal.migrator.tasks.ExpandTemplateTask" /> + <antTask library="ant_tasks/cdo.ant.tasks.jar" name="cdo.transferMembers" class="org.eclipse.emf.cdo.internal.migrator.tasks.TransferMembersTask" /> + </extension> + + <extension point="org.eclipse.ant.core.antTypes"> + <antType library="ant_tasks/cdo.ant.tasks.jar" name="templateproperty" class="org.eclipse.emf.cdo.internal.migrator.tasks.ExpandTemplateTask$TemplateProperty" /> + <antType library="ant_tasks/cdo.ant.tasks.jar" name="sourceclass" class="org.eclipse.emf.cdo.internal.migrator.tasks.TransferMembersTask$SourceClass" /> + <antType library="ant_tasks/cdo.ant.tasks.jar" name="sourcefield" class="org.eclipse.emf.cdo.internal.migrator.tasks.TransferMembersTask$SourceClass$SourceField" /> + <antType library="ant_tasks/cdo.ant.tasks.jar" name="sourcemethod" class="org.eclipse.emf.cdo.internal.migrator.tasks.TransferMembersTask$SourceClass$SourceMethod" /> </extension> </plugin> diff --git a/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/CDOTask.java b/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/CDOTask.java index fa7c26366c..bf715dfc75 100644 --- a/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/CDOTask.java +++ b/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/CDOTask.java @@ -85,11 +85,11 @@ public abstract class CDOTask extends Task protected abstract void doExecute() throws Exception; - protected final void log(Object object) + protected final void verbose(Object object) { if (verbose) { - System.out.println(object); + log(String.valueOf(object)); } } diff --git a/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/DeleteProjectTask.java b/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/DeleteProjectTask.java index 2f4482cee8..3fbb55f2cb 100644 --- a/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/DeleteProjectTask.java +++ b/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/DeleteProjectTask.java @@ -46,11 +46,11 @@ public class DeleteProjectTask extends CDOTask IProject project = root.getProject(projectName); if (!project.exists()) { - log("Project " + projectName + " does not exist."); + verbose("Project " + projectName + " does not exist."); return; } - log("Deleting project " + projectName + " ..."); + verbose("Deleting project " + projectName + " ..."); project.delete(deleteContent, true, new NullProgressMonitor()); } } diff --git a/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/ExpandTemplateTask.java b/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/ExpandTemplateTask.java index d610d68109..99df9a10d9 100644 --- a/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/ExpandTemplateTask.java +++ b/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/ExpandTemplateTask.java @@ -1,3 +1,13 @@ +/* + * Copyright (c) 2018 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + */ package org.eclipse.emf.cdo.internal.migrator.tasks; import org.apache.tools.ant.BuildException; @@ -13,7 +23,7 @@ import java.util.Map; */ public class ExpandTemplateTask extends CDOTask { - private final List<Property> properties = new ArrayList<Property>(); + private final List<TemplateProperty> templateProperties = new ArrayList<TemplateProperty>(); private File template; @@ -23,11 +33,11 @@ public class ExpandTemplateTask extends CDOTask private String placeholderSuffix = "%%"; - public Property createProperty() + public TemplateProperty createTemplateProperty() { - Property property = new Property(); - properties.add(property); - return property; + TemplateProperty templateProperty = new TemplateProperty(); + templateProperties.add(templateProperty); + return templateProperty; } public void setTemplate(File template) @@ -59,9 +69,9 @@ public class ExpandTemplateTask extends CDOTask assertTrue("'placeholderPrefix' must be specified.", placeholderPrefix != null && placeholderPrefix.length() != 0); assertTrue("'placeholderSuffix' must be specified.", placeholderSuffix != null && placeholderSuffix.length() != 0); - for (Property property : properties) + for (TemplateProperty templateProperty : templateProperties) { - String name = property.getName(); + String name = templateProperty.getName(); assertTrue("'name' of property must be specified.", name != null && name.length() != 0); } } @@ -69,6 +79,8 @@ public class ExpandTemplateTask extends CDOTask @Override protected void doExecute() throws Exception { + verbose("Expanding template " + template + " to target " + target); + String content = readTextFile(template); Map<String, String> properties = getProperties(); @@ -101,6 +113,7 @@ public class ExpandTemplateTask extends CDOTask break; } + verbose("Expanding template property '" + entry.getKey() + "' at position " + pos); result.replace(pos, pos + placeholderLength, value); start = pos + valueLength; } @@ -118,9 +131,9 @@ public class ExpandTemplateTask extends CDOTask { Map<String, String> result = new LinkedHashMap<String, String>(); - for (Property property : properties) + for (TemplateProperty templateProperty : templateProperties) { - result.put(property.getName(), property.getValue()); + result.put(templateProperty.getName(), templateProperty.getValue()); } return result; @@ -129,13 +142,13 @@ public class ExpandTemplateTask extends CDOTask /** * @author Eike Stepper */ - public static final class Property + public static final class TemplateProperty { private String name; private String value; - public Property() + public TemplateProperty() { } diff --git a/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/ImportProjectTask.java b/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/ImportProjectTask.java index c95b6ada2f..f41a353a92 100644 --- a/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/ImportProjectTask.java +++ b/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/ImportProjectTask.java @@ -59,11 +59,11 @@ public class ImportProjectTask extends CDOTask throw new BuildException("Project " + projectName + " exists in different location: " + existingLocation); } - log("Project " + fromLocation + " is already imported."); + verbose("Project " + fromLocation + " is already imported."); return; } - log("Importing project " + fromLocation + " ..."); + verbose("Importing project " + fromLocation + " ..."); IPath locationPath = new Path(fromLocation.getAbsolutePath()); IProjectDescription projectDescription = workspace.newProjectDescription(projectName); diff --git a/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/MigrateModelTask.java b/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/MigrateModelTask.java index cb9033d41e..2b33f449ff 100644 --- a/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/MigrateModelTask.java +++ b/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/MigrateModelTask.java @@ -52,12 +52,12 @@ public class MigrateModelTask extends CDOTask String msg = CDOMigratorUtil.adjustGenModel(genModel, featureDelegation); if (msg == null) { - log(Messages.getString("MigrateAction_3")); + verbose(Messages.getString("MigrateAction_3")); } else { genModel.eResource().save(null); - log(Messages.getString("MigrateAction_4") + msg); + verbose(Messages.getString("MigrateAction_4") + msg); } } } diff --git a/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/TransferMembersTask.java b/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/TransferMembersTask.java index 30b6b0f2c1..d19926f4c5 100644 --- a/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/TransferMembersTask.java +++ b/plugins/org.eclipse.emf.cdo.migrator/src/org/eclipse/emf/cdo/internal/migrator/tasks/TransferMembersTask.java @@ -1,10 +1,23 @@ +/* + * Copyright (c) 2018 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + */ package org.eclipse.emf.cdo.internal.migrator.tasks; +import org.eclipse.emf.cdo.internal.migrator.tasks.TransferMembersTask.SourceClass.SourceMember; + import org.apache.tools.ant.BuildException; import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.Collection; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -16,7 +29,7 @@ import java.util.regex.Pattern; */ public class TransferMembersTask extends ExpandTemplateTask { - private File sourceClass; + private final List<SourceClass> sourceClasses = new ArrayList<SourceClass>(); private String importsPlaceholder = "IMPORTS"; @@ -24,15 +37,11 @@ public class TransferMembersTask extends ExpandTemplateTask private String methodsPlaceholder = "METHODS"; - private boolean transferImports = true; - - private final List<TransferField> transferFields = new ArrayList<TransferField>(); - - private final List<TransferMethod> transferMethods = new ArrayList<TransferMethod>(); - - public void setSourceClass(File sourceClass) + public SourceClass createSourceClass() { - this.sourceClass = sourceClass; + SourceClass sourceClass = new SourceClass(); + sourceClasses.add(sourceClass); + return sourceClass; } public void setImportsPlaceholder(String importsPlaceholder) @@ -50,113 +59,82 @@ public class TransferMembersTask extends ExpandTemplateTask this.methodsPlaceholder = methodsPlaceholder; } - public void setTransferImports(boolean transferImports) - { - this.transferImports = transferImports; - } - - public TransferField createTransferField() - { - TransferField transferField = new TransferField(); - transferFields.add(transferField); - return transferField; - } - - public TransferMethod createTransferMethod() - { - TransferMethod transferMethod = new TransferMethod(); - transferMethods.add(transferMethod); - return transferMethod; - } - @Override protected void checkAttributes() throws BuildException { super.checkAttributes(); - assertTrue("'sourceClass' must be specified.", sourceClass != null); - assertTrue("'sourceClass' must be point to an existing file.", sourceClass.isFile()); - assertTrue("'importsPlaceholder' must be specified.", importsPlaceholder != null && importsPlaceholder.length() != 0); - assertTrue("'fieldsPlaceholder' must be specified.", fieldsPlaceholder != null && fieldsPlaceholder.length() != 0); - assertTrue("'methodsPlaceholder' must be specified.", methodsPlaceholder != null && methodsPlaceholder.length() != 0); - checkTransferMembers(transferFields); - checkTransferMembers(transferMethods); - } - - private void checkTransferMembers(List<? extends TransferMember> transferMembers) - { - for (TransferMember transferMember : transferMembers) + for (SourceClass sourceClass : sourceClasses) { - String pattern = transferMember.getPattern(); - assertTrue("'pattern' must be specified.", pattern != null && pattern.length() != 0); + sourceClass.checkAttributes(); } + + assertTrue("'importsPlaceholder' must be specified.", importsPlaceholder != null && importsPlaceholder.length() != 0); + assertTrue("'fieldsPlaceholder' must be specified.", fieldsPlaceholder != null && fieldsPlaceholder.length() != 0); + assertTrue("'methodsPlaceholder' must be specified.", methodsPlaceholder != null && methodsPlaceholder.length() != 0); } @Override protected String generate(String content, Map<String, String> properties) throws Exception { - Collector collector = new Collector(sourceClass); + Collector collector = new Collector(this); - StringBuilder imports = new StringBuilder(); - if (transferImports) + for (SourceClass sourceClass : sourceClasses) { - for (String name : collector.imports.keySet()) - { - imports.append("import "); - imports.append(name); - imports.append(";"); - imports.append(NL); - } + collector.collect(sourceClass); } - properties.put(importsPlaceholder, imports.toString()); - properties.put(fieldsPlaceholder, formatMembers(collector.fields, transferFields)); - properties.put(methodsPlaceholder, formatMembers(collector.methods, transferMethods)); + properties.put(importsPlaceholder, formatImports(collector.imports.keySet())); + properties.put(fieldsPlaceholder, formatMembers(collector.fields.values())); + properties.put(methodsPlaceholder, formatMembers(collector.methods.values())); return super.generate(content, properties); } - private String formatMembers(Map<String, List<String>> members, List<? extends TransferMember> transferMembers) + private String formatImports(Collection<String> imports) { - if (transferMembers.isEmpty()) - { - return ""; - } + StringBuilder builder = new StringBuilder(); + boolean first = true; - List<Pattern> patterns = new ArrayList<Pattern>(); - for (TransferMember transferMember : transferMembers) + for (String name : imports) { - patterns.add(Pattern.compile(transferMember.getPattern())); + if (first) + { + first = false; + } + else + { + builder.append(NL); + } + + builder.append("import "); + builder.append(name); + builder.append(";"); } + return builder.toString(); + } + + private String formatMembers(Collection<List<String>> members) + { StringBuilder builder = new StringBuilder(); boolean first = true; - for (Map.Entry<String, List<String>> entry : members.entrySet()) + for (List<String> texts : members) { - String name = entry.getKey(); - for (Pattern pattern : patterns) + for (String text : texts) { - if (pattern.matcher(name).matches()) + if (first) { - List<String> texts = entry.getValue(); - for (String text : texts) - { - if (first) - { - first = false; - } - else - { - builder.append(NL); - builder.append(NL); - } - - builder.append(text); - } - - break; + first = false; } + else + { + builder.append(NL); + builder.append(NL); + } + + builder.append(text); } } @@ -166,50 +144,132 @@ public class TransferMembersTask extends ExpandTemplateTask /** * @author Eike Stepper */ - public static abstract class TransferMember + public static final class SourceClass { - private String pattern; + private File file; + + private boolean imports = true; + + private final List<SourceField> sourceFields = new ArrayList<SourceField>(); - public String getPattern() + private final List<SourceMethod> sourceMethods = new ArrayList<SourceMethod>(); + + public File getFile() { - return pattern; + return file; } - public void setPattern(String pattern) + public void setFile(File file) { - this.pattern = pattern; + this.file = file; } - } - /** - * @author Eike Stepper - */ - public static final class TransferField extends TransferMember - { - @Override - public String toString() + public boolean isImports() { - StringBuilder builder = new StringBuilder(); - builder.append("TransferField["); - builder.append(getPattern()); - builder.append("]"); - return builder.toString(); + return imports; + } + + public void setImports(boolean imports) + { + this.imports = imports; + } + + public List<SourceField> getSourceFields() + { + return sourceFields; + } + + public SourceField createSourceField() + { + SourceField sourceField = new SourceField(); + sourceFields.add(sourceField); + return sourceField; + } + + public List<SourceMethod> getSourceMethods() + { + return sourceMethods; + } + + public SourceMethod createSourceMethod() + { + SourceMethod sourceMethod = new SourceMethod(); + sourceMethods.add(sourceMethod); + return sourceMethod; } - } - /** - * @author Eike Stepper - */ - public static final class TransferMethod extends TransferMember - { @Override public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("TransferMethod["); - builder.append(getPattern()); - builder.append("]"); - return builder.toString(); + return String.valueOf(file); + } + + public void checkAttributes() throws BuildException + { + assertTrue("'file' must be specified.", file != null); + assertTrue("'file' must be point to an existing file.", file.isFile()); + + checkSourceMembers(sourceFields); + checkSourceMembers(sourceMethods); + } + + private static void checkSourceMembers(List<? extends SourceMember> sourceMembers) + { + for (SourceMember sourceMember : sourceMembers) + { + Pattern pattern = sourceMember.getPattern(); + assertTrue("'match' must be specified.", pattern != null); + } + } + + /** + * @author Eike Stepper + */ + public static abstract class SourceMember + { + private Pattern pattern; + + public Pattern getPattern() + { + return pattern; + } + + public void setMatch(String regex) + { + pattern = Pattern.compile(regex); + } + } + + /** + * @author Eike Stepper + */ + public static final class SourceField extends SourceMember + { + @Override + public String toString() + { + StringBuilder builder = new StringBuilder(); + builder.append("SourceField["); + builder.append(getPattern()); + builder.append("]"); + return builder.toString(); + } + } + + /** + * @author Eike Stepper + */ + public static final class SourceMethod extends SourceMember + { + @Override + public String toString() + { + StringBuilder builder = new StringBuilder(); + builder.append("SourceMethod["); + builder.append(getPattern()); + builder.append("]"); + return builder.toString(); + } } } @@ -232,28 +292,53 @@ public class TransferMembersTask extends ExpandTemplateTask public final Map<String, List<String>> methods = new LinkedHashMap<String, List<String>>(); - public Collector(File file) throws IOException + private final CDOTask task; + + public Collector(CDOTask task) { - String content = readTextFile(file); - collect(content, IMPORT_PATTERN, 1, imports); - collect(content, FIELD_PATTERN, 3, fields); - collect(content, METHOD_PATTERN, 4, methods); + this.task = task; + } + + public void collect(SourceClass sourceClass) throws IOException + { + String content = readTextFile(sourceClass.getFile()); + + if (sourceClass.isImports()) + { + task.verbose("Collecting imports of " + sourceClass); + collect(content, IMPORT_PATTERN, 1, null, imports); + } + + if (!sourceClass.getSourceFields().isEmpty()) + { + task.verbose("Collecting fields of " + sourceClass); + collect(content, FIELD_PATTERN, 3, sourceClass.getSourceFields(), fields); + } + + if (!sourceClass.getSourceMethods().isEmpty()) + { + task.verbose("Collecting methods of " + sourceClass); + collect(content, METHOD_PATTERN, 4, sourceClass.getSourceMethods(), methods); + } } - private static void collect(String content, Pattern pattern, int group, Map<String, List<String>> result) + private void collect(String content, Pattern pattern, int group, List<? extends SourceMember> sourceMembers, Map<String, List<String>> result) { Matcher matcher = pattern.matcher(content); - while (matcher.find()) + int matcherStart = 0; + + while (matcher.find(matcherStart)) { - String text = matcher.group(0); String name = matcher.group(group); + String text = matcher.group(0); + matcherStart = matcher.end() + 1; if (pattern == METHOD_PATTERN) { String braceOrSemicolon = matcher.group(5); if (braceOrSemicolon.equals("{")) { - int start = matcher.end(); + int start = matcherStart - 1; int end = content.length(); int nesting = 1; @@ -268,7 +353,9 @@ public class TransferMembersTask extends ExpandTemplateTask { if (--nesting == 0) { - String body = content.substring(start, i + 1); + matcherStart = i + 1; + + String body = content.substring(start, matcherStart); text += body; break; } @@ -277,6 +364,14 @@ public class TransferMembersTask extends ExpandTemplateTask } } + if (sourceMembers != null) + { + if (!matchName(name, sourceMembers)) + { + continue; + } + } + List<String> texts = result.get(name); if (texts == null) { @@ -285,7 +380,22 @@ public class TransferMembersTask extends ExpandTemplateTask } texts.add(text); + task.verbose(" " + name); } } + + private static boolean matchName(String name, List<? extends SourceMember> sourceMembers) + { + for (SourceMember sourceMember : sourceMembers) + { + Pattern pattern = sourceMember.getPattern(); + if (pattern.matcher(name).matches()) + { + return true; + } + } + + return false; + } } } |