JSFFinalStateLogicImpl.java

package org.andromda.cartridges.jsf2.metafacades;

import org.andromda.metafacades.uml.ClassifierFacade;
import org.andromda.metafacades.uml.FrontEndUseCase;
import org.andromda.metafacades.uml.ModelElementFacade;
import org.andromda.metafacades.uml.UMLProfile;

/**
 * MetafacadeLogic implementation for org.andromda.cartridges.jsf2.metafacades.JSFFinalState.
 *
 * @see org.andromda.cartridges.jsf2.metafacades.JSFFinalState
 */
public class JSFFinalStateLogicImpl
    extends JSFFinalStateLogic
{
    private static final long serialVersionUID = 34L;
    /**
     * @param metaObject
     * @param context
     */
    public JSFFinalStateLogicImpl(Object metaObject, String context)
    {
        super(metaObject, context);
    }
    
    private JSFManageableEntity findManageableByName(String name)
    {
        for(ClassifierFacade clazz: getModel().getAllClasses())
        {
            if(clazz instanceof JSFManageableEntity && 
               (clazz.getName().equals(name) || clazz.getFullyQualifiedName().equals(name)))
            {
                return (JSFManageableEntity)clazz;
            }
        }
        return null;
    }

    /**
     * @return fullPath
     * @see org.andromda.cartridges.jsf2.metafacades.JSFFinalState#getPath()
     */
    protected String handleGetPath()
    {
        String fullPath = null;

        FrontEndUseCase useCase = this.getTargetUseCase();
        if (useCase == null)
        {
            // - perhaps this final state links outside of the UML model
            final Object taggedValue = this.findTaggedValue(UMLProfile.TAGGEDVALUE_EXTERNAL_HYPERLINK);
            if (taggedValue == null)
            {
                String name = getName();
                if (name != null && (name.startsWith("/") || name.startsWith("http://") || name.startsWith("file:")))
                {
                    fullPath = name;
                }
            }
            else
            {
                fullPath = String.valueOf(taggedValue);
            }
            
            if(fullPath == null && getName() != null)
            {
                fullPath = ((JSFManageableEntity)getTargetElement()).getActionFullPath();
            }
            
        }
        else if (useCase instanceof JSFUseCase)
        {
            fullPath = ((JSFUseCase)useCase).getPath();
        }

        return fullPath;
    }

    /**
     * @return the target controller
     * @see org.andromda.cartridges.jsf2.metafacades.JSFFinalState#getTargetControllerFullyQualifiedName()
     */
    @Override
    protected String handleGetTargetControllerFullyQualifiedName() {
        String result=null;
        
        if(getTargetElement() instanceof JSFUseCase)
        {
            result=((JSFUseCase)getTargetElement()).getController().getFullyQualifiedName();
        }
        else if(getTargetElement() instanceof JSFManageableEntity)
        {
            result=((JSFManageableEntity)getTargetElement()).getControllerType();
        }
        
        return result;
    }

    /**
     * @return the target controller bean name
     * @see org.andromda.cartridges.jsf2.metafacades.JSFFinalState#getTargetControllerBeanName()
     */
    @Override
    protected String handleGetTargetControllerBeanName() {
        String result=null;
        
        if(getTargetElement() instanceof JSFUseCase)
        {
            result=((JSFController)((JSFUseCase)getTargetElement()).getController()).getBeanName();
        }
        else if(getTargetElement() instanceof JSFManageableEntity)
        {
            result=((JSFManageableEntity)getTargetElement()).getControllerBeanName();
        }
        
        return result;
    }

    /**
     * @return the target element (use case or manageable class)
     * @see org.andromda.cartridges.jsf2.metafacades.JSFFinalState#getTargetElement()
     */
    @Override
    protected ModelElementFacade handleGetTargetElement() {
        ModelElementFacade targetElement=getTargetUseCase();
        
        if(targetElement == null)
        {
            String nameParts[] = getName().split(" ");
            if(nameParts.length >= 2 && nameParts[0].equalsIgnoreCase("Manage"))
            {
                JSFManageableEntity manageable=findManageableByName(nameParts[1]);
                if(manageable != null)
                {
                    return targetElement=manageable;
                }
            }
        }
        
        return targetElement;
    }
}