org.eclipse.jdt.core.IOpenable.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.jdt.core.IOpenable.java

Source

/*******************************************************************************
 * Copyright (c) 2000, 2016 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.jdt.core;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;

/**
 * Common protocol for Java elements that must be opened before they can be
 * navigated or modified. Opening a textual element (such as a compilation unit)
 * involves opening a buffer on its contents.  While open, any changes to the buffer
 * can be reflected in the element's structure;
 * see {@link #isConsistent} and {@link #makeConsistent(IProgressMonitor)}.
 * <p>
 * To reduce complexity in clients, elements are automatically opened
 * by the Java model as element properties are accessed. The Java model maintains
 * an LRU cache of open elements, and automatically closes elements as they
 * are swapped out of the cache to make room for other elements. Elements with
 * unsaved changes are never removed from the cache, and thus, if the client
 * maintains many open elements with unsaved
 * changes, the LRU cache can grow in size (in this case the cache is not
 * bounded). However, as elements are saved, the cache will shrink back to its
 * original bounded size.
 * </p>
 * <p>
 * To open an element, all openable parent elements must be open.
 * The Java model automatically opens parent elements, as it automatically opens elements.
 * Opening an element may provide access to direct children and other descendants,
 * but does not automatically open any descendents which are themselves {@link IOpenable}.
 * For example, opening a compilation unit provides access to all its constituent elements,
 * but opening a package fragment does not open all compilation units in the package fragment.
 * </p>
 *
 * @noimplement This interface is not intended to be implemented by clients.
 */
public interface IOpenable {

    /**
     * Closes this element and its buffer (if any).
     * Closing an element which is not open has no effect.
     *
     * <p>Note: Although {@link #close} is exposed in the API, clients are
     * not expected to open and close elements - the Java model does this automatically
     * as elements are accessed.
     *
     * @exception JavaModelException if an error occurs closing this element
     */
    public void close() throws JavaModelException;

    /**
     * Finds and returns the recommended line separator for this element.
     * The element's buffer is first searched and the first line separator in this buffer is returned if any.
     * Otherwise the preference {@link org.eclipse.core.runtime.Platform#PREF_LINE_SEPARATOR}
     * on this element's project or workspace is returned.
     * Finally if no such preference is set, the system line separator is returned.
     *
     * @return the recommended line separator for this element
     * @exception JavaModelException if this element does not exist or if an
     *      exception occurs while accessing its corresponding resource.
     * @since 3.2
     */
    public String findRecommendedLineSeparator() throws JavaModelException;

    /**
     * Returns the buffer opened for this element, or <code>null</code>
     * if this element does not have a buffer.
     *
     * @exception JavaModelException if this element does not exist or if an
     *      exception occurs while accessing its corresponding resource.
     * @return the buffer opened for this element, or <code>null</code>
     * if this element does not have a buffer
     */
    public IBuffer getBuffer() throws JavaModelException;

    /**
     * Returns <code>true</code> if this element is open and:
     * <ul>
     * <li>its buffer has unsaved changes, or
     * <li>one of its descendants has unsaved changes, or
     * <li>a working copy has been created on one of this
     * element's children and has not yet destroyed
     * </ul>
     *
     * @exception JavaModelException if this element does not exist or if an
     *      exception occurs while accessing its corresponding resource.
     * @return <code>true</code> if this element is open and:
     * <ul>
     * <li>its buffer has unsaved changes, or
     * <li>one of its descendants has unsaved changes, or
     * <li>a working copy has been created on one of this
     * element's children and has not yet destroyed
     * </ul>
     */
    boolean hasUnsavedChanges() throws JavaModelException;

    /**
     * Returns whether the element is consistent with its underlying resource or buffer.
     * The element is consistent when opened, and is consistent if the underlying resource
     * or buffer has not been modified since it was last consistent.
     *
     * <p>NOTE: Child consistency is not considered. For example, a package fragment
     * responds <code>true</code> when it knows about all of its
     * compilation units present in its underlying folder. However, one or more of
     * the compilation units could be inconsistent.
     *
     * @exception JavaModelException if this element does not exist or if an
     *      exception occurs while accessing its corresponding resource.
     * @return true if the element is consistent with its underlying resource or buffer, false otherwise.
     * @see IOpenable#makeConsistent(IProgressMonitor)
     */
    boolean isConsistent() throws JavaModelException;

    /**
     * Returns whether this openable is open. This is a handle-only method.
     * 
     * <p>Note: This method doesn't tell whether an {@link IJavaProject}'s {@link IJavaProject#getProject() getProject()} is open.
     * It is <b>not</b> equivalent to {@link IProject#isOpen()}!</p>
     * 
     * <p>Note: Although {@link #isOpen} is exposed in the API, clients
     * rarely have a need to rely on this internal state of the Java model.</p>
        
     * @return true if this openable is open, false otherwise
     */
    boolean isOpen();

    /**
     * Makes this element consistent with its underlying resource or buffer
     * by updating the element's structure and properties as necessary.
     *<p>
     * Note: Using this functionality on a working copy will interfere with any
     * subsequent reconciling operation. Indeed, the next
     * {@link ICompilationUnit#reconcile(int, boolean, WorkingCopyOwner, IProgressMonitor)} or
     * {@link ICompilationUnit#reconcile(int, boolean, boolean, WorkingCopyOwner, IProgressMonitor)}
     * operation will not account for changes which occurred before an
     * explicit use of {@link #makeConsistent(IProgressMonitor)}
     * <p>
     * @param progress the given progress monitor
     * @exception JavaModelException if the element is unable to access the contents
     *       of its underlying resource. Reasons include:
     * <ul>
     *  <li>This Java element does not exist (ELEMENT_DOES_NOT_EXIST)</li>
     * </ul>
     * @see IOpenable#isConsistent()
     * @see ICompilationUnit#reconcile(int, boolean, WorkingCopyOwner, IProgressMonitor)
     */
    void makeConsistent(IProgressMonitor progress) throws JavaModelException;

    /**
     * Opens this element and all parent elements that are not already open.
     * For compilation units, a buffer is opened on the contents of the underlying resource.
     *
     * <p>Note: Although {@link #open} is exposed in the API, clients are
     * not expected to open and close elements - the Java model does this automatically
     * as elements are accessed.
     *
     * @param progress the given progress monitor
     * @exception JavaModelException if an error occurs accessing the contents
     *       of its underlying resource. Reasons include:
     * <ul>
     *  <li>This Java element does not exist (ELEMENT_DOES_NOT_EXIST)</li>
     * </ul>
     */
    public void open(IProgressMonitor progress) throws JavaModelException;

    /**
     * Saves any changes in this element's buffer to its underlying resource
     * via a workspace resource operation. This has no effect if the element has no underlying
     * buffer, or if there are no unsaved changed in the buffer.
     * <p>
     * The <code>force</code> parameter controls how this method deals with
     * cases where the workbench is not completely in sync with the local file system.
     * If <code>false</code> is specified, this method will only attempt
     * to overwrite a corresponding file in the local file system provided
     * it is in sync with the workbench. This option ensures there is no
     * unintended data loss; it is the recommended setting.
     * However, if <code>true</code> is specified, an attempt will be made
     * to write a corresponding file in the local file system,
     * overwriting any existing one if need be.
     * In either case, if this method succeeds, the resource will be marked
     * as being local (even if it wasn't before).
     * <p>
     * As a result of this operation, the element is consistent with its underlying
     * resource or buffer.
     *
     * @param progress the given progress monitor
     * @param force it controls how this method deals with
     * cases where the workbench is not completely in sync with the local file system
     * @exception JavaModelException if an error occurs accessing the contents
     *       of its underlying resource. Reasons include:
     * <ul>
     *  <li>This Java element does not exist (ELEMENT_DOES_NOT_EXIST)</li>
     *  <li>This Java element is read-only (READ_ONLY)</li>
     * </ul>
     */
    public void save(IProgressMonitor progress, boolean force) throws JavaModelException;
}