Search in sources :

Example 1 with IPersistableAnnotationModel

use of org.eclipse.core.filebuffers.IPersistableAnnotationModel in project eclipse.platform.text by eclipse.

the class FileStoreTextFileBuffer method revert.

@Override
public void revert(IProgressMonitor monitor) throws CoreException {
    if (isDisconnected())
        return;
    IDocument original = null;
    fStatus = null;
    try {
        original = fManager.createEmptyDocument(getLocationOrName(), LocationKind.LOCATION);
        cacheEncodingState();
        setDocumentContent(original, fFileStore, fEncoding, fHasBOM, monitor);
    } catch (CoreException x) {
        fStatus = x.getStatus();
    }
    if (original == null)
        return;
    String originalContents = original.get();
    boolean replaceContents = !originalContents.equals(fDocument.get());
    if (!replaceContents && !fCanBeSaved)
        return;
    fManager.fireStateChanging(this);
    try {
        if (replaceContents) {
            fManager.fireBufferContentAboutToBeReplaced(this);
            fDocument.set(original.get());
        }
        boolean fireDirtyStateChanged = fCanBeSaved;
        if (fCanBeSaved) {
            fCanBeSaved = false;
            addFileBufferContentListeners();
        }
        if (replaceContents)
            fManager.fireBufferContentReplaced(this);
        IFileInfo info = fFileStore.fetchInfo();
        if (info.exists())
            fSynchronizationStamp = fFileStore.fetchInfo().getLastModified();
        if (fAnnotationModel instanceof IPersistableAnnotationModel) {
            IPersistableAnnotationModel persistableModel = (IPersistableAnnotationModel) fAnnotationModel;
            try {
                persistableModel.revert(fDocument);
            } catch (CoreException x) {
                fStatus = x.getStatus();
            }
        }
        if (fireDirtyStateChanged)
            fManager.fireDirtyStateChanged(this, fCanBeSaved);
    } catch (RuntimeException x) {
        fManager.fireStateChangeFailed(this);
        throw x;
    }
}
Also used : IPersistableAnnotationModel(org.eclipse.core.filebuffers.IPersistableAnnotationModel) IFileInfo(org.eclipse.core.filesystem.IFileInfo) CoreException(org.eclipse.core.runtime.CoreException) IDocument(org.eclipse.jface.text.IDocument)

Example 2 with IPersistableAnnotationModel

use of org.eclipse.core.filebuffers.IPersistableAnnotationModel in project eclipse.platform.text by eclipse.

the class FileStoreTextFileBuffer method commitFileBufferContent.

@Override
protected void commitFileBufferContent(IProgressMonitor monitor, boolean overwrite) throws CoreException {
    if (!isSynchronized() && !overwrite) {
        String message = NLSUtility.format(FileBuffersMessages.FileBuffer_error_outOfSync, getFileStore().toURI());
        throw new CoreException(new Status(IStatus.WARNING, FileBuffersPlugin.PLUGIN_ID, IResourceStatus.OUT_OF_SYNC_LOCAL, message, null));
    }
    String encoding = computeEncoding();
    Charset charset;
    try {
        charset = Charset.forName(encoding);
    } catch (UnsupportedCharsetException ex) {
        String message = NLSUtility.format(FileBuffersMessages.ResourceTextFileBuffer_error_unsupported_encoding_message_arg, encoding);
        IStatus s = new Status(IStatus.ERROR, FileBuffersPlugin.PLUGIN_ID, IStatus.OK, message, ex);
        throw new CoreException(s);
    } catch (IllegalCharsetNameException ex) {
        String message = NLSUtility.format(FileBuffersMessages.ResourceTextFileBuffer_error_illegal_encoding_message_arg, encoding);
        IStatus s = new Status(IStatus.ERROR, FileBuffersPlugin.PLUGIN_ID, IStatus.OK, message, ex);
        throw new CoreException(s);
    }
    CharsetEncoder encoder = charset.newEncoder();
    encoder.onMalformedInput(CodingErrorAction.REPLACE);
    encoder.onUnmappableCharacter(CodingErrorAction.REPORT);
    byte[] bytes;
    int bytesLength;
    try {
        ByteBuffer byteBuffer = encoder.encode(CharBuffer.wrap(fDocument.get()));
        bytesLength = byteBuffer.limit();
        if (byteBuffer.hasArray())
            bytes = byteBuffer.array();
        else {
            bytes = new byte[bytesLength];
            byteBuffer.get(bytes);
        }
    } catch (CharacterCodingException ex) {
        Assert.isTrue(ex instanceof UnmappableCharacterException);
        String message = NLSUtility.format(FileBuffersMessages.ResourceTextFileBuffer_error_charset_mapping_failed_message_arg, encoding);
        IStatus s = new Status(IStatus.ERROR, FileBuffersPlugin.PLUGIN_ID, IFileBufferStatusCodes.CHARSET_MAPPING_FAILED, message, null);
        throw new CoreException(s);
    }
    IFileInfo fileInfo = fFileStore.fetchInfo();
    if (fileInfo != null && fileInfo.exists()) {
        if (!overwrite)
            checkSynchronizationState();
        InputStream stream = new ByteArrayInputStream(bytes, 0, bytesLength);
        /*
			 * XXX:
			 * This is a workaround for a corresponding bug in Java readers and writer,
			 * see http://developer.java.sun.com/developer/bugParade/bugs/4508058.html
			 */
        if (fHasBOM && CHARSET_UTF_8.equals(encoding))
            stream = new SequenceInputStream(new ByteArrayInputStream(IContentDescription.BOM_UTF_8), stream);
        // here the file synchronizer should actually be removed and afterwards added again. However,
        // we are already inside an operation, so the delta is sent AFTER we have added the listener
        setFileContents(stream, monitor);
        // set synchronization stamp to know whether the file synchronizer must become active
        fSynchronizationStamp = fFileStore.fetchInfo().getLastModified();
        if (fAnnotationModel instanceof IPersistableAnnotationModel) {
            IPersistableAnnotationModel persistableModel = (IPersistableAnnotationModel) fAnnotationModel;
            persistableModel.commit(fDocument);
        }
    } else {
        fFileStore.getParent().mkdir(EFS.NONE, null);
        try (OutputStream out = fFileStore.openOutputStream(EFS.NONE, null)) {
            /*
				 * XXX:
				 * This is a workaround for a corresponding bug in Java readers and writer,
				 * see http://developer.java.sun.com/developer/bugParade/bugs/4508058.html
				 */
            if (fHasBOM && CHARSET_UTF_8.equals(encoding))
                out.write(IContentDescription.BOM_UTF_8);
            out.write(bytes, 0, bytesLength);
            out.flush();
            out.close();
        } catch (IOException x) {
            IStatus s = new Status(IStatus.ERROR, FileBuffersPlugin.PLUGIN_ID, IStatus.OK, x.getLocalizedMessage(), x);
            throw new CoreException(s);
        }
        // set synchronization stamp to know whether the file synchronizer must become active
        fSynchronizationStamp = fFileStore.fetchInfo().getLastModified();
    }
}
Also used : IStatus(org.eclipse.core.runtime.IStatus) Status(org.eclipse.core.runtime.Status) IResourceStatus(org.eclipse.core.resources.IResourceStatus) IPersistableAnnotationModel(org.eclipse.core.filebuffers.IPersistableAnnotationModel) IStatus(org.eclipse.core.runtime.IStatus) ByteArrayInputStream(java.io.ByteArrayInputStream) SequenceInputStream(java.io.SequenceInputStream) InputStream(java.io.InputStream) OutputStream(java.io.OutputStream) Charset(java.nio.charset.Charset) CharacterCodingException(java.nio.charset.CharacterCodingException) IOException(java.io.IOException) CharsetEncoder(java.nio.charset.CharsetEncoder) ByteBuffer(java.nio.ByteBuffer) IllegalCharsetNameException(java.nio.charset.IllegalCharsetNameException) IFileInfo(org.eclipse.core.filesystem.IFileInfo) CoreException(org.eclipse.core.runtime.CoreException) SequenceInputStream(java.io.SequenceInputStream) ByteArrayInputStream(java.io.ByteArrayInputStream) UnsupportedCharsetException(java.nio.charset.UnsupportedCharsetException) UnmappableCharacterException(java.nio.charset.UnmappableCharacterException)

Example 3 with IPersistableAnnotationModel

use of org.eclipse.core.filebuffers.IPersistableAnnotationModel in project eclipse.platform.text by eclipse.

the class ResourceTextFileBuffer method handleFileContentChanged.

@Override
protected void handleFileContentChanged(boolean revert, boolean updateModificationStamp) throws CoreException {
    IDocument document = getManager().createEmptyDocument(fFile);
    IStatus status = null;
    try {
        cacheEncodingState();
        setDocumentContent(document, fFile, fEncoding);
    } catch (CoreException x) {
        status = x.getStatus();
    }
    String newContent = document.get();
    boolean replaceContent = updateModificationStamp || !newContent.equals(fDocument.get());
    if (replaceContent)
        fManager.fireBufferContentAboutToBeReplaced(this);
    removeFileBufferContentListeners();
    fSynchronizationStamp = fFile.getModificationStamp();
    if (replaceContent) {
        if (fDocument instanceof IDocumentExtension4)
            ((IDocumentExtension4) fDocument).set(newContent, fSynchronizationStamp);
        else
            fDocument.set(newContent);
    }
    fCanBeSaved = false;
    fStatus = status;
    addFileBufferContentListeners();
    if (replaceContent)
        fManager.fireBufferContentReplaced(this);
    if (fAnnotationModel instanceof IPersistableAnnotationModel) {
        IPersistableAnnotationModel persistableModel = (IPersistableAnnotationModel) fAnnotationModel;
        try {
            if (revert)
                persistableModel.revert(fDocument);
            else
                persistableModel.reinitialize(fDocument);
        } catch (CoreException x) {
            fStatus = x.getStatus();
        }
    }
    fManager.fireDirtyStateChanged(this, fCanBeSaved);
}
Also used : IPersistableAnnotationModel(org.eclipse.core.filebuffers.IPersistableAnnotationModel) IStatus(org.eclipse.core.runtime.IStatus) CoreException(org.eclipse.core.runtime.CoreException) IDocumentExtension4(org.eclipse.jface.text.IDocumentExtension4) IDocument(org.eclipse.jface.text.IDocument)

Example 4 with IPersistableAnnotationModel

use of org.eclipse.core.filebuffers.IPersistableAnnotationModel in project eclipse.platform.text by eclipse.

the class ResourceTextFileBuffer method commitFileBufferContent.

@Override
protected void commitFileBufferContent(IProgressMonitor monitor, boolean overwrite) throws CoreException {
    if (!isSynchronized() && !overwrite) {
        String message = NLSUtility.format(FileBuffersMessages.FileBuffer_error_outOfSync, getFileStore().toURI());
        throw new CoreException(new Status(IStatus.WARNING, FileBuffersPlugin.PLUGIN_ID, IResourceStatus.OUT_OF_SYNC_LOCAL, message, null));
    }
    String encoding = computeEncoding();
    if (fBOM == IContentDescription.BOM_UTF_16LE && CHARSET_UTF_16.equals(encoding))
        encoding = CHARSET_UTF_16LE;
    Charset charset;
    try {
        charset = Charset.forName(encoding);
    } catch (UnsupportedCharsetException ex) {
        String message = NLSUtility.format(FileBuffersMessages.ResourceTextFileBuffer_error_unsupported_encoding_message_arg, encoding);
        IStatus s = new Status(IStatus.ERROR, FileBuffersPlugin.PLUGIN_ID, IStatus.OK, message, ex);
        throw new CoreException(s);
    } catch (IllegalCharsetNameException ex) {
        String message = NLSUtility.format(FileBuffersMessages.ResourceTextFileBuffer_error_illegal_encoding_message_arg, encoding);
        IStatus s = new Status(IStatus.ERROR, FileBuffersPlugin.PLUGIN_ID, IStatus.OK, message, ex);
        throw new CoreException(s);
    }
    CharsetEncoder encoder = charset.newEncoder();
    encoder.onMalformedInput(CodingErrorAction.REPLACE);
    encoder.onUnmappableCharacter(CodingErrorAction.REPORT);
    InputStream stream;
    try {
        byte[] bytes;
        ByteBuffer byteBuffer = encoder.encode(CharBuffer.wrap(fDocument.get()));
        if (byteBuffer.hasArray())
            bytes = byteBuffer.array();
        else {
            bytes = new byte[byteBuffer.limit()];
            byteBuffer.get(bytes);
        }
        stream = new ByteArrayInputStream(bytes, 0, byteBuffer.limit());
    } catch (CharacterCodingException ex) {
        Assert.isTrue(ex instanceof UnmappableCharacterException);
        String message = NLSUtility.format(FileBuffersMessages.ResourceTextFileBuffer_error_charset_mapping_failed_message_arg, encoding);
        IStatus s = new Status(IStatus.ERROR, FileBuffersPlugin.PLUGIN_ID, IFileBufferStatusCodes.CHARSET_MAPPING_FAILED, message, ex);
        throw new CoreException(s);
    }
    /*
		 * XXX:
		 * This is a workaround for a corresponding bug in Java readers and writer,
		 * see http://developer.java.sun.com/developer/bugParade/bugs/4508058.html
		 */
    if (fBOM == IContentDescription.BOM_UTF_8 && CHARSET_UTF_8.equals(encoding))
        stream = new SequenceInputStream(new ByteArrayInputStream(IContentDescription.BOM_UTF_8), stream);
    if (fBOM == IContentDescription.BOM_UTF_16LE && CHARSET_UTF_16LE.equals(encoding))
        stream = new SequenceInputStream(new ByteArrayInputStream(IContentDescription.BOM_UTF_16LE), stream);
    if (fFile.exists()) {
        // here the file synchronizer should actually be removed and afterwards added again. However,
        // we are already inside an operation, so the delta is sent AFTER we have added the listener
        fFile.setContents(stream, overwrite, true, monitor);
        if (fDocument instanceof IDocumentExtension4) {
            fSynchronizationStamp = ((IDocumentExtension4) fDocument).getModificationStamp();
            fFile.revertModificationStamp(fSynchronizationStamp);
        } else
            fSynchronizationStamp = fFile.getModificationStamp();
        if (fAnnotationModel instanceof IPersistableAnnotationModel) {
            IPersistableAnnotationModel persistableModel = (IPersistableAnnotationModel) fAnnotationModel;
            persistableModel.commit(fDocument);
        }
    } else {
        SubMonitor subMonitor = SubMonitor.convert(monitor, FileBuffersMessages.ResourceTextFileBuffer_task_saving, 2);
        ContainerCreator creator = new ContainerCreator(fFile.getWorkspace(), fFile.getParent().getFullPath());
        creator.createContainer(subMonitor.split(1));
        fFile.create(stream, false, subMonitor.split(1));
        // set synchronization stamp to know whether the file synchronizer must become active
        fSynchronizationStamp = fFile.getModificationStamp();
        subMonitor.split(1);
    // TODO commit persistable annotation model
    }
}
Also used : IStatus(org.eclipse.core.runtime.IStatus) Status(org.eclipse.core.runtime.Status) IResourceStatus(org.eclipse.core.resources.IResourceStatus) IPersistableAnnotationModel(org.eclipse.core.filebuffers.IPersistableAnnotationModel) IStatus(org.eclipse.core.runtime.IStatus) IDocumentExtension4(org.eclipse.jface.text.IDocumentExtension4) ByteArrayInputStream(java.io.ByteArrayInputStream) SequenceInputStream(java.io.SequenceInputStream) InputStream(java.io.InputStream) SubMonitor(org.eclipse.core.runtime.SubMonitor) Charset(java.nio.charset.Charset) CharacterCodingException(java.nio.charset.CharacterCodingException) CharsetEncoder(java.nio.charset.CharsetEncoder) ByteBuffer(java.nio.ByteBuffer) IllegalCharsetNameException(java.nio.charset.IllegalCharsetNameException) CoreException(org.eclipse.core.runtime.CoreException) SequenceInputStream(java.io.SequenceInputStream) ByteArrayInputStream(java.io.ByteArrayInputStream) UnsupportedCharsetException(java.nio.charset.UnsupportedCharsetException) UnmappableCharacterException(java.nio.charset.UnmappableCharacterException) ContainerCreator(org.eclipse.core.filebuffers.manipulation.ContainerCreator)

Aggregations

IPersistableAnnotationModel (org.eclipse.core.filebuffers.IPersistableAnnotationModel)4 CoreException (org.eclipse.core.runtime.CoreException)4 IStatus (org.eclipse.core.runtime.IStatus)3 ByteArrayInputStream (java.io.ByteArrayInputStream)2 InputStream (java.io.InputStream)2 SequenceInputStream (java.io.SequenceInputStream)2 ByteBuffer (java.nio.ByteBuffer)2 CharacterCodingException (java.nio.charset.CharacterCodingException)2 Charset (java.nio.charset.Charset)2 CharsetEncoder (java.nio.charset.CharsetEncoder)2 IllegalCharsetNameException (java.nio.charset.IllegalCharsetNameException)2 UnmappableCharacterException (java.nio.charset.UnmappableCharacterException)2 UnsupportedCharsetException (java.nio.charset.UnsupportedCharsetException)2 IFileInfo (org.eclipse.core.filesystem.IFileInfo)2 IResourceStatus (org.eclipse.core.resources.IResourceStatus)2 Status (org.eclipse.core.runtime.Status)2 IDocument (org.eclipse.jface.text.IDocument)2 IDocumentExtension4 (org.eclipse.jface.text.IDocumentExtension4)2 IOException (java.io.IOException)1 OutputStream (java.io.OutputStream)1