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

Java tutorial

Introduction

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

Source

/**
 * Copyright 2012-2018 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.util.Calendar;
import java.util.TimeZone;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
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.util.EList;
import org.eclipse.emf.common.util.EMap;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.impl.ENotificationImpl;
import org.eclipse.emf.ecore.util.EcoreEMap;
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.NoHeadException;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.revwalk.RevCommit;
import org.enterprisedomain.classmaker.ClassMakerFactory;
import org.enterprisedomain.classmaker.ClassMakerPackage;
import org.enterprisedomain.classmaker.Contribution;
import org.enterprisedomain.classmaker.Customizer;
import org.enterprisedomain.classmaker.Item;
import org.enterprisedomain.classmaker.ModelPair;
import org.enterprisedomain.classmaker.Project;
import org.enterprisedomain.classmaker.Revision;
import org.enterprisedomain.classmaker.SCMOperator;
import org.enterprisedomain.classmaker.StageQualifier;
import org.enterprisedomain.classmaker.State;
import org.enterprisedomain.classmaker.core.ClassMakerPlugin;
import org.enterprisedomain.classmaker.util.ListUtil;
import org.osgi.framework.Version;

/**
 * <!-- begin-user-doc --> An implementation of the model object '
 * <em><b>Revision</b></em>'. <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * </p>
 * <ul>
 * <li>{@link org.enterprisedomain.classmaker.impl.RevisionImpl#getState
 * <em>State</em>}</li>
 * <li>{@link org.enterprisedomain.classmaker.impl.RevisionImpl#getTimestamp
 * <em>Timestamp</em>}</li>
 * <li>{@link org.enterprisedomain.classmaker.impl.RevisionImpl#getStateHistory
 * <em>State History</em>}</li>
 * <li>{@link org.enterprisedomain.classmaker.impl.RevisionImpl#getLatestTimestamp
 * <em>Latest Timestamp</em>}</li>
 * <li>{@link org.enterprisedomain.classmaker.impl.RevisionImpl#getVersion
 * <em>Version</em>}</li>
 * </ul>
 *
 * @generated
 */
public class RevisionImpl extends ItemImpl implements Revision {

    static {
        Revision.VERSION_QUALIFIER_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC")); //$NON-NLS-1$
    }

    /**
     * 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 cached value of the '{@link #getStateHistory() <em>State History</em>}'
     * map. <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @see #getStateHistory()
     * @generated
     * @ordered
     */
    protected EMap<Long, State> stateHistory;

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

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

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

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    protected RevisionImpl() {
        super();
    }

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

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public void setProject(Project newProject) {
        if (newProject != null)
            newProject.getRevisions().put(getVersion(), this);
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public State getState() {
        State state = basicGetState();
        return state != null && state.eIsProxy() ? (State) eResolveProxy((InternalEObject) state) : state;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public State basicGetState() {
        return getStateHistory().get((Object) getTimestamp());
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public void setState(State newState) {
        if (!getStateHistory().containsKey(newState.getTimestamp()))
            getStateHistory().put(newState.getTimestamp(), newState);
        setTimestamp(newState.getTimestamp());
    }

    /**
     * <!-- 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.REVISION__TIMESTAMP,
                    oldTimestamp, timestamp));
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public EMap<Long, State> getStateHistory() {
        if (stateHistory == null) {
            stateHistory = new EcoreEMap<Long, State>(ClassMakerPackage.Literals.LONG_TO_STATE_MAP_ENTRY,
                    LongToStateMapEntryImpl.class, this, ClassMakerPackage.REVISION__STATE_HISTORY);
        }
        return stateHistory;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public long getLatestTimestamp() {
        if (!getStateHistory().isEmpty())
            return ListUtil.getLast(getStateHistory()).getKey();
        return StateImpl.TIMESTAMP_EDEFAULT;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public Version getVersion() {
        return version;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public void setVersion(Version newVersion) {
        Version oldVersion = version;
        version = newVersion;
        if (eNotificationRequired())
            eNotify(new ENotificationImpl(this, Notification.SET, ClassMakerPackage.REVISION__VERSION, oldVersion,
                    version));
    }

    @Override
    public String getLanguage() {
        return getState().getLanguage();
    }

    @Override
    public void setLanguage(String value) {
        if (isStateSet())
            getState().setLanguage(value);
    }

    @Override
    public ModelPair getDomainModel() {
        return getState().getDomainModel();
    }

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

    protected boolean isStateSet() {
        return eIsSet(ClassMakerPackage.REVISION__STATE);
    }

    @Override
    public Item basicGetParent() {
        if (getProject() instanceof Item)
            return (Item) getProject();
        return null;
    }

    @Override
    public void setParent(Item newParent) {
        if (newParent instanceof Contribution)
            ((Contribution) newParent).getRevisions().put(getVersion(), this);
        super.setParent(newParent);
    }

    @Override
    public String initialize(boolean commit) {
        super.initialize(commit);
        @SuppressWarnings("unchecked")
        SCMOperator<Git> operator = (SCMOperator<Git>) getProject().getWorkspace().getSCMRegistry()
                .get(getProject().getProjectName());
        try {
            Git git = operator.getRepositorySCM();

            LogCommand log = git.log();
            Ref branch = git.getRepository().findRef(getVersion().toString());
            if (branch != null) {
                log.add(branch.getObjectId());
                Iterable<RevCommit> commits = log.call();
                for (RevCommit c : commits) {
                    long timestamp = operator.decodeTimestamp(c.getShortMessage());
                    if (timestamp == -1) {
                        timestamp = operator.decodeTimestamp(getVersion().getQualifier());
                        if (timestamp == -1)
                            continue;
                    }
                    State state = null;
                    if (getStateHistory().containsKey(timestamp))
                        state = (State) getStateHistory().get((Object) timestamp);
                    else {
                        state = ClassMakerFactory.eINSTANCE.createState();
                        state.setTimestamp(timestamp);
                        getStateHistory().put(timestamp, state);
                        state.getProject().setVersion(getVersion());
                    }
                    String commitId = c.getId().toString();
                    state.getCommitIds().add(commitId);
                    state.setCommitId(commitId);
                    setTimestamp(timestamp);
                    state.initialize(commit);
                }
                if (getStateHistory().isEmpty())
                    return null;
                checkout(ListUtil.getLast(getStateHistory()).getKey());
            }
        } catch (NoHeadException e) {
            return null;
        } catch (Exception e) {
            ClassMakerPlugin.getInstance().getLog().log(ClassMakerPlugin.createErrorStatus(e));
            return null;
        } finally {
            try {
                operator.ungetRepositorySCM();
            } catch (Exception e) {
                ClassMakerPlugin.getInstance().getLog().log(ClassMakerPlugin.createErrorStatus(e));
            }
        }
        return getState().getCommitId();
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public void create(IProgressMonitor monitor) throws CoreException {
        if (isStateSet()) {
            @SuppressWarnings("unchecked")
            SCMOperator<Git> operator = (SCMOperator<Git>) getProject().getWorkspace().getSCMRegistry()
                    .get(getProject().getProjectName());
            try {
                Git git = operator.getRepositorySCM();
                git.branchCreate().setForce(true).setName(getVersion().toString()).call();
            } catch (Exception e) {
                throw new CoreException(ClassMakerPlugin.createErrorStatus(e));
            } finally {
                try {
                    operator.ungetRepositorySCM();
                } catch (Exception e) {
                    throw new CoreException(ClassMakerPlugin.createErrorStatus(e));
                }
            }
        }

    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public void checkout(long stateTime, String commitId) {
        setTimestamp(stateTime);
        getProject().initAdapters(this);
        if (isStateSet())
            getState().checkout(commitId);
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public void checkout(long stateTime) {
        setTimestamp(stateTime);
        getProject().initAdapters(this);
        if (isStateSet())
            getState().checkout();
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public void checkout(String commitId) {
        for (State state : getStateHistory().values())
            if (state.getCommitIds().contains(commitId))
                checkout(state.getTimestamp(), commitId);
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public State newState() {
        State newState = ClassMakerFactory.eINSTANCE.createState();
        newState.setTimestamp(
                (long) (Calendar.getInstance(Revision.VERSION_QUALIFIER_FORMAT.getTimeZone()).getTimeInMillis()
                        / 1000));
        getStateHistory().put(newState.getTimestamp(), newState);
        newState.getProject().setVersion(getVersion());
        return newState;
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @return commitId
     * @generated NOT
     */
    public String make(IProgressMonitor monitor) throws Exception {
        getState().copyModel(getParent());
        return getState().make(monitor);
    }

    @Override
    public void load(boolean create) throws CoreException {
        initialize(false);
        getProject().initAdapters(this);
        if (create && isStateSet()) {
            @SuppressWarnings("unchecked")
            SCMOperator<Git> operator = (SCMOperator<Git>) getProject().getWorkspace().getSCMRegistry()
                    .get(getProject().getProjectName());
            Git git = null;
            try {
                git = operator.getRepositorySCM();
                Ref branch = git.getRepository().findRef(getVersion().toString());
                if (branch == null) {
                    if (create) {
                        create(ClassMakerPlugin.getProgressMonitor());
                    }
                    getState().initialize(false);
                }
            } catch (Exception e) {
                throw new CoreException(ClassMakerPlugin.createErrorStatus(e));
            } finally {
                try {
                    operator.ungetRepositorySCM();
                } catch (Exception e) {
                    throw new CoreException(ClassMakerPlugin.createErrorStatus(e));
                }
            }
        }
        if (isStateSet())
            getState().load(create);
    }

    /**
     * <!-- begin-user-doc --><!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public void delete(IProgressMonitor monitor) throws CoreException {
        if (isStateSet()) {
            State state = getState();
            state.delete(monitor);
        }
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public void addAdapters(EList<Adapter> adapters) {
        for (State state : getStateHistory().values())
            state.eAdapters().addAll(adapters);
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated NOT
     */
    public void copyModel(Revision from) {
        super.copyModel(from);
        getState().copyModel(from.getState());
    }

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

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public Object eGet(int featureID, boolean resolve, boolean coreType) {
        switch (featureID) {
        case ClassMakerPackage.REVISION__STATE:
            if (resolve)
                return getState();
            return basicGetState();
        case ClassMakerPackage.REVISION__TIMESTAMP:
            return getTimestamp();
        case ClassMakerPackage.REVISION__STATE_HISTORY:
            if (coreType)
                return getStateHistory();
            else
                return getStateHistory().map();
        case ClassMakerPackage.REVISION__LATEST_TIMESTAMP:
            return getLatestTimestamp();
        case ClassMakerPackage.REVISION__VERSION:
            return getVersion();
        }
        return super.eGet(featureID, resolve, coreType);
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public void eSet(int featureID, Object newValue) {
        switch (featureID) {
        case ClassMakerPackage.REVISION__STATE:
            setState((State) newValue);
            return;
        case ClassMakerPackage.REVISION__TIMESTAMP:
            setTimestamp((Long) newValue);
            return;
        case ClassMakerPackage.REVISION__STATE_HISTORY:
            ((EStructuralFeature.Setting) getStateHistory()).set(newValue);
            return;
        case ClassMakerPackage.REVISION__VERSION:
            setVersion((Version) newValue);
            return;
        }
        super.eSet(featureID, newValue);
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public void eUnset(int featureID) {
        switch (featureID) {
        case ClassMakerPackage.REVISION__STATE:
            setState((State) null);
            return;
        case ClassMakerPackage.REVISION__TIMESTAMP:
            setTimestamp(TIMESTAMP_EDEFAULT);
            return;
        case ClassMakerPackage.REVISION__STATE_HISTORY:
            getStateHistory().clear();
            return;
        case ClassMakerPackage.REVISION__VERSION:
            setVersion(VERSION_EDEFAULT);
            return;
        }
        super.eUnset(featureID);
    }

    /**
     * <!-- begin-user-doc --> <!-- end-user-doc -->
     * 
     * @generated
     */
    @Override
    public boolean eIsSet(int featureID) {
        switch (featureID) {
        case ClassMakerPackage.REVISION__STATE:
            return basicGetState() != null;
        case ClassMakerPackage.REVISION__TIMESTAMP:
            return timestamp != TIMESTAMP_EDEFAULT;
        case ClassMakerPackage.REVISION__STATE_HISTORY:
            return stateHistory != null && !stateHistory.isEmpty();
        case ClassMakerPackage.REVISION__LATEST_TIMESTAMP:
            return getLatestTimestamp() != LATEST_TIMESTAMP_EDEFAULT;
        case ClassMakerPackage.REVISION__VERSION:
            return VERSION_EDEFAULT == null ? version != null : !VERSION_EDEFAULT.equals(version);
        }
        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(" (timestamp: ");
        result.append(timestamp);
        result.append(", version: ");
        result.append(version);
        result.append(')');
        return result.toString();
    }

    @Override
    public void build(IProgressMonitor monitor) throws CoreException {
        getState().build(monitor);
    }

    @Override
    public Project basicGetProject() {
        if (eContainer().eContainer() instanceof Project)
            return (Project) eContainer().eContainer();
        else
            return null;
    }

} // RevisionImpl