JSFControllerLogicImpl.java

package org.andromda.cartridges.jsf2.metafacades;

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

import org.andromda.cartridges.jsf2.JSFGlobals;
import org.andromda.cartridges.jsf2.JSFUtils;
import org.andromda.metafacades.uml.ActionStateFacade;
import org.andromda.metafacades.uml.ClassifierFacade;
import org.andromda.metafacades.uml.DependencyFacade;
import org.andromda.metafacades.uml.FilteredCollection;
import org.andromda.metafacades.uml.FrontEndAction;
import org.andromda.metafacades.uml.FrontEndActionState;
import org.andromda.metafacades.uml.ModelElementFacade;
import org.andromda.metafacades.uml.OperationFacade;
import org.andromda.metafacades.uml.PackageFacade;
import org.andromda.metafacades.uml.Service;
import org.andromda.utils.StringUtilsHelper;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringUtils;

/**
 * MetafacadeLogic implementation for org.andromda.cartridges.jsf2.metafacades.JSFController.
 *
 * @see org.andromda.cartridges.jsf2.metafacades.JSFController
 */
public class JSFControllerLogicImpl
    extends JSFControllerLogic
{
    private static final long serialVersionUID = 34L;
    /**
     * @param metaObject
     * @param context
     */
    public JSFControllerLogicImpl(Object metaObject, String context)
    {
        super(metaObject, context);
    }

    /**
     * @return implementationName
     * @see org.andromda.cartridges.jsf2.metafacades.JSFController#getImplementationName()
     */
    protected String handleGetImplementationName()
    {
        final String pattern = ObjectUtils.toString(
            this.getConfiguredProperty(JSFGlobals.CONTROLLER_IMPLEMENTATION_PATTERN));
        return pattern.replaceFirst("\\{0\\}", StringUtils.capitalize(this.getName()));
    }

    /**
     * @return fullyQualifiedImplementationName
     * @see org.andromda.cartridges.jsf2.metafacades.JSFController#getFullyQualifiedImplementationName()
     */
    protected String handleGetFullyQualifiedImplementationName()
    {
        final StringBuilder fullyQualifiedName = new StringBuilder();
        final String packageName = this.getPackageName();
        if (StringUtils.isNotBlank(packageName))
        {
            fullyQualifiedName.append(packageName + '.');
        }
        return fullyQualifiedName.append(this.getImplementationName()).toString();
    }

    /**
     * @return getFullyQualifiedImplementationName().replace('.', '/')
     * @see org.andromda.cartridges.jsf2.metafacades.JSFController#getFullyQualifiedImplementationPath()
     */
    protected String handleGetFullyQualifiedImplementationPath()
    {
        return this.getFullyQualifiedImplementationName().replace('.', '/');
    }

    /**
     * @return StringUtilsHelper.lowerCamelCaseName(this.getName())
     * @see org.andromda.cartridges.jsf2.metafacades.JSFController#getBeanName()
     */
    protected String handleGetBeanName()
    {
        return StringUtilsHelper.lowerCamelCaseName(this.getName());
    }

    /**
     * @return references
     * @see org.andromda.cartridges.jsf2.metafacades.JSFController#getSessionObjectReferences()
     */
    protected List<DependencyFacade> handleGetSessionObjectReferences()
    {
        final List<DependencyFacade> references = new ArrayList<DependencyFacade>(this.getSourceDependencies());
        for (final Iterator<DependencyFacade> iterator = references.iterator(); iterator.hasNext();)
        {
            final ModelElementFacade targetElement = (iterator.next()).getTargetElement();
            if (!(targetElement instanceof JSFSessionObject))
            {
                iterator.remove();
            }
        }
        return references;
    }

    /**
     * @return controllerSerialVersionUID
     * @see org.andromda.cartridges.jsf2.metafacades.JSFController#getControllerSerialVersionUID()
     */
    protected String handleGetControllerSerialVersionUID()
    {
       final StringBuilder buffer = new StringBuilder();
       buffer.append(this.getFullyQualifiedImplementationName());
       addSerialUIDData(buffer);
       return JSFUtils.calcSerialVersionUID(buffer);
    }

    private void addSerialUIDData(StringBuilder buffer)
    {
        for (final FrontEndAction action : this.getUseCase().getActions())
        {
            buffer.append(action.getName());
        }
    }

    /**
     * @see org.andromda.cartridges.jsf2.metafacades.JSFController#getAllServices()
     */
    @Override
    protected Collection<Service> handleGetAllServices() {
        final Set<Service> allServices=new HashSet<Service>();
        for(final DependencyFacade dependency: this.getServiceReferences())
        {
            allServices.add((Service)dependency.getTargetElement());
        }
        for(final DependencyFacade dependency: this.getServicesPackagesReferences())
        {
            final PackageFacade pack=(PackageFacade)dependency.getTargetElement();
            for(final ClassifierFacade clazz: pack.getClasses())
            {
                if(clazz instanceof Service)
                {
                    allServices.add((Service)clazz);
                }
            }
        }
        for(final FrontEndAction action: getUseCase().getActions())
        {
            for(final FrontEndActionState as: action.getActionStates())
            {
                for(final OperationFacade operation: as.getServiceCalls())
                {
                    allServices.add((Service)operation.getOwner());
                }
            }
        }
        return allServices;
    }

    /**
     * @see org.andromda.cartridges.jsf2.metafacades.JSFController#getServicesPackagesReferences()
     */
    @SuppressWarnings("unchecked")
    @Override
    protected List<PackageFacade> handleGetServicesPackagesReferences() {
        return (List<PackageFacade>)new FilteredCollection(this.getSourceDependencies())
        {
            private static final long serialVersionUID = 134L;
            @Override
            public boolean evaluate(final Object object)
            {
                return ((DependencyFacade)object).getTargetElement() instanceof PackageFacade;
            }
        };
    }
}