/* * Copyright (c) 2009-2012, 2015 Eike Stepper (Berlin, Germany) 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: * Eike Stepper - initial API and implementation */ package org.eclipse.emf.cdo.common.model; import org.eclipse.emf.cdo.common.util.CDOTimeProvider; import org.eclipse.emf.cdo.internal.common.messages.Messages; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EPackage.Registry; /** * Represents a tree structure of nested {@link EPackage packages} that are registered with a {@link CDOPackageRegistry * package registry} and that can only be serialized as a whole. * <p> * A package unit is the granule of committing or lazy loading packages. It contains some overall information like * {@link Type type}, {@link State state}, {@link #getTimeStamp() commit time} and nested {@link CDOPackageInfo package * info} objects that describe all the nested packages. * * @author Eike Stepper * @since 2.0 * @noextend This interface is not intended to be extended by clients. * @noimplement This interface is not intended to be implemented by clients. * @apiviz.landmark * @apiviz.has {@link CDOPackageUnit.Type} * @apiviz.has {@link CDOPackageUnit.State} * @apiviz.composedOf {@link CDOPackageInfo} */ public interface CDOPackageUnit extends Comparable<CDOPackageUnit>, CDOTimeProvider { /** * Returns the package registry this package unit is managed by. */ public CDOPackageRegistry getPackageRegistry(); /** * Returns the ID of this package unit. * <p> * Same as {@link #getTopLevelPackageInfo()}. {@link CDOPackageInfo#getPackageURI()}. */ public String getID(); /** * Returns the current state of this package unit. */ public State getState(); /** * Returns the current type of this package unit. */ public Type getType(); /** * Returns the type of this package unit as it was at the time it was originally committed by a client. */ public Type getOriginalType(); /** * Returns the time this package unit was originally committed. */ public long getTimeStamp(); /** * Returns the {@link CDOPackageInfo package info} object that describes the top level {@link EPackage package} of the * nested package tree structure described by this package unit. */ public CDOPackageInfo getTopLevelPackageInfo(); /** * Returns the {@link CDOPackageInfo package info} object that describes the {@link EPackage package} with the given * namespace URI, or <code>null</code> if this package unit does not contain a package with this URI. */ public CDOPackageInfo getPackageInfo(String packageURI); /** * Returns all {@link CDOPackageInfo package info} objects of the nested package tree structure described by this * package unit in depth-first traversal order. */ public CDOPackageInfo[] getPackageInfos(); /** * Returns all {@link EPackage packages} of the nested package tree structure described by this package unit in * depth-first traversal order. * * @param loadOnDemand * If <code>true</code> and this package unit is not {@link State#LOADED LOADED} the package unit is * implicitely loaded. If <code>false</code> and this package unit is not {@link State#LOADED LOADED} an * empty array is returned. */ public EPackage[] getEPackages(boolean loadOnDemand); /** * Returns <code>true</code> is this package unit describes one of the models <i>Ecore</i>, <i>Eresource</i> or * <i>Etypes</i>, <code>false</code> otherwise. * <p> * Note that the models <i>Ecore</i>, <i>Eresource</i> and <i>Etypes</i> are expected to be present as generated * {@link Type#NATIVE NATIVE} models in all deployments. */ public boolean isSystem(); /** * Returns <code>true</code> is this package unit describes the model <i>Eresource</i> , <code>false</code> otherwise. * <p> * Note that the model <i>Eresource</i> is expected to bepresent as generated {@link Type#NATIVE NATIVE} models in all * deployments. * * @since 4.0 */ public boolean isResource(); /** * Describes the possible states a {@link CDOPackageUnit package unit} may be in during its lifecycle. * * @author Eike Stepper */ public enum State { /** * The state of a {@link CDOPackageUnit package unit} after one of its described {@link EPackage packages} is newly * attached to a transactional {@link CDOPackageRegistry package registry}, but before the associated transaction is * committed. A {@link #NEW} package unit can only transition to {@link #LOADED} or {@link #DISPOSED}. */ NEW, /** * The state of a {@link CDOPackageUnit package unit} after the described {@link EPackage packages} are loaded or * wired from the {@link Registry#INSTANCE global package registry}. A {@link #LOADED} package unit can only * transition to {@link #DISPOSED}. */ LOADED, /** * The state of a {@link CDOPackageUnit package unit} after the context of the associated {@link CDOPackageRegistry * package registry} has been initialized, that is the repository been started or the session been opened. A * {@link #PROXY} package unit can only transition to {@link #LOADED} or {@link #DISPOSED}. */ PROXY, /** * The state of a {@link CDOPackageUnit package unit} after the associated {@link CDOPackageRegistry package * registry} has been deactivated, that is the repository been stopped or the session been closed. A * {@link #DISPOSED} package unit can not transition to any other state. */ DISPOSED } /** * Describes the instances of {@link EClass classes} of a {@link CDOPackageUnit package unit}. * * @author Eike Stepper */ public enum Type { /** * The type of models that are generated specifically for the usage with CDO. Instances of {@link EClass classes} of * these models can be directly cast to InternalCDOObject. */ NATIVE, /** * The type of models that are <b>not</b> generated specifically for the usage with CDO. Instances of {@link EClass * classes} of these models can <b>not</b> be directly cast to InternalCDOObject. */ LEGACY, /** * The type of models that are not generated <b>at all</b> but rather dynamically contructed at runtime. Instances * of {@link EClass classes} of these models <b>can</b> be directly cast to InternalCDOObject, i.e. they're * implicitely <i>native</i>. */ DYNAMIC, /** * Used to indicate that the type of a model could not be determined. Refer to the * {@link CDOPackageTypeRegistry#INSTANCE package type registry} on how to deal with this scenario. */ UNKNOWN; /** * Returns <code>true</code> if this type is either {@link #NATIVE} or {@link #LEGACY}, <code>false</code> * otherwise. */ public boolean isGenerated() { checkNotUnknown(); return this == NATIVE || this == LEGACY; } /** * @throws IllegalStateException * if this type is {@link #UNKNOWN}. */ public void checkNotUnknown() throws IllegalStateException { if (this == UNKNOWN) { throw new IllegalStateException(Messages.getString("CDOPackageUnit.0")); //$NON-NLS-1$ } } } }