FrontEndEventLogicImpl.java

package org.andromda.metafacades.emf.uml22;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.andromda.metafacades.uml.FrontEndAction;
import org.andromda.metafacades.uml.FrontEndControllerOperation;
import org.andromda.metafacades.uml.FrontEndUseCase;
import org.andromda.metafacades.uml.TransitionFacade;
import org.apache.commons.lang.StringUtils;
import org.eclipse.uml2.uml.Activity;
import org.eclipse.uml2.uml.ActivityNode;
import org.eclipse.uml2.uml.CallOperationAction;
import org.eclipse.uml2.uml.Element;
import org.eclipse.uml2.uml.NamedElement;
import org.eclipse.uml2.uml.Operation;
import org.eclipse.uml2.uml.Transition;
import org.eclipse.uml2.uml.UseCase;

/**
 * MetafacadeLogic implementation for
 * org.andromda.metafacades.uml.FrontEndEvent.
 *
 * @see org.andromda.metafacades.uml.FrontEndEvent
 */
public class FrontEndEventLogicImpl
    extends FrontEndEventLogic
{
    private static final long serialVersionUID = 34L;
    /**
     * @param metaObject
     * @param context
     */
    public FrontEndEventLogicImpl(
        final Object metaObject,
        final String context)
    {
        super(metaObject, context);
    }

    /**
     * @see org.andromda.metafacades.uml.FrontEndEvent#isContainedInFrontEndUseCase()
     */
    @Override
    protected boolean handleIsContainedInFrontEndUseCase()
    {
        // Be careful. Should return true only when it has an owning transition
        // contained in front end usecase
        // from UML1.4: return this.getTransition() instanceof FrontEndForward;
        // Causes stack overflow...
        Element owner = (Element)this.metaObject;
        if (!(owner.getOwner() instanceof Transition))
        {
            return false;
        }
        while (owner != null)
        {
            if (owner instanceof UseCase)
            {
                if (this.shieldedElement(owner) instanceof FrontEndUseCase)
                {
                    return true;
                }
            }
            owner = owner.getOwner();
        }
        return false;
    }

    /**
     * @see org.andromda.metafacades.uml.FrontEndEvent#getControllerCall()
     */
    @Override
    protected FrontEndControllerOperation handleGetControllerCall()
    {
        final List<FrontEndControllerOperation> operations = this.getControllerCalls();
        return (operations.isEmpty() ? null : operations.iterator().next());
    }

    /**
     * @see org.andromda.metafacades.uml.FrontEndEvent#getControllerCalls()
     */
    @Override
    public List<Operation> handleGetControllerCalls()
    {
        // - get every operation from each CallOperationAction instance.
        // - Note: this is the same implementation as CallEvent.getOperationCall()
        final Activity activity = (Activity)this.metaObject;
        final List<Operation> operations = new ArrayList<Operation>();
        Collection<ActivityNode> nodes = activity.getNodes();
        // UML2 v3: What previously was in getNodes is now in getOwnedNodes, while getNodes returns null
        // This causes JSF cartridge to fail unless implemented
        if (nodes==null || nodes.isEmpty())
        {
            nodes = activity.getOwnedNodes();
        }
        for (final Iterator<ActivityNode> iterator = nodes.iterator(); iterator.hasNext();)
        {
            final Object nextNode = iterator.next();
            if (nextNode instanceof CallOperationAction)
            {
                final Operation operation = ((CallOperationAction)nextNode).getOperation();
                if (operation != null)
                {
                    operations.add(operation);
                }
            }
        }
        return operations;
    }

    /**
     * @see org.andromda.metafacades.uml.FrontEndEvent#getAction()
     */
    @Override
    protected FrontEndAction handleGetAction()
    {
        FrontEndAction action = null;
        final TransitionFacade transition = this.getTransition();
        if (transition instanceof FrontEndAction)
        {
            action = (FrontEndAction)transition;
        }
        return action;
    }

    /**
     * UML2 v5: ActivityImpl returns NULL for namespace. Need another way to get package name
     * @see org.andromda.metafacades.uml.FrontEndEvent#getPackageName()
     */
    @Override
    protected String handleGetPackageName()
    {
        String packageName = UmlUtilities.getPackageName((NamedElement)this.metaObject, ".", false);
        if (StringUtils.isBlank(packageName))
        {
            packageName = this.getPackage().getFullyQualifiedName();
        }
        return packageName;
    }
}