/* This file is part of Green. * * Copyright (C) 2005 The Research Foundation of State University of New York * All Rights Under Copyright Reserved, The Research Foundation of S.U.N.Y. * * Green is free software, licensed under the terms of the Eclipse * Public License, version 1.0. The license is available at * http://www.eclipse.org/legal/epl-v10.html */ package edu.buffalo.cse.green.relationships; import static org.eclipse.jdt.core.dom.ASTNode.EXPRESSION_STATEMENT; import java.util.AbstractList; import java.util.ArrayList; import java.util.List; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.dom.ASTMatcher; import org.eclipse.jdt.core.dom.Block; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.ExpressionStatement; import org.eclipse.jdt.core.dom.Statement; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IDocument; import org.eclipse.text.edits.TextEdit; import org.eclipse.ui.IWorkbenchPage; import edu.buffalo.cse.green.GreenException; import edu.buffalo.cse.green.PlugIn; import edu.buffalo.cse.green.editor.DiagramEditor; import edu.buffalo.cse.green.editor.model.RelationshipModel; import edu.buffalo.cse.green.util.IModifiableBuffer; /** * Provides support common to all relationship removers. * * @author bcmartin * @author rjtruban */ public abstract class RelationshipRemover extends RelationshipVisitor { private RelationshipModel _rModel; private Relationship _relationship; /** * @return The source type of the relationship. */ protected IType getSourceType() { return _rModel.getSourceType(); } /** * @return The target type of the relationship. */ protected IType getTargetType() { return _rModel.getTargetType(); } /** * @return The relationship being removed. */ protected Relationship getRelationship() { return _relationship; } /** * Sets the relationship model to remove. * * @param rModel - The model. */ public void setRelationship(RelationshipModel rModel) { _rModel = rModel; } /** * @see edu.buffalo.cse.green.relationships.RelationshipVisitor#run(org.eclipse.jdt.core.dom.CompilationUnit, edu.buffalo.cse.green.relationships.RelationshipCache) */ public final void run(CompilationUnit cu, RelationshipCache cache) { if (_rModel == null) { throw new IllegalStateException( "The relationship to remove hasn't been set"); } try { ICompilationUnit iCU = (ICompilationUnit) getSourceType() .getAncestor(IJavaElement.COMPILATION_UNIT); cu.recordModifications(); for (Relationship relationship : _rModel.getRelationships()) { _relationship = relationship; init(); cu.accept(this); finish(); } IDocument sourceDoc = new IModifiableBuffer(iCU.getBuffer()); TextEdit textEdit = cu.rewrite(sourceDoc, null); textEdit.apply(sourceDoc); // // put this outside of if block // iCU.save(PlugIn.getEmptyProgressMonitor(), false); // // if (!iCU.isConsistent()) { // iCU.discardWorkingCopy(); // iCU.save(PlugIn.getEmptyProgressMonitor(), false); // } // iCU.save(PlugIn.getEmptyProgressMonitor(), true); //find active workbench and save it IWorkbenchPage page = DiagramEditor.getActiveEditor().getSite().getPage(); //Iterates through the editor references and finds the source editor and saves it String sourceCUName = getSourceType().getCompilationUnit().getResource().getName(); for (int i = 0; i < page.getEditorReferences().length; i++) { if( sourceCUName.equals(page.getEditorReferences()[i].getEditor(true).getEditorInput().getName())) { page.saveEditor(page.getEditorReferences()[i].getEditor(false), false); } } organizeImports(getSourceType()); DiagramEditor.getActiveEditor().refresh(); _rModel.getSourceModel().forceRefesh(); } catch (BadLocationException e) { e.printStackTrace(); } catch (JavaModelException e) { e.printStackTrace(); } } /** * Called after the remover is run. */ protected abstract void finish(); /** * Called before the remover is run. */ protected abstract void init(); /** * Throws an exception if relationship removal was unsuccessful. */ protected void relationshipRemovalError() { GreenException.illegalOperation("Couldn't remove relationship"); } /** * Handles removal of add invocations involved in a relationship. * * @param block - The block to process. */ protected void processAddInvocations(Block block) { List<Statement> stmts = (AbstractList<Statement>) (List) block.statements(); List<Statement> toRemove = new ArrayList<Statement>(); for (int x = 1; x < _relationship.getFeatures().size(); x++) { stmts.removeAll(toRemove); toRemove.clear(); for (Statement statement : stmts) { if (statement.getNodeType() == EXPRESSION_STATEMENT) { ExpressionStatement e = (ExpressionStatement) statement; if (new ASTMatcher().match(e, _relationship.getFeatures().get(x))) { toRemove.add(e); break; } } } } stmts.removeAll(toRemove); } }