/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.ui.refactor; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.ltk.core.refactoring.Change; import org.eclipse.ltk.core.refactoring.ChangeDescriptor; import org.eclipse.ltk.core.refactoring.CompositeChange; import org.eclipse.ltk.core.refactoring.resource.ResourceChange; /** * Abstract implementation of composite change that ensure all * affected resources (that are EMF model resources) are unloaded * prior to the change. */ public abstract class AbstractResourcesCompositeChange extends CompositeChange { /** * @param name * @param changes */ public AbstractResourcesCompositeChange(String name, Change[] changes) { super(name, changes); } @Override public abstract ChangeDescriptor getDescriptor(); @Override protected abstract Change createUndoChange(Change[] childUndos); private void unloadChangeResource(Change change) throws CoreException { Object[] objects = change.getAffectedObjects(); if (objects != null) { for (Object object : objects) { if (object instanceof IResource && ((IResource) object).exists()) { RefactorResourcesUtils.unloadModelResource((IResource) object); } } } if (change instanceof ResourceChange) { ResourceChange resourceChange = (ResourceChange) change; Object object = resourceChange.getModifiedElement(); if (object instanceof IResource) { RefactorResourcesUtils.unloadModelResource((IResource) object); } } } @Override public Change perform(IProgressMonitor pm) throws CoreException { for (Change childChange : getChildren()) { unloadChangeResource(childChange); } Change change = super.perform(pm); if (change instanceof CompositeChange) { for (Change childChange : ((CompositeChange) change).getChildren()) { postPerform(childChange); } } else { postPerform(change); } return change; } protected void postPerform(Change change) { // Do Nothing } }