Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'core/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StorageModelProvider.java')
-rw-r--r--core/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StorageModelProvider.java764
1 files changed, 764 insertions, 0 deletions
diff --git a/core/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StorageModelProvider.java b/core/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StorageModelProvider.java
new file mode 100644
index 0000000000..18815a78ed
--- /dev/null
+++ b/core/bundles/org.eclipse.wst.sse.ui/src/org/eclipse/wst/sse/ui/internal/StorageModelProvider.java
@@ -0,0 +1,764 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2011 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
+ * Jens Lukowski/Innoopract - initial renaming/restructuring
+ *
+ *******************************************************************************/
+package org.eclipse.wst.sse.ui.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Reader;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IEncodedStorage;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.core.runtime.content.IContentDescription;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.source.AnnotationModel;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IPathEditorInput;
+import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.editors.text.FileDocumentProvider;
+import org.eclipse.ui.editors.text.ILocationProvider;
+import org.eclipse.ui.editors.text.StorageDocumentProvider;
+import org.eclipse.ui.texteditor.DocumentProviderRegistry;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.ui.texteditor.IElementStateListener;
+import org.eclipse.wst.sse.core.StructuredModelManager;
+import org.eclipse.wst.sse.core.internal.encoding.CodedReaderCreator;
+import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
+import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocument;
+import org.eclipse.wst.sse.core.internal.util.Utilities;
+import org.eclipse.wst.sse.ui.internal.debug.BreakpointRulerAction;
+import org.eclipse.wst.sse.ui.internal.editor.EditorModelUtil;
+import org.eclipse.wst.sse.ui.internal.extension.BreakpointProviderBuilder;
+import org.eclipse.wst.sse.ui.internal.provisional.extensions.breakpoint.IExtendedStorageEditorInput;
+
+/**
+ * A StorageDocumentProvider that is IStructuredModel aware
+ */
+public class StorageModelProvider extends StorageDocumentProvider implements IModelProvider {
+
+ private class InternalElementStateListener implements IElementStateListener {
+ public void elementContentAboutToBeReplaced(Object element) {
+ if (debugElementStatelistener) {
+ System.out.println("StorageModelProvider: elementContentAboutToBeReplaced: " + ((IEditorInput) element).getName()); //$NON-NLS-1$
+ }
+ // we just forward the event
+ StorageModelProvider.this.fireElementContentAboutToBeReplaced(element);
+ }
+
+ public void elementContentReplaced(Object element) {
+ if (debugElementStatelistener) {
+ System.out.println("StorageModelProvider: elementContentReplaced: " + ((IEditorInput) element).getName()); //$NON-NLS-1$
+ }
+
+ StorageInfo info = (StorageInfo) getElementInfo(element);
+
+ if (info == null)
+ return;
+
+ /**
+ * Force a reload of the markers into annotations since their
+ * previous Positions have been deleted. Disconnecting and
+ * reconnecting forces a call to the private catchupWithMarkers
+ * method.
+ */
+ if (info.fModel != null) {
+ info.fModel.disconnect(info.fDocument);
+ }
+
+ Reader reader = null;
+ IStructuredDocument innerdocument = null;
+ try {
+ // update document from input's contents
+ CodedReaderCreator codedReaderCreator = new CodedReaderCreator(calculateID((IStorageEditorInput) element), Utilities.getMarkSupportedStream(((IStorageEditorInput) element).getStorage().getContents()));
+ reader = codedReaderCreator.getCodedReader();
+
+ innerdocument = (IStructuredDocument) info.fDocument;
+
+ int originalLengthToReplace = innerdocument.getLength();
+
+ StringBuffer stringBuffer = new StringBuffer();
+ int bufferSize = 2048;
+ char[] buffer = new char[bufferSize];
+ int nRead = 0;
+ boolean eof = false;
+ while (!eof) {
+ nRead = reader.read(buffer, 0, bufferSize);
+ if (nRead == -1) {
+ eof = true;
+ }
+ else {
+ stringBuffer.append(buffer, 0, nRead);
+ }
+ }
+ innerdocument.replaceText(this, 0, originalLengthToReplace, stringBuffer.toString(), true);
+ }
+ catch (CoreException e) {
+ Logger.logException(e);
+ }
+ catch (IOException e) {
+ Logger.logException(e);
+ }
+ finally {
+ if (reader != null) {
+ try {
+ reader.close();
+ }
+ catch (IOException e1) {
+ // would be highly unusual
+ Logger.logException(e1);
+ }
+ }
+ }
+
+ // forward the event
+ if (info.fCanBeSaved) {
+ info.fCanBeSaved = false;
+ addUnchangedElementListeners(element, info);
+ }
+ fireElementContentReplaced(element);
+ fireElementDirtyStateChanged(element, false);
+
+ if (info != null && info.fModel != null) {
+ info.fModel.connect(info.fDocument);
+ }
+ }
+
+ public void elementDeleted(Object element) {
+ if (debugElementStatelistener) {
+ System.out.println("StorageModelProvider: elementDeleted: " + ((IEditorInput) element).getName()); //$NON-NLS-1$
+ }
+ // we just forward the event
+ StorageModelProvider.this.fireElementDeleted(element);
+ }
+
+ public void elementDirtyStateChanged(Object element, boolean isDirty) {
+ if (debugElementStatelistener) {
+ System.out.println("StorageModelProvider: elementDirtyStateChanged: " + ((IEditorInput) element).getName() + " (" + isDirty + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+ // we just forward the event
+ StorageModelProvider.this.fireElementDirtyStateChanged(element, isDirty);
+ }
+
+ public void elementMoved(Object originalElement, Object movedElement) {
+ if (debugElementStatelistener) {
+ System.out.println("StorageModelProvider: elementMoved " + originalElement + " --> " + movedElement); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ // we just forward the event
+ StorageModelProvider.this.fireElementMoved(originalElement, movedElement);
+ }
+ }
+
+ /**
+ * Collection of info that goes with a model.
+ */
+ private class ModelInfo {
+ public IEditorInput fElement;
+ public boolean fShouldReleaseOnInfoDispose;
+ public IStructuredModel fStructuredModel;
+
+ public ModelInfo(IStructuredModel structuredModel, IEditorInput element, boolean selfCreated) {
+ fElement = element;
+ fStructuredModel = structuredModel;
+ fShouldReleaseOnInfoDispose = selfCreated;
+ }
+ }
+
+ static final boolean debugElementStatelistener = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.ui/storagemodelprovider/elementstatelistener")); //$NON-NLS-1$ //$NON-NLS-2$
+ static final boolean debugOperations = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.sse.ui/storagemodelprovider/operations")); //$NON-NLS-1$ //$NON-NLS-2$
+
+ private static StorageModelProvider fInstance = null;
+
+ public synchronized static StorageModelProvider getInstance() {
+ if (fInstance == null)
+ fInstance = new StorageModelProvider();
+ return fInstance;
+ }
+
+ private IElementStateListener fInternalListener;
+ /** IStructuredModel information of all connected elements */
+ private Map fModelInfoMap = new HashMap();
+ private boolean fReuseModelDocument = true;
+
+ private StorageModelProvider() {
+ super();
+ fInternalListener = new InternalElementStateListener();
+ }
+
+ String calculateBaseLocation(IStorageEditorInput input) {
+ String location = null;
+ if (input instanceof IPathEditorInput) {
+ IPath path = ((IPathEditorInput) input).getPath();
+ if (path != null) {
+ location = path.toString();
+ }
+ }
+ if (location == null && input instanceof ILocationProvider) {
+ IPath path = ((ILocationProvider) input).getPath(input);
+ if (path != null) {
+ location = path.toString();
+ }
+ }
+ if (location == null) {
+ try {
+ IStorage storage = input.getStorage();
+ if (storage != null) {
+ IPath storagePath = storage.getFullPath();
+ String name = storage.getName();
+ if (storagePath != null) {
+ /*
+ * If the path's last segment and the name are
+ * different, the IStorage contract is not being
+ * honored
+ * (https://bugs.eclipse.org/bugs/show_bug.cgi?
+ * id=73098). Favor the name
+ */
+ if (!storagePath.lastSegment().equals(name)) {
+ IPath workingPath = storagePath.addTrailingSeparator();
+ location = workingPath.append(name).toString();
+ }
+ else {
+ location = storagePath.makeAbsolute().toString();
+ }
+ }
+ if (location == null)
+ location = name;
+ }
+ }
+ catch (CoreException e) {
+ Logger.logException(e);
+ }
+ finally {
+ if (location == null)
+ location = input.getName();
+ }
+ }
+ return location;
+ }
+
+ String calculateID(IStorageEditorInput input) {
+ /**
+ * Typically CVS will return a path of "filename.ext" and the input's
+ * name will be "filename.ext version". The path must be used to load
+ * the model so that the suffix will be available to compute the
+ * contentType properly. The editor input name can then be set as the
+ * base location for display on the editor title bar.
+ *
+ */
+ String path = null;
+ if (input instanceof ILocationProvider) {
+ IPath ipath = ((ILocationProvider) input).getPath(input);
+ if (ipath != null) {
+ path = ipath.toString();
+ }
+ }
+ if (path == null) {
+ try {
+ IStorage storage = input.getStorage();
+ if (storage != null) {
+ IPath storagePath = storage.getFullPath();
+ String name = storage.getName();
+ if (storagePath != null) {
+ // If they are different, the IStorage contract is not
+ // being honored
+ // (https://bugs.eclipse.org/bugs/show_bug.cgi?id=73098).
+ // Favor the name.
+ if (!storagePath.lastSegment().equals(name)) {
+ IPath workingPath = storagePath.addTrailingSeparator();
+ path = workingPath.append(name).toString();
+ }
+ else {
+ path = storagePath.makeAbsolute().toString();
+ }
+ }
+ if (path == null)
+ path = name;
+ }
+ }
+ catch (CoreException e) {
+ Logger.logException(e);
+ }
+ finally {
+ if (path == null)
+ path = input.getName(); //$NON-NLS-1$
+ }
+ }
+ /*
+ * Prepend the hash to the path value so that we have a 1:1:1 match
+ * between editor inputs, element info, and models. The editor manager
+ * should help prevent needlessly duplicated models as long as two
+ * editor inputs from the same storage indicate they're equals().
+ */
+ path = input.hashCode() + "#" + path; //$NON-NLS-1$
+ return path;
+ }
+
+ // public boolean canSaveDocument(Object element) {
+ // return false;
+ // }
+
+ protected IAnnotationModel createAnnotationModel(Object element) throws CoreException {
+ IAnnotationModel model = null;
+ if (debugOperations) {
+ if (element instanceof IStorageEditorInput)
+ System.out.println("StorageModelProvider: createAnnotationModel for " + ((IStorageEditorInput) element).getStorage().getFullPath()); //$NON-NLS-1$
+ else
+ System.out.println("StorageModelProvider: createAnnotationModel for " + element); //$NON-NLS-1$
+ }
+ if (element instanceof IStorageEditorInput) {
+ IStorageEditorInput input = (IStorageEditorInput) element;
+ String contentType = (getModel(input) != null ? getModel(input).getContentTypeIdentifier() : null);
+ String ext = BreakpointRulerAction.getFileExtension((IEditorInput) element);
+ IResource res = BreakpointProviderBuilder.getInstance().getResource(input, contentType, ext);
+ String id = input.getName();
+ if (input.getStorage() != null && input.getStorage().getFullPath() != null) {
+ id = input.getStorage().getFullPath().toString();
+ }
+ // we can only create a resource marker annotationmodel off of a
+ // valid resource
+ if (res != null)
+ model = new StructuredResourceMarkerAnnotationModel(res, id);
+ else
+ model = new AnnotationModel();
+ }
+ if (model == null) {
+ model = super.createAnnotationModel(element);
+ }
+ return model;
+ }
+
+ protected IDocument createDocument(Object element) {
+ if (debugOperations) {
+ if (element instanceof IStorageEditorInput)
+ try {
+ System.out.println("StorageModelProvider: createDocument for " + ((IStorageEditorInput) element).getStorage().getFullPath()); //$NON-NLS-1$
+ }
+ catch (CoreException e) {
+ System.out.println("StorageModelProvider: createDocument for " + element + "(exception caught)"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ else {
+ System.out.println("StorageModelProvider: createDocument for " + element); //$NON-NLS-1$
+ }
+ }
+
+ // The following is largely copied from FileModelProvider
+
+ IDocument document = null;
+ if (element instanceof IEditorInput) {
+ // create a new IDocument for the element; should always reflect
+ // the contents of the resource
+ ModelInfo info = getModelInfoFor((IEditorInput) element);
+ if (info == null) {
+ throw new IllegalArgumentException("no corresponding model info found"); //$NON-NLS-1$
+ }
+ IStructuredModel model = info.fStructuredModel;
+ if (model != null) {
+ if (!fReuseModelDocument && element instanceof IStorageEditorInput) {
+ Reader reader = null;
+ IStructuredDocument innerdocument = null;
+ try {
+ // update document from input's contents
+
+ CodedReaderCreator codedReaderCreator = new CodedReaderCreator(calculateID((IStorageEditorInput) element), Utilities.getMarkSupportedStream(((IStorageEditorInput) element).getStorage().getContents()));
+ reader = codedReaderCreator.getCodedReader();
+
+ innerdocument = model.getStructuredDocument();
+
+ int originalLengthToReplace = innerdocument.getLength();
+
+ /*
+ * TODO_future: we could implement with sequential
+ * rewrite, if we don't pickup automatically from
+ * FileBuffer support, so not so much has to be pulled
+ * into memory (as an extra big string), but we need
+ * to carry that API through so that StructuredModel
+ * is not notified until done.
+ */
+
+ // innerdocument.startSequentialRewrite(true);
+ // innerdocument.replaceText(this, 0,
+ // innerdocument.getLength(), "");
+ StringBuffer stringBuffer = new StringBuffer();
+ int bufferSize = 2048;
+ char[] buffer = new char[bufferSize];
+ int nRead = 0;
+ boolean eof = false;
+ while (!eof) {
+ nRead = reader.read(buffer, 0, bufferSize);
+ if (nRead == -1) {
+ eof = true;
+ }
+ else {
+ stringBuffer.append(buffer, 0, nRead);
+ // innerdocument.replaceText(this,
+ // innerdocument.getLength(), 0, new
+ // String(buffer, 0, nRead));
+ }
+ }
+ // ignore read-only settings if reverting whole
+ // document
+ innerdocument.replaceText(this, 0, originalLengthToReplace, stringBuffer.toString(), true);
+ model.setDirtyState(false);
+
+ }
+ catch (CoreException e) {
+ Logger.logException(e);
+ }
+ catch (IOException e) {
+ Logger.logException(e);
+ }
+ finally {
+ if (reader != null) {
+ try {
+ reader.close();
+ }
+ catch (IOException e1) {
+ // would be highly unusual
+ Logger.logException(e1);
+ }
+ }
+ // if (innerdocument != null) {
+ // innerdocument.stopSequentialRewrite();
+ // }
+ }
+
+ }
+ document = model.getStructuredDocument();
+ }
+ }
+ return document;
+ }
+
+ /**
+ * Also create ModelInfo - extra resource synchronization classes should
+ * be stored within the ModelInfo
+ */
+ protected ElementInfo createElementInfo(Object element) throws CoreException {
+ // create the corresponding ModelInfo if necessary
+ if (debugOperations) {
+ if (element instanceof IStorageEditorInput)
+ try {
+ System.out.println("StorageModelProvider: createElementInfo for " + ((IStorageEditorInput) element).getStorage().getFullPath()); //$NON-NLS-1$
+ }
+ catch (CoreException e) {
+ System.out.println("StorageModelProvider: createElementInfo for " + element + "(exception caught)"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ else
+ System.out.println("storageModelProvider: createElementInfo for " + element); //$NON-NLS-1$
+ }
+
+ if (getModelInfoFor((IEditorInput) element) == null) {
+ createModelInfo((IEditorInput) element);
+ }
+
+ ElementInfo info = super.createElementInfo(element);
+ return info;
+ }
+
+ public void createModelInfo(IEditorInput input) {
+ if (getModelInfoFor(input) == null) {
+ IStructuredModel structuredModel = selfCreateModel(input);
+ if (structuredModel != null) {
+ createModelInfo(input, structuredModel, true);
+ }
+ }
+ }
+
+ /**
+ * To be used when model is provided to us, ensures that when setInput is
+ * used on this input, the given model will be used.
+ */
+ public void createModelInfo(IEditorInput input, IStructuredModel structuredModel, boolean releaseModelOnDisconnect) {
+ // we have to make sure factories are added, whether we created or
+ // not.
+ if (getModelInfoFor(input) != null || getModelInfoFor(structuredModel) != null) {
+ if (debugOperations) {
+ if (input instanceof IStorageEditorInput) {
+
+ try {
+ System.out.println("StorageModelProvider: DUPLICATE createModelInfo for " + ((IStorageEditorInput) input).getStorage().getFullPath()); //$NON-NLS-1$
+ }
+ catch (CoreException e) {
+ System.out.println("StorageModelProvider: DUPLICATE createModelInfo for " + input + "(exception caught)"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ else {
+ System.out.println("storageModelProvider: DUPLICATE createModelInfo for " + input); //$NON-NLS-1$
+ }
+ }
+ return;
+ }
+
+ if (debugOperations) {
+ if (input instanceof IStorageEditorInput) {
+ try {
+ System.out.println("StorageModelProvider: createModelInfo for " + ((IStorageEditorInput) input).getStorage().getFullPath()); //$NON-NLS-1$
+ }
+ catch (CoreException e) {
+ System.out.println("StorageModelProvider: createModelInfo for " + input + "(exception caught)"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ else {
+ System.out.println("StorageModelProvider: createModelInfo for " + input); //$NON-NLS-1$
+ }
+ }
+
+
+ if (input instanceof IExtendedStorageEditorInput) {
+ ((IExtendedStorageEditorInput) input).addElementStateListener(fInternalListener);
+ }
+
+ EditorModelUtil.addFactoriesTo(structuredModel);
+
+ ModelInfo modelInfo = new ModelInfo(structuredModel, input, releaseModelOnDisconnect);
+ fModelInfoMap.put(input, modelInfo);
+ }
+
+ protected void disposeElementInfo(Object element, ElementInfo info) {
+ if (debugOperations) {
+ if (element instanceof IStorageEditorInput) {
+ try {
+ System.out.println("StorageModelProvider: disposeElementInfo for " + ((IStorageEditorInput) element).getStorage().getFullPath()); //$NON-NLS-1$
+ }
+ catch (CoreException e) {
+ System.out.println("StorageModelProvider: disposeElementInfo for " + element + "(exception caught)"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ else {
+ System.out.println("StorageModelProvider: disposeElementInfo for " + element); //$NON-NLS-1$
+ }
+ }
+
+ if (element instanceof IEditorInput) {
+ IEditorInput input = (IEditorInput) element;
+ ModelInfo modelInfo = getModelInfoFor(input);
+ disposeModelInfo(modelInfo);
+ }
+ super.disposeElementInfo(element, info);
+ }
+
+ /**
+ * disconnect from this model info
+ *
+ * @param info
+ */
+ public void disposeModelInfo(ModelInfo info) {
+ if (debugOperations) {
+ if (info.fElement instanceof IStorageEditorInput) {
+ try {
+ System.out.println("StorageModelProvider: disposeModelInfo for " + ((IStorageEditorInput) info.fElement).getStorage().getFullPath()); //$NON-NLS-1$
+ }
+ catch (CoreException e) {
+ System.out.println("StorageModelProvider: disposeModelInfo for " + info.fElement + "(exception caught)"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+ else {
+ System.out.println("StorageModelProvider: disposeModelInfo for " + info.fElement); //$NON-NLS-1$
+ }
+ }
+
+ if (info.fElement instanceof IStorageEditorInput) {
+ if (info.fElement instanceof IExtendedStorageEditorInput) {
+ ((IExtendedStorageEditorInput) info.fElement).removeElementStateListener(fInternalListener);
+ }
+ if (info.fShouldReleaseOnInfoDispose) {
+ info.fStructuredModel.releaseFromEdit();
+ }
+ }
+ fModelInfoMap.remove(info.fElement);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.texteditor.AbstractDocumentProvider#doResetDocument(java.lang.Object,
+ * org.eclipse.core.runtime.IProgressMonitor)
+ */
+ protected void doResetDocument(Object element, IProgressMonitor monitor) throws CoreException {
+ fReuseModelDocument = false;
+ super.doResetDocument(element, monitor);
+ fReuseModelDocument = true;
+ }
+
+ /**
+ * @see org.eclipse.ui.texteditor.AbstractDocumentProvider#doSaveDocument(org.eclipse.core.runtime.IProgressMonitor,
+ * java.lang.Object, org.eclipse.jface.text.IDocument, boolean)
+ */
+ protected void doSaveDocument(IProgressMonitor monitor, Object element, IDocument document, boolean overwrite) throws CoreException {
+ IDocumentProvider provider = null;
+ // BUG119211 - try to use registered document provider if possible
+ if (element instanceof IEditorInput) {
+ provider = DocumentProviderRegistry.getDefault().getDocumentProvider((IEditorInput) element);
+ }
+ if (provider == null)
+ provider = new FileDocumentProvider();
+ provider.saveDocument(monitor, element, document, overwrite);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.ui.editors.text.StorageDocumentProvider#getPersistedEncoding(java.lang.Object)
+ */
+ protected String getPersistedEncoding(Object element) {
+ String charset = super.getPersistedEncoding(element);
+ if (charset == null && element instanceof IStorageEditorInput) {
+ IStorage storage;
+ try {
+ storage = ((IStorageEditorInput) element).getStorage();
+ if (storage != null && !(storage instanceof IEncodedStorage)) {
+ InputStream contents = null;
+ try {
+ contents = storage.getContents();
+ if (contents != null) {
+ QualifiedName[] detectionOptions = new QualifiedName[]{IContentDescription.BYTE_ORDER_MARK, IContentDescription.CHARSET};
+ IContentDescription description = Platform.getContentTypeManager().getDescriptionFor(contents, storage.getName(), detectionOptions);
+ if (description != null) {
+ charset = description.getCharset();
+ }
+ }
+
+ }
+ catch (IOException e) {
+ }
+ finally {
+ if (contents != null)
+ try {
+ contents.close();
+ }
+ catch (IOException e) {
+ // do nothing
+ }
+ }
+ }
+ }
+ catch (CoreException e) {
+ Logger.logException(e);
+ }
+ }
+ return charset;
+ }
+
+ public IStructuredModel getModel(IEditorInput element) {
+ IStructuredModel result = null;
+ ModelInfo info = getModelInfoFor(element);
+ if (info != null) {
+ result = info.fStructuredModel;
+ }
+ return result;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.wst.sse.ui.IModelProvider#getModel(java.lang.Object)
+ */
+ public IStructuredModel getModel(Object element) {
+ if (element instanceof IEditorInput)
+ return getModel((IEditorInput) element);
+ return null;
+ }
+
+ private ModelInfo getModelInfoFor(IEditorInput element) {
+ ModelInfo result = (ModelInfo) fModelInfoMap.get(element);
+ return result;
+ }
+
+ private ModelInfo getModelInfoFor(IStructuredModel structuredModel) {
+ ModelInfo result = null;
+ if (structuredModel != null) {
+ ModelInfo[] modelInfos = (ModelInfo[]) fModelInfoMap.values().toArray(new ModelInfo[0]);
+ for (int i = 0; i < modelInfos.length; i++) {
+ ModelInfo info = modelInfos[i];
+ if (structuredModel.equals(info.fStructuredModel)) {
+ result = info;
+ break;
+ }
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Method loadModel.
+ *
+ * @param input
+ * @return IStructuredModel
+ */
+ public IStructuredModel loadModel(IStorageEditorInput input) {
+ return loadModel(input, false);
+ }
+
+ /**
+ * Method loadModel.
+ *
+ * @param input
+ * @param logExceptions
+ * @return IStructuredModel
+ */
+ public IStructuredModel loadModel(IStorageEditorInput input, boolean logExceptions) {
+ String id = calculateID(input);
+ if (id == null) {
+ return null;
+ }
+
+ InputStream contents = null;
+ try {
+ contents = input.getStorage().getContents();
+ }
+ catch (CoreException noStorageExc) {
+ if (logExceptions)
+ Logger.logException(NLS.bind(SSEUIMessages._32concat_EXC_, new Object[]{input.getName()}), noStorageExc);
+ }
+
+ IStructuredModel model = null;
+ try {
+ // first parameter must be unique
+ model = StructuredModelManager.getModelManager().getModelForEdit(id, contents, null);
+ model.setBaseLocation(calculateBaseLocation(input));
+ }
+ catch (IOException e) {
+ if (logExceptions)
+ Logger.logException(NLS.bind(SSEUIMessages._32concat_EXC_, new Object[]{input}), e);
+ }
+ finally {
+ if (contents != null) {
+ try {
+ contents.close();
+ }
+ catch (IOException e) {
+ // nothing
+ }
+ catch (Exception e) {
+ Logger.logException(e);
+ }
+ }
+ }
+ return model;
+ }
+
+ /**
+ * @param input
+ * @return
+ */
+ private IStructuredModel selfCreateModel(IEditorInput input) {
+ return loadModel((IStorageEditorInput) input);
+ }
+
+}

Back to the top