Copyright (c) 2000, 2008 IBM Corporation and others. This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which accompanies this distribution, and is available at https://www.eclipse.org/legal/epl-2.0/ SPDX-License-Identifier: EPL-2.0 Contributors: IBM Corporation - initial API and implementation
/******************************************************************************* * Copyright (c) 2000, 2008 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/legal/epl-2.0/ * * SPDX-License-Identifier: EPL-2.0 * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/
package org.eclipse.core.internal.filebuffers; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.filesystem.IFileInfo; import org.eclipse.core.filesystem.IFileStore; import org.eclipse.core.filesystem.URIUtil; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.jobs.ISchedulingRule; import org.eclipse.jface.text.IDocumentExtension4;
Since:3.3 (previously available as JavaFileBuffer since 3.0)
/** * @since 3.3 (previously available as JavaFileBuffer since 3.0) */
public abstract class FileStoreFileBuffer extends AbstractFileBuffer {
The location
/** The location */
protected IPath fLocation;
How often the element has been connected
/** How often the element has been connected */
protected int fReferenceCount;
Can the element be saved
/** Can the element be saved */
protected boolean fCanBeSaved= false;
The status of this element
/** The status of this element */
protected IStatus fStatus;
The time stamp at which this buffer synchronized with the underlying file.
/** The time stamp at which this buffer synchronized with the underlying file. */
protected long fSynchronizationStamp= IDocumentExtension4.UNKNOWN_MODIFICATION_STAMP;
How often the synchronization context has been requested
/** How often the synchronization context has been requested */
protected int fSynchronizationContextCount; public FileStoreFileBuffer(TextFileBufferManager manager) { super(manager); } abstract protected void addFileBufferContentListeners(); abstract protected void removeFileBufferContentListeners(); abstract protected void initializeFileBufferContent(IProgressMonitor monitor) throws CoreException; abstract protected void commitFileBufferContent(IProgressMonitor monitor, boolean overwrite) throws CoreException; public void create(IFileStore fileStore, IProgressMonitor monitor) throws CoreException { IFileInfo info= fileStore.fetchInfo(); fFileStore= fileStore; if (fLocation == null) fLocation= URIUtil.toPath(fileStore.toURI()); initializeFileBufferContent(monitor); if (info.exists()) fSynchronizationStamp= info.getLastModified(); addFileBufferContentListeners(); } @Override public void create(IPath location, IProgressMonitor monitor) throws CoreException { fLocation= location; create(EFS.getStore(URIUtil.toURI(getLocation())), monitor); } @Override public void connect() { ++ fReferenceCount; if (fReferenceCount == 1) connected(); }
Called when this file buffer has been connected. This is the case when there is exactly one connection.

Clients may extend this method.

/** * Called when this file buffer has been connected. This is the case when * there is exactly one connection. * <p> * Clients may extend this method. */
protected void connected() { } @Override public void disconnect() throws CoreException { --fReferenceCount; if (fReferenceCount <= 0) disconnected(); }
Called when this file buffer has been disconnected. This is the case when the number of connections drops below 1.

Clients may extend this method.

/** * Called when this file buffer has been disconnected. This is the case when * the number of connections drops below <code>1</code>. * <p> * Clients may extend this method. */
protected void disconnected() { } @Override protected boolean isDisconnected() { return fReferenceCount <= 0; } @Override public IPath getLocation() { return fLocation; } @Override public void commit(IProgressMonitor monitor, boolean overwrite) throws CoreException { if (!isDisconnected() && fCanBeSaved) { fManager.fireStateChanging(this); try { commitFileBufferContent(monitor, overwrite); } catch (CoreException | RuntimeException x) { fManager.fireStateChangeFailed(this); throw x; } fCanBeSaved= false; addFileBufferContentListeners(); fManager.fireDirtyStateChanged(this, fCanBeSaved); } } @Override public ISchedulingRule computeCommitRule() { return null; } @Override public boolean isDirty() { return fCanBeSaved; } @Override public void setDirty(boolean isDirty) { fCanBeSaved= isDirty; } @Override public boolean isShared() { return fReferenceCount > 1; } @Override public ISchedulingRule computeValidateStateRule() { return null; } @Override public void validateState(IProgressMonitor monitor, Object computationContext) throws CoreException { // nop } @Override public boolean isStateValidated() { return true; } @Override public void resetStateValidation() { // nop } @Override public boolean isSynchronized() { return fSynchronizationStamp == getModificationStamp(); } @Override public void requestSynchronizationContext() { ++ fSynchronizationContextCount; } @Override public void releaseSynchronizationContext() { -- fSynchronizationContextCount; } @Override public boolean isSynchronizationContextRequested() { return fSynchronizationContextCount > 0; } @Override public boolean isCommitable() { IFileInfo info= fFileStore.fetchInfo(); return info.exists() && !info.getAttribute(EFS.ATTRIBUTE_READ_ONLY); } @Override public void validationStateChanged(boolean validationState, IStatus status) { //nop } }