improved architecture
diff --git a/plugins/org.eclipse.mylyn.docs.intent.client.synchronizer/src/org/eclipse/mylyn/docs/intent/client/synchronizer/factory/SynchronizerStatusFactory.java b/plugins/org.eclipse.mylyn.docs.intent.client.synchronizer/src/org/eclipse/mylyn/docs/intent/client/synchronizer/factory/SynchronizerStatusFactory.java
index 8e7e50f..c6ed24d 100644
--- a/plugins/org.eclipse.mylyn.docs.intent.client.synchronizer/src/org/eclipse/mylyn/docs/intent/client/synchronizer/factory/SynchronizerStatusFactory.java
+++ b/plugins/org.eclipse.mylyn.docs.intent.client.synchronizer/src/org/eclipse/mylyn/docs/intent/client/synchronizer/factory/SynchronizerStatusFactory.java
@@ -28,6 +28,7 @@
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.mylyn.docs.intent.core.compiler.AttributeChangeStatus;
import org.eclipse.mylyn.docs.intent.core.compiler.CompilationMessageType;
import org.eclipse.mylyn.docs.intent.core.compiler.CompilationStatus;
import org.eclipse.mylyn.docs.intent.core.compiler.CompilationStatusSeverity;
@@ -91,7 +92,13 @@
break;
case DiffPackage.UPDATE_ATTRIBUTE:
status = CompilerFactory.eINSTANCE.createAttributeChangeStatus();
- ((StructuralFeatureChangeStatus)status).setChangeState(SynchronizerChangeState.UPDATE);
+ ((AttributeChangeStatus)status).setChangeState(SynchronizerChangeState.UPDATE);
+ UpdateAttribute updateAttribute = (UpdateAttribute)difference;
+ ((AttributeChangeStatus)status).setFeatureName(updateAttribute.getAttribute().getName());
+ ((AttributeChangeStatus)status).setWorkingCopyElementURIFragment(EcoreUtil.getURI(
+ updateAttribute.getRightElement()).toString());
+ ((AttributeChangeStatus)status).setCompiledElementURIFragment(EcoreUtil.getURI(
+ updateAttribute.getLeftElement()).toString());
break;
// references
diff --git a/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/IntentEditorDropSupport.java b/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/IntentEditorDropSupport.java
index f2ec719..f5185b3 100644
--- a/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/IntentEditorDropSupport.java
+++ b/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/IntentEditorDropSupport.java
@@ -24,10 +24,8 @@
import org.eclipse.mylyn.docs.intent.collab.handlers.adapters.RepositoryAdapter;
import org.eclipse.mylyn.docs.intent.core.compiler.CompilationStatus;
import org.eclipse.mylyn.docs.intent.core.compiler.ModelElementChangeStatus;
-import org.eclipse.mylyn.docs.intent.core.compiler.SynchronizerCompilationStatus;
import org.eclipse.mylyn.docs.intent.core.modelingunit.ModelingUnit;
import org.eclipse.mylyn.docs.intent.modelingunit.update.ModelingUnitUpdater;
-import org.eclipse.mylyn.docs.intent.modelingunit.update.ModelingUnitUpdaterUtils;
import org.eclipse.swt.dnd.DropTargetAdapter;
import org.eclipse.swt.dnd.DropTargetEvent;
@@ -107,17 +105,16 @@
IntentDocumentProvider documentProvider = (IntentDocumentProvider)editor.getDocumentProvider();
final RepositoryAdapter repositoryAdapter = documentProvider.getListenedElementsHandler()
.getRepositoryAdapter();
- ModelingUnitUpdater updater = new ModelingUnitUpdater(repositoryAdapter, modelingUnit);
+ ModelingUnitUpdater updater = new ModelingUnitUpdater(repositoryAdapter);
boolean astChanged = false;
CompilationStatusQuery query = new CompilationStatusQuery(repositoryAdapter);
for (CompilationStatus compilationStatus : query.getOrCreateCompilationStatusManager()
.getCompilationStatusList()) {
- if (compilationStatus instanceof ModelElementChangeStatus
- && ModelingUnitUpdaterUtils.canFix((SynchronizerCompilationStatus)compilationStatus)) {
+ if (compilationStatus instanceof ModelElementChangeStatus) {
ModelElementChangeStatus status = (ModelElementChangeStatus)compilationStatus;
if (uriFragments.contains(status.getWorkingCopyElementURIFragment())) {
- updater.fixSynchronizationStatus(status);
+ updater.fixSynchronizationStatus(modelingUnit, status);
astChanged = true;
}
}
diff --git a/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/quickfix/IntentQuickAssistProcessor.java b/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/quickfix/IntentQuickAssistProcessor.java
index 3e5b36f..2391ecf 100644
--- a/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/quickfix/IntentQuickAssistProcessor.java
+++ b/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/quickfix/IntentQuickAssistProcessor.java
@@ -28,7 +28,6 @@
import org.eclipse.mylyn.docs.intent.core.compiler.ResourceChangeStatus;
import org.eclipse.mylyn.docs.intent.core.compiler.SynchronizerCompilationStatus;
import org.eclipse.mylyn.docs.intent.core.compiler.SynchronizerResourceState;
-import org.eclipse.mylyn.docs.intent.modelingunit.update.ModelingUnitUpdaterUtils;
/**
* {@link IntentQuickAssistProcessor} used by Intent to fix any issues.
@@ -121,9 +120,7 @@
}
} else {
proposals.add(new EMFCompareFix(annotation));
- if (ModelingUnitUpdaterUtils.canFix(status)) {
- proposals.add(new UpdateModelingUnitFix(annotation));
- }
+ proposals.add(new UpdateModelingUnitFix(annotation));
}
return proposals;
}
diff --git a/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/quickfix/UpdateModelingUnitFix.java b/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/quickfix/UpdateModelingUnitFix.java
index e766c44..eafdb6a 100644
--- a/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/quickfix/UpdateModelingUnitFix.java
+++ b/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/quickfix/UpdateModelingUnitFix.java
@@ -15,11 +15,9 @@
import org.eclipse.jface.text.source.Annotation;
import org.eclipse.mylyn.docs.intent.client.ui.editor.IntentEditorDocument;
import org.eclipse.mylyn.docs.intent.collab.handlers.adapters.RepositoryAdapter;
-import org.eclipse.mylyn.docs.intent.core.compiler.SynchronizerCompilationStatus;
import org.eclipse.mylyn.docs.intent.core.modelingunit.InstanciationInstruction;
import org.eclipse.mylyn.docs.intent.core.modelingunit.ModelingUnit;
import org.eclipse.mylyn.docs.intent.modelingunit.update.ModelingUnitUpdater;
-import org.eclipse.mylyn.docs.intent.modelingunit.update.ModelingUnitUpdaterUtils;
/**
* Proposal used to fix a Synchronization issue by opening the compare Editor.
@@ -53,9 +51,9 @@
intentTarget = intentTarget.eContainer();
}
if (intentTarget != null) {
- ModelingUnitUpdater updater = new ModelingUnitUpdater(repositoryAdapter,
- (ModelingUnit)intentTarget);
- updater.fixSynchronizationStatus(syncAnnotation.getCompilationStatus());
+ ModelingUnitUpdater updater = new ModelingUnitUpdater(repositoryAdapter);
+ updater.fixSynchronizationStatus((ModelingUnit)intentTarget,
+ syncAnnotation.getCompilationStatus());
((IntentEditorDocument)document).reloadFromAST();
}
}
@@ -67,8 +65,7 @@
* @see org.eclipse.jface.text.contentassist.ICompletionProposal#getDisplayString()
*/
public String getDisplayString() {
- return ModelingUnitUpdaterUtils.getFixMessage((SynchronizerCompilationStatus)syncAnnotation
- .getCompilationStatus());
+ return "Update modeling unit";
}
}
diff --git a/plugins/org.eclipse.mylyn.docs.intent.modelingunit.update/src/org/eclipse/mylyn/docs/intent/modelingunit/update/ModelingUnitUpdater.java b/plugins/org.eclipse.mylyn.docs.intent.modelingunit.update/src/org/eclipse/mylyn/docs/intent/modelingunit/update/ModelingUnitUpdater.java
index d08ffcc..295cada 100644
--- a/plugins/org.eclipse.mylyn.docs.intent.modelingunit.update/src/org/eclipse/mylyn/docs/intent/modelingunit/update/ModelingUnitUpdater.java
+++ b/plugins/org.eclipse.mylyn.docs.intent.modelingunit.update/src/org/eclipse/mylyn/docs/intent/modelingunit/update/ModelingUnitUpdater.java
@@ -11,20 +11,27 @@
*******************************************************************************/
package org.eclipse.mylyn.docs.intent.modelingunit.update;
+import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.mylyn.docs.intent.collab.common.logger.IIntentLogger.LogType;
import org.eclipse.mylyn.docs.intent.collab.common.logger.IntentLogger;
import org.eclipse.mylyn.docs.intent.collab.handlers.adapters.IntentCommand;
import org.eclipse.mylyn.docs.intent.collab.handlers.adapters.ReadOnlyException;
import org.eclipse.mylyn.docs.intent.collab.handlers.adapters.RepositoryAdapter;
import org.eclipse.mylyn.docs.intent.collab.handlers.adapters.SaveException;
+import org.eclipse.mylyn.docs.intent.core.compiler.AttributeChangeStatus;
import org.eclipse.mylyn.docs.intent.core.compiler.CompilationStatus;
import org.eclipse.mylyn.docs.intent.core.compiler.CompilerPackage;
import org.eclipse.mylyn.docs.intent.core.compiler.ModelElementChangeStatus;
+import org.eclipse.mylyn.docs.intent.core.compiler.ReferenceChangeStatus;
+import org.eclipse.mylyn.docs.intent.core.compiler.SynchronizerChangeState;
import org.eclipse.mylyn.docs.intent.core.compiler.SynchronizerCompilationStatus;
import org.eclipse.mylyn.docs.intent.core.modelingunit.ContributionInstruction;
import org.eclipse.mylyn.docs.intent.core.modelingunit.InstanciationInstruction;
import org.eclipse.mylyn.docs.intent.core.modelingunit.ModelingUnit;
+import org.eclipse.mylyn.docs.intent.core.modelingunit.NativeValueForStructuralFeature;
+import org.eclipse.mylyn.docs.intent.core.modelingunit.StructuralFeatureAffectation;
import org.eclipse.mylyn.docs.intent.modelingunit.gen.ModelingUnitGenerator;
/**
@@ -36,67 +43,131 @@
private RepositoryAdapter repositoryAdapter;
- private ModelingUnit modelingUnit;
-
/**
* Creates a modeling unit updater.
*
* @param repositoryAdapter
* the repository adapter
- * @param modelingUnitToUpdate
- * the modeling unit to update
*/
- public ModelingUnitUpdater(RepositoryAdapter repositoryAdapter, ModelingUnit modelingUnitToUpdate) {
+ public ModelingUnitUpdater(RepositoryAdapter repositoryAdapter) {
this.repositoryAdapter = repositoryAdapter;
- this.modelingUnit = modelingUnitToUpdate;
}
/**
- * Fixes the given statuses by updating the current modeling unit.
+ * Fixes the given statuses by updating the given modeling unit.
*
+ * @param modelingUnit
+ * the modeling unit to update
* @param statusToFix
* the statuses to fix
*/
- public void fixSynchronizationStatus(CompilationStatus... statusToFix) {
+ public void fixSynchronizationStatus(ModelingUnit modelingUnit, CompilationStatus... statusToFix) {
for (CompilationStatus status : statusToFix) {
switch (status.eClass().getClassifierID()) {
case CompilerPackage.MODEL_ELEMENT_CHANGE_STATUS:
- InstanciationInstruction instanciation = (InstanciationInstruction)((SynchronizerCompilationStatus)status)
- .getTarget();
- create(instanciation,
- ModelingUnitUpdaterUtils
- .getRootEObjectToGenerate((ModelElementChangeStatus)status));
+ fixModelElementChangeStatus(modelingUnit, (ModelElementChangeStatus)status);
break;
-
+ case CompilerPackage.ATTRIBUTE_CHANGE_STATUS:
+ fixAttributeChangeStatus(modelingUnit, (AttributeChangeStatus)status);
+ break;
+ case CompilerPackage.REFERENCE_CHANGE_STATUS:
+ fixReferenceChangeStatus(modelingUnit, (ReferenceChangeStatus)status);
+ break;
default:
break;
}
}
}
- /**
- * Creates or update the given target element.
- *
- * @param containerInstanciation
- * the instruction that defines the containment of the target element
- * @param target
- * the element to create or update
- */
- private void create(InstanciationInstruction containerInstanciation, EObject target) {
- final ContributionInstruction contribution = generateContribution(containerInstanciation, target);
- repositoryAdapter.execute(new IntentCommand() {
+ private void fixModelElementChangeStatus(final ModelingUnit modelingUnit, ModelElementChangeStatus status) {
+ switch (status.getChangeState().getValue()) {
+ case SynchronizerChangeState.WORKING_COPY_TARGET_VALUE:
+ InstanciationInstruction containerInstanciation = (InstanciationInstruction)status
+ .getTarget();
- public void execute() {
- try {
- modelingUnit.getInstructions().add(contribution);
- repositoryAdapter.save();
- } catch (ReadOnlyException e) {
- IntentLogger.getInstance().log(LogType.ERROR, e.getMessage());
- } catch (SaveException e) {
- IntentLogger.getInstance().log(LogType.ERROR, e.getMessage());
- }
- }
+ EObject target = getWorkingCopyEObject(status.getWorkingCopyElementURIFragment());
- });
+ final ContributionInstruction contribution = generateContribution(containerInstanciation,
+ target);
+ repositoryAdapter.execute(new IntentCommand() {
+
+ public void execute() {
+ try {
+ modelingUnit.getInstructions().add(contribution);
+ repositoryAdapter.save();
+ } catch (ReadOnlyException e) {
+ IntentLogger.getInstance().log(LogType.ERROR, e.getMessage());
+ } catch (SaveException e) {
+ IntentLogger.getInstance().log(LogType.ERROR, e.getMessage());
+ }
+ }
+
+ });
+ break;
+
+ default:
+ debug(status);
+ break;
+ }
}
+
+ private EObject getWorkingCopyEObject(String uri) {
+ ResourceSetImpl rs = new ResourceSetImpl();
+ EObject target = rs.getEObject(URI.createURI(uri), true);
+ return target;
+ }
+
+ private void fixAttributeChangeStatus(final ModelingUnit modelingUnit, AttributeChangeStatus status) {
+ switch (status.getChangeState().getValue()) {
+ case SynchronizerChangeState.UPDATE_VALUE:
+
+ InstanciationInstruction target = (InstanciationInstruction)status.getTarget();
+ for (StructuralFeatureAffectation affectation : target.getStructuralFeatures()) {
+ if (affectation.getName().equals(status.getFeatureName())) {
+ final NativeValueForStructuralFeature value = (NativeValueForStructuralFeature)affectation
+ .getValues().get(0);
+
+ EObject element = getWorkingCopyEObject(status.getWorkingCopyElementURIFragment());
+ final Object newValue = element.eGet(element.eClass().getEStructuralFeature(
+ status.getFeatureName()));
+ repositoryAdapter.execute(new IntentCommand() {
+
+ public void execute() {
+ try {
+ value.setValue("\"" + newValue.toString() + "\"");
+ repositoryAdapter.save();
+ } catch (ReadOnlyException e) {
+ IntentLogger.getInstance().log(LogType.ERROR, e.getMessage());
+ } catch (SaveException e) {
+ IntentLogger.getInstance().log(LogType.ERROR, e.getMessage());
+ }
+ }
+
+ });
+
+ }
+ }
+
+ break;
+
+ default:
+ debug(status);
+ break;
+ }
+ }
+
+ private void fixReferenceChangeStatus(ModelingUnit modelingUnit, ReferenceChangeStatus status) {
+ switch (status.getChangeState().getValue()) {
+ default:
+ debug(status);
+ break;
+ }
+ }
+
+ private void debug(SynchronizerCompilationStatus status) {
+ System.err.println("UNSUPPORTED :");
+ System.err.println(status.eClass().getName());
+ System.err.println(status.getMessage());
+ }
+
}
diff --git a/plugins/org.eclipse.mylyn.docs.intent.modelingunit.update/src/org/eclipse/mylyn/docs/intent/modelingunit/update/ModelingUnitUpdaterUtils.java b/plugins/org.eclipse.mylyn.docs.intent.modelingunit.update/src/org/eclipse/mylyn/docs/intent/modelingunit/update/ModelingUnitUpdaterUtils.java
deleted file mode 100644
index b7fb09a..0000000
--- a/plugins/org.eclipse.mylyn.docs.intent.modelingunit.update/src/org/eclipse/mylyn/docs/intent/modelingunit/update/ModelingUnitUpdaterUtils.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 Obeo.
-
- * 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:
- * Obeo - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.docs.intent.modelingunit.update;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.mylyn.docs.intent.core.compiler.CompilerPackage;
-import org.eclipse.mylyn.docs.intent.core.compiler.ModelElementChangeStatus;
-import org.eclipse.mylyn.docs.intent.core.compiler.SynchronizerChangeState;
-import org.eclipse.mylyn.docs.intent.core.compiler.SynchronizerCompilationStatus;
-
-/**
- * Modeling unit updater utilities methods.
- *
- * @author <a href="mailto:william.piers@obeo.fr">William Piers</a>
- */
-public final class ModelingUnitUpdaterUtils {
-
- /**
- * Constructor.
- */
- private ModelingUnitUpdaterUtils() {
- // prevents instantiation
- }
-
- /**
- * Returns the root EObject to generate.
- *
- * @param status
- * the sync status
- * @return the root EObject to generate
- */
- public static EObject getRootEObjectToGenerate(ModelElementChangeStatus status) {
- ResourceSetImpl rs = new ResourceSetImpl();
- return rs.getEObject(URI.createURI(status.getWorkingCopyElementURIFragment()), true);
- }
-
- /**
- * Checks whether a status can be fixed or not.
- *
- * @param status
- * the status to test
- * @return true if the status can be fixed
- */
- public static boolean canFix(SynchronizerCompilationStatus status) {
- boolean res = false;
- switch (status.eClass().getClassifierID()) {
- case CompilerPackage.MODEL_ELEMENT_CHANGE_STATUS:
- res = ((ModelElementChangeStatus)status).getChangeState().equals(
- SynchronizerChangeState.WORKING_COPY_TARGET);
- break;
-
- default:
- break;
- }
- return res;
- }
-
- /**
- * Checks whether a status can be fixed or not.
- *
- * @param status
- * the status to test
- * @return true if the status can be fixed
- */
- public static String getFixMessage(SynchronizerCompilationStatus status) {
- // TODO accurate messages
- return "Update modeling unit";
- }
-}