Bug 530354 - [Revision] add hierarchy of review when a modification is
done

Change-Id: I4fb1bde3aa00cd16d3a8a662642df5cf59baa962
diff --git a/plugins/revision/org.eclipse.papyrus.revisiontool/src/org/eclipse/papyrus/revision/tool/core/ReviewResourceManager.java b/plugins/revision/org.eclipse.papyrus.revisiontool/src/org/eclipse/papyrus/revision/tool/core/ReviewResourceManager.java
index 60c1f26..deeb299 100755
--- a/plugins/revision/org.eclipse.papyrus.revisiontool/src/org/eclipse/papyrus/revision/tool/core/ReviewResourceManager.java
+++ b/plugins/revision/org.eclipse.papyrus.revisiontool/src/org/eclipse/papyrus/revision/tool/core/ReviewResourceManager.java
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * Copyright (c) 2014, 2017 CEA LIST.
+ * Copyright (c) 2014, 2017-2018 CEA LIST.
  *
  *
  * All rights reserved. This program and the accompanying materials
@@ -15,11 +15,15 @@
 
 import java.io.IOException;
 import java.text.DateFormat;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.EventObject;
+import java.util.Iterator;
 import java.util.List;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.emf.common.command.CommandStackListener;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.compare.CompareFactory;
 import org.eclipse.emf.compare.Comparison;
@@ -65,6 +69,7 @@
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
 import org.eclipse.ui.dialogs.PatternFilter;
+import org.eclipse.ui.internal.wizards.NewWizardRegistry;
 import org.eclipse.ui.model.BaseWorkbenchContentProvider;
 import org.eclipse.ui.model.WorkbenchLabelProvider;
 import org.eclipse.uml2.uml.Actor;
@@ -94,6 +99,7 @@
 	protected RefreshFigureListener refreshFigureListener=null;
 	protected Comparison diffModel=null;
 	protected boolean modeRevisionRunning=false;
+	private int commentSize;
 
 
 	/**
@@ -235,6 +241,54 @@
 		getDomain().getCommandStack().execute(cmd);
 
 	}
+	
+	/**
+	 *  used to group a set of review under a new review from the index to the last
+	 *  @param element the container of the review
+	 *  @param index must be >0 
+	 */
+	private void groupReviews(final Element element, final int index){
+		getCurrentReviewModel();
+		final Actor theauthor=getCurrentAuthor();
+
+		RecordingCommand cmd= new RecordingCommand(getDomain(), "createAReview") {
+			@Override
+			protected void doExecute() {
+				ArrayList<Comment> subComments= new ArrayList<Comment>();
+				
+				for (int i=index; i<reviewModel.getOwnedComments().size();i++) {
+					subComments.add(reviewModel.getOwnedComments().get(i));
+				}
+				
+				Comment cmt= UMLFactory.eINSTANCE.createComment();
+				cmt.setBody("Your review");
+				if(element instanceof Comment ){
+					((Comment)element).getOwnedComments().add(cmt);
+				}
+				else{	reviewModel.getOwnedComments().add(cmt);}
+
+				Stereotype review= cmt.getApplicableStereotype(I_ReviewStereotype.TODO_STEREOTYPE);
+				cmt.applyStereotype(review);
+				cmt.setValue(review, I_ReviewStereotype.COMMENT_SUBJECT_ATT, "subject");
+
+				for (Iterator iterator = subComments.iterator(); iterator.hasNext();) {
+					Comment comment = (Comment) iterator.next();
+					cmt.getOwnedComments().add(comment);
+					
+				}
+				cmt.setBody(cmt.getOwnedComments().get(0).getBody());
+				Stereotype authorStereotype= theauthor.getApplicableStereotype(I_VersioningStereotype.AUTHOR_STEREOTYPE);
+				cmt.setValue(review, I_VersioningStereotype.VERSIONINGELEMENT_AUTHOR_ATT, theauthor.getStereotypeApplication(authorStereotype));
+
+				// add tthe date
+				Date today = new Date();
+				DateFormat shortDateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.SHORT);
+				cmt.setValue(review, I_VersioningStereotype.VERSIONINGELEMENT_DATE_ATT, shortDateFormat.format(today));
+			}
+		};
+		getDomain().getCommandStack().execute(cmd);
+
+	}
 
 	/**
 	 * 
@@ -511,6 +565,7 @@
 	 */
 	public void startModeRevision(){
 		modeRevisionRunning=true;
+
 		RecordingCommand cmd= new RecordingCommand(getDomain(), "savediff") {
 			@Override
 			protected void doExecute() {
@@ -527,6 +582,18 @@
 		};
 		getDomain().getCommandStack().execute(cmd);
 		getDomain().addResourceSetListener(addingDiffListener);
+		getDomain().getCommandStack().addCommandStackListener(new CommandStackListener() {
+			
+			@Override
+			public void commandStackChanged(EventObject event) {
+				System.out.println("Command added "+commentSize);
+				int commentIndex=commentSize;
+				
+				groupReviews(getCurrentReviewModel(), commentIndex);
+				commentSize = getCurrentReviewModel().getOwnedComments().size();
+			}
+		});
+		commentSize = getCurrentReviewModel().getOwnedComments().size();
 	}
 	/**
 	 * stop the revision model and stop listening modifications
diff --git a/plugins/revision/org.eclipse.papyrus.revisiontool/src/org/eclipse/papyrus/revision/tool/handlers/AcceptReviewHandler.java b/plugins/revision/org.eclipse.papyrus.revisiontool/src/org/eclipse/papyrus/revision/tool/handlers/AcceptReviewHandler.java
index 29ebdd2..7d96a53 100755
--- a/plugins/revision/org.eclipse.papyrus.revisiontool/src/org/eclipse/papyrus/revision/tool/handlers/AcceptReviewHandler.java
+++ b/plugins/revision/org.eclipse.papyrus.revisiontool/src/org/eclipse/papyrus/revision/tool/handlers/AcceptReviewHandler.java
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * Copyright (c) 2014, 2017 CEA LIST.
+ * Copyright (c) 2014, 2017-2018 CEA LIST.
  *
  *
  * All rights reserved. This program and the accompanying materials
@@ -14,6 +14,7 @@
 package org.eclipse.papyrus.revision.tool.handlers;
 
 import java.util.ArrayList;
+import java.util.Iterator;
 
 import org.eclipse.core.commands.ExecutionEvent;
 import org.eclipse.core.commands.ExecutionException;
@@ -32,6 +33,7 @@
 import org.eclipse.papyrus.revision.tool.ui.ReviewsEditor;
 import org.eclipse.ui.IWorkbenchPart;
 import org.eclipse.ui.PlatformUI;
+import org.eclipse.uml2.uml.Comment;
 import org.eclipse.uml2.uml.Element;
 import org.eclipse.uml2.uml.Stereotype;
 
@@ -55,39 +57,60 @@
 		if( part instanceof ReviewsEditor){
 			if( elements.size()!=0){
 
-				RecordingCommand cmd= new RecordingCommand(((ReviewsEditor)part).getReviewResourceManager().getDomain(), "Refuse currentReview") {
+				RecordingCommand cmd= new RecordingCommand(((ReviewsEditor)part).getReviewResourceManager().getDomain(), "Accept currentReview") {
 					@Override
 					protected void doExecute() {
+
 						for (Element element : elements) {
+							ArrayList<Comment> subCommentsToReview= new ArrayList<Comment>();
+							//collect all subcomments
+							for (Iterator<Comment> commentInerator = element.getOwnedComments().iterator(); commentInerator.hasNext();) {
+								Comment subComment = (Comment) commentInerator.next();
+								subCommentsToReview.add(subComment);
+							}
+							//manage subComments
+							for (Iterator<Comment> commentInerator = subCommentsToReview.iterator(); commentInerator.hasNext();) {
+								Element subComment = (Comment) commentInerator.next();
+								manageTodoReview(part, subComment);
 
-							Stereotype reviewtoDo= element.getAppliedStereotype(I_ReviewStereotype.TODO_STEREOTYPE);
-							if(reviewtoDo!=null ){
-								String diffuriFragment=(String)element.getValue(reviewtoDo, I_ReviewStereotype.COMMENT_DIFFREF_ATT);
-								if( diffuriFragment!=null){
+							}
 
-									//load EObject
-									EObject eOject=element.eResource().getEObject(diffuriFragment);
-									if(eOject instanceof ReferenceChange  ){
-										ReferenceChange referenceChange= (ReferenceChange)eOject;
-										//accept Remove
-										if( referenceChange.getKind().equals(DifferenceKind.DELETE)){
-											acceptDelete(part, element, referenceChange);
-										}
-										//accept ADD
-										else if( referenceChange.getKind().equals(DifferenceKind.ADD)){
-											removeDiffAndReview(part, element, referenceChange);
+							manageTodoReview(part, element);
+						}
+					}
 
-										}
+					private void manageTodoReview(final IWorkbenchPart part, Element element) {
+						Stereotype reviewtoDo= element.getAppliedStereotype(I_ReviewStereotype.TODO_STEREOTYPE);
+						if(reviewtoDo!=null ){
+							String diffuriFragment=(String)element.getValue(reviewtoDo, I_ReviewStereotype.COMMENT_DIFFREF_ATT);
+							if( diffuriFragment!=null){
+
+								//load EObject
+								EObject eOject=element.eResource().getEObject(diffuriFragment);
+								if(eOject instanceof ReferenceChange  ){
+									ReferenceChange referenceChange= (ReferenceChange)eOject;
+									//accept Remove
+									if( referenceChange.getKind().equals(DifferenceKind.DELETE)){
+										acceptDelete(part, element, referenceChange);
 									}
-									//accept Set
-									else if(eOject instanceof Match ){
-										ReviewResourceManager r=((ReviewsEditor)part).getReviewResourceManager();
-										removeMatchAndReview(eOject, r, element);
+									//accept ADD
+									else if( referenceChange.getKind().equals(DifferenceKind.ADD)){
+										removeDiffAndReview(part, element, referenceChange);
 
 									}
 								}
+								//accept Set
+								else if(eOject instanceof Match ){
+									ReviewResourceManager r=((ReviewsEditor)part).getReviewResourceManager();
+									removeMatchAndReview(eOject, r, element);
+
+								}
+							}
+							else {
+								((Element)element.eContainer()).getOwnedComments().remove(element);
 							}
 						}
+
 					}
 				};
 				((ReviewsEditor)part).getReviewResourceManager().getDomain().getCommandStack().execute(cmd);
@@ -110,15 +133,17 @@
 		DestroyElementRequest destroyrequest= new DestroyElementRequest(false); 
 		destroyrequest.setEditingDomain(r.getDomain());
 		destroyrequest.setElementToDestroy(eObjectToRemove);
-		IElementEditService  provider = ElementEditServiceUtils.getCommandProvider(eObjectToRemove);
-		if(provider != null) {
-			// Retrieve delete command from the Element Edit service
-			ICommand deleteCommand = provider.getEditCommand(destroyrequest);
-			if(deleteCommand != null) {
-				try {
-					deleteCommand.execute(new NullProgressMonitor(), null);
-				} catch (Exception e) {
-					System.err.println(e);
+		if( eObjectToRemove!=null) {
+			IElementEditService  provider = ElementEditServiceUtils.getCommandProvider(eObjectToRemove);
+			if(provider != null) {
+				// Retrieve delete command from the Element Edit service
+				ICommand deleteCommand = provider.getEditCommand(destroyrequest);
+				if(deleteCommand != null) {
+					try {
+						deleteCommand.execute(new NullProgressMonitor(), null);
+					} catch (Exception e) {
+						System.err.println(e);
+					}
 				}
 			}
 		}
diff --git a/plugins/revision/org.eclipse.papyrus.revisiontool/src/org/eclipse/papyrus/revision/tool/ui/ReviewsEditor.java b/plugins/revision/org.eclipse.papyrus.revisiontool/src/org/eclipse/papyrus/revision/tool/ui/ReviewsEditor.java
index 25feb72..e670932 100755
--- a/plugins/revision/org.eclipse.papyrus.revisiontool/src/org/eclipse/papyrus/revision/tool/ui/ReviewsEditor.java
+++ b/plugins/revision/org.eclipse.papyrus.revisiontool/src/org/eclipse/papyrus/revision/tool/ui/ReviewsEditor.java
@@ -122,11 +122,12 @@
 	protected void filterContextMenu(IMenuManager mgr) {
 		IContributionItem[] contributionItems=mgr.getItems();
 		for (int i = 0; i < contributionItems.length; i++) {
-			if(!(contributionItems[i].getId().startsWith(ORG_ECLIPSE_PAPYRUS_REVISIONTOOL))){
-				mgr.remove(contributionItems[i]);
+			if(contributionItems[i].getId()!=null) {
+				if(!(contributionItems[i].getId().startsWith(ORG_ECLIPSE_PAPYRUS_REVISIONTOOL))){
+					mgr.remove(contributionItems[i]);
+				}
 			}
 		}
-
 	}
 
 	/**
@@ -288,7 +289,7 @@
 		viewer.setInput(reviewResourceManager.getCurrentReviewModel());
 		reviewResourceManager.getDomain().addResourceSetListener(getResourceListener());
 		reviewResourceManager.stopModelRevision();
-		
+
 	}
 	/**
 	 * @return true if the mode revision is running.
@@ -328,7 +329,7 @@
 			return super.getAdapter(adapter);
 		}
 	}
-	
+
 	@Override
 	public void setFocus() {