Package org.enhydra.jawe.base.controller

Source Code of org.enhydra.jawe.base.controller.JaWEController

package org.enhydra.jawe.base.controller;

import java.awt.HeadlessException;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.lang.reflect.Constructor;
import java.nio.channels.FileLock;
import java.nio.channels.NonWritableChannelException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
import java.util.Properties;
import java.util.Set;

import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.enhydra.jawe.BarFactory;
import org.enhydra.jawe.ChoiceButton;
import org.enhydra.jawe.ChoiceButtonListener;
import org.enhydra.jawe.JaWEComponent;
import org.enhydra.jawe.JaWEComponentSettings;
import org.enhydra.jawe.JaWEComponentView;
import org.enhydra.jawe.JaWEConstants;
import org.enhydra.jawe.JaWEEAHandler;
import org.enhydra.jawe.JaWEManager;
import org.enhydra.jawe.JaWEXMLUtil;
import org.enhydra.jawe.ResourceManager;
import org.enhydra.jawe.UndoHistoryManager;
import org.enhydra.jawe.Utils;
import org.enhydra.jawe.WaitScreen;
import org.enhydra.jawe.XPDLElementChangeInfo;
import org.enhydra.jawe.XPDLListenerAndObservable;
import org.jped.base.xpdlhandler.DefaultXPDLHandlerSettings;
import org.jped.filter.PluggableValueFilter;
import org.jped.filter.ValueFilter;
import org.jped.plugins.PluginsManager;
import org.enhydra.jawe.base.xpdlhandler.XPDLHandler;
import org.enhydra.jawe.base.xpdlobjectfactory.XPDLObjectFactory;
import org.enhydra.jawe.base.xpdlvalidator.ValidationError;
import org.enhydra.jawe.components.graph.GraphUtilities;
import org.enhydra.shark.utilities.SequencedHashMap;
import org.enhydra.shark.xpdl.Path;
import org.enhydra.shark.xpdl.StandardPackageValidator;
import org.enhydra.shark.xpdl.XMLAttribute;
import org.enhydra.shark.xpdl.XMLCollection;
import org.enhydra.shark.xpdl.XMLCollectionElement;
import org.enhydra.shark.xpdl.XMLComplexElement;
import org.enhydra.shark.xpdl.XMLElement;
import org.enhydra.shark.xpdl.XMLElementChangeInfo;
import org.enhydra.shark.xpdl.XMLUtil;
import org.enhydra.shark.xpdl.XMLValidationError;
import org.enhydra.shark.xpdl.elements.Activities;
import org.enhydra.shark.xpdl.elements.Activity;
import org.enhydra.shark.xpdl.elements.ActivitySet;
import org.enhydra.shark.xpdl.elements.ActivitySets;
import org.enhydra.shark.xpdl.elements.Application;
import org.enhydra.shark.xpdl.elements.Applications;
import org.enhydra.shark.xpdl.elements.DataField;
import org.enhydra.shark.xpdl.elements.DataFields;
import org.enhydra.shark.xpdl.elements.EnumerationValue;
import org.enhydra.shark.xpdl.elements.ExtendedAttribute;
import org.enhydra.shark.xpdl.elements.ExtendedAttributes;
import org.enhydra.shark.xpdl.elements.ExternalPackage;
import org.enhydra.shark.xpdl.elements.ExternalPackages;
import org.enhydra.shark.xpdl.elements.FormalParameter;
import org.enhydra.shark.xpdl.elements.FormalParameters;
import org.enhydra.shark.xpdl.elements.Join;
import org.enhydra.shark.xpdl.elements.Member;
import org.enhydra.shark.xpdl.elements.Namespace;
import org.enhydra.shark.xpdl.elements.Namespaces;
import org.enhydra.shark.xpdl.elements.Package;
import org.enhydra.shark.xpdl.elements.Participant;
import org.enhydra.shark.xpdl.elements.Participants;
import org.enhydra.shark.xpdl.elements.Responsible;
import org.enhydra.shark.xpdl.elements.Responsibles;
import org.enhydra.shark.xpdl.elements.Split;
import org.enhydra.shark.xpdl.elements.Tools;
import org.enhydra.shark.xpdl.elements.Transition;
import org.enhydra.shark.xpdl.elements.TransitionRef;
import org.enhydra.shark.xpdl.elements.TransitionRefs;
import org.enhydra.shark.xpdl.elements.TransitionRestriction;
import org.enhydra.shark.xpdl.elements.TransitionRestrictions;
import org.enhydra.shark.xpdl.elements.Transitions;
import org.enhydra.shark.xpdl.elements.TypeDeclaration;
import org.enhydra.shark.xpdl.elements.TypeDeclarations;
import org.enhydra.shark.xpdl.elements.WorkflowProcess;
import org.enhydra.shark.xpdl.elements.WorkflowProcesses;
import org.w3c.dom.Document;

public class JaWEController extends Observable implements
        Observer,
        JaWEComponent,
        ChoiceButtonListener {

    protected ControllerSettings settings;
    protected boolean undoableChangeInProgress = false;
    protected boolean updateInProgress = false;
    protected boolean updateSpecialInProgress = false;
    protected JaWEEdit edit = new JaWEEdit();
    protected JaWETypes jtypes;
    protected JaWETypeResolver jtypeResolver;
    protected List xpdlInfoList = new ArrayList();
    protected List xpdlListenerObservables = new ArrayList();
    protected JaWESelectionManager selectionMng;
    protected JaWEActions defaultJaWEActions;
    protected UndoHistoryManager undoHistoryManager;
    protected JaWEFrame frame;
    boolean jaweFrameShown = false;
    protected XPDLElementChangeInfo undoSelectionEvent = null;
    protected String currentConfig = null;
    protected Map configInfo;
    protected PluginsManager pluginsManager;

    public JaWEController(ControllerSettings settings) {
        this.settings = settings;
        this.settings.init(this);

        jtypes = new JaWETypes();
        jtypes.setPropertyMgr(settings.getPropertyMgr());
        jtypes.init(this);
        pluginsManager = new PluginsManager(JaWEManager.getInstance());
    }

    // ********************** Observable
    public void addObserver(Observer obs) {
        super.addObserver(obs);
        if (obs instanceof Observable) {
            ((Observable) obs).addObserver(this);
        }
    }

    // **********************
    // ********************** Observer
    public void update(Observable o, Object arg) {
        if (updateInProgress) {
            JaWEManager.getInstance().getLoggingManager().warn("JaWEController -> this is nested event dispatch, because another one is in progress!");
            Thread.dumpStack();
            return;
        }
        if (!(arg instanceof XMLElementChangeInfo) || ((XMLElementChangeInfo) arg).getChangedElement() == null) {
            JaWEManager.getInstance().getLoggingManager().error("JaWEController -> Invalid arg " + arg + " or element");
            Thread.dumpStack();
            return;
        }
        XPDLElementChangeInfo info;
        if (!(arg instanceof XPDLElementChangeInfo)) {
            info = new XPDLElementChangeInfo(this, (XMLElementChangeInfo) arg);
        } else {
            info = (XPDLElementChangeInfo) arg;
        }
        if (arg instanceof XPDLElementChangeInfo && info.getSource() == this) {
            JaWEManager.getInstance().getLoggingManager().error("JaWEController -> Aborting update because JaWEController is a source!");
            Thread.dumpStack();
            return;
        }

        int action = info.getAction();

        XMLElement chel = info.getChangedElement();
        if (chel != null && chel.getParent() instanceof Package) {
            if (action == XMLElementChangeInfo.UPDATED && chel instanceof XMLAttribute && chel.toName().equals("Id") || chel.toName().equals("Name")) {
                if (chel.toName().equals("Id")) {
                    changePackageId((Package) chel.getParent(),
                            (String) info.getOldValue(),
                            (String) info.getNewValue());
                }
                updateTitle();
            }
        }

        if (isUndoOrRedoInProgress()) {
            JaWEManager.getInstance().getLoggingManager().debug("JaWEController -> event " + info + " won't be taken into account while processing undo/redo actions!");
            return;
        }
        if (undoableChangeInProgress) {
            if (!(action == XMLElementChangeInfo.INSERTED || action == XMLElementChangeInfo.REMOVED || action == XMLElementChangeInfo.UPDATED || action == XMLElementChangeInfo.REPOSITIONED)) {
                JaWEManager.getInstance().getLoggingManager().error("JaWEController -> event " + info + " won't be taken into account while processing undoable change action!");
                return;
            }

            xpdlInfoList.add(info);
            return;
        }

        if (updateSpecialInProgress) {
            JaWEManager.getInstance().getLoggingManager().warn("JaWEController -> this is nested event dispatch, because another special update is in progress!");
            Thread.dumpStack();
            return;
        }

        updateInProgress = true;
        JaWEManager.getInstance().getLoggingManager().info("JaWEController -> normal update for event " + arg + " started ...");

        if (action == XPDLElementChangeInfo.SELECTED) {
            JaWEManager.getInstance().getLoggingManager().error("JaWEController -> SELECTION event not sent from JaWEController! ");
            Thread.dumpStack();
            return;
        }
        clearHistory();

        setChanged();
        notifyObservers(info);

        JaWEManager.getInstance().getLoggingManager().info("JaWEController -> normal update ended");
        updateTitle();
        adjustActions();
        updateInProgress = false;

        if (settings.isDesingTimeValidationEnabled()) {
            if (getMainPackage() != null && (action == XMLElementChangeInfo.INSERTED || action == XMLElementChangeInfo.REMOVED || action == XMLElementChangeInfo.UPDATED || action == XMLElementChangeInfo.REPOSITIONED)) {
                checkValidity(getMainPackage(), true, false, true);
            }
        }

        handleEvent(info);
    }

    // **********************
    // ********************** JaWEComponent
    public JaWEComponentSettings getSettings() {
        return settings;
    }

    public JaWEComponentView getView() {
        return getJaWEFrame();
    }

    public String getName() {
        return "TogWE";
    }

    public String getType() {
        return JaWEComponent.MAIN_COMPONENT;
    }

    public void setType(String type) {
    }

    public boolean adjustXPDL(Package pkg) {
        boolean changed = JaWEManager.getInstance().getXPDLUtils().correctSplitsAndJoins(pkg);

        if (JaWEManager.getInstance().getXPDLHandler().getXPDLRepositoryHandler().isXPDLPrefixEnabled()) {
            List l = pkg.getNamespaces().toElements();
            boolean hasxpdlns = false;
            for (int i = 0; i < l.size(); i++) {
                Namespace ns = (Namespace) l.get(i);
                String nsn = ns.getName();
                if (nsn.equals("xpdl")) {
                    hasxpdlns = true;
                    break;
                }
            }
            if (!hasxpdlns) {
                Namespaces nss = pkg.getNamespaces();
                XPDLObjectFactory xpdlof = JaWEManager.getInstance().getXPDLObjectFactory();
                Namespace ns = xpdlof.createXPDLObject(nss, "", false);
                ns.setName("xpdl");
                ns.setLocation("http://www.wfmc.org/2002/XPDL1.0");
                nss.add(ns);
                xpdlof.adjustXPDLObject(pkg, null);
                changed = true;
            }
        }
        Iterator comps = JaWEManager.getInstance().getComponentManager().getComponents().iterator();
        while (comps.hasNext()) {
            JaWEComponent jc = (JaWEComponent) comps.next();
            if (jc != this) {
                changed = jc.adjustXPDL(pkg) || changed;
            }
        }

        // configuration ext. attribute
        if (!JaWEEAHandler.getJaWEConfig(pkg).equals(getCurrentConfig())) {
            JaWEEAHandler.setJaWEConfig(pkg, getCurrentConfig());
            changed = true;
        }

      String verInfo = JaWEManager.getVersion()
                       + "-" + JaWEManager.getRelease() + "-"
                       + JaWEManager.getBuildEdition()
                       + JaWEManager.getBuildEditionSuffix() + "-"
                       + JaWEManager.getBuildNo();
        if (!JaWEEAHandler.getEditingToolVersion(pkg).equals(verInfo)) {
            JaWEEAHandler.setEditingToolVersion(pkg, verInfo);
            changed = true;
        }
        if (!JaWEEAHandler.getEditingTool(pkg).equals(JaWEManager.getInstance().getName())) {
            JaWEEAHandler.setEditingTool(pkg, JaWEManager.getInstance().getName());
            changed = true;
        }

        if (JaWEEAHandler.removeOldPackageEAs(pkg)) {
            changed = true;
        }

        // add external package's ext. attrib. if it does not exist
        if (JaWEEAHandler.adjustExternalPackageEAs(pkg)) {
            changed = true;
        }

        return changed;
    }

    public boolean checkValidity(Package el,
            boolean fullCheck,
            boolean specNotif,
            boolean initialOrDesignTimeValidation) {
        // configure validator
        StandardPackageValidator xpdlValidator = JaWEManager.getInstance().getXPDLValidator();
        xpdlValidator.init(JaWEManager.getInstance().getXPDLHandler(),
                XMLUtil.getPackage(el),
                !specNotif,
                settings.getEncoding(),
                JaWEManager.getInstance().getStartingLocale());
        List l = checkValidity(el, fullCheck);
        XPDLElementChangeInfo info = createInfo(el,
                l,
                XPDLElementChangeInfo.VALIDATION_ERRORS);
        info.setNewValue(new Boolean(specNotif));
        info.setOldValue(new Boolean(initialOrDesignTimeValidation));
        sendEvent(info);
        return (l == null || l.size() == 0);
    }

    public List checkValidity(XMLElement el, boolean fullCheck) {
        StandardPackageValidator xpdlValidator = JaWEManager.getInstance().getXPDLValidator();

        if (el == null) {
            return null;
        }

        List existingErrors = new ArrayList();
        xpdlValidator.validateElement(el, existingErrors, fullCheck);
        List verrors = new ArrayList();
        for (int i = 0; i < existingErrors.size(); i++) {
            ValidationError verr = new ValidationError((XMLValidationError) existingErrors.get(i));
            verrors.add(verr);
        }
        existingErrors.clear();
        boolean isValid = verrors.size() == 0;

        List vers = new ArrayList();
        if (isValid || fullCheck) {
            Iterator comps = JaWEManager.getInstance().getComponentManager().getComponents().iterator();
            while (comps.hasNext()) {
                JaWEComponent jc = (JaWEComponent) comps.next();
                if (jc != this) {
                    List l = jc.checkValidity(el, fullCheck);
                    isValid = (l == null || l.size() == 0) && isValid;
                    if (l != null) {
                        vers.addAll(l);
                    }
                    if (!(isValid || fullCheck)) {
                        break;
                    }
                }
            }
        }

        verrors.addAll(vers);
        verrors = Utils.sortValidationErrorList(verrors, XMLUtil.getPackage(el));

        //CUSTOM
        if (verrors.size() == 0) {
            verrors.add(ResourceManager.getLanguageDependentString("ERROR_NO_ERROR"));
        }
        //CUSTOM

        return verrors;
    }

    public boolean canCreateElement(XMLCollection col) {
        return canCreateElement(col, true);
    }

    public boolean canInsertElement(XMLCollection col, XMLElement el) {
        return canInsertElement(col, el, true);
    }

    public boolean canModifyElement(XMLElement el) {
        return canModifyElement(el, true);
    }

    public boolean canRemoveElement(XMLCollection col, XMLElement el) {
        return canRemoveElement(col, el, true);
    }

    public boolean canDuplicateElement(XMLCollection col, XMLElement el) {
        return canDuplicateElement(col, el, true);
    }

    public boolean canRepositionElement(XMLCollection col, XMLElement el) {
        return canRepositionElement(col, el, true);
    }

    // **********************
    // ********************** ChoiceButtonListener
    public void selectionChanged(ChoiceButton cbutton, Object change) {
        if (cbutton instanceof JaWETypeChoiceButton && ((JaWETypeChoiceButton) cbutton).getXPDLChoiceType() != null && cbutton.getChoiceType().equals(JaWEType.class)) {
            JaWEType jtype = (JaWEType) change;

            String typeId = null;
            if (jtype != null) {
                typeId = jtype.getTypeId();
            }

            Class xpdlClass = ((JaWETypeChoiceButton) cbutton).getXPDLChoiceType();
            if (xpdlClass == Package.class) {
                if (tryToClosePackage(getMainPackageId(), false)) {
                    newPackage(typeId);
                }
            } else {
                startUndouableChange();
                List temp = new ArrayList();
                XMLElement newEl = null;
                if (xpdlClass == Activities.class || xpdlClass == Activity.class) {
                    ActivitySet as = selectionMng.getWorkingActivitySet();
                    WorkflowProcess wp = selectionMng.getWorkingProcess();
                    if (as != null && !as.isReadOnly()) {
                        newEl = JaWEManager.getInstance().getXPDLObjectFactory().createXPDLObject(as.getActivities(), typeId, true);
                    } else if (wp != null && !wp.isReadOnly()) {
                        newEl = JaWEManager.getInstance().getXPDLObjectFactory().createXPDLObject(wp.getActivities(), typeId, true);
                    }
                } else if (xpdlClass == ActivitySet.class || xpdlClass == ActivitySets.class) {
                    WorkflowProcess wp = selectionMng.getWorkingProcess();
                    if (wp != null && !wp.isReadOnly()) {
                        newEl = JaWEManager.getInstance().getXPDLObjectFactory().createXPDLObject(wp.getActivitySets(), typeId, true);
                    }
                } else if (xpdlClass == Application.class || xpdlClass == Applications.class) {
                    Package workingPkg = selectionMng.getWorkingPKG();
                    if (workingPkg != null && !workingPkg.isReadOnly()) {
                        newEl = JaWEManager.getInstance().getXPDLObjectFactory().createXPDLObject(workingPkg.getApplications(), typeId, true);
                    }
                } else if (xpdlClass == DataField.class || xpdlClass == DataFields.class) {
                    Package workingPkg = selectionMng.getWorkingPKG();
                    if (workingPkg != null && !workingPkg.isReadOnly()) {
                        newEl = JaWEManager.getInstance().getXPDLObjectFactory().createXPDLObject(workingPkg.getDataFields(), typeId, true);
                    }
                } else if (xpdlClass == ExtendedAttribute.class || xpdlClass == ExtendedAttributes.class) {
                    Package workingPkg = selectionMng.getWorkingPKG();
                    if (workingPkg != null && !workingPkg.isReadOnly()) {
                        newEl = JaWEManager.getInstance().getXPDLObjectFactory().createXPDLObject(workingPkg.getExtendedAttributes(), typeId, true);
                    }
                } else if (xpdlClass == FormalParameter.class || xpdlClass == FormalParameters.class) {
                    WorkflowProcess wp = selectionMng.getWorkingProcess();
                    if (wp != null && !wp.isReadOnly()) {
                        newEl = JaWEManager.getInstance().getXPDLObjectFactory().createXPDLObject(wp.getFormalParameters(), typeId, true);
                    }
                } else if (xpdlClass == Namespace.class || xpdlClass == Namespaces.class) {
                    Package workingPkg = selectionMng.getWorkingPKG();
                    if (workingPkg != null && !workingPkg.isReadOnly()) {
                        newEl = JaWEManager.getInstance().getXPDLObjectFactory().createXPDLObject(workingPkg.getNamespaces(), typeId, true);
                    }
                } else if (xpdlClass == Participant.class || xpdlClass == Participants.class) {
                    Package workingPkg = selectionMng.getWorkingPKG();
                    if (workingPkg != null && !workingPkg.isReadOnly()) {
                        newEl = JaWEManager.getInstance().getXPDLObjectFactory().createXPDLObject(workingPkg.getParticipants(), typeId, true);
                    }
                } else if (xpdlClass == Responsible.class || xpdlClass == Responsibles.class) {
                    Package workingPkg = selectionMng.getWorkingPKG();
                    if (workingPkg != null && !workingPkg.isReadOnly()) {
                        newEl = JaWEManager.getInstance().getXPDLObjectFactory().createXPDLObject(workingPkg.getRedefinableHeader().getResponsibles(),
                                typeId,
                                true);
                    }
                } else if (xpdlClass == Transition.class || xpdlClass == Transitions.class) {
                    ActivitySet as = selectionMng.getWorkingActivitySet();
                    WorkflowProcess wp = selectionMng.getWorkingProcess();
                    if (as != null && !as.isReadOnly()) {
                        newEl = JaWEManager.getInstance().getXPDLObjectFactory().createXPDLObject(as.getTransitions(), typeId, true);
                    } else if (wp != null && !wp.isReadOnly()) {
                        newEl = JaWEManager.getInstance().getXPDLObjectFactory().createXPDLObject(wp.getTransitions(), typeId, true);
                    }
                } else if (xpdlClass == TypeDeclaration.class || xpdlClass == TypeDeclarations.class) {
                    Package workingPkg = selectionMng.getWorkingPKG();
                    if (workingPkg != null && !workingPkg.isReadOnly()) {
                        newEl = JaWEManager.getInstance().getXPDLObjectFactory().createXPDLObject(workingPkg.getTypeDeclarations(), typeId, true);
                    }
                } else if (xpdlClass == WorkflowProcess.class || xpdlClass == WorkflowProcesses.class) {
                    Package workingPkg = selectionMng.getWorkingPKG();
                    if (workingPkg != null && !workingPkg.isReadOnly()) {
                        newEl = JaWEManager.getInstance().getXPDLObjectFactory().createXPDLObject(workingPkg.getWorkflowProcesses(), typeId, true);
                    }
                }
                if (newEl != null) {
                    temp.add(newEl);
                }
                endUndouableChange(temp);
            }
        } else {
            selectionMng.setSelection((XMLElement) change, true);
            updateTitle();
            adjustActions();
        }
    }

    public Object getSelectedObject(ChoiceButton cbutton) {
        return null;
    }

    public List getChoices(ChoiceButton cbutton) {
        ArrayList toRet = new ArrayList();
        if (cbutton instanceof JaWETypeChoiceButton) {
            Class xpdlElType = ((JaWETypeChoiceButton) cbutton).getXPDLChoiceType();
            toRet.addAll(jtypes.getTypes(xpdlElType));
        }

        return toRet;
    }

    // **********************
    public void init() {
        selectionMng = new JaWESelectionManager(this);
        try {
            String uhmc = getControllerSettings().undoHistoryManagerClass();
            if (uhmc != null && !uhmc.equals("")) {
                undoHistoryManager = (UndoHistoryManager) Class.forName(uhmc).newInstance();
                undoHistoryManager.init(getControllerSettings().undoHistorySize());
            }
        } catch (Exception ex) {
            System.err.println("Failed to instantiate undo history manager!");
        }

        try {
            String className = settings.getResolverTypeClassName();

            Constructor c = Class.forName(className).getConstructor(new Class[]{
                        JaWEController.class
                    });
            jtypeResolver = (JaWETypeResolver) c.newInstance(new Object[]{
                        this
                    });
            JaWEManager.getInstance().getLoggingManager().info("JaWEController -> Working with '" + className + "' as type resolver");
        } catch (Throwable ex) {
            ex.printStackTrace();
            JaWEManager.getInstance().getLoggingManager().info("JaweManager -> Problems while instantiating type resolver! Using default!");
            jtypeResolver = new JaWETypeResolver(this);
        }

        defaultJaWEActions = new JaWEActions(this);
        defaultJaWEActions.init();

        settings.adjustActions();

        initPlugins();
        createJaWEFrame();
        updateTitle();
        clearAll();
    }

    private void initPlugins() {
        pluginsManager.initPlugins(JaWEManager.getProperties());
    }

    public void registerJaWEComponent(JaWEComponent jaweComponent) {
        if (getJaWEFrame() != null) {
            JComponent display = jaweComponent.getView().getDisplay();
            String name = jaweComponent.getName();
            String type = jaweComponent.getType();
            if (type.equals(JaWEComponent.MAIN_COMPONENT)) {
                getJaWEFrame().addMainComponent(name, display);
            } else if (type.equals(JaWEComponent.SPECIAL_COMPONENT)) {
                getJaWEFrame().addToSpecialComponents(name, display);
            } else if (type.equals(JaWEComponent.TREE_COMPONENT)) {
                getJaWEFrame().addToTreeComponents(name, display);
            } else if (type.equals(JaWEComponent.OTHER_COMPONENT)) {
                getJaWEFrame().addToOtherComponents(name, display);
            } else if (type.equals(JaWEComponent.UPPER_STATUS_COMPONENT)) {
                getJaWEFrame().addUpperStatusComponent(name, display);
            } else if (type.equals(JaWEComponent.LOWER_STATUS_COMPONENT)) {
                getJaWEFrame().addLowerStatusComponent(name, display);
            }
        }
    }

    public void removeJaWEComonent(JaWEComponent comp) {
        if (getJaWEFrame() != null) {
            String type = comp.getType();
            JComponent display = comp.getView().getDisplay();
            if (type.equals(JaWEComponent.MAIN_COMPONENT)) {
                getJaWEFrame().removeMainComponent(display);
            } else if (type.equals(JaWEComponent.SPECIAL_COMPONENT)) {
                getJaWEFrame().removeSpecialComponent(display);
            } else if (type.equals(JaWEComponent.TREE_COMPONENT)) {
                getJaWEFrame().removeTreeComponent(display);
            } else if (type.equals(JaWEComponent.OTHER_COMPONENT)) {
                getJaWEFrame().removeOtherComponent(display);
            } else if (type.equals(JaWEComponent.UPPER_STATUS_COMPONENT)) {
                getJaWEFrame().removeUpperStatusComponent(display);
            } else if (type.equals(JaWEComponent.LOWER_STATUS_COMPONENT)) {
                getJaWEFrame().removeLowerStatusComponent(display);
            }
        }
    }

    public void changeJaWEComponentType(JaWEComponent comp, String newType) {
        if (getJaWEFrame() != null) {
            removeJaWEComonent(comp);
            comp.setType(newType);
            registerJaWEComponent(comp);
        }
    }

    protected void createJaWEFrame() {
        //CUSTOM: catch HeadlessException
        try {
            frame = new JaWEFrame(this);
            frame.configure();
        } catch (HeadlessException e) {
            // ignore
        }
        //END CUSTOM
    }

    public void showJaWEFrame() {
        if (frame != null) {
            frame.setVisible(true);
            jaweFrameShown = true;
        }
    }

    public boolean isPackageModified(String xpdlId) {
        if (xpdlId == null) {
            xpdlId = getMainPackageId();
        }
        Iterator it = xpdlListenerObservables.iterator();
        while (it.hasNext()) {
            XPDLListenerAndObservable xpdl = (XPDLListenerAndObservable) it.next();
            if (xpdl.getPackage() != null && xpdl.getPackage().getId().equals(xpdlId)) {
                return xpdl.isModified();
            }
        }
        return false;
    }

    public Package getMainPackage() {
        return JaWEManager.getInstance().getXPDLHandler().getPackageById(getMainPackageId());
    }

    public String getMainPackageId() {
        XPDLHandler xpdlhandler = JaWEManager.getInstance().getXPDLHandler();
        String xpdlId = xpdlhandler.getMainPackageId();
        if (xpdlId == null && xpdlhandler.getAllPackageIds().size() > 0) {
            Iterator it = xpdlhandler.getAllPackages().iterator();
            while (it.hasNext()) {
                Package p = (Package) it.next();
                if (!p.isTransient() && !p.isReadOnly()) {
                    xpdlId = p.getId();
                    break;
                }
            }
        }
        return xpdlId;
    }

    // ///////////////////////////// XPDL File Handling /////////////////////////
    public String getPackageFilename(String xpdlId) {
        XPDLHandler xpdlhandler = JaWEManager.getInstance().getXPDLHandler();
        if (xpdlId == null) {
            xpdlId = getMainPackageId();
        }
        Package pkg = xpdlhandler.getPackageById(xpdlId);
        return xpdlhandler.getAbsoluteFilePath(pkg);
    }

    public void changePackageFileName(Package pkg, String newFileName) {
        XPDLHandler xpdlhandler = JaWEManager.getInstance().getXPDLHandler();
        xpdlhandler.registerPackageFilename(newFileName, pkg);
    }

    public void newPackage(String type) {
        clearAll();

        XPDLHandler xpdlhandler = JaWEManager.getInstance().getXPDLHandler();
        JaWEManager.getInstance().getLoggingManager().info("JaWEController -> creating new XPDL, type=" + type);

        Package pkg = JaWEManager.getInstance().getXPDLObjectFactory().createPackage(type);
        xpdlhandler.registerPackage(pkg);
        adjustXPDL(pkg);
        createNewXPDLListenerObservable(pkg, true, true);
        setChanged();
        notifyObservers(createInfo(pkg, XMLElementChangeInfo.INSERTED));
        selectionMng.setSelection(pkg, true);

        JaWEManager.getInstance().getLoggingManager().info("JaWEController -> new package with Id " + pkg.getId() + " is created");
        updateTitle();
        adjustActions();

        //CUSTOM
        JaWEManager.getInstance().getXPDLObjectFactory().createXPDLObject(this.getMainPackage().getWorkflowProcesses(), JaWEConstants.WORKFLOW_PROCESS_TYPE_DEFAULT, true);
        GraphUtilities.getGraphController().getGraphMarqueeHandler().insertParticipant();

        //END CUSTOM
    }

    public Package openPackageFromFile(String filename) {
        JaWEManager.getInstance().getLoggingManager().info("JaWEController -> opening package from file " + filename);
        return openPackage(filename, null);
    }

    public Package openPackageFromStream(byte[] xpdlStream) {
        JaWEManager.getInstance().getLoggingManager().info("JaWEController -> opening package from stream ");
        return openPackage(null, xpdlStream);
    }

    protected Package openPackage(String filename, byte[] xpdlStream) {
        //CUSTOM: added exception handling for HeadlessException
        WaitScreen ws = null;
        try {
            ws = new WaitScreen(frame);
        } catch (HeadlessException e) {
            // ignore
        }
        XPDLHandler xpdlh = null;
        try {
            Package pkg = null;
            clearAll();
            XPDLHandler xpdlhandler = JaWEManager.getInstance().getXPDLHandler();
            if (jaweFrameShown && filename != null && xpdlStream == null) {
                if (ws != null) {
                    ws.show(null, "", settings.getLanguageDependentString("OpeningFile"));
                }
            }
            xpdlh = JaWEManager.getInstance().createXPDLHandler(xpdlhandler.getXPDLRepositoryHandler());

            try {
                if (filename != null) {
                    pkg = xpdlh.openPackage(filename, true);
                } else {
                    pkg = xpdlh.openPackageFromStream(xpdlStream, true);
                }
            } catch (Exception ex) {
                ex.printStackTrace();
                clearAll();
                xpdlh.closeAllPackages();
                if (ws != null) {
                    ws.setVisible(false);
                }
                getJaWEFrame().message(settings.getLanguageDependentString("ErrorCannotOpenXPDL" + "\n" + ex.getMessage()),
                        JOptionPane.INFORMATION_MESSAGE);
            }

            if (pkg != null) {
                // do not allow insertion if package has the same Id as the one already
                // inserted
                Set allpkgids = new HashSet(xpdlhandler.getAllPackageIds());
                boolean canInsert = true;
                if (allpkgids.contains(pkg.getId())) {
                    canInsert = false;
                }
                if (canInsert) {
                    xpdlhandler.synchronizePackages(xpdlh);

                    boolean mainChanged = false;
                    Iterator it = xpdlhandler.getAllPackages().iterator();
                    while (it.hasNext()) {
                        Package p = (Package) it.next();
                        boolean changed = false;
                        try {
                            changed = adjustXPDL(p);
                        } catch (Exception e) {
                            // ignore
                        }

                        XPDLListenerAndObservable xpdl;
                        if (p == pkg) {
                            xpdl = createNewXPDLListenerObservable(pkg, true, false);
                            if (changed) {
                                mainChanged = true;
                            }
                        } else {
                            xpdl = createNewXPDLListenerObservable(p, false, false);
                            p.setReadOnly(true);
                        }
                        xpdl.setModified(changed);
                    }

                    List inserted = new ArrayList();
                    inserted.add(pkg);

                    it = xpdlhandler.getAllPackages().iterator();
                    while (it.hasNext()) {
                        Package pkgext = (Package) it.next();
                        if (pkgext == pkg) {
                            continue;
                        }
                        inserted.add(pkgext);
                    }

                    setChanged();
                    notifyObservers(createInfo(pkg, inserted, XMLElementChangeInfo.INSERTED));

                    if (pkg.getWorkflowProcesses().size() > 0) {
                        selectionMng.setSelection(pkg.getWorkflowProcesses().get(0), true);
                    } else {
                        selectionMng.setSelection(pkg, true);
                    }

                    JaWEManager.getInstance().getLoggingManager().info("JaWEController -> opened package " + pkg.getId());
                    if (settings.isInitialXPDLValidationEnabled()) {
                        try {
                            checkValidity(pkg, true, true, true);
                        } catch (Exception e) {
                            // ignore
                        }

                    }

                    if ((mainChanged) && jaweFrameShown) {
                        if (mainChanged) {
                            if (ws != null) {
                                ws.setVisible(false);
                            }
                            // CUSTOM: hide warning message
//                            frame.message(settings.getLanguageDependentString("InformationTogWEHasAutomaticallyAdjustedSomeXPDLParts"),
//                                    JOptionPane.INFORMATION_MESSAGE);
                            // END CUSTOM
                        }
                    }

                } else {
                    if (getJaWEFrame() != null) {
                        getJaWEFrame().message(settings.getLanguageDependentString("InformationPackageCannotBeOpened"),
                                JOptionPane.INFORMATION_MESSAGE);

                    }
                }
            } else {
                clearAll();
                Map pems = xpdlhandler.getParsingErrorMessages();
                String msg = null;
                if (pems != null && pems.size() > 0) {
                    Set s = (Set) pems.values().toArray()[0];
                    if (s != null && s.size() > 0) {
                        msg = (String) s.toArray()[0];
                    }
                }
                Iterator it = xpdlhandler.getAllPackages().iterator();
                while (it.hasNext()) {
                    Package p = (Package) it.next();
                    if (!p.isTransient()) {
                        xpdlhandler.closePackageVersion(p.getId(), p.getInternalVersion());
                    }
                }
                if (ws != null) {
                    ws.setVisible(false);
                }
                getJaWEFrame().message(settings.getLanguageDependentString("ErrorCannotOpenXPDL") + ((msg != null) ? "\n" + msg : ""),
                        JOptionPane.INFORMATION_MESSAGE);
            }
            updateTitle();
            adjustActions();

            return pkg;
        } finally {
            if (ws != null) {
                ws.setVisible(false);
            }
        }
        //END CUSTOM
    }

    public void addExternalPackage(String filename) {
        Package mainPkg = getMainPackage();
        XPDLHandler xpdlhmain = JaWEManager.getInstance().getXPDLHandler();
        XPDLHandler xpdlh = null;
        if (filename != null && filename.length() > 0) {
            try {
                xpdlh = new XPDLHandler(new DefaultXPDLHandlerSettings());
                Package pkg = xpdlh.openPackage(filename, true);
                // do not allow insertion if package has the same Id as the main one,
                // or as some of its external packages
                Set mainPkgExtPkgIds = new HashSet(mainPkg.getExternalPackageIds());
                boolean canInsert = true;
                if (mainPkgExtPkgIds.contains(pkg.getId())) {
                    canInsert = false;
                }
                if (canInsert) {
                    canInsert = checkInsertion(xpdlhmain, xpdlh, mainPkg.getId());
                }
                if (canInsert) {
                    List l = XMLUtil.getAllExternalPackageIds(xpdlhmain,
                            mainPkg,
                            new HashSet());
                    if (!l.contains(pkg.getId()) && xpdlhmain.getPackageById(pkg.getId()) != null) {
                        canInsert = false;
                    }
                }
                if (canInsert) {
                    Set pkgIdsToInsert = new HashSet(xpdlh.getAllPackageIds());
                    Set otherEPIds = new HashSet(mainPkg.getExternalPackageIds());
                    Set allOtherEPIds = new HashSet(otherEPIds);
                    List l = XMLUtil.getAllExternalPackageIds(xpdlhmain,
                            mainPkg,
                            new HashSet());
                    List ids = new ArrayList(xpdlhmain.getAllPackageIds());
                    ids.removeAll(l);
                    allOtherEPIds.addAll(ids);
                    Iterator it = otherEPIds.iterator();
                    while (it.hasNext()) {
                        String pkgId = (String) it.next();
                        Package p = xpdlhmain.getPackageById(pkgId);
                        allOtherEPIds.addAll(XMLUtil.getAllExternalPackageIds(xpdlhmain,
                                p,
                                new HashSet()));
                    }
                    pkgIdsToInsert.removeAll(allOtherEPIds);

                    Set pkgsToInsert = new HashSet();
                    it = pkgIdsToInsert.iterator();
                    while (it.hasNext()) {
                        String pkgId = (String) it.next();
                        Package tAdd = xpdlh.getPackageById(pkgId);
                        pkgsToInsert.add(tAdd);
                    }

                    xpdlhmain.synchronizePackages(xpdlh);

                    Package realPkg = xpdlhmain.getPackageById(pkg.getId());
                    ExternalPackage ep = null;
                    // insert ExternalPackage
                    ExternalPackages eps = mainPkg.getExternalPackages();
                    File f = new File(xpdlhmain.getAbsoluteFilePath(mainPkg));
                    String parentF = f.getParent();
                    Path newPath = new Path(parentF);
                    String eppath = xpdlhmain.getAbsoluteFilePath(realPkg);
                    String relativePath = Path.getRelativePath(new Path(eppath), newPath);
                    ep = JaWEManager.getInstance().getXPDLObjectFactory().createXPDLObject(eps, "", false);
                    ep.setHref(relativePath);
                    JaWEEAHandler.setExternalPackageEA(ep, realPkg.getId());
                    mainPkg.addExternalPackageMapping(relativePath, realPkg.getId());
                    eps.add(ep);

                    it = pkgsToInsert.iterator();
                    while (it.hasNext()) {
                        Package p = (Package) it.next();
                        boolean changed = adjustXPDL(p);
                        XPDLListenerAndObservable xpdl;
                        xpdl = createNewXPDLListenerObservable(p, false, false);
                        p.setReadOnly(true);
                        xpdl.setModified(changed);
                    }

                    setChanged();
                    notifyObservers(createInfo(mainPkg,
                            new ArrayList(pkgsToInsert),
                            XMLElementChangeInfo.INSERTED));

                    if (ep != null) {
                        getSelectionManager().setSelection(ep, true);
                    }

                } else {
                    getJaWEFrame().message(settings.getLanguageDependentString("InformationExternalPackageCannotBeInserted"),
                            JOptionPane.INFORMATION_MESSAGE);
                    xpdlh.closeAllPackages();
                }
            } catch (Exception ex) {
                ex.printStackTrace();
                getJaWEFrame().message(settings.getLanguageDependentString("InformationExternalPackageCannotBeInserted"),
                        JOptionPane.INFORMATION_MESSAGE);
                if (xpdlh != null) {
                    xpdlh.closeAllPackages();
                }
            }
        }
    }

    public void addExternalPackage() {
        Package mainPkg = getMainPackage();
        XPDLHandler xpdlhmain = JaWEManager.getInstance().getXPDLHandler();
        getSelectionManager().setSelection(mainPkg.getExternalPackages(), false);

        String filename = "";
        String message = settings.getLanguageDependentString("DialogChooseFile");
        filename = JaWEXMLUtil.dialog(getJaWEFrame(), message, 0, 0, null);
        XPDLHandler xpdlh = null;
        if (filename != null && filename.length() > 0) {
            try {
                xpdlh = JaWEManager.getInstance().createXPDLHandler(xpdlhmain.getXPDLRepositoryHandler());
                Package pkg = xpdlh.openPackage(filename, true);
                // do not allow insertion if package has the same Id as the main one,
                // or as some of its external packages
                Set mainPkgExtPkgIds = new HashSet(mainPkg.getExternalPackageIds());
                boolean canInsert = true;
                if (mainPkgExtPkgIds.contains(pkg.getId())) {
                    canInsert = false;
                }
                if (canInsert) {
                    canInsert = checkInsertion(xpdlhmain, xpdlh, mainPkg.getId());
                }
                if (canInsert) {
                    List l = XMLUtil.getAllExternalPackageIds(xpdlhmain,
                            mainPkg,
                            new HashSet());
                    if (!l.contains(pkg.getId()) && xpdlhmain.getPackageById(pkg.getId()) != null) {
                        canInsert = false;
                    }
                }
                if (canInsert) {
                    Set pkgIdsToInsert = new HashSet(xpdlh.getAllPackageIds());
                    Set otherEPIds = new HashSet(mainPkg.getExternalPackageIds());
                    Set allOtherEPIds = new HashSet(otherEPIds);
                    List l = XMLUtil.getAllExternalPackageIds(xpdlhmain,
                            mainPkg,
                            new HashSet());
                    List ids = new ArrayList(xpdlhmain.getAllPackageIds());
                    ids.removeAll(l);
                    allOtherEPIds.addAll(ids);
                    Iterator it = otherEPIds.iterator();
                    while (it.hasNext()) {
                        String pkgId = (String) it.next();
                        Package p = xpdlhmain.getPackageById(pkgId);
                        allOtherEPIds.addAll(XMLUtil.getAllExternalPackageIds(xpdlhmain,
                                p,
                                new HashSet()));
                    }
                    pkgIdsToInsert.removeAll(allOtherEPIds);

                    Set pkgsToInsert = new HashSet();
                    it = pkgIdsToInsert.iterator();
                    while (it.hasNext()) {
                        String pkgId = (String) it.next();
                        Package tAdd = xpdlh.getPackageById(pkgId);
                        pkgsToInsert.add(tAdd);
                    }

                    xpdlhmain.synchronizePackages(xpdlh);

                    Package realPkg = xpdlhmain.getPackageById(pkg.getId());
                    ExternalPackage ep = null;
                    // insert ExternalPackage
                    ExternalPackages eps = mainPkg.getExternalPackages();
                    File f = new File(xpdlhmain.getAbsoluteFilePath(mainPkg));
                    String parentF = f.getParent();
                    Path newPath = new Path(parentF);
                    String eppath = xpdlhmain.getAbsoluteFilePath(realPkg);
                    String relativePath = Path.getRelativePath(new Path(eppath), newPath);
                    ep = JaWEManager.getInstance().getXPDLObjectFactory().createXPDLObject(eps, "", false);
                    ep.setHref(relativePath);
                    JaWEEAHandler.setExternalPackageEA(ep, realPkg.getId());
                    mainPkg.addExternalPackageMapping(relativePath, realPkg.getId());
                    eps.add(ep);

                    it = pkgsToInsert.iterator();
                    while (it.hasNext()) {
                        Package p = (Package) it.next();
                        boolean changed = adjustXPDL(p);
                        XPDLListenerAndObservable xpdl;
                        xpdl = createNewXPDLListenerObservable(p, false, false);
                        p.setReadOnly(true);
                        xpdl.setModified(changed);
                    }

                    setChanged();
                    notifyObservers(createInfo(mainPkg,
                            new ArrayList(pkgsToInsert),
                            XMLElementChangeInfo.INSERTED));

                    if (ep != null) {
                        getSelectionManager().setSelection(ep, true);
                    }

                } else {
                    getJaWEFrame().message(settings.getLanguageDependentString("InformationExternalPackageCannotBeInserted"),
                            JOptionPane.INFORMATION_MESSAGE);
                    xpdlh.closeAllPackages();
                }
            } catch (Exception ex) {
                ex.printStackTrace();
                getJaWEFrame().message(settings.getLanguageDependentString("InformationExternalPackageCannotBeInserted"),
                        JOptionPane.INFORMATION_MESSAGE);
                if (xpdlh != null) {
                    xpdlh.closeAllPackages();
                }
            }
        }
    }

    public void removeExternalPackage() {
        Package mainPkg = getMainPackage();
        XPDLHandler xpdlh = JaWEManager.getInstance().getXPDLHandler();
        Package toRemove = (Package) getSelectionManager().getSelectedElement();

        Set pkgIdsToRemove = new HashSet();
        pkgIdsToRemove.add(toRemove.getId());
        pkgIdsToRemove.addAll(XMLUtil.getAllExternalPackageIds(xpdlh,
                toRemove,
                new HashSet()));

        Set otherEPIds = new HashSet(mainPkg.getExternalPackageIds());
        otherEPIds.remove(toRemove.getId());

        Set allOtherEPIds = new HashSet(otherEPIds);
        Iterator it = otherEPIds.iterator();
        while (it.hasNext()) {
            String pkgId = (String) it.next();
            Package p = xpdlh.getPackageById(pkgId);
            allOtherEPIds.addAll(XMLUtil.getAllExternalPackageIds(xpdlh, p, new HashSet()));
        }

        pkgIdsToRemove.removeAll(allOtherEPIds);

        Set pkgsToRemove = new HashSet();
        it = pkgIdsToRemove.iterator();
        while (it.hasNext()) {
            String pkgId = (String) it.next();
            Package tRem = xpdlh.getPackageById(pkgId);
            if (tRem != mainPkg && !tRem.isTransient()) {
                pkgsToRemove.add(tRem);
            }
        }

        ExternalPackages eps = mainPkg.getExternalPackages();
        ExternalPackage ep = mainPkg.getExternalPackage(toRemove.getId());

        if (pkgsToRemove.size() > 0) {
            boolean warningMessage = false;
            it = pkgsToRemove.iterator();
            while (it.hasNext()) {
                Package tRem = (Package) it.next();
                List refs = JaWEManager.getInstance().getXPDLUtils().getReferences(mainPkg,
                        tRem);
                if (refs.size() > 0) {
                    warningMessage = true;
                    break;
                }
            }
            if (warningMessage) {
                int yn = JOptionPane.showConfirmDialog(getJaWEFrame(),
                        settings.getLanguageDependentString("MessageReferencedDoYouReallyWantToDeleteSelectedItem"),
                        settings.getLanguageDependentString("DeletingKey"),
                        JOptionPane.YES_NO_OPTION);
                if (yn != JOptionPane.YES_OPTION) {
                    return;
                }
            }
        }

        try {
            if (ep != null) {
                mainPkg.removeExternalPackageMapping(ep.getHref());
            }
            if (pkgsToRemove.size() > 0) {
                it = pkgsToRemove.iterator();
                while (it.hasNext()) {
                    Package pkg = (Package) it.next();
                    XPDLListenerAndObservable xpdllo = getXPDLListenerObservable(pkg);
                    xpdllo.unregisterFromXPDL();
                    xpdlListenerObservables.remove(xpdllo);
                    xpdlh.closePackageVersion(pkg.getId(), pkg.getInternalVersion());
                }
                setChanged();
                notifyObservers(createInfo(mainPkg,
                        new ArrayList(pkgsToRemove),
                        XMLElementChangeInfo.REMOVED));
            }
            if (ep != null) {
                eps.remove(ep);
                List remove = new ArrayList();
                remove.add(ep);
                setChanged();
                notifyObservers(createInfo(eps, remove, XMLElementChangeInfo.REMOVED));
            }
            getSelectionManager().setSelection(eps, true);

            if (pkgsToRemove.size() > 0) {
                if (settings.isDesingTimeValidationEnabled()) {
                    it = pkgsToRemove.iterator();
                    while (it.hasNext()) {
                        Package pkg = (Package) it.next();
                        JaWEManager.getInstance().getXPDLValidator().clearCache(pkg);
                    }
                    checkValidity(mainPkg, true, true, true);
                }
            }

        } catch (Exception ex) {
            ex.printStackTrace();
            getJaWEFrame().message(settings.getLanguageDependentString("ErrorCannotRemoveExternalPackage"),
                    JOptionPane.INFORMATION_MESSAGE);
        }
    }

    public void addTransientPackage() {
        getSelectionManager().setSelection((XMLElement) null, true);

        String filename = "";
        String message = settings.getLanguageDependentString("DialogChooseFile");
        filename = JaWEXMLUtil.dialog(getJaWEFrame(), message, 0, 0, null);
        if (filename != null && filename.length() > 0) {
            boolean added = addTransientPackage(filename);
            if (!added) {
                getJaWEFrame().message(settings.getLanguageDependentString("InformationTransientPackageCannotBeInserted"),
                        JOptionPane.INFORMATION_MESSAGE);
            }
        }
    }

    public boolean addTransientPackage(String filename) {
        XPDLHandler xpdlhmain = JaWEManager.getInstance().getXPDLHandler();
        XPDLHandler xpdlh = null;
        if (filename != null && filename.length() > 0) {
            try {
                xpdlh = JaWEManager.getInstance().createXPDLHandler(xpdlhmain.getXPDLRepositoryHandler());
                Package pkg = xpdlh.openPackage(filename, false);
                // do not allow insertion if package has the same Id as the main one,
                // or as some of its external packages
                Set allpkgids = new HashSet(xpdlhmain.getAllPackageIds());
                boolean canInsert = true;
                if (allpkgids.contains(pkg.getId())) {
                    canInsert = false;
                }
                if (canInsert) {
                    Package mainPkg = getMainPackage();
                    if (mainPkg != null) {
                        canInsert = checkInsertion(xpdlhmain, xpdlh, mainPkg.getId());
                    }
                }
                if (canInsert) {
                    xpdlhmain.synchronizePackages(xpdlh);

                    Package realPkg = xpdlhmain.getPackageById(pkg.getId());
                    adjustXPDL(realPkg);
                    XPDLListenerAndObservable xpdl = createNewXPDLListenerObservable(realPkg,
                            false,
                            false);
                    realPkg.setReadOnly(true);
                    xpdl.setModified(false);

                    List pkgsToInsert = new ArrayList();
                    pkgsToInsert.add(realPkg);
                    setChanged();
                    notifyObservers(createInfo(realPkg,
                            new ArrayList(pkgsToInsert),
                            XMLElementChangeInfo.INSERTED));

                    return true;
                }
                xpdlh.closeAllPackages();
                return false;
            } catch (Exception ex) {
                ex.printStackTrace();
                if (xpdlh != null) {
                    xpdlh.closeAllPackages();
                }
            }
        }
        return false;
    }

    public void removeTransientPackage() {
        XPDLHandler xpdlh = JaWEManager.getInstance().getXPDLHandler();
        Package toRemove = XMLUtil.getPackage(getSelectionManager().getSelectedElement());

        try {
            XPDLListenerAndObservable xpdllo = getXPDLListenerObservable(toRemove);
            xpdllo.unregisterFromXPDL();
            xpdlListenerObservables.remove(xpdllo);
            xpdlh.closePackageVersion(toRemove.getId(), toRemove.getInternalVersion());
            setChanged();
            List pkgsToRemove = new ArrayList();
            pkgsToRemove.add(toRemove);
            notifyObservers(createInfo(toRemove, pkgsToRemove, XMLElementChangeInfo.REMOVED));
            getSelectionManager().setSelection(getMainPackage(), true);
        } catch (Exception ex) {
            ex.printStackTrace();
            getJaWEFrame().message(settings.getLanguageDependentString("ErrorCannotRemoveTransientPackage"),
                    JOptionPane.INFORMATION_MESSAGE);
        }
    }

    protected boolean checkInsertion(XPDLHandler xpdlhmain,
            XPDLHandler xpdlh,
            String mainPkgId) {
        boolean canInsert = true;
        Collection allPackages = xpdlh.getAllPackages();
        Iterator it = allPackages.iterator();
        while (it.hasNext()) {
            // do not allow insertion if package has the same path as the one of the main
            // package or some of the packages that are already referenced
            Package pkg = (Package) it.next();
            if (pkg.getId().equals(mainPkgId)) {
                canInsert = false;
                break;
            }

            String filename = xpdlh.getAbsoluteFilePath(pkg);
            Package pkgbfn = xpdlhmain.getPackageByFilename(filename);
            if (pkgbfn != null && !pkgbfn.getId().equals(pkg.getId())) {
                canInsert = false;
                break;
            }
        }
        return canInsert;
    }

    public void closePackage(String xpdlId, boolean closeTransient) {
        clearAll();
        XPDLHandler xpdlhandler = JaWEManager.getInstance().getXPDLHandler();
        Package mainPackage = getMainPackage();
        if (xpdlId == null && mainPackage != null) {
            xpdlId = mainPackage.getId();
        }
        JaWEManager.getInstance().getLoggingManager().info("JaWEController -> closing package " + xpdlId);
        if (mainPackage != null && mainPackage.getId().equals(xpdlId)) {
            String filePath = JaWEManager.getInstance().getXPDLHandler().getAbsoluteFilePath(mainPackage);
            List allPackages = new ArrayList(xpdlhandler.getAllPackages());
            List notToClose = new ArrayList();
            for (int i = 0; i < allPackages.size(); i++) {
                Package pkg = (Package) allPackages.get(i);
                if (!pkg.isTransient() || closeTransient) {
                    xpdlhandler.closePackageVersion(pkg.getId(), pkg.getInternalVersion());
                } else {
                    notToClose.add(pkg);
                }
            }
            allPackages.removeAll(notToClose);
            setChanged();
            XPDLElementChangeInfo info = createInfo(mainPackage,
                    allPackages,
                    XMLElementChangeInfo.REMOVED);
            info.setOldValue(filePath);
            notifyObservers(info);
            clearXPDLListenerObservables(closeTransient);
        }
        JaWEManager.getInstance().getLoggingManager().info("JaWEController -> package " + xpdlId + " closed");
        updateTitle();
        frame.repaint();
        adjustActions();
        System.gc();
    }

    public boolean isSaveEnabled(boolean isSaveAs) {
        if (getMainPackageId() != null) {
            if (isSaveAs) {
                return true;
            }

            return isPackageModified(getMainPackageId());
        }

        return false;
    }

    public void savePackage(String xpdlId, String filename) {
        XPDLHandler xpdlhandler = JaWEManager.getInstance().getXPDLHandler();
        Package pkg = xpdlhandler.getPackageById(xpdlId);
        String oldFilename = xpdlhandler.getAbsoluteFilePath(pkg);
        try {

            // if SaveAs was performed and the document was previously saved,
            // change ExternalPackage's relative paths
            boolean isNewFile = !filename.equals(oldFilename);
            if (oldFilename != null && isNewFile) {
                boolean crossRefs = JaWEManager.getInstance().getXPDLUtils().doesCrossreferenceExist(pkg);
                int r = JOptionPane.YES_OPTION;
                if (crossRefs) {
                    r = JOptionPane.showConfirmDialog(getJaWEFrame(),
                            settings.getLanguageDependentString("MessageCrossReferenceExistDoYouWantToProceed"),
                            getJaWEFrame().getAppTitle(),
                            JOptionPane.YES_NO_OPTION);
                }
                if (r == JOptionPane.YES_OPTION) {
                    updateExternalPackagesRelativePaths(pkg, filename);
                } else {
                    return;
                }
            }

            Document document = null;

            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder dbuilder = dbf.newDocumentBuilder();
            document = dbuilder.newDocument();

            // retrieve the file writter
            RandomAccessFile raf = xpdlhandler.getRaf(pkg);

            // output stream will either be the FileOutputStream in the
            // case of save as, or the ByteArrayOutputStream if we are
            // saving an existing file
            OutputStream os;
            if (isNewFile) {
                // try to open random access file as rw, if it fails
                // the saving shouldn't occur
                try {
                    File f = new File(filename);
                    RandomAccessFile r = new RandomAccessFile(f, "rw");
                    FileLock flck = r.getChannel().tryLock();
                    flck.release();
                    r.close(); // Harald Meister
                    // this exception happens when using jdk1.4 under Linux
                    // if it happens, just catch it and proceed with saving
                    // because Linux with jdk1.4.0 doesn't support locking
                } catch (IOException ioe) {
                    // ioe.printStackTrace();
                    // this happens when the locking fails, and null is returned,
                    // and after that release method is called on the null;
                    // This means that the file we want to save the given
                    // package as, is already locked, so we do not allow saving
                } catch (NullPointerException npe) {
                    throw new Exception();
                }
                // if we are at this point, this means either the locking
                // succeeded, or we use jdk1.4 under Linux that does not
                // support locking
                os = new FileOutputStream(filename);
            } else {
                os = new ByteArrayOutputStream();
            }

            // Here we get all document elements set
            JaWEManager.getInstance().getXPDLHandler().getXPDLRepositoryHandler().toXML(document, pkg);

            // Use a Transformer for output
            TransformerFactory tFactory = TransformerFactory.newInstance();
            Transformer transformer = tFactory.newTransformer();
            transformer.setOutputProperty("indent", "yes");
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
            transformer.setOutputProperty("encoding", settings.getEncoding());
            DOMSource source = new DOMSource(document);
            StreamResult result = new StreamResult(os);
            transformer.transform(source, result);

            if (!isNewFile && raf != null && os instanceof ByteArrayOutputStream) {
                if (raf != null) {
                    // must go to the beginning - otherwise, it will not
                    // truncate the file correctly in some Java-OS combination
                    raf.seek(0);
                    raf.getChannel().truncate(0);
                    raf.write(((ByteArrayOutputStream) os).toByteArray());
                }
            }

            os.close();

            XPDLListenerAndObservable xpdl = getXPDLListenerObservable(pkg);
            if (xpdl != null) {
                xpdl.setModified(false);
            }

            if (isNewFile) {
                xpdlhandler.registerPackageFilename(filename, pkg);
            }
            try {
                System.setProperty("user.dir", xpdlhandler.getParentDirectory(pkg));
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        } catch (NonWritableChannelException nwcex) {
            nwcex.printStackTrace();
            getJaWEFrame().message(settings.getLanguageDependentString("ErrorCannotSaveReadOnlyFile"),
                    JOptionPane.ERROR_MESSAGE);
        } catch (Exception ex) {
            ex.printStackTrace();
            getJaWEFrame().message(settings.getLanguageDependentString("ErrorCannotSaveDocument"),
                    JOptionPane.ERROR_MESSAGE);
        }
        updateTitle();
        adjustActions();
    }

    /*
     * Method for closing document. Returns true if the user really wants to close. Gives
     * chance to save work.
     */
    public boolean tryToClosePackage(String xpdlId, boolean closeTransient) {
        if (xpdlId == null) {
            xpdlId = getMainPackageId();
        }
        if (xpdlId == null) {
            return true;
        }
        int r = JOptionPane.NO_OPTION;
        boolean modified = isPackageModified(xpdlId);
        String filename = getPackageFilename(xpdlId);
        if (modified || filename == null) {
            r = JOptionPane.showConfirmDialog(getJaWEFrame(),
                    settings.getLanguageDependentString("DialogSaveChanges"),
                    getJaWEFrame().getAppTitle(),
                    JOptionPane.YES_NO_CANCEL_OPTION);
        }
        if (r == JOptionPane.YES_OPTION) {
            String dialogTitle = settings.getLanguageDependentString("Save" + BarFactory.LABEL_POSTFIX);
            if (filename == null) {
                dialogTitle = settings.getLanguageDependentString("SaveAs" + BarFactory.LABEL_POSTFIX);
            }

            if (filename == null) {
                filename = getJaWEFrame().saveDialog(dialogTitle, 0, xpdlId);
            }

            savePackage(xpdlId, filename);
            if (isPackageModified(xpdlId)) {
                r = JOptionPane.CANCEL_OPTION;
            }
        }
        if (r == JOptionPane.CANCEL_OPTION) {
            return false;
        }
        closePackage(xpdlId, closeTransient);
        return true;
    }

    protected XPDLListenerAndObservable createNewXPDLListenerObservable(Package pkg,
            boolean receiveEvents,
            boolean modified) {
        XPDLListenerAndObservable xpdl = new XPDLListenerAndObservable(pkg, receiveEvents);
        xpdl.setModified(modified);
        xpdlListenerObservables.add(xpdl);
        xpdl.addObserver(this);
        return xpdl;
    }

    protected XPDLListenerAndObservable getXPDLListenerObservable(Package pkg) {
        Iterator it = xpdlListenerObservables.iterator();
        while (it.hasNext()) {
            XPDLListenerAndObservable xpdl = (XPDLListenerAndObservable) it.next();
            if (xpdl.getPackage() == pkg) {
                return xpdl;
            }
        }
        return null;
    }

    protected XPDLListenerAndObservable getWorkingXPDLListenerObservable() {
        Iterator it = xpdlListenerObservables.iterator();
        while (it.hasNext()) {
            XPDLListenerAndObservable xpdl = (XPDLListenerAndObservable) it.next();
            if (xpdl.getPackage() == selectionMng.getWorkingPKG()) {
                return xpdl;
            }
        }
        return null;
    }

    protected void changePackageId(Package pkg, String oldId, String newId) {
        XPDLHandler xpdlhandler = JaWEManager.getInstance().getXPDLHandler();
        xpdlhandler.changePackageId(pkg, oldId, newId);
    }

    protected void updateExternalPackagesRelativePaths(Package pkg, String newFilename) {
        XPDLHandler xpdlhandler = JaWEManager.getInstance().getXPDLHandler();
        File f = new File(newFilename);
        String parentF = f.getParent();
        Path newPath = new Path(parentF);

        Iterator eps = pkg.getExternalPackages().toElements().iterator();
        while (eps.hasNext()) {
            ExternalPackage ep = (ExternalPackage) eps.next();
            String oldRelativePath = ep.getHref();
            try {
                Package extP = xpdlhandler.getExternalPackageByRelativeFilePath(oldRelativePath,
                        pkg);
                String oldFullPath = xpdlhandler.getAbsoluteFilePath(extP);
                String relativePath = Path.getRelativePath(new Path(oldFullPath), newPath);
                ep.setHref(XMLUtil.replaceBackslashesWithSlashes(relativePath));
            } catch (Exception ex) {
                System.err.println("Failed to update old external package's relative path " + oldRelativePath + " for main package " + pkg.getId() + " with a new filename " + newFilename);
            }
        }
    }

    // ////////////////////////// END Of XPDL File Handling /////////////////////
    public XPDLElementChangeInfo createInfo(XMLElement el, int action) {
        XPDLElementChangeInfo info = new XPDLElementChangeInfo();
        info.setChangedElement(el);
        info.setAction(action);
        info.setSource(this);
        return info;
    }

    public XPDLElementChangeInfo createInfo(XMLElement main, List elements, int action) {
        XPDLElementChangeInfo info = new XPDLElementChangeInfo();
        info.setChangedElement(main);
        info.setChangedSubElements(elements);
        info.setAction(action);
        info.setSource(this);
        return info;
    }

    public boolean canCreateElement(XMLCollection col, boolean checkReadOnly) {
        if (checkReadOnly && col.isReadOnly()) {
            return false;
        }
        if (col instanceof TransitionRestrictions || col instanceof TransitionRefs || col instanceof ExternalPackages) {
            return false;
        }

        if (col instanceof Responsibles) {
            Map m = JaWEManager.getInstance().getXPDLUtils().getPossibleResponsibles((Responsibles) col, null);
            if (m.size() == 0) {
                return false;
            }
        }

        if (col instanceof Tools) {
            Map m = XMLUtil.getPossibleApplications(XMLUtil.getWorkflowProcess(col),
                    JaWEManager.getInstance().getXPDLHandler());
            if (m.size() == 0) {
                return false;
            }
        }

        Iterator comps = JaWEManager.getInstance().getComponentManager().getComponents().iterator();
        while (comps.hasNext()) {
            JaWEComponent jc = (JaWEComponent) comps.next();
            if (jc != this) {
                boolean approved = jc.canCreateElement(col);
                if (approved == false) {
                    return false;
                }
            }
        }
        return true;
    }

    public boolean canInsertElement(XMLCollection col, XMLElement el, boolean checkReadOnly) {
        if (checkReadOnly && col.isReadOnly()) {
            return false;
        }
        if (col instanceof TransitionRestrictions || col instanceof TransitionRefs || col instanceof ExternalPackages) {
            return false;
        } else if (col instanceof ExtendedAttributes && col.getParent() instanceof ExternalPackage) {
            if (el != null && ((ExtendedAttribute) el).getName().equals(JaWEEAHandler.EA_JAWE_EXTERNAL_PACKAGE_ID)) {
                return false;
            }
        }

        Iterator comps = JaWEManager.getInstance().getComponentManager().getComponents().iterator();
        while (comps.hasNext()) {
            JaWEComponent jc = (JaWEComponent) comps.next();
            if (jc != this) {
                boolean approved = jc.canInsertElement(col, el);
                if (approved == false) {
                    return false;
                }
            }
        }
        return true;
    }

    public boolean canModifyElement(XMLElement el, boolean checkReadOnly) {
        if (checkReadOnly && el.isReadOnly()) {
            return false;
        }
        if (el instanceof TransitionRef || el.getParent() instanceof TransitionRef) {
            return false;
        } else if (XMLUtil.getParentElement(ExternalPackage.class, el) != null) {
            if (el.toName().equals("href")) {
                return false;
            }
            ExtendedAttribute ea = (ExtendedAttribute) XMLUtil.getParentElement(ExtendedAttribute.class,
                    el);
            if (ea != null) {
                if (ea.getName().equals(JaWEEAHandler.EA_JAWE_EXTERNAL_PACKAGE_ID)) {
                    return false;
                }
            }
        }

        if ((el.getParent() instanceof Split || el.getParent() instanceof Join) && el.toName().equals("Type")) {
            if (el.getParent() instanceof Split) {
                Set ogt = XMLUtil.getOutgoingTransitions(XMLUtil.getActivity(el));
                if (ogt.size() <= 1) {
                    return false;
                }
            } else {
                Set inct = XMLUtil.getIncomingTransitions(XMLUtil.getActivity(el));
                if (inct.size() <= 1) {
                    return false;
                }
            }
        }

        Iterator comps = JaWEManager.getInstance().getComponentManager().getComponents().iterator();
        while (comps.hasNext()) {
            JaWEComponent jc = (JaWEComponent) comps.next();
            if (jc != this) {
                boolean approved = jc.canModifyElement(el);
                if (approved == false) {
                    return false;
                }
            }
        }
        return true;
    }

    public boolean canRemoveElement(XMLCollection col, XMLElement el, boolean checkReadOnly) {
        if (checkReadOnly && col.isReadOnly()) {
            return false;
        }
        if (col instanceof TransitionRestrictions || col instanceof TransitionRefs) {
            return false;
        } else if (col instanceof ExternalPackages) {
            if (el != null) {
                String href = ((ExternalPackage) el).getHref();
                Package pkg = XMLUtil.getPackage(col);
                String epId = pkg.getExternalPackageId(href);
                if (epId != null) {
                    return false;
                }
            }
        } else if (col instanceof ExtendedAttributes && col.getParent() instanceof ExternalPackage) {
            if (el != null && ((ExtendedAttribute) el).getName().equals(JaWEEAHandler.EA_JAWE_EXTERNAL_PACKAGE_ID)) {
                return false;
            }
        }

        Iterator comps = JaWEManager.getInstance().getComponentManager().getComponents().iterator();
        while (comps.hasNext()) {
            JaWEComponent jc = (JaWEComponent) comps.next();
            if (jc != this) {
                boolean approved = jc.canRemoveElement(col, el);
                if (approved == false) {
                    return false;
                }
            }
        }
        return true;
    }

    public boolean canDuplicateElement(XMLCollection col,
            XMLElement el,
            boolean checkReadOnly) {
        if (checkReadOnly && col.isReadOnly()) {
            return false;
        }
        if (el instanceof TransitionRestriction || el instanceof TransitionRef || el instanceof Member || el instanceof EnumerationValue || el instanceof ExternalPackage || el instanceof Responsible || el instanceof Transition) {
            return false;
        } else if (col instanceof ExtendedAttributes && col.getParent() instanceof ExternalPackage) {
            if (el != null && ((ExtendedAttribute) el).getName().equals(JaWEEAHandler.EA_JAWE_EXTERNAL_PACKAGE_ID)) {
                return false;
            }
        }

        Iterator comps = JaWEManager.getInstance().getComponentManager().getComponents().iterator();
        while (comps.hasNext()) {
            JaWEComponent jc = (JaWEComponent) comps.next();
            if (jc != this) {
                boolean approved = jc.canDuplicateElement(col, el);
                if (approved == false) {
                    return false;
                }
            }
        }
        return true;
    }

    public boolean canRepositionElement(XMLCollection col,
            XMLElement el,
            boolean checkReadOnly) {
        if (checkReadOnly && col.isReadOnly()) {
            return false;
        } else if (col instanceof ExtendedAttributes && col.getParent() instanceof ExternalPackage) {
            if (el != null && ((ExtendedAttribute) el).getName().equals(JaWEEAHandler.EA_JAWE_EXTERNAL_PACKAGE_ID)) {
                return false;
            }
        }

        Iterator comps = JaWEManager.getInstance().getComponentManager().getComponents().iterator();
        while (comps.hasNext()) {
            JaWEComponent jc = (JaWEComponent) comps.next();
            if (jc != this) {
                boolean approved = jc.canRepositionElement(col, el);
                if (approved == false) {
                    return false;
                }
            }
        }
        return true;
    }

    public void startUndouableChange() {
        Package mainPkg = getMainPackage();
        xpdlInfoList.clear();
        undoableChangeInProgress = true;
        undoSelectionEvent = getCurrentSelectionEvent();
        XPDLElementChangeInfo ucInfo = createInfo(mainPkg,
                XPDLElementChangeInfo.UNDOABLE_ACTION_STARTED);
        ucInfo.setChangedSubElements(xpdlInfoList);
        setChanged();
        notifyObservers(ucInfo);
    }

    public void endUndouableChange(List elementsToSelect) {
        Package mainPkg = getMainPackage();
        List infoList = new ArrayList(xpdlInfoList);

        Iterator it = infoList.iterator();
        while (it.hasNext()) {
            XPDLElementChangeInfo info = (XPDLElementChangeInfo) it.next();
            handleEvent(info);
        }

        XPDLElementChangeInfo ucInfo = createInfo(mainPkg,
                XPDLElementChangeInfo.ADJUST_UNDOABLE_ACTION);
        ucInfo.setChangedSubElements(xpdlInfoList);
        setChanged();
        notifyObservers(ucInfo);

        ucInfo = createInfo(mainPkg, XPDLElementChangeInfo.UNDOABLE_ACTION_ENDED);

        if (elementsToSelect != null && elementsToSelect.size() > 0) {
            if (!selectionMng.checkSelection(elementsToSelect)) {
                XMLElement firstToSelect = (XMLElement) elementsToSelect.get(0);
                elementsToSelect.clear();
                elementsToSelect.add(firstToSelect);
            }
        } else {
            elementsToSelect = new ArrayList();
            elementsToSelect.add(mainPkg);
        }

        ucInfo.setChangedSubElements(xpdlInfoList);

        updateInProgress = true;
        setChanged();
        notifyObservers(ucInfo);
        updateInProgress = false;

        if (undoHistoryManager != null) {
            undoHistoryManager.registerEvents(xpdlInfoList, undoSelectionEvent);
        }
        getSettings().adjustActions();
        JaWEManager.getInstance().getLoggingManager().debug("All events after undoable change:\n" + xpdlInfoList);
        xpdlInfoList.clear();
        undoableChangeInProgress = false;

        selectionMng.setSelection(elementsToSelect, true);
        if (settings.isDesingTimeValidationEnabled()) {
            checkValidity(mainPkg, true, false, true);
        }
    }

    public boolean isUndoableChangeInProgress() {
        return undoableChangeInProgress;
    }

    public boolean isUndoOrRedoInProgress() {
        if (undoHistoryManager != null) {
            return undoHistoryManager.isUndoOrRedoInProgress();
        }
        return false;
    }

    public void handleEvent(XPDLElementChangeInfo info) {
        XMLElement changedElement = info.getChangedElement();

        JaWEManager.getInstance().getLoggingManager().debug("INFO: handleEvenet(): " + info);

        int action = info.getAction();

        if (action == XPDLElementChangeInfo.SELECTED) {
            // should never happen
        } else {
            if (changedElement instanceof WorkflowProcesses) {
                if (action == XMLElementChangeInfo.REMOVED) {
                    if (info.getChangedSubElements() != null) {
                        Iterator it = info.getChangedSubElements().iterator();
                        while (it.hasNext()) {
                            WorkflowProcess wp = (WorkflowProcess) it.next();
                            if (wp == selectionMng.getWorkingProcess()) {
                                // select package
                                selectionMng.setSelection(wp.getParent().getParent(), true);
                                break;
                            }
                        }
                    }
                }
            } else if (changedElement instanceof ActivitySet) {
                if (action == XMLElementChangeInfo.REMOVED) {
                    if (info.getChangedSubElements() != null) {
                        Iterator it = info.getChangedSubElements().iterator();
                        while (it.hasNext()) {
                            ActivitySet as = (ActivitySet) it.next();
                            if (as == selectionMng.getWorkingActivitySet()) {
                                // select process
                                selectionMng.setSelection(as.getParent().getParent(), true);
                                break;
                            }
                        }
                    }
                }
            }
        }

        if (action == XMLElementChangeInfo.INSERTED && (changedElement instanceof WorkflowProcesses || changedElement instanceof ActivitySets)) {
            if (info.getChangedSubElements() != null) {
                selectionMng.setSelection(info.getChangedSubElements(), true);
            }
        }

        updateTitle();
        adjustActions();

        if (action == XMLElementChangeInfo.REMOVED || action == XMLElementChangeInfo.INSERTED) {
            JaWEManager.getInstance().getLoggingManager().info("JaWEController -> performing appropriate actions on inserting/removing");
            if (changedElement instanceof Activities && action == XMLElementChangeInfo.REMOVED) {
                // for removing connected Transitions
                updateSpecialInProgress = true;
                JaWEManager.getInstance().getXPDLUtils().removeTransitionsForActivities(info.getChangedSubElements());
                selectionMng.removeFromSelection(info.getChangedSubElements());
                updateSpecialInProgress = false;
            } else if (changedElement instanceof Transitions) {
                Activities acts = (Activities) ((XMLCollectionElement) changedElement.getParent()).get("Activities");

                updateSpecialInProgress = true;
                JaWEManager.getInstance().getXPDLUtils().correctSplitsAndJoins(acts.toElements());
                updateSpecialInProgress = false;
                if (action == XMLElementChangeInfo.REMOVED) {
                    selectionMng.removeFromSelection(info.getChangedSubElements());
                }
            }
            JaWEManager.getInstance().getLoggingManager().info("JaWEController -> finished performing appropriate actions on inserting/removing");
        } else if (action == XMLElementChangeInfo.UPDATED) {
            XMLElement parent = changedElement.getParent();
            if ((changedElement.toName().equals("Id") && (parent instanceof WorkflowProcess || parent instanceof ActivitySet || parent instanceof Application || parent instanceof Participant || parent instanceof DataField || parent instanceof FormalParameter || parent instanceof Activity || parent instanceof Transition || parent instanceof TypeDeclaration)) || ((changedElement.toName().equals("From") || changedElement.toName().equals("To")) && parent instanceof Transition) || ((parent instanceof Split || parent instanceof Join) && changedElement instanceof XMLAttribute)) {

                if (parent instanceof Activity || parent instanceof Transition || parent instanceof Split || parent instanceof Join) {
                    XMLCollectionElement wpOrAs = XMLUtil.getActivitySet(parent);
                    if (wpOrAs == null) {
                        wpOrAs = XMLUtil.getWorkflowProcess(parent);
                    }
                    if (parent instanceof Activity) {
                        updateSpecialInProgress = true;
                        JaWEManager.getInstance().getXPDLUtils().updateTransitionsOnActivityIdChange((Transitions) wpOrAs.get("Transitions"),
                                (String) info.getOldValue(),
                                (String) info.getNewValue());
                        updateSpecialInProgress = false;
                    } else if (parent instanceof Transition) {
                        if (changedElement.toName().equals("Id")) {
                            updateSpecialInProgress = true;
                            JaWEManager.getInstance().getXPDLUtils().updateActivityOnTransitionIdChange((Activities) wpOrAs.get("Activities"),
                                    ((Transition) parent).getFrom(),
                                    (String) info.getOldValue(),
                                    (String) info.getNewValue());
                            updateSpecialInProgress = false;
                        } else if (changedElement.toName().equals("From")) {
                            updateSpecialInProgress = true;
                            JaWEManager.getInstance().getXPDLUtils().updateActivitiesOnTransitionFromChange((Activities) wpOrAs.get("Activities"),
                                    ((Transition) parent).getId(),
                                    (String) info.getOldValue(),
                                    (String) info.getNewValue());
                            updateSpecialInProgress = false;
                        } else {
                            updateSpecialInProgress = true;
                            JaWEManager.getInstance().getXPDLUtils().updateActivitiesOnTransitionToChange((Activities) wpOrAs.get("Activities"),
                                    ((Transition) parent).getId(),
                                    (String) info.getOldValue(),
                                    (String) info.getNewValue());
                            updateSpecialInProgress = false;
                        }
                    } else if (parent instanceof Split || parent instanceof Join) {
                        updateSpecialInProgress = true;
                        Activity act = XMLUtil.getActivity(parent);
                        JaWEManager.getInstance().getXPDLUtils().correctSplitAndJoin(act);
                        updateSpecialInProgress = false;
                    }
                } else if (parent instanceof TypeDeclaration) {
                    updateSpecialInProgress = true;
                    JaWEManager.getInstance().getXPDLUtils().updateTypeDeclarationReferences(JaWEManager.getInstance().getXPDLUtils().getTypeDeclarationReferences(XMLUtil.getPackage(parent),
                            (String) info.getOldValue()),
                            (String) info.getNewValue());
                    updateSpecialInProgress = false;
                } else if (parent instanceof WorkflowProcess) {
                    updateSpecialInProgress = true;
                    JaWEManager.getInstance().getXPDLUtils().updateWorkflowProcessReferences(JaWEManager.getInstance().getXPDLUtils().getWorkflowProcessReferences(XMLUtil.getPackage(parent),
                            (String) info.getOldValue()),
                            (String) info.getNewValue());
                    updateSpecialInProgress = false;
                } else if (parent instanceof ActivitySet) {
                    updateSpecialInProgress = true;
                    JaWEManager.getInstance().getXPDLUtils().updateActivitySetReferences(JaWEManager.getInstance().getXPDLUtils().getActivitySetReferences(XMLUtil.getWorkflowProcess(parent),
                            (String) info.getOldValue()),
                            (String) info.getNewValue());
                    updateSpecialInProgress = false;
                } else if (parent instanceof Application) {
                    updateSpecialInProgress = true;
                    JaWEManager.getInstance().getXPDLUtils().updateApplicationReferences(JaWEManager.getInstance().getXPDLUtils().getApplicationReferences((XMLComplexElement) parent.getParent().getParent(),
                            (String) info.getOldValue()),
                            (String) info.getNewValue());
                    updateSpecialInProgress = false;
                } else if (parent instanceof Participant) {
                    updateSpecialInProgress = true;
                    JaWEManager.getInstance().getXPDLUtils().updateParticipantReferences(JaWEManager.getInstance().getXPDLUtils().getParticipantReferences((XMLComplexElement) parent.getParent().getParent(),
                            (String) info.getOldValue()),
                            (String) info.getNewValue());
                    updateSpecialInProgress = false;
                } else if (parent instanceof DataField || (parent instanceof FormalParameter && parent.getParent().getParent() instanceof WorkflowProcess)) {
                    updateSpecialInProgress = true;
                    XMLComplexElement pkgOrWp = (XMLComplexElement) parent.getParent().getParent();
                    List refs = null;
                    if (parent instanceof DataField) {
                        refs = JaWEManager.getInstance().getXPDLUtils().getDataFieldReferences(pkgOrWp, (String) info.getOldValue());
                    } else {
                        refs = JaWEManager.getInstance().getXPDLUtils().getFormalParameterReferences((WorkflowProcess) pkgOrWp,
                                (String) info.getOldValue());
                    }
                    JaWEManager.getInstance().getXPDLUtils().updateVariableReferences(refs,
                            (String) info.getOldValue(),
                            (String) info.getNewValue());
                    updateSpecialInProgress = false;
                }
            }
        }

    }

    protected void clearHistory() {
        if (undoHistoryManager != null) {
            undoHistoryManager.cleanHistory();
            adjustActions();
        }
        undoSelectionEvent = null;
        System.gc();
    }

    protected void clearAll() {
        xpdlInfoList.clear();
        clearHistory();
        selectionMng.clear();
        edit.clear();
        undoSelectionEvent = null;
        StandardPackageValidator val = JaWEManager.getInstance().getXPDLValidator();
        if (val != null) {
            val.clearCache();
        }
        if (JaWEManager.getInstance().getXPDLElementEditor() != null && JaWEManager.getInstance().getXPDLElementEditor().getWindow() != null) {
            JaWEManager.getInstance().getXPDLElementEditor().close();
        }
        XPDLElementChangeInfo info = createInfo(null,
                new ArrayList(),
                XPDLElementChangeInfo.VALIDATION_ERRORS);
        info.setNewValue(new Boolean(false));
        sendEvent(info);
        info = createInfo(null, new ArrayList(), XPDLElementChangeInfo.REFERENCES);
        sendEvent(info);
        if (JaWEManager.getInstance().getTableEditor() != null) {
            JaWEManager.getInstance().getTableEditor().close();
        }

        System.gc();
    }

    protected void clearXPDLListenerObservables(boolean clearTransient) {
        List retain = new ArrayList();
        for (int i = 0; i < xpdlListenerObservables.size(); i++) {
            XPDLListenerAndObservable xpdllo = (XPDLListenerAndObservable) xpdlListenerObservables.get(i);
            if (clearTransient || !xpdllo.getPackage().isTransient()) {
                xpdllo.unregisterFromXPDL();
            } else {
                retain.add(xpdllo);
            }
        }
        xpdlListenerObservables.retainAll(retain);
        System.gc();
    }

    public void undo() {
        if (undoHistoryManager != null) {
            undoHistoryManager.undo();
            if (settings.isDesingTimeValidationEnabled()) {
                checkValidity(getMainPackage(), true, false, true);
            }
            getSettings().adjustActions();
        }
    }

    public void redo() {
        if (undoHistoryManager != null) {
            undoHistoryManager.redo();
            if (settings.isDesingTimeValidationEnabled()) {
                checkValidity(getMainPackage(), true, false, true);
            }
            getSettings().adjustActions();
        }
    }

    public void sendEvent(XPDLElementChangeInfo info) {
        setChanged();
        JaWEManager.getInstance().getLoggingManager().debug("Controller sending event: " + info);
        notifyObservers(info);
        updateTitle();
        adjustActions();
    }

    public XPDLElementChangeInfo getCurrentSelectionEvent() {
        // add will be selected event at the end
        List currentSelection = selectionMng.getSelectedElements();
        XMLElement selectionOwner = getMainPackage();
        if (currentSelection != null && currentSelection.size() > 0) {
            selectionOwner = (XMLElement) currentSelection.get(0);
            if (currentSelection.size() == 1) {
                currentSelection.clear();
            } else {
                selectionOwner = selectionOwner.getParent();
            }
        }
        XPDLElementChangeInfo selectionEvent = createInfo(selectionOwner,
                currentSelection,
                XPDLElementChangeInfo.SELECTED);
        return selectionEvent;
    }

    public boolean confirmDelete(List sel, XMLElement firstSelected) {
        XMLComplexElement pkgOrWP = getMainPackage();
        WorkflowProcess wp = XMLUtil.getWorkflowProcess(firstSelected);
        if (wp != null && wp != firstSelected) {
            pkgOrWP = wp;
        }

        String doNotAskOnDeletionOfReferencedElements = getControllerSettings().doNotAskOnDeletionOfReferencedElementTypes();
        Set notToAsk = refElsNotToAskOnDeletion(doNotAskOnDeletionOfReferencedElements);
        List refs = new ArrayList();
        if (getControllerSettings().shouldAskOnDeletionOfReferencedElements()) {
            for (int i = 0; i < sel.size(); i++) {
                XMLElement el = (XMLElement) sel.get(i);
                if (el instanceof Activity) {
                    if (!notToAsk.contains(el.toName())) {
                        refs.addAll(JaWEManager.getInstance().getXPDLUtils().getReferences((Activity) el));
                    }
                } else if (el instanceof Transition) {
                    if (!notToAsk.contains(el.toName())) {
                        refs.addAll(JaWEManager.getInstance().getXPDLUtils().getReferences((Transition) el));
                    }
                } else if (el instanceof XMLComplexElement) {
                    if (!notToAsk.contains(el.toName())) {
                        refs.addAll(JaWEManager.getInstance().getXPDLUtils().getReferences(pkgOrWP, (XMLComplexElement) el));
                    }
                }
            }
        }

        int yn = JOptionPane.YES_OPTION;
        if (getControllerSettings().shoudAskOnDeletion() || getControllerSettings().shouldAskOnDeletionOfReferencedElements()) {
            if (refs.size() == 0) {
                if (getControllerSettings().shoudAskOnDeletion()) {
                    yn = JOptionPane.showConfirmDialog(getJaWEFrame(),
                            getSettings().getLanguageDependentString("MessageDoYouReallyWantToRemoveSelectedItem"),
                            getSettings().getLanguageDependentString("DeletingKey"),
                            JOptionPane.YES_NO_OPTION);
                }
            } else {
                if (getControllerSettings().shouldAskOnDeletionOfReferencedElements()) {

                    yn = JOptionPane.showConfirmDialog(getJaWEFrame(),
                            getSettings().getLanguageDependentString("MessageReferencedDoYouReallyWantToDeleteSelectedItem"),
                            getSettings().getLanguageDependentString("DeletingKey"),
                            JOptionPane.YES_NO_OPTION);

                }
            }
        }
        if (yn == JOptionPane.YES_OPTION) {
            return true;
        }
        return false;
    }

    protected static Set refElsNotToAskOnDeletion(String hstr) {
        Set s = new HashSet();

        String[] hstra = Utils.tokenize(hstr, " ");
        if (hstra.length > 0) {
            s.addAll(Arrays.asList(hstra));
        }

        return s;
    }

    // Controller help classes
    public JaWEEdit getEdit() {
        return edit;
    }

    public JaWESelectionManager getSelectionManager() {
        return selectionMng;
    }

    public JaWEActions getJaWEActions() {
        return defaultJaWEActions;
    }

    public JaWEFrame getJaWEFrame() {
        return frame;
    }

    public void adjustActions() {
        //CUSTOM
        try {
            settings.adjustActions();
            defaultJaWEActions.enableDisableActions();
        } catch (NullPointerException e) {
            // ignore
        }
        //END CUSTOM
    }

    protected void updateTitle() {
        String title = "";
        if (getMainPackage() != null) {
            XPDLListenerAndObservable xpdllo = getXPDLListenerObservable(getMainPackage());
            if (xpdllo != null && xpdllo.isModified()) {
                title = "*";
            }
        }

        title += JaWEManager.getInstance().getName();

        String ccn = getCurrentConfigName();
        if (ccn == null) {
            ccn = "Default";
        }
        title += " (" + ccn + " " + getSettings().getLanguageDependentString("ConfigurationKey") + ")";

        if (getMainPackage() != null) {
            title += " - ";
            XPDLHandler xpdlh = JaWEManager.getInstance().getXPDLHandler();
            String s = xpdlh.getAbsoluteFilePath(getMainPackage());
            if (s == null || s.equals("")) {
                title += getSettings().getLanguageDependentString("NotSavedKey");
            } else {
                title += s;
            }
        }
        //CUSTOM
        if (getJaWEFrame() != null) {
            getJaWEFrame().setTitle(title);
        }
        //END CUSTOM

    }

    public JaWETypes getJaWETypes() {
        return jtypes;
    }

    public JaWETypeResolver getTypeResolver() {
        return jtypeResolver;
    }

    public ControllerSettings getControllerSettings() {
        return settings;
    }

    public void setUpdateInProgress(boolean inProgress) {
        updateInProgress = inProgress;
    }

    public boolean isUpdateInProgress() {
        return updateInProgress;
    }

    public UndoHistoryManager getUndoHistoryManager() {
        return undoHistoryManager;
    }

    /*
     * Begin of JPEd added methods to controller
     */
    ValueFilter valueFilter = new PluggableValueFilter();

    /**
     * Return the plugin manager. All operations on plugins
     * are done thru this manager.
     * @since JPEd-plugins
     */
    public PluginsManager getPluginsManager() {
        return pluginsManager;
    }

    /**
     * Acquire the global value filter. It may dispatch to plugins
     * depending on interface implementation. Always use a ValueFilter
     * instead of calling XMLElement.toValue() directly
     * @return The ValueFilter
     * @since JPEd-plugins
     */
    public ValueFilter getValueFilter() {
        return valueFilter;
    }

    /**
     * shortcut to getValueFilter().getValue(element.get(property))
     * @param element the XMLComplexElement which property is to be filtered
     * @param property the property to filter
     * @return the filtered property or null of property does not exist
     */
    public String getFilteredProperty(XMLComplexElement element, String property) {
        if (element == null) {
            return null;
        }
        XMLElement elt = element.get(property);
        return elt == null ? null : getValueFilter().getValue(elt);
    }

    public String getCurrentConfig() {
        if (currentConfig == null) {
            fillConfigInfo();
            currentConfig = "default";
            String cch = System.getProperty(JaWEConstants.JAWE_CURRENT_CONFIG_HOME);
            if (cch != null) {
                int indofs = cch.lastIndexOf("/");
                int indofbs = cch.lastIndexOf("\\");
                int ind = Math.max(indofs, indofbs);
                if (ind >= 0) {
                    cch = cch.substring(ind + 1);
                }
                currentConfig = cch;
            }
        }
        return currentConfig;
    }

    public String getCurrentConfigName() {
        String cc = JaWEManager.getInstance().getJaWEController().getCurrentConfig();
        return (String) configInfo.get(cc);
    }

    public String getConfigId(String cfgName) {
        if (configInfo != null) {
            return getConfigId(configInfo, cfgName);
        }
        return cfgName;
    }

    protected String getConfigId(Map ci, String cfgName) {
        Iterator it = ci.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry me = (Map.Entry) it.next();
            if (me.getValue().equals(cfgName)) {
                return (String) me.getKey();
            }
        }
        return cfgName;
    }

    public Map getConfigInfo() {
        if (configInfo == null) {
            fillConfigInfo();
        }
        return Collections.unmodifiableMap(configInfo);
    }

    protected void fillConfigInfo() {
        Map m = new HashMap();
        if (JaWEConstants.JAWE_CONF_HOME != null) {
            File mainConfFolder = new File(JaWEConstants.JAWE_CONF_HOME);
            if (mainConfFolder.exists()) {
                File[] confs = mainConfFolder.listFiles();
                for (int i = 0; i < confs.length; i++) {
                    if (confs[i].isDirectory()) {
                        m.put(confs[i].getName(), readConfigName(confs[i].getName()));
                    }
                }
            }
        }
        List l = new ArrayList(m.values());
        Collections.sort(l);

        configInfo = new SequencedHashMap();
        for (int i = 0; i < l.size(); i++) {
            String cfgName = (String) l.get(i);
            configInfo.put(getConfigId(m, cfgName), cfgName);
        }
    }

    protected String readConfigName(String configFolder) {
        String fn = JaWEConstants.JAWE_CONF_HOME + "/" + configFolder + "/jaweconfigname";
        File file = new File(fn);
        if (file.exists()) {
            Properties props = new Properties();
            FileInputStream fis = null;
            try {
                fis = new FileInputStream(fn);
                props.load(fis);
                return props.getProperty(JaWEConstants.JAWE_CONFIG_NAME, configFolder);
            } catch (Exception ex) {
                throw new Error("Something went wrong while reading external component properties !!!",
                        ex);
            } finally {
                try {
                    fis.close();
                } catch (Exception ex) {
                }
            }
        }

        return configFolder;
    }
}
TOP

Related Classes of org.enhydra.jawe.base.controller.JaWEController

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.