| /***************************************************************************** |
| * Copyright (c) 2014, 2017 CEA LIST. |
| * |
| * |
| * 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: |
| * Patrick Tessier (CEA LIST) patrick.tessier@cea.fr - Initial API and implementation |
| * |
| *****************************************************************************/ |
| package org.eclipse.papyrus.revision.tool.core; |
| |
| import java.util.ArrayList; |
| |
| import org.eclipse.emf.common.command.Command; |
| import org.eclipse.emf.common.command.CompoundCommand; |
| import org.eclipse.emf.common.notify.Notification; |
| import org.eclipse.emf.compare.AttributeChange; |
| import org.eclipse.emf.compare.CompareFactory; |
| import org.eclipse.emf.compare.DifferenceKind; |
| import org.eclipse.emf.compare.DifferenceSource; |
| import org.eclipse.emf.compare.Match; |
| import org.eclipse.emf.compare.ReferenceChange; |
| import org.eclipse.emf.ecore.EAttribute; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.ecore.EReference; |
| import org.eclipse.emf.transaction.NotificationFilter; |
| import org.eclipse.emf.transaction.ResourceSetChangeEvent; |
| import org.eclipse.emf.transaction.ResourceSetListener; |
| import org.eclipse.emf.transaction.RollbackException; |
| import org.eclipse.papyrus.revision.tool.command.CreateDifferenceCommand; |
| import org.eclipse.papyrus.revision.tool.command.CreateMatchCommand; |
| import org.eclipse.papyrus.revision.tool.command.CreateToDoReviewCommand; |
| import org.eclipse.uml2.uml.NamedElement; |
| |
| /** |
| * This listener is used to register ADD ant SET about in the diff model during the launch of the revision mode. It also create review element in the review model. |
| * See package commands for specification of review creation commands. |
| * |
| */ |
| public class AddingDiffListener implements ResourceSetListener { |
| protected ReviewResourceManager reviewResourceManager; |
| |
| /** |
| * constructor |
| * @param reviewResourceManager |
| */ |
| public AddingDiffListener(ReviewResourceManager reviewResourceManager) { |
| this.reviewResourceManager=reviewResourceManager; |
| } |
| |
| @Override |
| public NotificationFilter getFilter() { |
| return null; |
| } |
| |
| |
| @Override |
| public Command transactionAboutToCommit(ResourceSetChangeEvent event) |
| throws RollbackException { |
| ArrayList<Command> commands = new ArrayList<Command>(); |
| |
| boolean noADD= true; |
| |
| |
| for (Notification notif : event.getNotifications()) { |
| if( notif.getEventType()==Notification.ADD&¬if.getNotifier() instanceof EObject){ |
| EObject notifier = (EObject) notif.getNotifier(); |
| if( reviewResourceManager.getWorkingModel().eResource().equals(notifier.eResource())){ |
| String subjectToWrite=""+notif.getNewValue().getClass().getSimpleName(); |
| |
| if(notif.getNewValue() instanceof NamedElement&&((NamedElement)notif.getNewValue()).getName()!=null){ |
| subjectToWrite=((NamedElement)notif.getNewValue()).getName(); |
| } |
| if(((EReference)notif.getFeature()).isContainment()){ |
| |
| noADD=false; |
| |
| |
| final ReferenceChange difference= CompareFactory.eINSTANCE.createReferenceChange(); |
| difference.setSource(DifferenceSource.LEFT); |
| difference.setKind(DifferenceKind.ADD); |
| difference.setReference((EReference)notif.getFeature()); |
| difference.setValue((EObject)notif.getNewValue()); |
| CreateDifferenceCommand createDifferenceCommand= new CreateDifferenceCommand( |
| reviewResourceManager.getDomain(), reviewResourceManager.getDiffModel().getMatch(reviewResourceManager.getWorkingModel()), difference); |
| commands.add(createDifferenceCommand); |
| |
| CreateToDoReviewCommand createToDoReviewCommand= new CreateToDoReviewCommand( |
| reviewResourceManager.getDomain(), |
| reviewResourceManager.getCurrentAuthor(), |
| reviewResourceManager.getCurrentReviewModel(), |
| "Add "+subjectToWrite, difference ); |
| commands.add(createToDoReviewCommand); |
| } |
| else{ |
| |
| |
| |
| Match match= CompareFactory.eINSTANCE.createMatch(); |
| match.setLeft((EObject)notif.getNotifier()); |
| final ReferenceChange difference= CompareFactory.eINSTANCE.createReferenceChange(); |
| difference.setSource(DifferenceSource.LEFT); |
| difference.setKind(DifferenceKind.ADD); |
| difference.setReference((EReference)notif.getFeature()); |
| difference.setValue((EObject)notif.getNewValue()); |
| match.getDifferences().add(difference); |
| CreateMatchCommand createDifferenceCommand= new CreateMatchCommand( |
| reviewResourceManager.getDomain(), reviewResourceManager.getDiffModel().getMatch(reviewResourceManager.getWorkingModel()), match); |
| commands.add(createDifferenceCommand); |
| CreateToDoReviewCommand createToDoReviewCommand= new CreateToDoReviewCommand( |
| reviewResourceManager.getDomain(), |
| reviewResourceManager.getCurrentAuthor(), |
| reviewResourceManager.getCurrentReviewModel(), |
| "Set "+((EReference)notif.getFeature()).getName()+" "+subjectToWrite, |
| match); |
| commands.add(createToDoReviewCommand); |
| } |
| } |
| } |
| if( notif.getEventType()==Notification.REMOVE&¬if.getNotifier() instanceof EObject){ |
| String subjectToWrite=""+notif.getOldValue().getClass().getSimpleName(); |
| if(notif.getNewValue() instanceof NamedElement&&((NamedElement)notif.getOldValue()).getName()!=null){ |
| subjectToWrite=((NamedElement)notif.getOldValue()).getName(); |
| } |
| EObject notifier = (EObject) notif.getNotifier(); |
| if( reviewResourceManager.getWorkingModel().eResource().equals(notifier.eResource())){ |
| |
| |
| |
| |
| Match match= CompareFactory.eINSTANCE.createMatch(); |
| match.setLeft((EObject)notif.getNotifier()); |
| final ReferenceChange difference= CompareFactory.eINSTANCE.createReferenceChange(); |
| difference.setSource(DifferenceSource.LEFT); |
| difference.setKind(DifferenceKind.DELETE); |
| difference.setReference((EReference)notif.getFeature()); |
| difference.setValue((EObject)notif.getOldValue()); |
| match.getDifferences().add(difference); |
| CreateMatchCommand createDifferenceCommand= new CreateMatchCommand( |
| reviewResourceManager.getDomain(), reviewResourceManager.getDiffModel().getMatch(reviewResourceManager.getWorkingModel()), match); |
| commands.add(createDifferenceCommand); |
| CreateToDoReviewCommand createToDoReviewCommand= new CreateToDoReviewCommand( |
| reviewResourceManager.getDomain(), |
| reviewResourceManager.getCurrentAuthor(), |
| reviewResourceManager.getCurrentReviewModel(), |
| "Remove "+((EReference)notif.getFeature()).getName()+" "+subjectToWrite, |
| match); |
| commands.add(createToDoReviewCommand); |
| } |
| } |
| } |
| if(noADD){ |
| for (Notification notif : event.getNotifications()) { |
| if( notif.getEventType()==Notification.SET&¬if.getNotifier() instanceof EObject){ |
| EObject notifier = (EObject) notif.getNotifier(); |
| if( reviewResourceManager.getWorkingModel().eResource().equals(notifier.eResource())){ |
| |
| noADD=false; |
| if( notif.getFeature() instanceof EAttribute){ |
| |
| |
| |
| Match match= CompareFactory.eINSTANCE.createMatch(); |
| match.setLeft((EObject)notif.getNotifier()); |
| final AttributeChange difference= CompareFactory.eINSTANCE.createAttributeChange(); |
| difference.setSource(DifferenceSource.LEFT); |
| difference.setKind(DifferenceKind.CHANGE); |
| difference.setAttribute((EAttribute)notif.getFeature()); |
| difference.setValue(notif.getOldValue()); |
| match.getDifferences().add(difference); |
| CreateMatchCommand createDifferenceCommand= new CreateMatchCommand( |
| reviewResourceManager.getDomain(), reviewResourceManager.getDiffModel().getMatch(reviewResourceManager.getWorkingModel()), match); |
| commands.add(createDifferenceCommand); |
| CreateToDoReviewCommand createToDoReviewCommand= new CreateToDoReviewCommand( |
| reviewResourceManager.getDomain(), |
| reviewResourceManager.getCurrentAuthor(), |
| reviewResourceManager.getCurrentReviewModel(), |
| "Set "+((EAttribute)notif.getFeature()).getName()+" "+notif.getNewValue(), |
| match); |
| commands.add(createToDoReviewCommand); |
| } |
| } |
| } |
| } |
| } |
| return commands.isEmpty()? null : new CompoundCommand(commands); |
| } |
| |
| |
| |
| @Override |
| public void resourceSetChanged(ResourceSetChangeEvent event) { |
| |
| } |
| |
| |
| @Override |
| public boolean isAggregatePrecommitListener() { |
| return false; |
| } |
| |
| |
| @Override |
| public boolean isPrecommitOnly() { |
| return false; |
| } |
| |
| |
| @Override |
| public boolean isPostcommitOnly() { |
| return false; |
| } |
| |
| } |