org.cheetahplatform.tdm.daily.model.Workspace.java Source code

Java tutorial

Introduction

Here is the source code for org.cheetahplatform.tdm.daily.model.Workspace.java

Source

/*******************************************************************************
 * This file is provided under the terms of the Eclipse Public License 1.0. 
 * Any use, reproduction or distribution of the program
 * constitutes recipient's acceptance of this agreement.
 *******************************************************************************/
package org.cheetahplatform.tdm.daily.model;

import static org.cheetahplatform.core.service.SimpleCheetahServiceLookup.NAMESPACE_DECLARATIVE_ACTIVITIES;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.cheetahplatform.common.Assert;
import org.cheetahplatform.common.date.Date;
import org.cheetahplatform.common.date.DateTime;
import org.cheetahplatform.common.date.TimeSlot;
import org.cheetahplatform.common.logging.AuditTrailEntry;
import org.cheetahplatform.common.logging.ILogListener;
import org.cheetahplatform.core.common.modeling.INodeInstance;
import org.cheetahplatform.core.declarative.modeling.DeclarativeActivity;
import org.cheetahplatform.core.declarative.modeling.DeclarativeProcessSchema;
import org.cheetahplatform.core.declarative.runtime.DeclarativeActivityInstance;
import org.cheetahplatform.core.declarative.runtime.DeclarativeProcessInstance;
import org.cheetahplatform.core.service.Services;
import org.cheetahplatform.modeler.Activator;
import org.cheetahplatform.modeler.generic.model.GenericModel;
import org.cheetahplatform.modeler.graph.command.AbstractGraphCommand;
import org.cheetahplatform.shared.ListenerList;
import org.cheetahplatform.tdm.Role;
import org.cheetahplatform.tdm.RoleLookup;
import org.cheetahplatform.tdm.TDMConstants;
import org.cheetahplatform.tdm.command.TDMCommand;
import org.cheetahplatform.tdm.daily.editpart.WorkspaceEditPart;
import org.cheetahplatform.tdm.engine.TDMTest;
import org.cheetahplatform.tdm.modeler.test.model.Weekly;
import org.cheetahplatform.tdm.modeler.test.model.WeeklyActivity;
import org.cheetahplatform.tdm.modeler.test.model.WeeklyConstraint;
import org.eclipse.core.runtime.Platform;
import org.eclipse.gef.EditPart;
import org.eclipse.jface.preference.IPreferenceStore;

public class Workspace extends GenericModel {
    private static final String SHOW_ROLE = "SHOW_ROLE_";

    public static final int DEFAULT_DAYS = 1;

    public static void initializeRoleFilterPreferences() {
        IPreferenceStore store = Activator.getDefault().getPreferenceStore();
        List<Role> roles = RoleLookup.getInstance().getAllRoles();

        for (Role role : roles) {
            String key = SHOW_ROLE + role.getName();
            if (!store.contains(key)) {
                store.setValue(key, String.valueOf(true));
            }
        }
    }

    private final DeclarativeProcessInstance processInstance;
    private ListenerList logListeners;

    private final List<Day> days;
    private final List<Activity> activities;
    private final Weekly weekly;
    private TimeSlot planningAreaSelection;
    private TimeSlot executionAreaSelection;
    private TimeSlot terminationAreaSelection;
    private List<ExecutionAssertion> executionAssertions;
    private List<TerminationAssertion> terminationAssertions;
    private boolean showCompletedActivities;
    private TDMTest test;

    public Workspace() {
        this(new DeclarativeProcessSchema(), DEFAULT_DAYS);
    }

    public Workspace(DeclarativeProcessInstance instance) {
        this(instance, DEFAULT_DAYS);
    }

    public Workspace(DeclarativeProcessInstance instance, int defaultDays) {
        super(null);

        this.processInstance = instance;
        this.logListeners = new ListenerList();
        this.days = new ArrayList<Day>();
        this.activities = new ArrayList<Activity>();
        this.executionAssertions = new ArrayList<ExecutionAssertion>();
        this.terminationAssertions = new ArrayList<TerminationAssertion>();

        for (int i = 0; i < defaultDays; i++) {
            Date date = new Date(processInstance.getStartTime());
            date.increaseDaysBy(i);
            days.add(new Day(this, date));
        }

        this.weekly = new Weekly(this);
        this.weekly.initialize();
        this.showCompletedActivities = true;
        if (Platform.isRunning()) {
            initializePreferences();
        }
    }

    public Workspace(DeclarativeProcessSchema schema) {
        this(schema, DEFAULT_DAYS);
    }

    public Workspace(DeclarativeProcessSchema schema, int defaultDays) {
        this(schema.instantiate(), defaultDays);
    }

    public Workspace(int defaultDays) {
        this(new DeclarativeProcessSchema(), defaultDays);
    }

    public void addActivityInstance(Activity activity) {
        activities.add(activity);
        DeclarativeActivityInstance instance = activity.getActivity();
        weekly.addActivityInstance(instance);

        firePropertyChanged(TDMConstants.PROPERTY_ACTIVITIES);
        AuditTrailEntry entry = new AuditTrailEntry(TDMCommand.COMMAND_ADD_ACTIVITIY_INSTANCE);
        entry.setAttribute(TDMCommand.ATTRIBUTE_ACTIVITY_ID, instance.getNode().getCheetahId());
        entry.setAttribute(TDMCommand.ATTRIBUTE_ACTIVITY_NAME, instance.getNode().getName());
        entry.setAttribute(TDMCommand.ATTRIBUTE_TIME_SLOT, instance.getSlot().toStringRepresentation());
        entry.setAttribute(AbstractGraphCommand.ID, activity.getCheetahId());
        log(entry);
    }

    public Activity addActivityInstance(DeclarativeActivity activity, DateTime start) {
        Services.getCheetahObjectLookup().registerObject(NAMESPACE_DECLARATIVE_ACTIVITIES, activity);

        DeclarativeActivityInstance instance = activity.instantiate(processInstance);
        instance.setStartTime(start);
        DateTime end = new DateTime(start, false);
        end.plus(activity.getExpectedDuration());
        instance.setEndTime(end);

        return addActivityInstance(instance);
    }

    public Activity addActivityInstance(DeclarativeActivityInstance instance) {
        DateTime start = instance.getStartTime();
        Day day = getDay(start);
        if (day == null) {
            day = new Day(this, start);
            days.add(day);
        }

        Activity tddInstance = new Activity(day, instance);
        addActivityInstance(tddInstance);
        return tddInstance;
    }

    /**
     * Create a new declarative activity and add an instance for the given timeslot.
     * 
     * @param day
     *            the day on which the activity is added
     * @param name
     *            the name of the activity to be created
     * @param slot
     *            the slot
     * @return the created activity
     */
    public Activity addActivityInstance(String name, TimeSlot slot) {
        DeclarativeActivity activity = (processInstance.getSchema()).createActivity(name);
        Activity instance = addActivityInstance(activity, slot.getStart());
        instance.getTimeSlot().setEnd(slot.getEnd());
        return instance;
    }

    public void addAssertion(ExecutionAssertion assertion) {
        Assert.isNotNull(assertion);
        executionAssertions.add(assertion);
        firePropertyChanged(TDMConstants.PROPERTY_EXECUTION_ASSERTIONS);

        AuditTrailEntry entry = new AuditTrailEntry(TDMCommand.COMMAND_ADD_EXECUTION_ASSERTION);
        entry.setAttribute(AbstractGraphCommand.ID, assertion.getCheetahId());
        entry.setAttribute(TDMCommand.ATTRIBUTE_ACTIVITY_ID, assertion.getActivityDefinition().getCheetahId());
        entry.setAttribute(TDMCommand.ATTRIBUTE_TIME_SLOT, assertion.getTimeSlot().toStringRepresentation());
        entry.setAttribute(TDMCommand.ATTRIBUTE_ACTIVITY_NAME, assertion.getActivityDefinition().getName());
        log(entry);
    }

    public void addAssertion(TerminationAssertion assertion) {
        Assert.isNotNull(assertion);
        terminationAssertions.add(assertion);
        firePropertyChanged(TDMConstants.PROPERTY_TERMINATION_ASSERTIONS);

        AuditTrailEntry entry = new AuditTrailEntry(TDMCommand.COMMAND_ADD_TERMINATION_ASSERTION);
        entry.setAttribute(TDMCommand.ATTRIBUTE_TIME_SLOT, assertion.getTimeSlot().toStringRepresentation());
        entry.setAttribute(AbstractGraphCommand.ID, assertion.getCheetahId());
        log(entry);
    }

    public Day addDay(Date date) {
        Day day = new Day(this, date);
        days.add(day);
        return day;
    }

    public void addLogListener(ILogListener listener) {
        logListeners.add(listener);
    }

    public void appendDay() {
        Date date = null;
        if (days.isEmpty()) {
            date = new Date();
        } else {
            date = new Date(days.get(days.size() - 1).getDate());
            date.increaseDaysBy(1);
        }

        days.add(new Day(this, date));
    }

    @Override
    public EditPart createEditPart(EditPart context) {
        return new WorkspaceEditPart(this);
    }

    private void fireTimeSlotSelectionChange() {
        for (Day day : days) {
            day.getPlanningArea().firePropertyChanged(TDMConstants.PROPERTY_TIMESLOT_SELECTION);
            day.getExecutionAssertionArea().firePropertyChanged(TDMConstants.PROPERTY_TIMESLOT_SELECTION);
            day.getTerminationAssertionArea().firePropertyChanged(TDMConstants.PROPERTY_TIMESLOT_SELECTION);
        }

        firePropertyChanged(TDMConstants.PROPERTY_TIMESLOT_SELECTION);
    }

    public List<Activity> getActivities() {
        return activities;
    }

    public Activity getActivity(long activityId) {
        for (Activity activity : activities) {
            if (activity.getCheetahId() == activityId) {
                return activity;
            }
        }

        return null;
    }

    /**
     * Determine the given day's activities.
     * 
     * @param tddDay
     *            the day
     * @return the activities
     */
    public List<Activity> getActivityInstances(Day tddDay) {
        return getOccurringAt(activities, tddDay);
    }

    private Assertion getAssertion(List<? extends Assertion> assertions, long id) {
        for (Assertion assertion : assertions) {
            if (assertion.getCheetahId() == id) {
                return assertion;
            }
        }

        return null;
    }

    public Assertion getAssertion(long id) {
        ExecutionAssertion assertion = getExecutionAssertion(id);
        if (assertion != null) {
            return assertion;
        }

        return getTerminationAssertion(id);
    }

    @Override
    public List<? extends Object> getChildren() {
        return days;
    }

    /**
     * Determine the day for the given date.
     * 
     * @param date
     *            the date
     * @return the corresponding day, <code>null</code> if there is no day for the given date
     */
    public Day getDay(Date date) {
        for (Day day : days) {
            if (day.getDate().sameDay(date)) {
                return day;
            }
        }

        return null;
    }

    public List<Day> getDays() {
        return days;
    }

    /**
     * @return the executionAreaSelection
     */
    public TimeSlot getExecutionAreaSelection() {
        return executionAreaSelection;
    }

    public ExecutionAssertion getExecutionAssertion(long id) {
        return (ExecutionAssertion) getAssertion(executionAssertions, id);
    }

    /**
     * @return the executionAssertions
     */
    public List<ExecutionAssertion> getExecutionAssertions() {
        return executionAssertions;
    }

    public List<Activity> getExecutionAssertions(Day day) {
        return getOccurringAt(executionAssertions, day);
    }

    /**
     * Determine all incoming constraints for this activity, i.e. where the arrow in the visualization for the constraints ends at the given
     * activity.
     * 
     * @param activity
     *            the activity
     * @return the constraints
     */
    public List<WeeklyConstraint> getIncomingConstraints(WeeklyActivity activity) {
        return weekly.getIncomingConstraints(activity);
    }

    private List<Activity> getOccurringAt(List<? extends Activity> activities, Day day) {
        List<Activity> instances = new ArrayList<Activity>();
        for (Activity instance : activities) {
            if (instance.occursAt(day)) {
                instances.add(instance);
            }
        }

        return instances;
    }

    /**
     * Determine all outgoing constraints for this activity, i.e. where the arrow in the visualization for the constraints starts at the
     * given activity.
     * 
     * @param activity
     *            the activity
     * @return the constraints
     */
    public List<WeeklyConstraint> getOutgoingConstraints(WeeklyActivity activity) {
        return weekly.getOutgoingConstraints(activity);
    }

    /**
     * @return the selection
     */
    public TimeSlot getPlanningAreaSelection() {
        return planningAreaSelection;
    }

    /**
     * Return the processInstance.
     * 
     * @return the processInstance
     */
    public DeclarativeProcessInstance getProcessInstance() {
        return processInstance;
    }

    /**
     * Determine the roles defined in this workspace.
     * 
     * @return all roles
     */
    public List<Role> getRoles() {
        Set<Role> roles = new HashSet<Role>();
        for (INodeInstance node : processInstance.getNodeInstances()) {
            Role role = RoleLookup.getInstance().getRole((DeclarativeActivityInstance) node);
            if (role != null) {
                roles.add(role);
            }
        }

        return new ArrayList<Role>(roles);
    }

    /**
     * @return the terminationAreaSelection
     */
    public TimeSlot getTerminationAreaSelection() {
        return terminationAreaSelection;
    }

    public TerminationAssertion getTerminationAssertion(long id) {
        return (TerminationAssertion) getAssertion(terminationAssertions, id);
    }

    public List<TerminationAssertion> getTerminationAssertions() {
        return terminationAssertions;
    }

    public List<Activity> getTerminationAssertions(Day day) {
        return getOccurringAt(terminationAssertions, day);
    }

    public TDMTest getTest() {
        return test;
    }

    /**
     * Return the weekly.
     * 
     * @return the weekly
     */
    public Weekly getWeekly() {
        return weekly;
    }

    private void initializePreferences() {
        IPreferenceStore store = Activator.getDefault().getPreferenceStore();
        this.showCompletedActivities = store.getBoolean(TDMConstants.KEY_SHOW_COMPLETED_ACTIVITIES);

        initializeRoleFilterPreferences();
    }

    public boolean isFirstDay(Day targetDay) {
        return days.indexOf(targetDay) == 0;
    }

    public boolean isLastDay(Day targetDay) {
        return days.indexOf(targetDay) == days.size() - 1;
    }

    public boolean isShowCompletedActivities() {
        return showCompletedActivities;
    }

    public boolean isShowRole(Role role) {
        IPreferenceStore store = Activator.getDefault().getPreferenceStore();
        String key = SHOW_ROLE + role.getName();
        return Boolean.valueOf(store.getString(key));
    }

    public void log(AuditTrailEntry entry) {
        for (Object listener : logListeners.getListeners()) {
            ((ILogListener) listener).log(entry);
        }
    }

    public void logInProcessInstance(AuditTrailEntry entry) {
        processInstance.log(entry);
    }

    public void removeActivity(Activity activity) {
        Assert.isTrue(activities.remove(activity));

        firePropertyChanged(TDMConstants.PROPERTY_ACTIVITIES);
        AuditTrailEntry entry = new AuditTrailEntry(TDMCommand.COMMAND_REMOVE_ACTIVITY_INSTANCE);
        entry.setAttribute(AbstractGraphCommand.ID, activity.getCheetahId());
        entry.setAttribute(TDMCommand.ATTRIBUTE_ACTIVITY_NAME, activity.getName());
        log(entry);
    }

    public void removeAssertion(Assertion assertion) {
        if (assertion instanceof ExecutionAssertion) {
            removeAssertion((ExecutionAssertion) assertion);
        } else if (assertion instanceof TerminationAssertion) {
            removeAssertion((TerminationAssertion) assertion);
        } else {
            throw new IllegalStateException();
        }
    }

    public void removeAssertion(ExecutionAssertion executionAssertion) {
        executionAssertions.remove(executionAssertion);
        firePropertyChanged(TDMConstants.PROPERTY_EXECUTION_ASSERTIONS);

        AuditTrailEntry entry = new AuditTrailEntry(TDMCommand.COMMAND_REMOVE_EXECUTION_ASSERTION);
        entry.setAttribute(AbstractGraphCommand.ID, executionAssertion.getCheetahId());
        log(entry);
    }

    public void removeAssertion(TerminationAssertion terminationAssertion) {
        terminationAssertions.remove(terminationAssertion);
        firePropertyChanged(TDMConstants.PROPERTY_TERMINATION_ASSERTIONS);

        AuditTrailEntry entry = new AuditTrailEntry(TDMCommand.COMMAND_REMOVE_TERMINATION_ASSERTION);
        entry.setAttribute(AbstractGraphCommand.ID, terminationAssertion.getCheetahId());
        log(entry);
    }

    public void removeLoggListener(ILogListener listener) {
        logListeners.remove(listener);
    }

    public void selectExclusively(Activity toSelect) {
        List<Activity> selectables = new ArrayList<Activity>();
        selectables.addAll(activities);
        selectables.addAll(executionAssertions);
        selectables.addAll(terminationAssertions);

        for (Activity selectable : selectables) {
            if (selectable.equals(toSelect)) {
                selectable.select();
            } else {
                selectable.unselect();
            }
        }
    }

    /**
     * @param executionAreaSelection
     *            the executionAreaSelection to set
     */
    public void setExecutionAreaSelection(TimeSlot executionAreaSelection) {
        this.executionAreaSelection = executionAreaSelection;
        this.planningAreaSelection = null;
        this.terminationAreaSelection = null;

        fireTimeSlotSelectionChange();
    }

    /**
     * @param executionAssertions
     *            the executionAssertions to set
     */
    public void setExecutionAssertions(List<ExecutionAssertion> executionAssertions) {
        this.executionAssertions = executionAssertions;
    }

    /**
     * @param selection
     *            the selection to set
     */
    public void setPlanningAreaSelection(TimeSlot selection) {
        this.planningAreaSelection = selection;
        this.executionAreaSelection = null;
        this.terminationAreaSelection = null;

        fireTimeSlotSelectionChange();
    }

    public void setShowCompletedActivities(boolean state) {
        showCompletedActivities = state;
        firePropertyChanged(TDMConstants.PROPERTY_ACTIVITIES);
    }

    public void setShowRole(Role role, boolean show) {
        String key = SHOW_ROLE + role.getName();
        IPreferenceStore store = Activator.getDefault().getPreferenceStore();
        store.setValue(key, String.valueOf(show));

        firePropertyChanged(TDMConstants.PROPERTY_ACTIVITIES);
    }

    /**
     * @param terminationAreaSelection
     *            the terminationAreaSelection to set
     */
    public void setTerminationAreaSelection(TimeSlot terminationAreaSelection) {
        this.terminationAreaSelection = terminationAreaSelection;
        this.planningAreaSelection = null;
        this.executionAreaSelection = null;

        fireTimeSlotSelectionChange();
    }

    public void setTest(TDMTest test) {
        this.test = test;
    }

}