org.enterprisedomain.classmaker.impl.StateImpl.java Source code

Java tutorial

Introduction

Here is the source code for org.enterprisedomain.classmaker.impl.StateImpl.java

Source

/**
 * Copyright 2012-2017 Kyrill Zotkin
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.enterprisedomain.classmaker.impl;

import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.SortedSet;
import java.util.TreeSet;

import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.common.util.ECollections;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.EMap;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EContentAdapter;
import org.eclipse.emf.ecore.util.EDataTypeUniqueEList;
import org.eclipse.emf.ecore.util.EcoreEMap;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.util.InternalEList;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.LogCommand;
import org.eclipse.jgit.api.errors.CheckoutConflictException;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.m2m.internal.qvt.oml.cst.parser.NLS;
import org.eclipse.pde.core.project.IBundleProjectDescription;
import org.eclipse.pde.core.project.IBundleProjectService;
import org.enterprisedomain.classmaker.ClassMakerPackage;
import org.enterprisedomain.classmaker.ClassMakerService;
import org.enterprisedomain.classmaker.CompletionListener;
import org.enterprisedomain.classmaker.Contribution;
import org.enterprisedomain.classmaker.Customizer;
import org.enterprisedomain.classmaker.Item;
import org.enterprisedomain.classmaker.Messages;
import org.enterprisedomain.classmaker.ModelPair;
import org.enterprisedomain.classmaker.Project;
import org.enterprisedomain.classmaker.Revision;
import org.enterprisedomain.classmaker.SCMOperator;
import org.enterprisedomain.classmaker.Stage;
import org.enterprisedomain.classmaker.StageQualifier;
import org.enterprisedomain.classmaker.State;
import org.enterprisedomain.classmaker.core.ClassMakerPlugin;
import org.enterprisedomain.classmaker.core.WrappingProgressMonitor;
import org.enterprisedomain.classmaker.jobs.EnterpriseDomainJob;
import org.enterprisedomain.classmaker.jobs.Worker;
import org.enterprisedomain.classmaker.jobs.export.AbstractExporter;
import org.enterprisedomain.classmaker.util.ListUtil;
import org.enterprisedomain.classmaker.util.ModelUtil;
import org.enterprisedomain.classmaker.util.ResourceUtils;
import org.osgi.framework.Version;

/**
 * <!-- begin-user-doc --> An implementation of the model object '
 * <em><b>State</b></em>'. <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 * <li>{@link org.enterprisedomain.classmaker.impl.StateImpl#getPackageClassName
 * <em>Package Class Name</em>}</li>
 * <li>{@link org.enterprisedomain.classmaker.impl.StateImpl#getRequiredPlugins
 * <em>Required Plugins</em>}</li>
 * <li>{@link org.enterprisedomain.classmaker.impl.StateImpl#getRevision
 * <em>Revision</em>}</li>
 * <li>{@link org.enterprisedomain.classmaker.impl.StateImpl#getTimestamp
 * <em>Timestamp</em>}</li>
 * <li>{@link org.enterprisedomain.classmaker.impl.StateImpl#getDeployableUnitName
 * <em>Deployable Unit Name</em>}</li>
 * <li>{@link org.enterprisedomain.classmaker.impl.StateImpl#getJobFamily
 * <em>Job Family</em>}</li>
 * <li>{@link org.enterprisedomain.classmaker.impl.StateImpl#getResource
 * <em>Resource</em>}</li>
 * <li>{@link org.enterprisedomain.classmaker.impl.StateImpl#getCommitIds
 * <em>Commit Ids</em>}</li>
 * <li>{@link org.enterprisedomain.classmaker.impl.StateImpl#getCommitId
 * <em>Commit Id</em>}</li>
 * <li>{@link org.enterprisedomain.classmaker.impl.StateImpl#getStateCustomizers
 * <em>State Customizers</em>}</li>
 * <li>{@link org.enterprisedomain.classmaker.impl.StateImpl#getProjectName
 * <em>Project Name</em>}</li>
 * <li>{@link org.enterprisedomain.classmaker.impl.StateImpl#isMaking
 * <em>Making</em>}</li>
 * </ul>
 *
 * @generated
 */
public class StateImpl extends ItemImpl implements State {

    /**
     * The default value of the '{@link #getPackageClassName() <em>Package Class
     * Name</em>}' attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @see #getPackageClassName()
     * @generated
     * @ordered
     */
    protected static final String PACKAGE_CLASS_NAME_EDEFAULT = null;

    /**
     * The cached value of the '{@link #getPackageClassName() <em>Package Class
     * Name</em>}' attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @see #getPackageClassName()
     * @generated
     * @ordered
     */
    protected String packageClassName = PACKAGE_CLASS_NAME_EDEFAULT;

    /**
     * The cached value of the '{@link #getRequiredPlugins() <em>Required
     * Plugins</em>}' attribute list. <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @see #getRequiredPlugins()
     * @generated
     * @ordered
     */
    protected EList<String> requiredPlugins;

    public class StateAdapter extends AdapterImpl {

        @Override
        public void notifyChanged(Notification msg) {
            if (msg.getFeatureID(State.class) == ClassMakerPackage.STATE__MODEL_NAME
                    && msg.getEventType() == Notification.SET && msg.getNewStringValue() != null
                    && eIsSet(ClassMakerPackage.STATE__PROJECT))
                setProjectName(
                        getProject().getWorkspace().getService().computeProjectName(msg.getNewStringValue()));
            // if (eContainer() != null && eIsSet(ClassMakerPackage.STATE__REVISION)
            // && eIsSet(ClassMakerPackage.STATE__CONTRIBUTION) &&
            // !getContribution().isSavingResource()
            // && msg.getFeatureID(State.class) == ClassMakerPackage.STATE__RESOURCE
            // && msg.getEventType() == Notification.SET && msg.getNewValue() != null) {
            // Resource resource = (Resource) msg.getNewValue();
            // resource.eAdapters().remove(resourceToModelsAdapter);
            // resource.eAdapters().add(resourceToModelsAdapter);
            // }

        }

    }

    public class MakingCompletionListener extends CompletionListenerImpl {

        @Override
        public void completed(Project result) throws Exception {
            if (((Contribution) result).getState().equals(StateImpl.this)) {
                setMaking(false);
                synchronized (makingLock) {
                    makingLock.notifyAll();
                }
            }
        }

    }

    /**
     * The default value of the '{@link #getTimestamp() <em>Timestamp</em>}'
     * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @see #getTimestamp()
     * @generated
     * @ordered
     */
    protected static final long TIMESTAMP_EDEFAULT = 0L;

    /**
     * The cached value of the '{@link #getTimestamp() <em>Timestamp</em>}'
     * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @see #getTimestamp()
     * @generated
     * @ordered
     */
    protected long timestamp = TIMESTAMP_EDEFAULT;

    /**
     * The default value of the '{@link #getVersion() <em>Version</em>}' attribute.
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @see #getVersion()
     * @generated NOT
     * @ordered
     */
    protected static final Version VERSION_EDEFAULT = Version.emptyVersion;

    /**
     * The default value of the '{@link #getDeployableUnitName() <em>Deployable Unit
     * Name</em>}' attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @see #getDeployableUnitName()
     * @generated
     * @ordered
     */
    protected static final String DEPLOYABLE_UNIT_NAME_EDEFAULT = ""; //$NON-NLS-1$

    /**
     * The default value of the '{@link #getJobFamily() <em>Job Family</em>}'
     * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @see #getJobFamily()
     * @generated
     * @ordered
     */
    protected static final String JOB_FAMILY_EDEFAULT = null;

    /**
     * The cached value of the '{@link #getJobFamily() <em>Job Family</em>}'
     * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @see #getJobFamily()
     * @generated
     * @ordered
     */
    protected String jobFamily = JOB_FAMILY_EDEFAULT;

    /**
     * The cached value of the '{@link #getResource() <em>Resource</em>}' reference.
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @see #getResource()
     * @generated
     * @ordered
     */
    protected Resource resource;

    /**
     * The cached value of the '{@link #getCommitIds() <em>Commit Ids</em>}'
     * attribute list. <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @see #getCommitIds()
     * @generated
     * @ordered
     */
    protected EList<String> commitIds;

    /**
     * The default value of the '{@link #getCommitId() <em>Commit Id</em>}'
     * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @see #getCommitId()
     * @generated
     * @ordered
     */
    protected static final String COMMIT_ID_EDEFAULT = null;

    /**
     * The cached value of the '{@link #getCommitId() <em>Commit Id</em>}'
     * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @see #getCommitId()
     * @generated
     * @ordered
     */
    protected String commitId = COMMIT_ID_EDEFAULT;

    /**
     * The cached value of the '{@link #getStateCustomizers() <em>State
     * Customizers</em>}' map. <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @see #getStateCustomizers()
     * @generated
     * @ordered
     */
    protected EMap<StageQualifier, Customizer> stateCustomizers;

    /**
     * The default value of the '{@link #getProjectName() <em>Project Name</em>}'
     * attribute. <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @see #getProjectName()
     * @generated
     * @ordered
     */
    protected static final String PROJECT_NAME_EDEFAULT = null;

    /**
     * The default value of the '{@link #isMaking() <em>Making</em>}' attribute.
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @see #isMaking()
     * @generated
     * @ordered
     */
    protected static final boolean MAKING_EDEFAULT = false;

    /**
     * The cached value of the '{@link #isMaking() <em>Making</em>}' attribute. <!--
     * begin-user-doc --> <!-- end-user-doc -->
     * 
     * @see #isMaking()
     * @generated
     * @ordered
     */
    protected boolean making = MAKING_EDEFAULT;

    protected String language = LANGUAGE_EDEFAULT;

    private boolean loading = false;

    private Object makingLock = new Object();

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    protected StateImpl() {
        super();
        eAdapters().add(new StateAdapter());
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    protected EClass eStaticClass() {
        return ClassMakerPackage.Literals.STATE;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public String getPackageClassName() {
        return packageClassName;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public void setPackageClassName(String newPackageClassName) {
        String oldPackageClassName = packageClassName;
        packageClassName = newPackageClassName;
        if (eNotificationRequired())
            eNotify(new ENotificationImpl(this, Notification.SET, ClassMakerPackage.STATE__PACKAGE_CLASS_NAME,
                    oldPackageClassName, packageClassName));
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public EList<String> getRequiredPlugins() {
        if (requiredPlugins == null) {
            requiredPlugins = new EDataTypeUniqueEList<String>(String.class, this,
                    ClassMakerPackage.STATE__REQUIRED_PLUGINS);
        }
        return requiredPlugins;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public long getTimestamp() {
        return timestamp;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public void setTimestamp(long newTimestamp) {
        long oldTimestamp = timestamp;
        timestamp = newTimestamp;
        if (eNotificationRequired())
            eNotify(new ENotificationImpl(this, Notification.SET, ClassMakerPackage.STATE__TIMESTAMP, oldTimestamp,
                    timestamp));
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public String getDeployableUnitName() {
        String separator = "_"; //$NON-NLS-1$
        return getProjectName() + separator + getRevision().getVersion().toString();
    }

    @Override
    public Item basicGetParent() {
        return getRevision();
    }

    @Override
    public void setParent(Item newParent) {
        if (newParent instanceof Revision)
            ((Revision) newParent).getStateHistory().put(getTimestamp(), this);
        super.setParent(newParent);
    }

    @Override
    public String initialize(boolean commit) {
        if (!eIsSet(ClassMakerPackage.STATE__MODEL_NAME))
            super.initialize(commit);
        if (eIsSet(ClassMakerPackage.STATE__PROJECT)
                && getProject().eIsSet(ClassMakerPackage.Literals.PROJECT__PROJECT_NAME)
                && ResourceUtils.isProjectExists(getProjectName())) {
            URI modelURI = getModelURI();
            loadResource(modelURI, !eIsSet(ClassMakerPackage.STATE__RESOURCE), true);
            saveResource();
            setPhase(Stage.MODELED);
            IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
            if (commit)
                try {
                    String[] segments = modelURI.deresolve(URI.createFileURI(root.getRawLocation().toString()))
                            .segments();
                    String[] path = new String[segments.length - 2];
                    System.arraycopy(segments, 2, path, 0, segments.length - 2);
                    add(URI.createHierarchicalURI(path, null, null).toString());
                    String result = commit();
                    return result;
                } catch (Exception e) {
                    ClassMakerPlugin.getInstance().getLog().log(ClassMakerPlugin.createErrorStatus(e));
                    return null;
                }
            else {
                @SuppressWarnings("unchecked")
                SCMOperator<Git> operator = (SCMOperator<Git>) getProject().getWorkspace().getSCMRegistry()
                        .get(getProjectName());
                try {
                    Git git = operator.getRepositorySCM();
                    Ref branch = git.getRepository().findRef(getRevision().getVersion().toString());
                    LogCommand log = git.log();
                    log.add(branch.getObjectId());
                    Iterable<RevCommit> commits = log.call();
                    for (RevCommit c : commits) {
                        if (operator.decodeTimestamp(c.getShortMessage()) == getTimestamp()) {
                            String id = c.getId().toString();
                            getCommitIds().add(id);
                            setCommitId(id);
                        }
                    }
                } catch (Exception e) {
                } finally {
                    try {
                        operator.ungetRepositorySCM();
                    } catch (Exception e) {
                        ClassMakerPlugin.getInstance().getLog().log(ClassMakerPlugin.createErrorStatus(e));
                    }
                }
                getProject().checkout(getRevision().getVersion(), getTimestamp(), getCommitId());
            }
        }
        return getCommitId(); // $NON-NLS-1$
    }

    private URI modelURI;

    private URI getModelURI() {
        if (modelURI == null) {
            IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
            IProject project = root.getProject(eIsSet(ClassMakerPackage.STATE__PROJECT_NAME) ? getProjectName()
                    : getModelName().toLowerCase());
            IProgressMonitor monitor = ClassMakerPlugin.getProgressMonitor();
            IFolder folder = project.getFolder(ResourceUtils.getModelFolderName());
            if (!folder.exists()) {
                try {
                    folder.create(true, true, monitor);
                } catch (CoreException e) {
                    ClassMakerPlugin.getInstance().getLog().log(e.getStatus());
                } finally {
                    monitor.done();
                }
            }
            modelURI = URI.createFileURI(root.getRawLocation().append(getProject().getResourcePath()).toString());
        }
        return modelURI;
    }

    @Override
    public String getModelName() {
        if (super.getModelName() == null && eIsSet(ClassMakerPackage.STATE__PROJECT_NAME))
            setModelName(getProjectName());
        else if (!eIsSet(ClassMakerPackage.STATE__PROJECT_NAME) && eIsSet(ClassMakerPackage.STATE__REVISION))
            setModelName(getRevision().getModelName());
        return super.getModelName();
    }

    public void loadResource(URI modelURI, boolean create, boolean loadOnDemand) {
        if (loading)
            return;
        loading = true;
        boolean created = false;
        ResourceSet resourceSet = getProject().getWorkspace().getResourceSet();
        File modelFile = new File(modelURI.toFileString());
        if (modelFile.exists())
            setResource(resourceSet.getResource(modelURI, loadOnDemand));
        else if (create && !eIsSet(ClassMakerPackage.STATE__RESOURCE)) {
            setResource(resourceSet.createResource(modelURI));
            created = true;
        }
        getResource().eAdapters().remove(resourceToModelsAdapter);
        getResource().eAdapters().add(resourceToModelsAdapter);
        getDomainModel().eAdapters().remove(modelsToResourceAdapter);
        getDomainModel().eAdapters().add(modelsToResourceAdapter);
        if (created) {
            loading = false;
            return;
        }
        try {
            getResource().load(Collections.emptyMap());
        } catch (IOException e) {
            ClassMakerPlugin.getInstance().getLog().log(ClassMakerPlugin.createWarningStatus(e));
        }
        if (!getResource().getContents().isEmpty()) {
            getDomainModel().setDynamic(EcoreUtil.copy((EPackage) getResource().getContents().get(0)));
        }
        loading = false;
    }

    public void saveResource() {
        if (getProject().isSavingResource() || isMaking())
            return;
        getProject().setSavingResource(true);
        setMaking(true);
        if (!eIsSet(ClassMakerPackage.STATE__RESOURCE))
            return;
        if (getPhase().getValue() >= Stage.MODELED_VALUE && getDomainModel().getDynamic() != null
                && getDomainModel().getDynamic().eResource() != null) {
            Resource importSource = getDomainModel().getDynamic().eResource();
            try {
                importSource.load(Collections.emptyMap());
            } catch (IOException e) {
                ClassMakerPlugin.getInstance().getLog().log(ClassMakerPlugin.createWarningStatus(e));
            }
            boolean deliver = resource.eDeliver();
            resource.eSetDeliver(false);
            resource.getContents().clear();
            resource.getContents().addAll(EcoreUtil.copyAll(importSource.getContents()));
            importSource.unload();
            resource.eSetDeliver(deliver);
            ClassMakerPlugin.getInstance().getLog().log(
                    ClassMakerPlugin.createInfoStatus(NLS.bind(Messages.ResourceImported, importSource.getURI())));
        } else if (getPhase().getValue() >= Stage.MODELED_VALUE && getDomainModel().getDynamic() != null
                && packagesDiffer(getDomainModel().getDynamic(), resource.getContents())) {
            boolean deliver = resource.eDeliver();
            resource.eSetDeliver(false);
            resource.getContents().clear();
            resource.getContents().add(EcoreUtil.copy(getDomainModel().getDynamic()));
            resource.eSetDeliver(deliver);
        }
        try {
            resource.save(Collections.emptyMap());
        } catch (IOException e) {
            ClassMakerPlugin.getInstance().getLog().log(ClassMakerPlugin.createWarningStatus(e));
        } finally {
            if (isMaking())
                setMaking(false);
            getProject().setSavingResource(false);
        }

    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public Worker createGenerator() {
        return create(
                ClassMakerService.Stages.lookup(ClassMakerService.Stages.ID_PREFIX + "project.create.generator"), //$NON-NLS-1$
                getEclipseProject(), getTimestamp());
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public Worker createExporter() {
        return create(
                ClassMakerService.Stages.lookup(ClassMakerService.Stages.ID_PREFIX + "project.create.exporter"), //$NON-NLS-1$
                Long.valueOf(getTimestamp()));
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public Worker createInstaller() {
        return create(
                ClassMakerService.Stages.lookup(ClassMakerService.Stages.ID_PREFIX + "project.create.installer"), //$NON-NLS-1$
                Long.valueOf(getTimestamp()));
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public Worker createModelLoader() {
        return create(ClassMakerService.Stages.lookup(ClassMakerService.Stages.ID_PREFIX + "project.create.loader"), //$NON-NLS-1$
                Long.valueOf(getTimestamp()));
    }

    private Worker create(StageQualifier stage, Object... customizerArgs) {
        SortedSet<Customizer> customizer = new TreeSet<Customizer>(new Customizer.CustomizerComparator());
        for (StageQualifier filter : getStateCustomizers().keySet())
            if (stage.equals(filter))
                customizer.add(getStateCustomizers().get(filter));
        for (StageQualifier filter : getProject().getWorkspace().getCustomizers().keySet())
            if (filter.equals(stage))
                customizer.add(getProject().getWorkspace().getCustomizers().get(filter));
        if (customizer.isEmpty())
            return null;
        return (Worker) (customizer.last().customize(ECollections.asEList(customizerArgs)));
    }

    private boolean packagesDiffer(EPackage source, EList<EObject> target) {
        if (source == null && target == null)
            return false;
        EList<EPackage> existingEPackages = ECollections.newBasicEList();
        boolean whether = false;
        if (source == null)
            whether = true;
        if (target == null)
            whether = true;
        for (EObject eObject : target)
            if (eObject instanceof EPackage)
                existingEPackages.add((EPackage) eObject);
            else
                whether = true;
        return whether || !ModelUtil.ePackagesAreEqual(source, existingEPackages, true);
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public String make(IProgressMonitor monitor) throws Exception {
        synchronized (makingLock) {
            IProgressMonitor wrappingMonitor = new WrappingProgressMonitor(monitor);
            CompletionListener completionListener = new MakingCompletionListener();
            getProject().addCompletionListener(completionListener);
            Stage oldStage = getPhase();
            try {
                if (isMaking())
                    if (!getCommitIds().isEmpty())
                        return ListUtil.getLast(getCommitIds());
                    else
                        return ""; //$NON-NLS-1$
                saveResource();

                try {
                    getProject().getWorkspace().provision(wrappingMonitor);
                } catch (CoreException e) {
                    ClassMakerPlugin.getInstance().getLog().log(e.getStatus());
                }
                IWorkspace workspace = ResourcesPlugin.getWorkspace();
                String projectName = null;
                if (eIsSet(ClassMakerPackage.STATE__PROJECT_NAME))
                    projectName = getProjectName();
                else
                    projectName = getModelName().toLowerCase();
                IProject project = workspace.getRoot().getProject(projectName);
                if (project.exists()) {
                    project.open(wrappingMonitor);
                } else {
                    ResourceUtils.createProject(project, ClassMakerPlugin.NATURE_ID, wrappingMonitor);
                }

                Worker exporter = createExporter();

                EnterpriseDomainJob exporterJob = getJob(exporter);
                exporterJob.setContributionState(this);
                exporterJob.setProject(getEclipseProject());
                exporter.getProperties().put(AbstractExporter.EXPORT_DESTINATION_PROP,
                        ResourceUtils.getExportDestination(getEclipseProject()).toString());

                Worker generator = createGenerator();
                EnterpriseDomainJob generatorJob = getJob(generator);
                generatorJob.setResourceSet(getProject().getWorkspace().getResourceSet());
                generatorJob.setContributionState(this);
                generatorJob.setProject(getEclipseProject());
                generatorJob.setProgressGroup(wrappingMonitor, 1);
                generatorJob.setNextJob(exporterJob);

                EnterpriseDomainJob installJob = getJob(createInstaller());
                installJob.setContributionState(this);
                exporterJob.setNextJob(installJob);

                EnterpriseDomainJob loadJob = getJob(createModelLoader());
                loadJob.setContributionState(this);
                loadJob.addListener();

                installJob.setNextJob(loadJob);

                monitor.beginTask(Messages.Save, 4);
                generatorJob.schedule();
                try {
                    generatorJob.join();
                    exporterJob.join();
                    installJob.join();
                    add("."); //$NON-NLS-1$
                    loadJob.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    monitor.setCanceled(true);
                }
            } catch (CoreException e) {
                if (e.getStatus().getSeverity() == IStatus.ERROR) {
                    setPhase(oldStage);
                }
                ClassMakerPlugin.getInstance().getLog().log(e.getStatus());
                wrappingMonitor.setCanceled(true);
                throw e;
            } catch (Exception e) {
                setPhase(oldStage);
                wrappingMonitor.setCanceled(true);
                throw e;
            } finally {
                setMaking(false);
                wrappingMonitor.done();
            }
            if (!monitor.isCanceled() || (!getPhase().equals(Stage.LOADED)
                    && !getDomainModel().eIsSet(ClassMakerPackage.Literals.MODEL_PAIR__GENERATED))) {
                makingLock.wait(7000);
                Thread.yield();
            }
            getProject().removeCompletionListener(completionListener);
            String result = commit(); // $NON-NLS-1$
            monitor.done();
            return result;
        }

    }

    private EnterpriseDomainJob getJob(Worker worker) {
        return (EnterpriseDomainJob) worker.getAdapter(EnterpriseDomainJob.class);
    }

    private IProject getEclipseProject() {
        return ResourceUtils.getProject(getProjectName());
    }

    /**
     * Initialize and load resource. Parent revision should be set.
     */
    @Override
    public void load(boolean create) throws CoreException {
        loadResource(getModelURI(), create, true);
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public void checkout() {
        if (getCommitIds().isEmpty()) {
            return;
        }
        if (!eIsSet(ClassMakerPackage.STATE__COMMIT_ID))
            setCommitId(ListUtil.getLast(getCommitIds()));
        checkout(getCommitId());
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public void checkout(String commitId) {
        try {
            @SuppressWarnings("unchecked")
            SCMOperator<Git> operator = (SCMOperator<Git>) getProject().getWorkspace().getSCMRegistry()
                    .get(getProjectName());
            setCommitId(commitId);
            operator.checkout(getProject().getVersion().toString(), getCommitId());
            copyModel(getParent());
            load(false);
        } catch (CheckoutConflictException e) {
            e.getConflictingPaths().clear();
        } catch (CoreException e) {
            ClassMakerPlugin.getInstance().getLog().log(e.getStatus());
        } catch (Exception e) {
            ClassMakerPlugin.getInstance().getLog().log(ClassMakerPlugin.createErrorStatus(e));
        }

    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public void add(String filepattern) throws Exception {
        @SuppressWarnings("unchecked")
        SCMOperator<Git> operator = (SCMOperator<Git>) getProject().getWorkspace().getSCMRegistry()
                .get(getProjectName());
        operator.add(filepattern);
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public String commit() throws Exception {
        @SuppressWarnings("unchecked")
        SCMOperator<Git> operator = (SCMOperator<Git>) ClassMakerPlugin.getClassMaker().getWorkspace()
                .getSCMRegistry().get(getProjectName());
        String commitId = null;
        commitId = operator.commit(operator.encodeCommitMessage(this));
        getCommitIds().add(commitId);
        setCommitId(commitId);
        return commitId;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
        switch (featureID) {
        case ClassMakerPackage.STATE__STATE_CUSTOMIZERS:
            return ((InternalEList<?>) getStateCustomizers()).basicRemove(otherEnd, msgs);
        }
        return super.eInverseRemove(otherEnd, featureID, msgs);
    }

    private boolean resourceModelsSynchronizing = false;

    protected Adapter resourceToModelsAdapter = new AdapterImpl() {

        @Override
        public void notifyChanged(Notification msg) {
            if (resourceModelsSynchronizing)
                return;
            resourceModelsSynchronizing = true;
            boolean deliver = eDeliver();
            eSetDeliver(false);
            if (msg.getFeatureID(Resource.class) == Resource.RESOURCE__CONTENTS)
                switch (msg.getEventType()) {
                case Notification.ADD:
                    if (msg.getNewValue() != null && msg.getNewValue() instanceof EPackage) {
                        if (findExistingEPackage((EPackage) msg.getNewValue()) == null) {
                            getDomainModel().setDynamic(copyEPackage((EPackage) msg.getNewValue()));
                        }
                    }
                    break;
                case Notification.SET:
                    if (msg.getOldValue() != null && msg.getOldValue() instanceof EPackage)
                        getDomainModel().setDynamic(null);
                    if (msg.getNewValue() != null && msg.getNewValue() instanceof EPackage)
                        if (findExistingEPackage((EPackage) msg.getNewValue()) == null) {
                            getDomainModel().setDynamic(copyEPackage((EPackage) msg.getNewValue()));
                        }
                    break;
                case Notification.REMOVE_MANY:
                    if (msg.getOldValue() != null) {
                        for (Object object : (Iterable<?>) msg.getOldValue())
                            if (object instanceof EPackage) {
                                getDomainModel().setDynamic(null);
                            }
                    }
                    break;
                case Notification.REMOVE:
                    if (msg.getOldValue() != null && msg.getOldValue() instanceof EPackage) {
                        getDomainModel().setDynamic(null);
                    }
                    break;
                }
            eSetDeliver(deliver);
            resourceModelsSynchronizing = false;
        }

        private EPackage copyEPackage(EPackage ePackage) {
            EPackage copy = EcoreUtil.copy(ePackage);
            return copy;
        }

        private EPackage findExistingEPackage(EPackage query) {
            EPackage ePackage = getDomainModel().getDynamic();
            if (ModelUtil.ePackagesAreEqual(ePackage, query, true))
                return ePackage;
            return null;
        }

    };

    protected Adapter modelsToResourceAdapter = new EContentAdapter() {

        @Override
        public void notifyChanged(Notification notification) {
            super.notifyChanged(notification);
            if (resourceModelsSynchronizing)
                return;
            if (notification.getNotifier() instanceof ModelPair
                    && notification.getFeatureID(ModelPair.class) == ClassMakerPackage.MODEL_PAIR__DYNAMIC) {
                resourceModelsSynchronizing = true;
                boolean deliver = getResource().eDeliver();
                getResource().eSetDeliver(false);
                if (notification.getEventType() == Notification.SET) {
                    if (notification.getOldValue() != null) {
                        EPackage dynamicEPackage = (EPackage) notification.getOldValue();
                        EList<EObject> toRemove = ECollections.newBasicEList();
                        for (EObject eObject : getResource().getContents())
                            if (eObject instanceof EPackage
                                    && ModelUtil.ePackagesAreEqual((EPackage) eObject, dynamicEPackage, true))
                                toRemove.add(eObject);
                        getResource().getContents().removeAll(toRemove);
                    }
                    if (notification.getNewValue() != null && notification.getPosition() >= Notification.NO_INDEX) {
                        EPackage dynamicEPackage = (EPackage) notification.getNewValue();
                        if (getResource().getContents().isEmpty()) {
                            getResource().getContents().add(EcoreUtil.copy(dynamicEPackage));
                        } else
                            getResource().getContents().set(0, EcoreUtil.copy(dynamicEPackage));
                    }
                }
                getResource().eSetDeliver(deliver);
                resourceModelsSynchronizing = false;
            }
        }

    };

    @Override
    public void copyModel(Item from) {
        if (from instanceof Contribution && !((ContributionImpl) from).isStateSet())
            return;
        super.copyModel(from);
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public Project basicGetProject() {
        if (eIsSet(ClassMakerPackage.STATE__REVISION))
            return getRevision().getProject();
        else
            return null;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public void setProject(Project newProject) {
        newProject.getRevision().getStateHistory().put(getTimestamp(), this);
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public Revision getRevision() {
        Revision revision = basicGetRevision();
        return revision != null && revision.eIsProxy() ? (Revision) eResolveProxy((InternalEObject) revision)
                : revision;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public Revision basicGetRevision() {
        if (eContainer() != null)
            return (Revision) eContainer().eContainer();
        else
            return null;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public void setRevision(Revision newRevision) {
        if (newRevision != null)
            newRevision.getStateHistory().put(getTimestamp(), this);
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public String getJobFamily() {
        if (!eIsSet(ClassMakerPackage.STATE__JOB_FAMILY))
            setJobFamily(getDeployableUnitName());
        return jobFamily;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public void setJobFamily(String newJobFamily) {
        String oldJobFamily = jobFamily;
        jobFamily = newJobFamily;
        if (eNotificationRequired())
            eNotify(new ENotificationImpl(this, Notification.SET, ClassMakerPackage.STATE__JOB_FAMILY, oldJobFamily,
                    jobFamily));
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public Resource getResource() {
        return resource;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public void setResource(Resource newResource) {
        Resource oldResource = resource;
        resource = newResource;
        if (eNotificationRequired())
            eNotify(new ENotificationImpl(this, Notification.SET, ClassMakerPackage.STATE__RESOURCE, oldResource,
                    resource));
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public EList<String> getCommitIds() {
        if (commitIds == null) {
            commitIds = new EDataTypeUniqueEList<String>(String.class, this, ClassMakerPackage.STATE__COMMIT_IDS);
        }
        return commitIds;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public String getCommitId() {
        return commitId;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public void setCommitId(String newCommitId) {
        String oldCommitId = commitId;
        commitId = newCommitId;
        if (eNotificationRequired())
            eNotify(new ENotificationImpl(this, Notification.SET, ClassMakerPackage.STATE__COMMIT_ID, oldCommitId,
                    commitId));
    }

    @Override
    public EMap<StageQualifier, Customizer> getCustomizers() {
        return getStateCustomizers();
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public EMap<StageQualifier, Customizer> getStateCustomizers() {
        if (stateCustomizers == null) {
            stateCustomizers = new EcoreEMap<StageQualifier, Customizer>(
                    ClassMakerPackage.Literals.STAGE_QUALIFIER_TO_CUSTOMIZER_MAP_ENTRY,
                    StageQualifierToCustomizerMapEntryImpl.class, this, ClassMakerPackage.STATE__STATE_CUSTOMIZERS);
        }
        return stateCustomizers;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public String getProjectName() {
        if (eIsSet(ClassMakerPackage.STATE__PROJECT))
            return getProject().getProjectName();
        else
            return null;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public void setProjectName(String newProjectName) {
        getProject().setProjectName(newProjectName);
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public boolean isMaking() {
        return making;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public void setMaking(boolean newMaking) {
        boolean oldMaking = making;
        making = newMaking;
        if (eNotificationRequired())
            eNotify(new ENotificationImpl(this, Notification.SET, ClassMakerPackage.STATE__MAKING, oldMaking,
                    making));
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public void setProjectVersion(IProgressMonitor monitor) throws CoreException {
        SubMonitor pm = SubMonitor.convert(monitor, 1);
        pm.setTaskName(Messages.TaskNameSetProjectVersion);
        pm.subTask(Messages.SubTaskNameSetProjectVersion);
        SubMonitor m = pm.newChild(1, SubMonitor.SUPPRESS_ISCANCELED);
        try {
            IBundleProjectService service = ((IBundleProjectService) ClassMakerPlugin
                    .getService(IBundleProjectService.class.getName()));
            IWorkspace workspace = ResourcesPlugin.getWorkspace();
            IProject project = workspace.getRoot().getProject(getProjectName());
            IBundleProjectDescription bundleProjectDescription = service.getDescription(project);
            bundleProjectDescription.setBundleVersion(getProject().getVersion());
            bundleProjectDescription.apply(m);
        } finally {
            m.done();
            pm.done();
        }
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public void delete(IProgressMonitor monitor) throws CoreException {
        @SuppressWarnings("unchecked")
        SCMOperator<Git> operator = (SCMOperator<Git>) ClassMakerPlugin.getClassMaker().getWorkspace()
                .getSCMRegistry().get(getProjectName());
        try {
            operator.deleteProject();
            try {
                operator.checkoutOrphan(getProject().getVersion().toString(), getTimestamp());
            } catch (Exception e) {
                throw new CoreException(ClassMakerPlugin.createErrorStatus(e));
            }
        } finally {
            monitor.done();
        }

    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public EPackage find(EPackage ePackage, Stage stage) {
        if (stage.equals(Stage.MODELED)) {
            EPackage dynamicEPackage = getDomainModel().getDynamic();
            if (ModelUtil.ePackagesAreEqual(ePackage, dynamicEPackage, false))
                return dynamicEPackage;
        }
        if (stage.equals(Stage.GENERATED)) {
            EPackage generatedEPackage = getDomainModel().getGenerated();
            if (ModelUtil.ePackagesAreEqual(ePackage, generatedEPackage, false))
                return generatedEPackage;
        }
        return null;
    }

    EList<? extends EPackage> results;

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public Object eGet(int featureID, boolean resolve, boolean coreType) {
        switch (featureID) {
        case ClassMakerPackage.STATE__PACKAGE_CLASS_NAME:
            return getPackageClassName();
        case ClassMakerPackage.STATE__REQUIRED_PLUGINS:
            return getRequiredPlugins();
        case ClassMakerPackage.STATE__REVISION:
            if (resolve)
                return getRevision();
            return basicGetRevision();
        case ClassMakerPackage.STATE__TIMESTAMP:
            return getTimestamp();
        case ClassMakerPackage.STATE__DEPLOYABLE_UNIT_NAME:
            return getDeployableUnitName();
        case ClassMakerPackage.STATE__JOB_FAMILY:
            return getJobFamily();
        case ClassMakerPackage.STATE__RESOURCE:
            return getResource();
        case ClassMakerPackage.STATE__COMMIT_IDS:
            return getCommitIds();
        case ClassMakerPackage.STATE__COMMIT_ID:
            return getCommitId();
        case ClassMakerPackage.STATE__STATE_CUSTOMIZERS:
            if (coreType)
                return getStateCustomizers();
            else
                return getStateCustomizers().map();
        case ClassMakerPackage.STATE__PROJECT_NAME:
            return getProjectName();
        case ClassMakerPackage.STATE__MAKING:
            return isMaking();
        }
        return super.eGet(featureID, resolve, coreType);
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @SuppressWarnings("unchecked")
    @Override
    public void eSet(int featureID, Object newValue) {
        switch (featureID) {
        case ClassMakerPackage.STATE__PACKAGE_CLASS_NAME:
            setPackageClassName((String) newValue);
            return;
        case ClassMakerPackage.STATE__REQUIRED_PLUGINS:
            getRequiredPlugins().clear();
            getRequiredPlugins().addAll((Collection<? extends String>) newValue);
            return;
        case ClassMakerPackage.STATE__REVISION:
            setRevision((Revision) newValue);
            return;
        case ClassMakerPackage.STATE__TIMESTAMP:
            setTimestamp((Long) newValue);
            return;
        case ClassMakerPackage.STATE__JOB_FAMILY:
            setJobFamily((String) newValue);
            return;
        case ClassMakerPackage.STATE__RESOURCE:
            setResource((Resource) newValue);
            return;
        case ClassMakerPackage.STATE__COMMIT_IDS:
            getCommitIds().clear();
            getCommitIds().addAll((Collection<? extends String>) newValue);
            return;
        case ClassMakerPackage.STATE__COMMIT_ID:
            setCommitId((String) newValue);
            return;
        case ClassMakerPackage.STATE__STATE_CUSTOMIZERS:
            ((EStructuralFeature.Setting) getStateCustomizers()).set(newValue);
            return;
        case ClassMakerPackage.STATE__PROJECT_NAME:
            setProjectName((String) newValue);
            return;
        case ClassMakerPackage.STATE__MAKING:
            setMaking((Boolean) newValue);
            return;
        }
        super.eSet(featureID, newValue);
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public void eUnset(int featureID) {
        switch (featureID) {
        case ClassMakerPackage.STATE__PACKAGE_CLASS_NAME:
            setPackageClassName(PACKAGE_CLASS_NAME_EDEFAULT);
            return;
        case ClassMakerPackage.STATE__REQUIRED_PLUGINS:
            getRequiredPlugins().clear();
            return;
        case ClassMakerPackage.STATE__REVISION:
            setRevision((Revision) null);
            return;
        case ClassMakerPackage.STATE__TIMESTAMP:
            setTimestamp(TIMESTAMP_EDEFAULT);
            return;
        case ClassMakerPackage.STATE__JOB_FAMILY:
            setJobFamily(JOB_FAMILY_EDEFAULT);
            return;
        case ClassMakerPackage.STATE__RESOURCE:
            setResource((Resource) null);
            return;
        case ClassMakerPackage.STATE__COMMIT_IDS:
            getCommitIds().clear();
            return;
        case ClassMakerPackage.STATE__COMMIT_ID:
            setCommitId(COMMIT_ID_EDEFAULT);
            return;
        case ClassMakerPackage.STATE__STATE_CUSTOMIZERS:
            getStateCustomizers().clear();
            return;
        case ClassMakerPackage.STATE__PROJECT_NAME:
            setProjectName(PROJECT_NAME_EDEFAULT);
            return;
        case ClassMakerPackage.STATE__MAKING:
            setMaking(MAKING_EDEFAULT);
            return;
        }
        super.eUnset(featureID);
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public boolean eIsSet(int featureID) {
        switch (featureID) {
        case ClassMakerPackage.STATE__PACKAGE_CLASS_NAME:
            return PACKAGE_CLASS_NAME_EDEFAULT == null ? packageClassName != null
                    : !PACKAGE_CLASS_NAME_EDEFAULT.equals(packageClassName);
        case ClassMakerPackage.STATE__REQUIRED_PLUGINS:
            return requiredPlugins != null && !requiredPlugins.isEmpty();
        case ClassMakerPackage.STATE__REVISION:
            return basicGetRevision() != null;
        case ClassMakerPackage.STATE__TIMESTAMP:
            return timestamp != TIMESTAMP_EDEFAULT;
        case ClassMakerPackage.STATE__DEPLOYABLE_UNIT_NAME:
            return DEPLOYABLE_UNIT_NAME_EDEFAULT == null ? getDeployableUnitName() != null
                    : !DEPLOYABLE_UNIT_NAME_EDEFAULT.equals(getDeployableUnitName());
        case ClassMakerPackage.STATE__JOB_FAMILY:
            return JOB_FAMILY_EDEFAULT == null ? jobFamily != null : !JOB_FAMILY_EDEFAULT.equals(jobFamily);
        case ClassMakerPackage.STATE__RESOURCE:
            return resource != null;
        case ClassMakerPackage.STATE__COMMIT_IDS:
            return commitIds != null && !commitIds.isEmpty();
        case ClassMakerPackage.STATE__COMMIT_ID:
            return COMMIT_ID_EDEFAULT == null ? commitId != null : !COMMIT_ID_EDEFAULT.equals(commitId);
        case ClassMakerPackage.STATE__STATE_CUSTOMIZERS:
            return stateCustomizers != null && !stateCustomizers.isEmpty();
        case ClassMakerPackage.STATE__PROJECT_NAME:
            return PROJECT_NAME_EDEFAULT == null ? getProjectName() != null
                    : !PROJECT_NAME_EDEFAULT.equals(getProjectName());
        case ClassMakerPackage.STATE__MAKING:
            return making != MAKING_EDEFAULT;
        }
        return super.eIsSet(featureID);
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public String toString() {
        if (eIsProxy())
            return super.toString();

        StringBuilder result = new StringBuilder(super.toString());
        result.append(" (packageClassName: ");
        result.append(packageClassName);
        result.append(", requiredPlugins: ");
        result.append(requiredPlugins);
        result.append(", timestamp: ");
        result.append(timestamp);
        result.append(", jobFamily: ");
        result.append(jobFamily);
        result.append(", commitIds: ");
        result.append(commitIds);
        result.append(", commitId: ");
        result.append(commitId);
        result.append(", making: ");
        result.append(making);
        result.append(')');
        return result.toString();
    }

    @Override
    public boolean contains(ISchedulingRule otherRule) {
        if (otherRule instanceof State)
            return getRevision().getVersion().equals(((State) otherRule).getRevision().getVersion())
                    && getRevision().equals(((State) otherRule).getRevision())
                    && getTimestamp() == ((State) otherRule).getTimestamp();
        return false;
    }

    @Override
    public boolean isConflicting(ISchedulingRule otherRule) {
        if (otherRule instanceof State)
            return getRevision().getVersion().equals(((State) otherRule).getRevision().getVersion())
                    && getRevision().equals(((State) otherRule).getRevision())
                    && getTimestamp() == ((State) otherRule).getTimestamp()
                    && getCommitId() == ((State) otherRule).getCommitId();
        return false;
    }

    @Override
    public void build(IProgressMonitor monitor) throws CoreException {
        if (getPhase().equals(Stage.LOADED)) {
            EnterpriseDomainJob installJob = getJob(createInstaller());
            installJob.setContributionState(this);

            EnterpriseDomainJob loadJob = getJob(createModelLoader());
            loadJob.setContributionState(this);
            loadJob.addListener();

            installJob.setNextJob(loadJob);

            installJob.schedule();
            try {
                installJob.join();
                add("."); //$NON-NLS-1$
                loadJob.join();
                Thread.yield();
            } catch (InterruptedException e) {
                e.printStackTrace();
                monitor.setCanceled(true);
            } catch (NullPointerException e) {
                try {
                    make(monitor);
                } catch (Exception ex) {
                    throw new CoreException(ClassMakerPlugin.createErrorStatus(ex));
                }
            } catch (Exception e) {
                throw new CoreException(ClassMakerPlugin.createErrorStatus(e));
            }
        }
    }

} // StateImpl