blob: 39be144f321c17d39d2d3284124d148cb299ab5b [file] [log] [blame]
<?xml version="1.0"?>
<!--
Copyright (c) 2018, 2020 Eike Stepper (Loehne, 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
-->
<project name="migrate" default="migrate">
<!--
The migration of the GMF Notation model to CDO is completely automated.
The following preconditions must be met before executing the 'migrate.ant' script:
1. The 'org.eclipse.emf.cdo.migrator' plugin must be installed into the Eclipse IDE.
2. CDO's Git repository must be cloned from ssh://git.eclipse.org:29418/cdo/cdo
to the local disk. It's disk location must then be registered under
Preferences | Run/Debug | String Substitution -> variable 'git.clone.cdo'.
3. GMF Notation's Git repository must be cloned from
ssh://git.eclipse.org:29418/gmf-notation/org.eclipse.gmf.notation
to the local disk. It's disk location must then be passed into this script
through the 'git.clone.gmf' property. The 'Migrate GMF Notation' launch config
assumes that the GMF Notation clone is colocated with the CDO clone.
Then execute the following tasks:
-->
<target name="migrate">
<!--
Ensure that GMF Notation's Git clone exists and is reachable.
-->
<fail unless="git.clone.gmf" message="Property 'git.clone.gmf' is undefined!" />
<property name="notation" location="${git.clone.gmf}/org.eclipse.gmf.runtime.notation" />
<fail message="The directory '${notation}' does not exist!">
<condition>
<not>
<available file="${notation}" type="dir" />
</not>
</condition>
</fail>
<property name="project.name" value="org.eclipse.gmf.runtime.notation" />
<property name="notation.tmp" location="${basedir}/target/${project.name}" />
<echo message="Migrating in ${notation.tmp} ..." />
<!--
Copy the entire 'org.eclipse.gmf.runtime.notation' project from the GMF clone
into the 'target' folder of the 'org.eclipse.emf.cdo.gmf.notation' plugin to avoid
changes in the GMF clone.
Remove all 'NOT_CDO' markers from the source code to cause regeneration of a
few methods that must be handwritten in pure GMF only.
-->
<delete failonerror="false" includeemptydirs="true">
<fileset dir="${notation.tmp}">
<include name="**" />
</fileset>
</delete>
<copy todir="${notation.tmp}" verbose="false" failonerror="true" overwrite="true" includeemptydirs="false">
<fileset dir="${notation}" defaultexcludes="true">
<include name="**/*" />
<exclude name="**/*.class" />
<exclude name="**/*.html" />
</fileset>
<filterchain>
<replacestring from="@generated NOT_CDO" to="@generated" />
</filterchain>
</copy>
<!--
Import the 'org.eclipse.gmf.runtime.notation' project from the 'target' folder
of the 'org.eclipse.emf.cdo.gmf.notation' plugin into the workspace, so that
workspace-relative references can be resolved.
-->
<cdo.deleteProject projectname="${project.name}" />
<cdo.importProject projectname="${project.name}" fromlocation="${notation.tmp}" />
<!--
Migrate the 'notation.genmodel' to CDO and regenerate the model within the
imported 'org.eclipse.gmf.runtime.notation' project.
-->
<property name="model.path" value="/${project.name}/model/notation.genmodel" />
<cdo.migrateModel modelpath="${model.path}" dynamicfeaturedelegation="true" />
<cdo.generateModel modelpath="${model.path}" />
<!--
Copy all Java files from the generated 'impl' folder to the 'impl' folder of the
'org.eclipse.emf.cdo.gmf.notation' project. Apply the following refactorings:
1. Rename the Java package to 'org.eclipse.emf.cdo.gmf.notation.impl'.
2. Replace EMF's EModelElementImpl base class with CDO's variant of that class.
3. Replace the eAnnotations field accesses that the generator has left in some
eIsSet() methods with calls to the getEAnnotations() method.
4. Decrease the generated ESTATIC_FEATURE_COUNT from 1 to 0 because the inherited
EModelElement.eAnnotations feature is implemented dynamically, too.
-->
<property name="impl" location="${basedir}/src/org/eclipse/emf/cdo/gmf/notation/impl" />
<delete>
<fileset dir="${impl}">
<include name="*.java" />
</fileset>
</delete>
<copy todir="${impl}">
<fileset dir="${notation.tmp}/src/org/eclipse/gmf/runtime/notation/impl">
<include name="*.java" />
</fileset>
<filterchain>
<replacestring from="org.eclipse.gmf.runtime.notation.impl" to="org.eclipse.emf.cdo.gmf.notation.impl" />
<replacestring from="extends EModelElementImpl" to="extends org.eclipse.emf.cdo.ecore.impl.EModelElementImpl" />
<replacestring from="eAnnotations != null &amp;&amp; !eAnnotations.isEmpty()" to="!getEAnnotations().isEmpty()" />
<replacestring from="ESTATIC_FEATURE_COUNT = 1" to="ESTATIC_FEATURE_COUNT = 0" />
</filterchain>
</copy>
<!--
The temporary 'org.eclipse.gmf.runtime.notation' project is no longer needed.
Delete it from the workspace.
-->
<cdo.deleteProject projectname="${project.name}" />
<!--
GMF's BasicDecorationNodeImpl class is completely handwritten, just to spare the
Java fields of the following six structural features:
1. Source Edges (from ViewImpl)
2. Target Edges (from ViewImpl)
3. Persisted Children (from ViewImpl)
4. Transient Children (from ViewImpl)
5. Styles (from ViewImpl)
6. Layout Constraint (from NodeImpl)
This was achieved by changing the super class of BasicDecorationNodeImpl from NodeIml
(which extends ViewImpl) to EModelElementImpl. As a result none of the required members
from ViewImpl and NodeImpl are available through class inheritance. For a complete analysis
of the effects of these optimizations refer to the HandWrittenClasses.rtf document.
Copy the implementations of the above six features from the 'BasicDecorationNodeImpl.java'
file in the 'templates' folder of the 'org.eclipse.emf.cdo.gmf.notation' project.
Copy the remaining required fields and methods from ViewImpl.
-->
<cdo.transferMembers template="${basedir}\templates\BasicDecorationNodeImpl.java" target="${impl}/BasicDecorationNodeImpl.java">
<sourceclass file="${impl}\ViewImpl.java">
<sourcefield match=".*_EDEFAULT" />
<sourcefield match="ESTATIC_FEATURE_COUNT" />
<sourcefield match="childrenFeatures" />
<sourcemethod match=".*Visible" />
<sourcemethod match=".*Type" />
<sourcemethod match=".*TypeGen" />
<sourcemethod match=".*Mutable" />
<sourcemethod match=".*Element" />
<sourcemethod match=".*ElementGen" />
<sourcemethod match=".*Diagram" />
<sourcemethod match="createStyle" />
<sourcemethod match=".*StyleGen" />
<sourcemethod match=".*Child" />
<sourcemethod match=".*ChildAt" />
<sourcemethod match="persist" />
<sourcemethod match="persistChildren" />
<sourcemethod match="getVisibleChildren" />
</sourceclass>
</cdo.transferMembers>
<!--
GMF's DecorationNodeImpl (which extends the handwritten BasicDecorationNodeImpl) reestablishes
the default behavior of the following four structural features:
1. Persisted Children (from ViewImpl)
2. Transient Children (from ViewImpl)
3. Styles (from ViewImpl)
4. Layout Constraint (from NodeImpl)
Copy the implementations of the above four features from ViewImpl and NodeImpl.
-->
<cdo.transferMembers template="${basedir}\templates\DecorationNodeImpl.java" target="${impl}/DecorationNodeImpl.java">
<sourceclass file="${impl}\ViewImpl.java">
<sourcemethod match="getChildren" />
<sourcemethod match="getPersistedChildren" />
<sourcemethod match="getTransientChildren" />
<sourcemethod match="getStyles" />
</sourceclass>
<sourceclass file="${impl}\NodeImpl.java">
<sourcemethod match="getLayoutConstraint" />
<sourcemethod match="basicSetLayoutConstraint" />
<sourcemethod match="setLayoutConstraint" />
</sourceclass>
</cdo.transferMembers>
<!--
GMF's BasicSemanticCompartmentImpl (which extends the handwritten BasicDecorationNodeImpl)
reestablishes the default behavior of the following structural feature:
1. Layout Constraint (from NodeImpl)
Replace the existing hand-written implementations of the above feature with their
counter parts from NodeImpl.
-->
<property name="dynamic.template" location="${notation.tmp}/template-BasicSemanticCompartmentImpl.java" />
<copy file="${impl}/BasicSemanticCompartmentImpl.java" tofile="${dynamic.template}" verbose="true" />
<replaceregexp file="${dynamic.template}" flags="gs" byline="false">
<regexp pattern="[ \t]*protected LayoutConstraint layoutConstraint;[\r\n]*" />
<substitution expression="" />
</replaceregexp>
<replaceregexp file="${dynamic.template}" flags="gs" byline="false">
<regexp pattern="[ \t]*public void setLayoutConstraint\(LayoutConstraint newLayoutConstraint\).*\} //[ ]*BasicSemanticCompartmentImpl" />
<substitution expression="%%METHODS%%${line.separator}${line.separator}} // BasicSemanticCompartmentImpl" />
</replaceregexp>
<cdo.transferMembers template="${dynamic.template}" target="${impl}/BasicSemanticCompartmentImpl.java">
<sourceclass file="${impl}\NodeImpl.java" imports="false">
<sourcemethod match="getLayoutConstraint" />
<sourcemethod match="basicSetLayoutConstraint" />
<sourcemethod match="setLayoutConstraint" />
</sourceclass>
</cdo.transferMembers>
<!--
A number of GMF classes contain handwritten eFlags fields. Remove them.
-->
<replaceregexp flags="gs" byline="false">
<fileset dir="${impl}">
<include name="*.java" />
</fileset>
<regexp pattern="\s*[ \t]+/\*\*.*?int eFlags[^;]*;[\r\n]*" />
<substitution expression="" />
</replaceregexp>
<!--
GMF's handwritten ListValueStyleImpl.getRawValuesList() method reuses the generated
rawValuesList field to cache an additional wrapper list. As this rawValuesList field
disappears when generating for CDO, reinsert it manually.
-->
<replaceregexp file="${impl}/ListValueStyleImpl.java" flags="gs" byline="false">
<regexp pattern="(implements ListValueStyle \{)" />
<substitution expression="\1${line.separator} private EList rawValuesList;${line.separator}" />
</replaceregexp>
<!--
GMF's hand-modified default value constants are not applied in models generated with feature delegation.
Apply them explicitly in the constructors of CDO's XyzImpl classes.
-->
<replaceregexp file="${impl}/SortingStyleImpl.java" flags="gs" byline="false">
<regexp pattern="(protected SortingStyleImpl\(\)\s*\{\s*super\(\);)(\s*\})" />
<substitution expression="\1 setSortingKeysGen(SORTING_KEYS_EDEFAULT);\2" />
</replaceregexp>
<replaceregexp file="${impl}/RelativeBendpointsImpl.java" flags="gs" byline="false">
<regexp pattern="(protected RelativeBendpointsImpl\(\)\s*\{\s*super\(\);)(\s*\})" />
<substitution expression="\1 setPointsGen(POINTS_EDEFAULT);\2" />
</replaceregexp>
<replaceregexp file="${impl}/FilteringStyleImpl.java" flags="gs" byline="false">
<regexp pattern="(protected FilteringStyleImpl\(\)\s*\{\s*super\(\);)(\s*\})" />
<substitution expression="\1 setFilteringKeysGen(FILTERING_KEYS_EDEFAULT);\2" />
</replaceregexp>
<replaceregexp file="${impl}/ListCompartmentImpl.java" flags="gs" byline="false">
<regexp pattern="(protected ListCompartmentImpl\(\)\s*\{\s*super\(\);)(\s*\})" />
<substitution expression="\1 setSortingKeys(SORTING_KEYS_EDEFAULT); setFilteringKeys(FILTERING_KEYS_EDEFAULT);\2" />
</replaceregexp>
<!--
Apply source cleanup to the 'org.eclipse.emf.cdo.gmf.notation' project.
This ensures that only relevant changes appear in the Git history.
-->
<cdo.cleanupProject projectname="org.eclipse.emf.cdo.gmf.notation" />
</target>
</project>