/*******************************************************************************
* Copyright (c) 2000, 2009 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 com.liferay.ide.core.model;
import com.liferay.ide.core.util.StringPool;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.jface.text.IDocument;
public abstract class AbstractEditingModel extends PlatformObject implements IEditingModel, IModelChangeProviderExtension {
private ArrayList fListeners = new ArrayList();
protected boolean fReconciling;
protected boolean fInSync = true;
protected boolean fLoaded = false;
protected boolean fDisposed;
protected long fTimestamp;
// private transient NLResourceHelper fNLResourceHelper;
private IDocument fDocument;
private boolean fDirty;
private String fCharset;
private IResource fUnderlyingResource;
private String fInstallLocation;
private boolean fStale;
public AbstractEditingModel(IDocument document, boolean isReconciling) {
fDocument = document;
fReconciling = isReconciling;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#dispose()
*/
public void dispose() {
// if (fNLResourceHelper != null) {
// fNLResourceHelper.dispose();
// fNLResourceHelper = null;
// }
fDisposed = true;
fListeners.clear();
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#getResourceString(java.lang.String)
*/
public String getResourceString(String key) {
if (key == null || key.length() == 0)
return ""; //$NON-NLS-1$
// return (getNLResourceHelper() == null) ? key : getNLResourceHelper().getResourceString(key);
return StringPool.EMPTY;
}
// protected abstract NLResourceHelper createNLResourceHelper();
//
// public NLResourceHelper getNLResourceHelper() {
// if (fNLResourceHelper == null)
// fNLResourceHelper = createNLResourceHelper();
// return fNLResourceHelper;
// }
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#isDisposed()
*/
public boolean isDisposed() {
return fDisposed;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#isEditable()
*/
public boolean isEditable() {
return fReconciling;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#isLoaded()
*/
public boolean isLoaded() {
return fLoaded;
}
/**
* @param loaded
*/
public void setLoaded(boolean loaded) {
fLoaded = loaded;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#isInSync()
*/
public boolean isInSync() {
return fInSync;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#isValid()
*/
public boolean isValid() {
return isLoaded();
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#getTimeStamp()
*/
public final long getTimeStamp() {
return fTimestamp;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#load()
*/
public final void load() throws CoreException {
try {
load(getInputStream(getDocument()), false);
} catch (UnsupportedEncodingException e) {
}
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#reload(java.io.InputStream, boolean)
*/
public final void reload(InputStream source, boolean outOfSync) throws CoreException {
load(source, outOfSync);
fireModelChanged(new ModelChangedEvent(this, IModelChangedEvent.WORLD_CHANGED, new Object[] {this}, null));
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#isReconcilingModel()
*/
public boolean isReconcilingModel() {
return fReconciling;
}
public IDocument getDocument() {
return fDocument;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.neweditor.text.IReconcilingParticipant#reconciled(org.eclipse.jface.text.IDocument)
*/
public final void reconciled(IDocument document) {
if (isReconcilingModel()) {
try {
if (isStale()) {
adjustOffsets(document);
setStale(false);
} else {
reload(getInputStream(document), false);
}
} catch (UnsupportedEncodingException e) {
} catch (CoreException e) {
}
if (isDirty())
setDirty(false);
}
}
public abstract void adjustOffsets(IDocument document) throws CoreException;
protected InputStream getInputStream(IDocument document) throws UnsupportedEncodingException {
return new BufferedInputStream(new ByteArrayInputStream(document.get().getBytes(getCharset())));
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.text.IEditingModel#getCharset()
*/
public String getCharset() {
return fCharset != null ? fCharset : "UTF-8"; //$NON-NLS-1$
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.core.text.IEditingModel#setCharset(java.lang.String)
*/
public void setCharset(String charset) {
fCharset = charset;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModelChangeProvider#addModelChangedListener(org.eclipse.pde.core.IModelChangedListener)
*/
public void addModelChangedListener(IModelChangedListener listener) {
if (!fListeners.contains(listener))
fListeners.add(listener);
}
public void transferListenersTo(IModelChangeProviderExtension target, IModelChangedListenerFilter filter) {
List oldList = (List) fListeners.clone();
for (int i = 0; i < oldList.size(); i++) {
IModelChangedListener listener = (IModelChangedListener) oldList.get(i);
if (filter == null || filter.accept(listener)) {
// add the listener to the target
target.addModelChangedListener(listener);
// remove the listener from our list
fListeners.remove(listener);
}
}
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModelChangeProvider#fireModelChanged(org.eclipse.pde.core.IModelChangedEvent)
*/
public void fireModelChanged(IModelChangedEvent event) {
if (event.getChangeType() == IModelChangedEvent.CHANGE && event.getOldValue() != null && event.getOldValue().equals(event.getNewValue()))
return;
setDirty(event.getChangeType() != IModelChangedEvent.WORLD_CHANGED);
for (int i = 0; i < fListeners.size(); i++) {
((IModelChangedListener) fListeners.get(i)).modelChanged(event);
}
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModelChangeProvider#fireModelObjectChanged(java.lang.Object, java.lang.String, java.lang.Object, java.lang.Object)
*/
public void fireModelObjectChanged(Object object, String property, Object oldValue, Object newValue) {
fireModelChanged(new ModelChangedEvent(this, object, property, oldValue, newValue));
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModelChangeProvider#removeModelChangedListener(org.eclipse.pde.core.IModelChangedListener)
*/
public void removeModelChangedListener(IModelChangedListener listener) {
fListeners.remove(listener);
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IEditable#isDirty()
*/
public boolean isDirty() {
return fDirty;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IEditable#save(java.io.PrintWriter)
*/
public void save(PrintWriter writer) {
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IEditable#setDirty(boolean)
*/
public void setDirty(boolean dirty) {
this.fDirty = dirty;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.model.IEditingModel#isStale()
*/
public boolean isStale() {
return fStale;
}
/* (non-Javadoc)
* @see org.eclipse.pde.internal.ui.model.IEditingModel#setStale(boolean)
*/
public void setStale(boolean stale) {
fStale = stale;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.IModel#getUnderlyingResource()
*/
public IResource getUnderlyingResource() {
return fUnderlyingResource;
}
public void setUnderlyingResource(IResource resource) {
fUnderlyingResource = resource;
}
/* (non-Javadoc)
* @see org.eclipse.pde.core.plugin.ISharedPluginModel#getInstallLocation()
*/
public String getInstallLocation() {
if (fInstallLocation == null && fUnderlyingResource != null) {
IPath path = fUnderlyingResource.getProject().getLocation();
return path != null ? path.addTrailingSeparator().toString() : null;
}
return fInstallLocation;
}
public void setInstallLocation(String location) {
fInstallLocation = location;
}
public IModelTextChangeListener getLastTextChangeListener() {
for (int i = fListeners.size() - 1; i >= 0; i--) {
Object obj = fListeners.get(i);
if (obj instanceof IModelTextChangeListener)
return (IModelTextChangeListener) obj;
}
return null;
}
}