/* $Id: ActivityGraphsHelperMDRImpl.java 17765 2010-01-11 21:20:14Z linus $
*****************************************************************************
* Copyright (c) 2009 Contributors - see below
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* tfmorris
*****************************************************************************
*
* Some portions of this file was previously release using the BSD License:
*/
// Copyright (c) 2005-2007 The Regents of the University of California. All
// Rights Reserved. Permission to use, copy, modify, and distribute this
// software and its documentation without fee, and without a written
// agreement is hereby granted, provided that the above copyright notice
// and this paragraph appear in all copies. This software program and
// documentation are copyrighted by The Regents of the University of
// California. The software program and documentation are supplied "AS
// IS", without any accompanying services from The Regents. The Regents
// does not warrant that the operation of the program will be
// uninterrupted or error-free. The end-user understands that the program
// was developed for research purposes and is advised not to rely
// exclusively on the program for any reason. IN NO EVENT SHALL THE
// UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT,
// SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS,
// ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF
// THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF
// SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE
// PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF
// CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT,
// UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
package org.argouml.model.mdr;
import java.util.Collection;
import java.util.Iterator;
import org.argouml.model.ActivityGraphsHelper;
import org.argouml.model.Model;
import org.omg.uml.behavioralelements.activitygraphs.ClassifierInState;
import org.omg.uml.behavioralelements.activitygraphs.ObjectFlowState;
import org.omg.uml.behavioralelements.activitygraphs.Partition;
import org.omg.uml.behavioralelements.statemachines.CompositeState;
import org.omg.uml.behavioralelements.statemachines.State;
import org.omg.uml.behavioralelements.statemachines.StateMachine;
import org.omg.uml.behavioralelements.statemachines.StateVertex;
import org.omg.uml.foundation.core.BehavioralFeature;
import org.omg.uml.foundation.core.Classifier;
import org.omg.uml.foundation.core.ModelElement;
import org.omg.uml.foundation.core.Namespace;
import org.omg.uml.foundation.core.Parameter;
import org.omg.uml.modelmanagement.UmlPackage;
/**
* Class to implement ActivityGraphsHelper.
* @since ARGO0.19.5
* @author Ludovic Maître
* Derived from NSUML implementation
*/
class ActivityGraphsHelperMDRImpl implements ActivityGraphsHelper {
/**
* Constructor.
*/
public ActivityGraphsHelperMDRImpl() {
super();
}
/*
* @see org.argouml.model.ActivityGraphsHelper#findClassifierByName(
* java.lang.Object, java.lang.String)
*/
public Object findClassifierByName(Object ofs, String s) {
if (!(ofs instanceof ObjectFlowState)) {
throw new IllegalArgumentException();
}
CompositeState cs = ((ObjectFlowState) ofs).getContainer();
StateMachine sm = cs.getStateMachine();
ModelElement ns = sm.getContext();
if (ns == null) {
return null;
}
if (!(ns instanceof Namespace)) {
ns = ns.getNamespace();
}
if (ns != null) {
Collection c =
Model.getModelManagementHelper().getAllModelElementsOfKind(
ns, Model.getMetaTypes().getClassifier());
Iterator i = c.iterator();
while (i.hasNext()) {
ModelElement classifier = (ModelElement) i.next();
String cn = classifier.getName();
if (cn != null && cn.equals(s)) {
return classifier;
}
}
} else {
throw new IllegalArgumentException();
}
return null;
}
public Object findStateByName(Object c, String s) {
if (!(c instanceof Classifier)) {
throw new IllegalArgumentException();
}
if ((s == null) || (s.equals(""))) {
return null;
}
Collection allStatemachines = Model.getFacade().getBehaviors(c);
Iterator i = allStatemachines.iterator();
while (i.hasNext()) {
StateMachine statemachine = (StateMachine) i.next();
State top = statemachine.getTop();
Collection allStates =
Model.getStateMachinesHelper().getAllSubStates(top);
Iterator ii = allStates.iterator();
while (ii.hasNext()) {
StateVertex state = (StateVertex) ii.next();
String statename = state.getName();
if (statename != null) {
if (statename.equals(s)) {
return state;
}
}
}
}
return null;
}
public boolean isAddingActivityGraphAllowed(Object context) {
return context instanceof BehavioralFeature
|| context instanceof Classifier
|| context instanceof UmlPackage;
}
public void addInState(Object classifierInState, Object state) {
if (classifierInState instanceof ClassifierInState
&& state instanceof State) {
((ClassifierInState) classifierInState).getInState().add(
(State) state);
} else {
throw new IllegalArgumentException(
"classifierInState: " + classifierInState
+ " or state: " + state);
}
}
public void setInStates(Object classifierInState, Collection newStates) {
if (classifierInState instanceof ClassifierInState) {
ClassifierInState cis = (ClassifierInState) classifierInState;
CollectionHelper.update(cis.getInState(), newStates);
} else {
throw new IllegalArgumentException(
"classifierInState: " + classifierInState);
}
}
public void setContents(Object partition, Collection contents) {
if (partition instanceof Partition) {
Partition p = (Partition) partition;
CollectionHelper.update(p.getContents(), contents);
} else {
throw new IllegalArgumentException(
"Partition: " + partition);
}
}
public void addContent(Object partition, Object modelElement) {
Partition p = (Partition) partition;
p.getContents().add((ModelElement) modelElement);
}
public void removeContent(Object partition, Object modelElement) {
Partition p = (Partition) partition;
p.getContents().remove(modelElement);
}
public void setSynch(Object objectFlowState, boolean isSynch) {
((ObjectFlowState) objectFlowState).setSynch(isSynch);
}
public void addParameter(Object objectFlowState, Object parameter) {
((ObjectFlowState) objectFlowState).getParameter().add(
(Parameter) parameter);
}
public void removeParameter(Object objectFlowState, Object parameter) {
((ObjectFlowState) objectFlowState).getParameter().remove(parameter);
}
public void setParameters(Object objectFlowState, Collection parameters) {
Collection params = ((ObjectFlowState) objectFlowState).getParameter();
params.clear();
params.addAll(parameters);
}
}