/******************************************************************************* * Copyright (c) 2005 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.common.ui.editmodel; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarkerDelta; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.emf.common.notify.Adapter; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; /** * Resource Info holds the information about the resource, the edit model it represents, and it listens * on the resource modifications notifications from the workbench. Once the EMF resource is loaded, * ResourceInfo will listen on any updates from it and propagate to the EditoModel as well. * * @author IBM */ public class ResourceInfo { /** The edit model */ EditModel editModel; /** The emf resource */ Resource resource; /** The workbench IFile that the resource came from */ IFile file; /** Resource listener, notifications from workbench */ ResourceListener resourceListener; /** The adapter on the EMF resource */ Adapter resourceAdapter; /** Last synchronization stamp */ long synchronizeStamp = 0; /** Load options */ Map loadOptions = new HashMap(); protected int referenceCount = 0; protected boolean loading = false; protected boolean fileExists = false; /** * Brand new shiny ResourceInfo object. * * @param editModel * @param file */ ResourceInfo (EditModel anEditModel, IFile aFile) { this.editModel = anEditModel; this.file = aFile; resetSynchronizeStamp(); resourceListener = new ResourceListener(this, this.file); ResourcesPlugin.getWorkspace().addResourceChangeListener (resourceListener); resourceAdapter = new AdapterImpl() { @Override public void notifyChanged(Notification msg) { if ((msg.getEventType() == Notification.SET) && (resource != null && msg.getNotifier() == resource)) { if (msg.getFeatureID(Resource.class) == Resource.RESOURCE__IS_MODIFIED) { ResourceInfo.this.editModel .fireModelDirtyStateChanged(ResourceInfo.this); } } } }; } /** * * @return the file which represents this resource in the workspace. */ public IFile getFile() { return file; } protected boolean getFileExists() { return fileExists; } /** * Answer if dirty. * * @return true if dirty, false if clean. */ public boolean isDirty() { if (resource == null) { return false; } return resource.isModified(); } /** * Return the EMF resource that this resource info is holding onto. * * @return the EMF resource. */ public Resource getResource() { return resource; } /** * Set the EMF resource that this resource is holding onto. * * @param aResource the EMF resource. */ protected void setResource (Resource aResource) { this.resource = aResource; } /** * Return the EMF load options. * * @return the EMF resource load options. */ public Map getLoadOptions() { return loadOptions; } /** * Set the EMF load options. * * @param loadOptions */ public void setLoadOptions(Map loadOptions) { this.loadOptions = loadOptions; } /** * The listener has notified us that the resource has moved in the Eclipse workbench. * We need to take appropriate cover. * * @param movedToFile the moved to file. */ protected void move(IFile movedToFile) { editModel.removeResourceInfo(this); file = movedToFile; resource.setURI(URI.createPlatformResourceURI(file.getFullPath().toString())); resetSynchronizeStamp(); resourceListener.setFile(movedToFile); editModel.addResourceInfo(this); editModel.fireModelLocationChanged(this, movedToFile); } /** * The listener has notified us that the resource has been deleted in the Eclipse workbench. */ protected void deleted() { if (editModel == null) { return; } editModel.fireModelDeleted(this); } /** * The listener has notified us that the resource has had markers updated. * We need to let the edit model know about about this. * */ protected void markersChanged ( IMarkerDelta [] markerDelta ) { if (editModel == null) { return ; } editModel.fireModelMarkersChanged ( this, markerDelta ); } /** * * Should not be used by clients * */ public void refresh() { if (getSynchronizeStamp() == getCurrentFileModified()) { return; } load(); editModel.fireModelReloaded(this); } protected void dispose() { if (editModel == null) { return; } if (resource != null) { resource.eAdapters().clear(); } editModel.removeResourceInfo(this); ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceListener); if (resource != null) { resource.unload(); } editModel = null; resource = null; resourceListener = null; } protected void load() { if (resource != null) { resource.unload(); } try { loading = true; resource = editModel.getResourceSet().getResource( URI .createPlatformResourceURI(file.getFullPath() .toString()), true); } finally { loading = false; } resourceLoaded(); } protected void resourceLoaded() { if (loading) { return; } resetSynchronizeStamp(); resource.eAdapters().add(resourceAdapter); fileExists = file.exists(); } /** * Should not be used by clients * * @throws IOException */ public void save() throws IOException { getResource().save(getLoadOptions()); fileExists = true; resetSynchronizeStamp(); } /** * Should not be used by clients * @param savedFile * @throws IOException */ public void saveAs(IFile savedFile) throws IOException { // TODO Revert to old file name if save fails move(savedFile); save(); } /** * Resets the synchronization stamp. Should not be used by clients */ public void resetSynchronizeStamp() { synchronizeStamp = getCurrentFileModified(); } /** * Returns the last synchronization stamp. Should not be used by clients * @return the last synchronization stamp. */ public long getSynchronizeStamp() { return synchronizeStamp; } /* * Returns the resource current modified time. */ private long getCurrentFileModified() { return file.getLocation().toFile().lastModified(); } }