SpringServiceLogic.java

// license-header java merge-point
//
// Attention: generated code (by MetafacadeLogic.vsl) - do not modify!
//
package org.andromda.cartridges.spring.metafacades;

import java.util.Collection;
import java.util.List;
import org.andromda.core.common.Introspector;
import org.andromda.core.metafacade.MetafacadeBase;
import org.andromda.core.metafacade.MetafacadeFactory;
import org.andromda.core.metafacade.ModelValidationMessage;
import org.andromda.metafacades.uml.AssociationEndFacade;
import org.andromda.metafacades.uml.AttributeFacade;
import org.andromda.metafacades.uml.ClassifierFacade;
import org.andromda.metafacades.uml.ConstraintFacade;
import org.andromda.metafacades.uml.DependencyFacade;
import org.andromda.metafacades.uml.Destination;
import org.andromda.metafacades.uml.GeneralizableElementFacade;
import org.andromda.metafacades.uml.GeneralizationFacade;
import org.andromda.metafacades.uml.ModelElementFacade;
import org.andromda.metafacades.uml.ModelFacade;
import org.andromda.metafacades.uml.OperationFacade;
import org.andromda.metafacades.uml.PackageFacade;
import org.andromda.metafacades.uml.Role;
import org.andromda.metafacades.uml.Service;
import org.andromda.metafacades.uml.StateMachineFacade;
import org.andromda.metafacades.uml.StereotypeFacade;
import org.andromda.metafacades.uml.TaggedValueFacade;
import org.andromda.metafacades.uml.TemplateParameterFacade;
import org.andromda.metafacades.uml.TypeMappings;
import org.andromda.translation.ocl.validation.OCLCollections;
import org.andromda.translation.ocl.validation.OCLExpressions;
import org.andromda.translation.ocl.validation.OCLIntrospector;
import org.andromda.translation.ocl.validation.OCLResultEnsurer;
import org.apache.commons.collections.Predicate;
import org.apache.log4j.Logger;

/**
 * Represents a Spring service (which can include regular java objects, and/or session EJBs).
 * MetafacadeLogic for SpringService
 *
 * @see SpringService
 */
public abstract class SpringServiceLogic
    extends MetafacadeBase
    implements SpringService
{
    /**
     * The underlying UML object
     * @see Object
     */
    protected Object metaObject;

    /** Create Metafacade implementation instance using the MetafacadeFactory from the context
     * @param metaObjectIn
     * @param context
     */
    protected SpringServiceLogic(Object metaObjectIn, String context)
    {
        super(metaObjectIn, getContext(context));
        this.superService =
           (Service)
            MetafacadeFactory.getInstance().createFacadeImpl(
                    "org.andromda.metafacades.uml.Service",
                    metaObjectIn,
                    getContext(context));
        this.metaObject = metaObjectIn;
    }

    /**
     * The logger instance.
     */
    private static final Logger logger = Logger.getLogger(SpringServiceLogic.class);

    /**
     * Gets the context for this metafacade logic instance.
     * @param context String. Set to SpringService if null
     * @return context String
     */
    private static String getContext(String context)
    {
        if (context == null)
        {
            context = "org.andromda.cartridges.spring.metafacades.SpringService";
        }
        return context;
    }

    private Service superService;
    private boolean superServiceInitialized = false;

    /**
     * Gets the Service parent instance.
     * @return this.superService Service
     */
    private Service getSuperService()
    {
        if (!this.superServiceInitialized)
        {
            ((MetafacadeBase)this.superService).setMetafacadeContext(this.getMetafacadeContext());
            this.superServiceInitialized = true;
        }
        return this.superService;
    }

    /** Reset context only for non-root metafacades
     * @param context
     * @see MetafacadeBase#resetMetafacadeContext(String context)
     */
    @Override
    public void resetMetafacadeContext(String context)
    {
        if (!this.contextRoot) // reset context only for non-root metafacades
        {
            context = getContext(context);  // to have same value as in original constructor call
            setMetafacadeContext (context);
            if (this.superServiceInitialized)
            {
                ((MetafacadeBase)this.superService).resetMetafacadeContext(context);
            }
        }
    }

    /**
     * @return boolean true always
     * @see SpringService
     */
    public boolean isSpringServiceMetaType()
    {
        return true;
    }

    // --------------- attributes ---------------------

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getWebServiceDelegatorName()
    * @return String
    */
    protected abstract String handleGetWebServiceDelegatorName();

    private String __webServiceDelegatorName1a;
    private boolean __webServiceDelegatorName1aSet = false;

    /**
     * The name of the web service delegator class.
     * @return (String)handleGetWebServiceDelegatorName()
     */
    public final String getWebServiceDelegatorName()
    {
        String webServiceDelegatorName1a = this.__webServiceDelegatorName1a;
        if (!this.__webServiceDelegatorName1aSet)
        {
            // webServiceDelegatorName has no pre constraints
            webServiceDelegatorName1a = handleGetWebServiceDelegatorName();
            // webServiceDelegatorName has no post constraints
            this.__webServiceDelegatorName1a = webServiceDelegatorName1a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__webServiceDelegatorName1aSet = true;
            }
        }
        return webServiceDelegatorName1a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getFullyQualifiedWebServiceDelegatorName()
    * @return String
    */
    protected abstract String handleGetFullyQualifiedWebServiceDelegatorName();

    private String __fullyQualifiedWebServiceDelegatorName2a;
    private boolean __fullyQualifiedWebServiceDelegatorName2aSet = false;

    /**
     * The fully qualified web service delegator class name.
     * @return (String)handleGetFullyQualifiedWebServiceDelegatorName()
     */
    public final String getFullyQualifiedWebServiceDelegatorName()
    {
        String fullyQualifiedWebServiceDelegatorName2a = this.__fullyQualifiedWebServiceDelegatorName2a;
        if (!this.__fullyQualifiedWebServiceDelegatorName2aSet)
        {
            // fullyQualifiedWebServiceDelegatorName has no pre constraints
            fullyQualifiedWebServiceDelegatorName2a = handleGetFullyQualifiedWebServiceDelegatorName();
            // fullyQualifiedWebServiceDelegatorName has no post constraints
            this.__fullyQualifiedWebServiceDelegatorName2a = fullyQualifiedWebServiceDelegatorName2a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__fullyQualifiedWebServiceDelegatorName2aSet = true;
            }
        }
        return fullyQualifiedWebServiceDelegatorName2a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getImplementationName()
    * @return String
    */
    protected abstract String handleGetImplementationName();

    private String __implementationName3a;
    private boolean __implementationName3aSet = false;

    /**
     * The implementation name of the service
     * @return (String)handleGetImplementationName()
     */
    public final String getImplementationName()
    {
        String implementationName3a = this.__implementationName3a;
        if (!this.__implementationName3aSet)
        {
            // implementationName has no pre constraints
            implementationName3a = handleGetImplementationName();
            // implementationName has no post constraints
            this.__implementationName3a = implementationName3a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__implementationName3aSet = true;
            }
        }
        return implementationName3a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getFullyQualifiedImplementationName()
    * @return String
    */
    protected abstract String handleGetFullyQualifiedImplementationName();

    private String __fullyQualifiedImplementationName4a;
    private boolean __fullyQualifiedImplementationName4aSet = false;

    /**
     * The fully qualified name of the implementation class.
     * @return (String)handleGetFullyQualifiedImplementationName()
     */
    public final String getFullyQualifiedImplementationName()
    {
        String fullyQualifiedImplementationName4a = this.__fullyQualifiedImplementationName4a;
        if (!this.__fullyQualifiedImplementationName4aSet)
        {
            // fullyQualifiedImplementationName has no pre constraints
            fullyQualifiedImplementationName4a = handleGetFullyQualifiedImplementationName();
            // fullyQualifiedImplementationName has no post constraints
            this.__fullyQualifiedImplementationName4a = fullyQualifiedImplementationName4a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__fullyQualifiedImplementationName4aSet = true;
            }
        }
        return fullyQualifiedImplementationName4a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getBaseName()
    * @return String
    */
    protected abstract String handleGetBaseName();

    private String __baseName5a;
    private boolean __baseName5aSet = false;

    /**
     * The service base class name.
     * @return (String)handleGetBaseName()
     */
    public final String getBaseName()
    {
        String baseName5a = this.__baseName5a;
        if (!this.__baseName5aSet)
        {
            // baseName has no pre constraints
            baseName5a = handleGetBaseName();
            // baseName has no post constraints
            this.__baseName5a = baseName5a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__baseName5aSet = true;
            }
        }
        return baseName5a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getBeanName()
    * @return String
    */
    protected abstract String handleGetBeanName();

    private String __beanName6a;
    private boolean __beanName6aSet = false;

    /**
     * The bean name of this service.
     * @return (String)handleGetBeanName()
     */
    public final String getBeanName()
    {
        String beanName6a = this.__beanName6a;
        if (!this.__beanName6aSet)
        {
            // beanName has no pre constraints
            beanName6a = handleGetBeanName();
            // beanName has no post constraints
            this.__beanName6a = beanName6a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__beanName6aSet = true;
            }
        }
        return beanName6a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#isWebService()
    * @return boolean
    */
    protected abstract boolean handleIsWebService();

    private boolean __webService7a;
    private boolean __webService7aSet = false;

    /**
     * Returns true/false depending on whether or not this SpringService represents a web service.
     * @return (boolean)handleIsWebService()
     */
    public final boolean isWebService()
    {
        boolean webService7a = this.__webService7a;
        if (!this.__webService7aSet)
        {
            // webService has no pre constraints
            webService7a = handleIsWebService();
            // webService has no post constraints
            this.__webService7a = webService7a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__webService7aSet = true;
            }
        }
        return webService7a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getEjbJndiName()
    * @return String
    */
    protected abstract String handleGetEjbJndiName();

    private String __ejbJndiName8a;
    private boolean __ejbJndiName8aSet = false;

    /**
     * The JNDI name to which a Spring remote Session EJB will be bound.
     * @return (String)handleGetEjbJndiName()
     */
    public final String getEjbJndiName()
    {
        String ejbJndiName8a = this.__ejbJndiName8a;
        if (!this.__ejbJndiName8aSet)
        {
            // ejbJndiName has no pre constraints
            ejbJndiName8a = handleGetEjbJndiName();
            // ejbJndiName has no post constraints
            this.__ejbJndiName8a = ejbJndiName8a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__ejbJndiName8aSet = true;
            }
        }
        return ejbJndiName8a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getEjbImplementationName()
    * @return String
    */
    protected abstract String handleGetEjbImplementationName();

    private String __ejbImplementationName9a;
    private boolean __ejbImplementationName9aSet = false;

    /**
     * The EJB implementation class name.
     * @return (String)handleGetEjbImplementationName()
     */
    public final String getEjbImplementationName()
    {
        String ejbImplementationName9a = this.__ejbImplementationName9a;
        if (!this.__ejbImplementationName9aSet)
        {
            // ejbImplementationName has no pre constraints
            ejbImplementationName9a = handleGetEjbImplementationName();
            // ejbImplementationName has no post constraints
            this.__ejbImplementationName9a = ejbImplementationName9a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__ejbImplementationName9aSet = true;
            }
        }
        return ejbImplementationName9a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getFullyQualifiedBaseName()
    * @return String
    */
    protected abstract String handleGetFullyQualifiedBaseName();

    private String __fullyQualifiedBaseName10a;
    private boolean __fullyQualifiedBaseName10aSet = false;

    /**
     * The fully qualified service base class name.
     * @return (String)handleGetFullyQualifiedBaseName()
     */
    public final String getFullyQualifiedBaseName()
    {
        String fullyQualifiedBaseName10a = this.__fullyQualifiedBaseName10a;
        if (!this.__fullyQualifiedBaseName10aSet)
        {
            // fullyQualifiedBaseName has no pre constraints
            fullyQualifiedBaseName10a = handleGetFullyQualifiedBaseName();
            // fullyQualifiedBaseName has no post constraints
            this.__fullyQualifiedBaseName10a = fullyQualifiedBaseName10a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__fullyQualifiedBaseName10aSet = true;
            }
        }
        return fullyQualifiedBaseName10a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getFullyQualifiedEjbName()
    * @return String
    */
    protected abstract String handleGetFullyQualifiedEjbName();

    private String __fullyQualifiedEjbName11a;
    private boolean __fullyQualifiedEjbName11aSet = false;

    /**
     * TODO: Model Documentation for
     * org.andromda.cartridges.spring.metafacades.SpringService.fullyQualifiedEjbName
     * @return (String)handleGetFullyQualifiedEjbName()
     */
    public final String getFullyQualifiedEjbName()
    {
        String fullyQualifiedEjbName11a = this.__fullyQualifiedEjbName11a;
        if (!this.__fullyQualifiedEjbName11aSet)
        {
            // fullyQualifiedEjbName has no pre constraints
            fullyQualifiedEjbName11a = handleGetFullyQualifiedEjbName();
            // fullyQualifiedEjbName has no post constraints
            this.__fullyQualifiedEjbName11a = fullyQualifiedEjbName11a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__fullyQualifiedEjbName11aSet = true;
            }
        }
        return fullyQualifiedEjbName11a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getEjbPackageName()
    * @return String
    */
    protected abstract String handleGetEjbPackageName();

    private String __ejbPackageName12a;
    private boolean __ejbPackageName12aSet = false;

    /**
     * This can be either the package name the model element exists within OR it can be the package
     * with a prefix or suffix (i.e. the package could have '.ejb') appended to it. This option is
     * available if the EJB is just used a wrapper around a POJO Spring Service.
     * @return (String)handleGetEjbPackageName()
     */
    public final String getEjbPackageName()
    {
        String ejbPackageName12a = this.__ejbPackageName12a;
        if (!this.__ejbPackageName12aSet)
        {
            // ejbPackageName has no pre constraints
            ejbPackageName12a = handleGetEjbPackageName();
            // ejbPackageName has no post constraints
            this.__ejbPackageName12a = ejbPackageName12a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__ejbPackageName12aSet = true;
            }
        }
        return ejbPackageName12a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getFullyQualifiedEjbImplementationName()
    * @return String
    */
    protected abstract String handleGetFullyQualifiedEjbImplementationName();

    private String __fullyQualifiedEjbImplementationName13a;
    private boolean __fullyQualifiedEjbImplementationName13aSet = false;

    /**
     * The fully qualified name of the implementation class name.
     * @return (String)handleGetFullyQualifiedEjbImplementationName()
     */
    public final String getFullyQualifiedEjbImplementationName()
    {
        String fullyQualifiedEjbImplementationName13a = this.__fullyQualifiedEjbImplementationName13a;
        if (!this.__fullyQualifiedEjbImplementationName13aSet)
        {
            // fullyQualifiedEjbImplementationName has no pre constraints
            fullyQualifiedEjbImplementationName13a = handleGetFullyQualifiedEjbImplementationName();
            // fullyQualifiedEjbImplementationName has no post constraints
            this.__fullyQualifiedEjbImplementationName13a = fullyQualifiedEjbImplementationName13a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__fullyQualifiedEjbImplementationName13aSet = true;
            }
        }
        return fullyQualifiedEjbImplementationName13a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getEjbPackageNamePath()
    * @return String
    */
    protected abstract String handleGetEjbPackageNamePath();

    private String __ejbPackageNamePath14a;
    private boolean __ejbPackageNamePath14aSet = false;

    /**
     * The EJB package name as a path (i.e. '.' are replaced with '/').
     * @return (String)handleGetEjbPackageNamePath()
     */
    public final String getEjbPackageNamePath()
    {
        String ejbPackageNamePath14a = this.__ejbPackageNamePath14a;
        if (!this.__ejbPackageNamePath14aSet)
        {
            // ejbPackageNamePath has no pre constraints
            ejbPackageNamePath14a = handleGetEjbPackageNamePath();
            // ejbPackageNamePath has no post constraints
            this.__ejbPackageNamePath14a = ejbPackageNamePath14a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__ejbPackageNamePath14aSet = true;
            }
        }
        return ejbPackageNamePath14a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getDefaultExceptionName()
    * @return String
    */
    protected abstract String handleGetDefaultExceptionName();

    private String __defaultExceptionName15a;
    private boolean __defaultExceptionName15aSet = false;

    /**
     * The name of the default exception to be generated for this service.
     * @return (String)handleGetDefaultExceptionName()
     */
    public final String getDefaultExceptionName()
    {
        String defaultExceptionName15a = this.__defaultExceptionName15a;
        if (!this.__defaultExceptionName15aSet)
        {
            // defaultExceptionName has no pre constraints
            defaultExceptionName15a = handleGetDefaultExceptionName();
            // defaultExceptionName has no post constraints
            this.__defaultExceptionName15a = defaultExceptionName15a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__defaultExceptionName15aSet = true;
            }
        }
        return defaultExceptionName15a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getFullyQualifiedDefaultExceptionName()
    * @return String
    */
    protected abstract String handleGetFullyQualifiedDefaultExceptionName();

    private String __fullyQualifiedDefaultExceptionName16a;
    private boolean __fullyQualifiedDefaultExceptionName16aSet = false;

    /**
     * The fully qualified class name of the default exception.
     * @return (String)handleGetFullyQualifiedDefaultExceptionName()
     */
    public final String getFullyQualifiedDefaultExceptionName()
    {
        String fullyQualifiedDefaultExceptionName16a = this.__fullyQualifiedDefaultExceptionName16a;
        if (!this.__fullyQualifiedDefaultExceptionName16aSet)
        {
            // fullyQualifiedDefaultExceptionName has no pre constraints
            fullyQualifiedDefaultExceptionName16a = handleGetFullyQualifiedDefaultExceptionName();
            // fullyQualifiedDefaultExceptionName has no post constraints
            this.__fullyQualifiedDefaultExceptionName16a = fullyQualifiedDefaultExceptionName16a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__fullyQualifiedDefaultExceptionName16aSet = true;
            }
        }
        return fullyQualifiedDefaultExceptionName16a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#isAllowDefaultServiceException()
    * @return boolean
    */
    protected abstract boolean handleIsAllowDefaultServiceException();

    private boolean __allowDefaultServiceException17a;
    private boolean __allowDefaultServiceException17aSet = false;

    /**
     * Indicates whether or not a default service exception should be allowed.
     * @return (boolean)handleIsAllowDefaultServiceException()
     */
    public final boolean isAllowDefaultServiceException()
    {
        boolean allowDefaultServiceException17a = this.__allowDefaultServiceException17a;
        if (!this.__allowDefaultServiceException17aSet)
        {
            // allowDefaultServiceException has no pre constraints
            allowDefaultServiceException17a = handleIsAllowDefaultServiceException();
            // allowDefaultServiceException has no post constraints
            this.__allowDefaultServiceException17a = allowDefaultServiceException17a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__allowDefaultServiceException17aSet = true;
            }
        }
        return allowDefaultServiceException17a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getRemotePort()
    * @return String
    */
    protected abstract String handleGetRemotePort();

    private String __remotePort18a;
    private boolean __remotePort18aSet = false;

    /**
     * Determines which port this service will be published on at the server side.
     * @return (String)handleGetRemotePort()
     */
    public final String getRemotePort()
    {
        String remotePort18a = this.__remotePort18a;
        if (!this.__remotePort18aSet)
        {
            // remotePort has no pre constraints
            remotePort18a = handleGetRemotePort();
            // remotePort has no post constraints
            this.__remotePort18a = remotePort18a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__remotePort18aSet = true;
            }
        }
        return remotePort18a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getRemoteUrl()
    * @return String
    */
    protected abstract String handleGetRemoteUrl();

    private String __remoteUrl19a;
    private boolean __remoteUrl19aSet = false;

    /**
     * The URL this servie will be run on at the server side.
     * @return (String)handleGetRemoteUrl()
     */
    public final String getRemoteUrl()
    {
        String remoteUrl19a = this.__remoteUrl19a;
        if (!this.__remoteUrl19aSet)
        {
            // remoteUrl has no pre constraints
            remoteUrl19a = handleGetRemoteUrl();
            // remoteUrl has no post constraints
            this.__remoteUrl19a = remoteUrl19a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__remoteUrl19aSet = true;
            }
        }
        return remoteUrl19a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#isRemotable()
    * @return boolean
    */
    protected abstract boolean handleIsRemotable();

    private boolean __remotable20a;
    private boolean __remotable20aSet = false;

    /**
     * Returns true if this service is remotable. Derived from remotingType.
     * @return (boolean)handleIsRemotable()
     */
    public final boolean isRemotable()
    {
        boolean remotable20a = this.__remotable20a;
        if (!this.__remotable20aSet)
        {
            // remotable has no pre constraints
            remotable20a = handleIsRemotable();
            // remotable has no post constraints
            this.__remotable20a = remotable20a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__remotable20aSet = true;
            }
        }
        return remotable20a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#isRemotingTypeRmi()
    * @return boolean
    */
    protected abstract boolean handleIsRemotingTypeRmi();

    private boolean __remotingTypeRmi21a;
    private boolean __remotingTypeRmi21aSet = false;

    /**
     * Indicates if the remoting type is RMI.
     * @return (boolean)handleIsRemotingTypeRmi()
     */
    public final boolean isRemotingTypeRmi()
    {
        boolean remotingTypeRmi21a = this.__remotingTypeRmi21a;
        if (!this.__remotingTypeRmi21aSet)
        {
            // remotingTypeRmi has no pre constraints
            remotingTypeRmi21a = handleIsRemotingTypeRmi();
            // remotingTypeRmi has no post constraints
            this.__remotingTypeRmi21a = remotingTypeRmi21a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__remotingTypeRmi21aSet = true;
            }
        }
        return remotingTypeRmi21a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#isRemotingTypeBurlap()
    * @return boolean
    */
    protected abstract boolean handleIsRemotingTypeBurlap();

    private boolean __remotingTypeBurlap22a;
    private boolean __remotingTypeBurlap22aSet = false;

    /**
     * Indicates if the remoting type is "burlap".
     * @return (boolean)handleIsRemotingTypeBurlap()
     */
    public final boolean isRemotingTypeBurlap()
    {
        boolean remotingTypeBurlap22a = this.__remotingTypeBurlap22a;
        if (!this.__remotingTypeBurlap22aSet)
        {
            // remotingTypeBurlap has no pre constraints
            remotingTypeBurlap22a = handleIsRemotingTypeBurlap();
            // remotingTypeBurlap has no post constraints
            this.__remotingTypeBurlap22a = remotingTypeBurlap22a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__remotingTypeBurlap22aSet = true;
            }
        }
        return remotingTypeBurlap22a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#isRemotingTypeHessian()
    * @return boolean
    */
    protected abstract boolean handleIsRemotingTypeHessian();

    private boolean __remotingTypeHessian23a;
    private boolean __remotingTypeHessian23aSet = false;

    /**
     * Indicates if the remoting type is "hessian".
     * @return (boolean)handleIsRemotingTypeHessian()
     */
    public final boolean isRemotingTypeHessian()
    {
        boolean remotingTypeHessian23a = this.__remotingTypeHessian23a;
        if (!this.__remotingTypeHessian23aSet)
        {
            // remotingTypeHessian has no pre constraints
            remotingTypeHessian23a = handleIsRemotingTypeHessian();
            // remotingTypeHessian has no post constraints
            this.__remotingTypeHessian23a = remotingTypeHessian23a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__remotingTypeHessian23aSet = true;
            }
        }
        return remotingTypeHessian23a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#isRemotingTypeHttpInvoker()
    * @return boolean
    */
    protected abstract boolean handleIsRemotingTypeHttpInvoker();

    private boolean __remotingTypeHttpInvoker24a;
    private boolean __remotingTypeHttpInvoker24aSet = false;

    /**
     * Indicates if the remoting type is "httpinvoker".
     * @return (boolean)handleIsRemotingTypeHttpInvoker()
     */
    public final boolean isRemotingTypeHttpInvoker()
    {
        boolean remotingTypeHttpInvoker24a = this.__remotingTypeHttpInvoker24a;
        if (!this.__remotingTypeHttpInvoker24aSet)
        {
            // remotingTypeHttpInvoker has no pre constraints
            remotingTypeHttpInvoker24a = handleIsRemotingTypeHttpInvoker();
            // remotingTypeHttpInvoker has no post constraints
            this.__remotingTypeHttpInvoker24a = remotingTypeHttpInvoker24a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__remotingTypeHttpInvoker24aSet = true;
            }
        }
        return remotingTypeHttpInvoker24a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#isRemotingTypeNone()
    * @return boolean
    */
    protected abstract boolean handleIsRemotingTypeNone();

    private boolean __remotingTypeNone25a;
    private boolean __remotingTypeNone25aSet = false;

    /**
     * Indicates if the remoting type for this service is "none".
     * @return (boolean)handleIsRemotingTypeNone()
     */
    public final boolean isRemotingTypeNone()
    {
        boolean remotingTypeNone25a = this.__remotingTypeNone25a;
        if (!this.__remotingTypeNone25aSet)
        {
            // remotingTypeNone has no pre constraints
            remotingTypeNone25a = handleIsRemotingTypeNone();
            // remotingTypeNone has no post constraints
            this.__remotingTypeNone25a = remotingTypeNone25a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__remotingTypeNone25aSet = true;
            }
        }
        return remotingTypeNone25a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#isHibernateInterceptorEnabled()
    * @return boolean
    */
    protected abstract boolean handleIsHibernateInterceptorEnabled();

    private boolean __hibernateInterceptorEnabled26a;
    private boolean __hibernateInterceptorEnabled26aSet = false;

    /**
     * Indicates whether or not the hibernate intercetor is enabled for this service.
     * @return (boolean)handleIsHibernateInterceptorEnabled()
     */
    public final boolean isHibernateInterceptorEnabled()
    {
        boolean hibernateInterceptorEnabled26a = this.__hibernateInterceptorEnabled26a;
        if (!this.__hibernateInterceptorEnabled26aSet)
        {
            // hibernateInterceptorEnabled has no pre constraints
            hibernateInterceptorEnabled26a = handleIsHibernateInterceptorEnabled();
            // hibernateInterceptorEnabled has no post constraints
            this.__hibernateInterceptorEnabled26a = hibernateInterceptorEnabled26a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__hibernateInterceptorEnabled26aSet = true;
            }
        }
        return hibernateInterceptorEnabled26a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#isEjbRemoteView()
    * @return boolean
    */
    protected abstract boolean handleIsEjbRemoteView();

    private boolean __ejbRemoteView27a;
    private boolean __ejbRemoteView27aSet = false;

    /**
     * Indicates if the view type of this service is remote.
     * @return (boolean)handleIsEjbRemoteView()
     */
    public final boolean isEjbRemoteView()
    {
        boolean ejbRemoteView27a = this.__ejbRemoteView27a;
        if (!this.__ejbRemoteView27aSet)
        {
            // ejbRemoteView has no pre constraints
            ejbRemoteView27a = handleIsEjbRemoteView();
            // ejbRemoteView has no post constraints
            this.__ejbRemoteView27a = ejbRemoteView27a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__ejbRemoteView27aSet = true;
            }
        }
        return ejbRemoteView27a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getRemoteServer()
    * @return String
    */
    protected abstract String handleGetRemoteServer();

    private String __remoteServer28a;
    private boolean __remoteServer28aSet = false;

    /**
     * Returns the name of the remote server for this service.
     * @return (String)handleGetRemoteServer()
     */
    public final String getRemoteServer()
    {
        String remoteServer28a = this.__remoteServer28a;
        if (!this.__remoteServer28aSet)
        {
            // remoteServer has no pre constraints
            remoteServer28a = handleGetRemoteServer();
            // remoteServer has no post constraints
            this.__remoteServer28a = remoteServer28a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__remoteServer28aSet = true;
            }
        }
        return remoteServer28a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getRemoteContext()
    * @return String
    */
    protected abstract String handleGetRemoteContext();

    private String __remoteContext29a;
    private boolean __remoteContext29aSet = false;

    /**
     * Returns the remote context for this service.
     * @return (String)handleGetRemoteContext()
     */
    public final String getRemoteContext()
    {
        String remoteContext29a = this.__remoteContext29a;
        if (!this.__remoteContext29aSet)
        {
            // remoteContext has no pre constraints
            remoteContext29a = handleGetRemoteContext();
            // remoteContext has no post constraints
            this.__remoteContext29a = remoteContext29a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__remoteContext29aSet = true;
            }
        }
        return remoteContext29a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getEjbTransactionType()
    * @return String
    */
    protected abstract String handleGetEjbTransactionType();

    private String __ejbTransactionType30a;
    private boolean __ejbTransactionType30aSet = false;

    /**
     * The EJB transaction type (Bean or Container).
     * @return (String)handleGetEjbTransactionType()
     */
    public final String getEjbTransactionType()
    {
        String ejbTransactionType30a = this.__ejbTransactionType30a;
        if (!this.__ejbTransactionType30aSet)
        {
            // ejbTransactionType has no pre constraints
            ejbTransactionType30a = handleGetEjbTransactionType();
            // ejbTransactionType has no post constraints
            this.__ejbTransactionType30a = ejbTransactionType30a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__ejbTransactionType30aSet = true;
            }
        }
        return ejbTransactionType30a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getInterceptors()
    * @return Collection<String>
    */
    protected abstract Collection<String> handleGetInterceptors();

    private Collection<String> __interceptors31a;
    private boolean __interceptors31aSet = false;

    /**
     * TODO: Model Documentation for
     * org.andromda.cartridges.spring.metafacades.SpringService.interceptors
     * @return (Collection<String>)handleGetInterceptors()
     */
    public final Collection<String> getInterceptors()
    {
        Collection<String> interceptors31a = this.__interceptors31a;
        if (!this.__interceptors31aSet)
        {
            // interceptors has no pre constraints
            interceptors31a = handleGetInterceptors();
            // interceptors has no post constraints
            this.__interceptors31a = interceptors31a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__interceptors31aSet = true;
            }
        }
        return interceptors31a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#isConfigonly()
    * @return boolean
    */
    protected abstract boolean handleIsConfigonly();

    private boolean __configonly32a;
    private boolean __configonly32aSet = false;

    /**
     * Defines whether this service will only be listed in the config, but note be generated as a
     * Spring bean.
     * @return (boolean)handleIsConfigonly()
     */
    public final boolean isConfigonly()
    {
        boolean configonly32a = this.__configonly32a;
        if (!this.__configonly32aSet)
        {
            // configonly has no pre constraints
            configonly32a = handleIsConfigonly();
            // configonly has no post constraints
            this.__configonly32a = configonly32a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__configonly32aSet = true;
            }
        }
        return configonly32a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getWebServiceOutgoingAttachmentHandlerCall()
    * @return String
    */
    protected abstract String handleGetWebServiceOutgoingAttachmentHandlerCall();

    private String __webServiceOutgoingAttachmentHandlerCall33a;
    private boolean __webServiceOutgoingAttachmentHandlerCall33aSet = false;

    /**
     * The call to the outgoing web service attachment call.
     * @return (String)handleGetWebServiceOutgoingAttachmentHandlerCall()
     */
    public final String getWebServiceOutgoingAttachmentHandlerCall()
    {
        String webServiceOutgoingAttachmentHandlerCall33a = this.__webServiceOutgoingAttachmentHandlerCall33a;
        if (!this.__webServiceOutgoingAttachmentHandlerCall33aSet)
        {
            // webServiceOutgoingAttachmentHandlerCall has no pre constraints
            webServiceOutgoingAttachmentHandlerCall33a = handleGetWebServiceOutgoingAttachmentHandlerCall();
            // webServiceOutgoingAttachmentHandlerCall has no post constraints
            this.__webServiceOutgoingAttachmentHandlerCall33a = webServiceOutgoingAttachmentHandlerCall33a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__webServiceOutgoingAttachmentHandlerCall33aSet = true;
            }
        }
        return webServiceOutgoingAttachmentHandlerCall33a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getWebServiceIncomingAttachmentHandlerCall()
    * @return String
    */
    protected abstract String handleGetWebServiceIncomingAttachmentHandlerCall();

    private String __webServiceIncomingAttachmentHandlerCall34a;
    private boolean __webServiceIncomingAttachmentHandlerCall34aSet = false;

    /**
     * The call to the incoming web service attachment call.
     * @return (String)handleGetWebServiceIncomingAttachmentHandlerCall()
     */
    public final String getWebServiceIncomingAttachmentHandlerCall()
    {
        String webServiceIncomingAttachmentHandlerCall34a = this.__webServiceIncomingAttachmentHandlerCall34a;
        if (!this.__webServiceIncomingAttachmentHandlerCall34aSet)
        {
            // webServiceIncomingAttachmentHandlerCall has no pre constraints
            webServiceIncomingAttachmentHandlerCall34a = handleGetWebServiceIncomingAttachmentHandlerCall();
            // webServiceIncomingAttachmentHandlerCall has no post constraints
            this.__webServiceIncomingAttachmentHandlerCall34a = webServiceIncomingAttachmentHandlerCall34a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__webServiceIncomingAttachmentHandlerCall34aSet = true;
            }
        }
        return webServiceIncomingAttachmentHandlerCall34a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#isRichClient()
    * @return boolean
    */
    protected abstract boolean handleIsRichClient();

    private boolean __richClient35a;
    private boolean __richClient35aSet = false;

    /**
     * Returns true if this service is meant to take part in a richt client application.
     * @return (boolean)handleIsRichClient()
     */
    public final boolean isRichClient()
    {
        boolean richClient35a = this.__richClient35a;
        if (!this.__richClient35aSet)
        {
            // richClient has no pre constraints
            richClient35a = handleIsRichClient();
            // richClient has no post constraints
            this.__richClient35a = richClient35a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__richClient35aSet = true;
            }
        }
        return richClient35a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#isEjbLocalView()
    * @return boolean
    */
    protected abstract boolean handleIsEjbLocalView();

    private boolean __ejbLocalView36a;
    private boolean __ejbLocalView36aSet = false;

    /**
     * TODO: Model Documentation for
     * org.andromda.cartridges.spring.metafacades.SpringService.ejbLocalView
     * @return (boolean)handleIsEjbLocalView()
     */
    public final boolean isEjbLocalView()
    {
        boolean ejbLocalView36a = this.__ejbLocalView36a;
        if (!this.__ejbLocalView36aSet)
        {
            // ejbLocalView has no pre constraints
            ejbLocalView36a = handleIsEjbLocalView();
            // ejbLocalView has no post constraints
            this.__ejbLocalView36a = ejbLocalView36a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__ejbLocalView36aSet = true;
            }
        }
        return ejbLocalView36a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getFullyQualifiedLocalEjbName()
    * @return String
    */
    protected abstract String handleGetFullyQualifiedLocalEjbName();

    private String __fullyQualifiedLocalEjbName37a;
    private boolean __fullyQualifiedLocalEjbName37aSet = false;

    /**
     * TODO: Model Documentation for
     * org.andromda.cartridges.spring.metafacades.SpringService.fullyQualifiedLocalEjbName
     * @return (String)handleGetFullyQualifiedLocalEjbName()
     */
    public final String getFullyQualifiedLocalEjbName()
    {
        String fullyQualifiedLocalEjbName37a = this.__fullyQualifiedLocalEjbName37a;
        if (!this.__fullyQualifiedLocalEjbName37aSet)
        {
            // fullyQualifiedLocalEjbName has no pre constraints
            fullyQualifiedLocalEjbName37a = handleGetFullyQualifiedLocalEjbName();
            // fullyQualifiedLocalEjbName has no post constraints
            this.__fullyQualifiedLocalEjbName37a = fullyQualifiedLocalEjbName37a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__fullyQualifiedLocalEjbName37aSet = true;
            }
        }
        return fullyQualifiedLocalEjbName37a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getEjbLocalJndiName()
    * @return String
    */
    protected abstract String handleGetEjbLocalJndiName();

    private String __ejbLocalJndiName38a;
    private boolean __ejbLocalJndiName38aSet = false;

    /**
     * The JNDI name to which a Spring local Session EJB will be bound.
     * @return (String)handleGetEjbLocalJndiName()
     */
    public final String getEjbLocalJndiName()
    {
        String ejbLocalJndiName38a = this.__ejbLocalJndiName38a;
        if (!this.__ejbLocalJndiName38aSet)
        {
            // ejbLocalJndiName has no pre constraints
            ejbLocalJndiName38a = handleGetEjbLocalJndiName();
            // ejbLocalJndiName has no post constraints
            this.__ejbLocalJndiName38a = ejbLocalJndiName38a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__ejbLocalJndiName38aSet = true;
            }
        }
        return ejbLocalJndiName38a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#isRemotingTypeLingo()
    * @return boolean
    */
    protected abstract boolean handleIsRemotingTypeLingo();

    private boolean __remotingTypeLingo39a;
    private boolean __remotingTypeLingo39aSet = false;

    /**
     * Indicates whether this service can be talked to using Lingo remoting.
     * @return (boolean)handleIsRemotingTypeLingo()
     */
    public final boolean isRemotingTypeLingo()
    {
        boolean remotingTypeLingo39a = this.__remotingTypeLingo39a;
        if (!this.__remotingTypeLingo39aSet)
        {
            // remotingTypeLingo has no pre constraints
            remotingTypeLingo39a = handleIsRemotingTypeLingo();
            // remotingTypeLingo has no post constraints
            this.__remotingTypeLingo39a = remotingTypeLingo39a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__remotingTypeLingo39aSet = true;
            }
        }
        return remotingTypeLingo39a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#isPrivate()
    * @return boolean
    */
    protected abstract boolean handleIsPrivate();

    private boolean __private40a;
    private boolean __private40aSet = false;

    /**
     * Returns true if the service is considered as private. Private services are not available
     * through the ServiceLocator, are not exposed via remoting and their methods are not
     * intercepted by transaction manager.
     * @return (boolean)handleIsPrivate()
     */
    public final boolean isPrivate()
    {
        boolean private40a = this.__private40a;
        if (!this.__private40aSet)
        {
            // private has no pre constraints
            private40a = handleIsPrivate();
            // private has no post constraints
            this.__private40a = private40a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__private40aSet = true;
            }
        }
        return private40a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getImplementationPackageName()
    * @return String
    */
    protected abstract String handleGetImplementationPackageName();

    private String __implementationPackageName41a;
    private boolean __implementationPackageName41aSet = false;

    /**
     * This can be either the package name the model element exists within OR it can be the package
     * with a prefix or suffix (i.e. the package could have '.impl') appended to it.
     * @return (String)handleGetImplementationPackageName()
     */
    public final String getImplementationPackageName()
    {
        String implementationPackageName41a = this.__implementationPackageName41a;
        if (!this.__implementationPackageName41aSet)
        {
            // implementationPackageName has no pre constraints
            implementationPackageName41a = handleGetImplementationPackageName();
            // implementationPackageName has no post constraints
            this.__implementationPackageName41a = implementationPackageName41a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__implementationPackageName41aSet = true;
            }
        }
        return implementationPackageName41a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getImplementationPackagePath()
    * @return String
    */
    protected abstract String handleGetImplementationPackagePath();

    private String __implementationPackagePath42a;
    private boolean __implementationPackagePath42aSet = false;

    /**
     * The service implementation package name as a path (i.e. '.' are replaced with '/').
     * @return (String)handleGetImplementationPackagePath()
     */
    public final String getImplementationPackagePath()
    {
        String implementationPackagePath42a = this.__implementationPackagePath42a;
        if (!this.__implementationPackagePath42aSet)
        {
            // implementationPackagePath has no pre constraints
            implementationPackagePath42a = handleGetImplementationPackagePath();
            // implementationPackagePath has no post constraints
            this.__implementationPackagePath42a = implementationPackagePath42a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__implementationPackagePath42aSet = true;
            }
        }
        return implementationPackagePath42a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getInitMethodName()
    * @return String
    */
    protected abstract String handleGetInitMethodName();

    private String __initMethodName43a;
    private boolean __initMethodName43aSet = false;

    /**
     * This is a name of the init-method of this service, or is empty if doesn't exists.
     * @return (String)handleGetInitMethodName()
     */
    public final String getInitMethodName()
    {
        String initMethodName43a = this.__initMethodName43a;
        if (!this.__initMethodName43aSet)
        {
            // initMethodName has no pre constraints
            initMethodName43a = handleGetInitMethodName();
            // initMethodName has no post constraints
            this.__initMethodName43a = initMethodName43a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__initMethodName43aSet = true;
            }
        }
        return initMethodName43a;
    }

   /**
    * @see org.andromda.cartridges.spring.metafacades.SpringService#getDestroyMethodName()
    * @return String
    */
    protected abstract String handleGetDestroyMethodName();

    private String __destroyMethodName44a;
    private boolean __destroyMethodName44aSet = false;

    /**
     * This is a name of the destroy-method of this service, or is empty if doesn't exists.
     * @return (String)handleGetDestroyMethodName()
     */
    public final String getDestroyMethodName()
    {
        String destroyMethodName44a = this.__destroyMethodName44a;
        if (!this.__destroyMethodName44aSet)
        {
            // destroyMethodName has no pre constraints
            destroyMethodName44a = handleGetDestroyMethodName();
            // destroyMethodName has no post constraints
            this.__destroyMethodName44a = destroyMethodName44a;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__destroyMethodName44aSet = true;
            }
        }
        return destroyMethodName44a;
    }

    // ---------------- business methods ----------------------

    /**
     * Method to be implemented in descendants
     * Gets the Spring bean name, and optionally adds a target suffix, if 'targetSuffix' is set to
     * true.
     * @param targetSuffix
     * @return String
     */
    protected abstract String handleGetBeanName(boolean targetSuffix);

    /**
     * Gets the Spring bean name, and optionally adds a target suffix, if 'targetSuffix' is set to
     * true.
     * @param targetSuffix boolean
     * Whether or not the target suffix should be added.
     * @return handleGetBeanName(targetSuffix)
     */
    public String getBeanName(boolean targetSuffix)
    {
        // getBeanName has no pre constraints
        String returnValue = handleGetBeanName(targetSuffix);
        // getBeanName has no post constraints
        return returnValue;
    }

    // ------------- associations ------------------

    private Collection<SpringServiceOperation> __getWebServiceOperations1r;
    private boolean __getWebServiceOperations1rSet = false;

    /**
     * Represents a Spring service (which can include regular java objects, and/or session EJBs).
     * @return (Collection<SpringServiceOperation>)handleGetWebServiceOperations()
     */
    public final Collection<SpringServiceOperation> getWebServiceOperations()
    {
        Collection<SpringServiceOperation> getWebServiceOperations1r = this.__getWebServiceOperations1r;
        if (!this.__getWebServiceOperations1rSet)
        {
            // springService has no pre constraints
            Collection result = handleGetWebServiceOperations();
            List shieldedResult = this.shieldedElements(result);
            try
            {
                getWebServiceOperations1r = (Collection<SpringServiceOperation>)shieldedResult;
            }
            catch (ClassCastException ex)
            {
                // Bad things happen if the metafacade type mapping in metafacades.xml is wrong - Warn
                SpringServiceLogic.logger.warn("incorrect metafacade cast for SpringServiceLogic.getWebServiceOperations Collection<SpringServiceOperation> " + result + ": " + shieldedResult);
            }
            // springService has no post constraints
            this.__getWebServiceOperations1r = getWebServiceOperations1r;
            if (isMetafacadePropertyCachingEnabled())
            {
                this.__getWebServiceOperations1rSet = true;
            }
        }
        return getWebServiceOperations1r;
    }

    /**
     * UML Specific type is returned in Collection, transformed by shieldedElements to AndroMDA Metafacade type
     * @return  Collection
     */
    protected abstract Collection handleGetWebServiceOperations();

    /**
     * @return true
     * @see Service
     */
    public boolean isServiceMetaType()
    {
        return true;
    }

    /**
     * @return true
     * @see ClassifierFacade
     */
    public boolean isClassifierFacadeMetaType()
    {
        return true;
    }

    /**
     * @return true
     * @see GeneralizableElementFacade
     */
    public boolean isGeneralizableElementFacadeMetaType()
    {
        return true;
    }

    /**
     * @return true
     * @see ModelElementFacade
     */
    public boolean isModelElementFacadeMetaType()
    {
        return true;
    }

    // ----------- delegates to Service ------------
    /**
     * Return the attribute which name matches the parameter
     * @see ClassifierFacade#findAttribute(String name)
     */
    public AttributeFacade findAttribute(String name)
    {
        return this.getSuperService().findAttribute(name);
    }

    /**
     * Those abstraction dependencies for which this classifier is the client.
     * @see ClassifierFacade#getAbstractions()
     */
    public Collection<ClassifierFacade> getAbstractions()
    {
        return this.getSuperService().getAbstractions();
    }

    /**
     * Lists all classes associated to this one and any ancestor classes (through generalization).
     * There will be no duplicates. The order of the elements is predictable.
     * @see ClassifierFacade#getAllAssociatedClasses()
     */
    public Collection<ClassifierFacade> getAllAssociatedClasses()
    {
        return this.getSuperService().getAllAssociatedClasses();
    }

    /**
     * A collection containing all 'properties' of the classifier and its ancestors.  Properties are
     * any attributes and navigable connecting association ends.
     * @see ClassifierFacade#getAllProperties()
     */
    public Collection<ModelElementFacade> getAllProperties()
    {
        return this.getSuperService().getAllProperties();
    }

    /**
     * A collection containing all required and/or read-only 'properties' of the classifier and its
     * ancestors. Properties are any attributes and navigable connecting association ends.
     * @see ClassifierFacade#getAllRequiredConstructorParameters()
     */
    public Collection<ModelElementFacade> getAllRequiredConstructorParameters()
    {
        return this.getSuperService().getAllRequiredConstructorParameters();
    }

    /**
     * Gets the array type for this classifier.  If this classifier already represents an array, it
     * just returns itself.
     * @see ClassifierFacade#getArray()
     */
    public ClassifierFacade getArray()
    {
        return this.getSuperService().getArray();
    }

    /**
     * The name of the classifier as an array.
     * @see ClassifierFacade#getArrayName()
     */
    public String getArrayName()
    {
        return this.getSuperService().getArrayName();
    }

    /**
     * Lists the classes associated to this one, there is no repitition of classes. The order of the
     * elements is predictable.
     * @see ClassifierFacade#getAssociatedClasses()
     */
    public Collection<ClassifierFacade> getAssociatedClasses()
    {
        return this.getSuperService().getAssociatedClasses();
    }

    /**
     * Gets the association ends belonging to a classifier.
     * @see ClassifierFacade#getAssociationEnds()
     */
    public List<AssociationEndFacade> getAssociationEnds()
    {
        return this.getSuperService().getAssociationEnds();
    }

    /**
     * Gets the attributes that belong to the classifier.
     * @see ClassifierFacade#getAttributes()
     */
    public List<AttributeFacade> getAttributes()
    {
        return this.getSuperService().getAttributes();
    }

    /**
     * Gets all attributes for the classifier and if 'follow' is true goes up the inheritance
     * hierarchy and gets the attributes from the super classes as well.
     * @see ClassifierFacade#getAttributes(boolean follow)
     */
    public List<AttributeFacade> getAttributes(boolean follow)
    {
        return this.getSuperService().getAttributes(follow);
    }

    /**
     * The fully qualified name of the classifier as an array.
     * @see ClassifierFacade#getFullyQualifiedArrayName()
     */
    public String getFullyQualifiedArrayName()
    {
        return this.getSuperService().getFullyQualifiedArrayName();
    }

    /**
     * Returns all those operations that could be implemented at this classifier's level. This means
     * the operations owned by this classifier as well as any realized interface's operations
     * (recursively) in case this classifier itself is not already an interface, or generalized when
     * this classifier is an interface.
     * @see ClassifierFacade#getImplementationOperations()
     */
    public Collection<OperationFacade> getImplementationOperations()
    {
        return this.getSuperService().getImplementationOperations();
    }

    /**
     * A comma separated list of the fully qualified names of all implemented interfaces.
     * @see ClassifierFacade#getImplementedInterfaceList()
     */
    public String getImplementedInterfaceList()
    {
        return this.getSuperService().getImplementedInterfaceList();
    }

    /**
     * Those attributes that are scoped to an instance of this class.
     * @see ClassifierFacade#getInstanceAttributes()
     */
    public Collection<AttributeFacade> getInstanceAttributes()
    {
        return this.getSuperService().getInstanceAttributes();
    }

    /**
     * Those operations that are scoped to an instance of this class.
     * @see ClassifierFacade#getInstanceOperations()
     */
    public List<OperationFacade> getInstanceOperations()
    {
        return this.getSuperService().getInstanceOperations();
    }

    /**
     * Those interfaces that are abstractions of this classifier, this basically means this
     * classifier realizes them.
     * @see ClassifierFacade#getInterfaceAbstractions()
     */
    public Collection<ClassifierFacade> getInterfaceAbstractions()
    {
        return this.getSuperService().getInterfaceAbstractions();
    }

    /**
     * A String representing a new Constructor declaration for this classifier type to be used in a
     * Java environment.
     * @see ClassifierFacade#getJavaNewString()
     */
    public String getJavaNewString()
    {
        return this.getSuperService().getJavaNewString();
    }

    /**
     * A String representing the null-value for this classifier type to be used in a Java
     * environment.
     * @see ClassifierFacade#getJavaNullString()
     */
    public String getJavaNullString()
    {
        return this.getSuperService().getJavaNullString();
    }

    /**
     * The other ends of this classifier's association ends which are navigable.
     * @see ClassifierFacade#getNavigableConnectingEnds()
     */
    public Collection<AssociationEndFacade> getNavigableConnectingEnds()
    {
        return this.getSuperService().getNavigableConnectingEnds();
    }

    /**
     * Get the other ends of this classifier's association ends which are navigable and if 'follow'
     * is true goes up the inheritance hierarchy and gets the super association ends as well.
     * @see ClassifierFacade#getNavigableConnectingEnds(boolean follow)
     */
    public List<AssociationEndFacade> getNavigableConnectingEnds(boolean follow)
    {
        return this.getSuperService().getNavigableConnectingEnds(follow);
    }

    /**
     * Assuming that the classifier is an array, this will return the non array type of the
     * classifier from
     * the model.  If the classifier is NOT an array, it will just return itself.
     * @see ClassifierFacade#getNonArray()
     */
    public ClassifierFacade getNonArray()
    {
        return this.getSuperService().getNonArray();
    }

    /**
     * The attributes from this classifier in the form of an operation call (this example would be
     * in Java): '(String attributeOne, String attributeTwo).  If there were no attributes on the
     * classifier, the result would be an empty '()'.
     * @see ClassifierFacade#getOperationCallFromAttributes()
     */
    public String getOperationCallFromAttributes()
    {
        return this.getSuperService().getOperationCallFromAttributes();
    }

    /**
     * The operations owned by this classifier.
     * @see ClassifierFacade#getOperations()
     */
    public List<OperationFacade> getOperations()
    {
        return this.getSuperService().getOperations();
    }

    /**
     * A collection containing all 'properties' of the classifier.  Properties are any attributes
     * and navigable connecting association ends.
     * @see ClassifierFacade#getProperties()
     */
    public List<ModelElementFacade> getProperties()
    {
        return this.getSuperService().getProperties();
    }

    /**
     * Gets all properties (attributes and navigable association ends) for the classifier and if
     * 'follow' is true goes up the inheritance hierarchy and gets the properties from the super
     * classes as well.
     * @see ClassifierFacade#getProperties(boolean follow)
     */
    public List getProperties(boolean follow)
    {
        return this.getSuperService().getProperties(follow);
    }

    /**
     * A collection containing all required and/or read-only 'properties' of the classifier. 
     * Properties are any attributes and navigable connecting association ends.
     * @see ClassifierFacade#getRequiredConstructorParameters()
     */
    public Collection<ModelElementFacade> getRequiredConstructorParameters()
    {
        return this.getSuperService().getRequiredConstructorParameters();
    }

    /**
     * Returns the serial version UID of the underlying model element.
     * @see ClassifierFacade#getSerialVersionUID()
     */
    public long getSerialVersionUID()
    {
        return this.getSuperService().getSerialVersionUID();
    }

    /**
     * Those attributes that are scoped to the definition of this class.
     * @see ClassifierFacade#getStaticAttributes()
     */
    public Collection<AttributeFacade> getStaticAttributes()
    {
        return this.getSuperService().getStaticAttributes();
    }

    /**
     * Those operations that are scoped to the definition of this class.
     * @see ClassifierFacade#getStaticOperations()
     */
    public List<OperationFacade> getStaticOperations()
    {
        return this.getSuperService().getStaticOperations();
    }

    /**
     * This class' superclass, returns the generalization if it is a ClassifierFacade, null
     * otherwise.
     * @see ClassifierFacade#getSuperClass()
     */
    public ClassifierFacade getSuperClass()
    {
        return this.getSuperService().getSuperClass();
    }

    /**
     * The wrapper name for this classifier if a mapped type has a defined wrapper class (ie. 'long'
     * maps to 'Long').  If the classifier doesn't have a wrapper defined for it, this method will
     * return a null.  Note that wrapper mappings must be defined for the namespace by defining the
     * 'wrapperMappingsUri', this property must point to the location of the mappings file which
     * maps the primitives to wrapper types.
     * @see ClassifierFacade#getWrapperName()
     */
    public String getWrapperName()
    {
        return this.getSuperService().getWrapperName();
    }

    /**
     * Indicates if this classifier is 'abstract'.
     * @see ClassifierFacade#isAbstract()
     */
    public boolean isAbstract()
    {
        return this.getSuperService().isAbstract();
    }

    /**
     * True if this classifier represents an array type. False otherwise.
     * @see ClassifierFacade#isArrayType()
     */
    public boolean isArrayType()
    {
        return this.getSuperService().isArrayType();
    }

    /**
     * True if the ClassifierFacade is an AssociationClass.
     * @see ClassifierFacade#isAssociationClass()
     */
    public boolean isAssociationClass()
    {
        return this.getSuperService().isAssociationClass();
    }

    /**
     * Returns true if this type represents a Blob type.
     * @see ClassifierFacade#isBlobType()
     */
    public boolean isBlobType()
    {
        return this.getSuperService().isBlobType();
    }

    /**
     * Indicates if this type represents a boolean type or not.
     * @see ClassifierFacade#isBooleanType()
     */
    public boolean isBooleanType()
    {
        return this.getSuperService().isBooleanType();
    }

    /**
     * Indicates if this type represents a char, Character, or java.lang.Character type or not.
     * @see ClassifierFacade#isCharacterType()
     */
    public boolean isCharacterType()
    {
        return this.getSuperService().isCharacterType();
    }

    /**
     * Returns true if this type represents a Clob type.
     * @see ClassifierFacade#isClobType()
     */
    public boolean isClobType()
    {
        return this.getSuperService().isClobType();
    }

    /**
     * True if this classifier represents a collection type. False otherwise.
     * @see ClassifierFacade#isCollectionType()
     */
    public boolean isCollectionType()
    {
        return this.getSuperService().isCollectionType();
    }

    /**
     * True/false depending on whether or not this classifier represents a datatype. A data type is
     * a type whose instances are identified only by their value. A data type may contain attributes
     * to support the modeling of structured data types.
     * @see ClassifierFacade#isDataType()
     */
    public boolean isDataType()
    {
        return this.getSuperService().isDataType();
    }

    /**
     * True when this classifier is a date type.
     * @see ClassifierFacade#isDateType()
     */
    public boolean isDateType()
    {
        return this.getSuperService().isDateType();
    }

    /**
     * Indicates if this type represents a Double type or not.
     * @see ClassifierFacade#isDoubleType()
     */
    public boolean isDoubleType()
    {
        return this.getSuperService().isDoubleType();
    }

    /**
     * Indicates whether or not this classifier represents an "EmbeddedValue'.
     * @see ClassifierFacade#isEmbeddedValue()
     */
    public boolean isEmbeddedValue()
    {
        return this.getSuperService().isEmbeddedValue();
    }

    /**
     * True if this classifier is in fact marked as an enumeration.
     * @see ClassifierFacade#isEnumeration()
     */
    public boolean isEnumeration()
    {
        return this.getSuperService().isEnumeration();
    }

    /**
     * Returns true if this type represents a 'file' type.
     * @see ClassifierFacade#isFileType()
     */
    public boolean isFileType()
    {
        return this.getSuperService().isFileType();
    }

    /**
     * Indicates if this type represents a Float type or not.
     * @see ClassifierFacade#isFloatType()
     */
    public boolean isFloatType()
    {
        return this.getSuperService().isFloatType();
    }

    /**
     * Indicates if this type represents an int or Integer or java.lang.Integer type or not.
     * @see ClassifierFacade#isIntegerType()
     */
    public boolean isIntegerType()
    {
        return this.getSuperService().isIntegerType();
    }

    /**
     * True/false depending on whether or not this Classifier represents an interface.
     * @see ClassifierFacade#isInterface()
     */
    public boolean isInterface()
    {
        return this.getSuperService().isInterface();
    }

    /**
     * True if this classifier cannot be extended and represent a leaf in the inheritance tree.
     * @see ClassifierFacade#isLeaf()
     */
    public boolean isLeaf()
    {
        return this.getSuperService().isLeaf();
    }

    /**
     * True if this classifier represents a list type. False otherwise.
     * @see ClassifierFacade#isListType()
     */
    public boolean isListType()
    {
        return this.getSuperService().isListType();
    }

    /**
     * Indicates if this type represents a Long type or not.
     * @see ClassifierFacade#isLongType()
     */
    public boolean isLongType()
    {
        return this.getSuperService().isLongType();
    }

    /**
     * Indicates whether or not this classifier represents a Map type.
     * @see ClassifierFacade#isMapType()
     */
    public boolean isMapType()
    {
        return this.getSuperService().isMapType();
    }

    /**
     * Indicates whether or not this classifier represents a primitive type.
     * @see ClassifierFacade#isPrimitive()
     */
    public boolean isPrimitive()
    {
        return this.getSuperService().isPrimitive();
    }

    /**
     * True if this classifier represents a set type. False otherwise.
     * @see ClassifierFacade#isSetType()
     */
    public boolean isSetType()
    {
        return this.getSuperService().isSetType();
    }

    /**
     * Indicates whether or not this classifier represents a string type.
     * @see ClassifierFacade#isStringType()
     */
    public boolean isStringType()
    {
        return this.getSuperService().isStringType();
    }

    /**
     * Indicates whether or not this classifier represents a time type.
     * @see ClassifierFacade#isTimeType()
     */
    public boolean isTimeType()
    {
        return this.getSuperService().isTimeType();
    }

    /**
     * Returns true if this type is a wrapped primitive type.
     * @see ClassifierFacade#isWrappedPrimitive()
     */
    public boolean isWrappedPrimitive()
    {
        return this.getSuperService().isWrappedPrimitive();
    }

    /**
     * Finds the tagged value optional searching the entire inheritance hierarchy if 'follow' is set
     * to true.
     * @see GeneralizableElementFacade#findTaggedValue(String tagName, boolean follow)
     */
    public Object findTaggedValue(String tagName, boolean follow)
    {
        return this.getSuperService().findTaggedValue(tagName, follow);
    }

    /**
     * All generalizations for this generalizable element, goes up the inheritance tree.
     * @see GeneralizableElementFacade#getAllGeneralizations()
     */
    public Collection<GeneralizableElementFacade> getAllGeneralizations()
    {
        return this.getSuperService().getAllGeneralizations();
    }

    /**
     * All specializations (travels down the inheritance hierarchy).
     * @see GeneralizableElementFacade#getAllSpecializations()
     */
    public Collection<GeneralizableElementFacade> getAllSpecializations()
    {
        return this.getSuperService().getAllSpecializations();
    }

    /**
     * Gets the direct generalization for this generalizable element.
     * @see GeneralizableElementFacade#getGeneralization()
     */
    public GeneralizableElementFacade getGeneralization()
    {
        return this.getSuperService().getGeneralization();
    }

    /**
     * Gets the actual links that this generalization element is part of (it plays either the
     * specialization or generalization).
     * @see GeneralizableElementFacade#getGeneralizationLinks()
     */
    public Collection<GeneralizationFacade> getGeneralizationLinks()
    {
        return this.getSuperService().getGeneralizationLinks();
    }

    /**
     * A comma separated list of the fully qualified names of all generalizations.
     * @see GeneralizableElementFacade#getGeneralizationList()
     */
    public String getGeneralizationList()
    {
        return this.getSuperService().getGeneralizationList();
    }

    /**
     * The element found when you recursively follow the generalization path up to the root. If an
     * element has no generalization itself will be considered the root.
     * @see GeneralizableElementFacade#getGeneralizationRoot()
     */
    public GeneralizableElementFacade getGeneralizationRoot()
    {
        return this.getSuperService().getGeneralizationRoot();
    }

    /**
     * Return all generalizations (ancestors) from this generalizable element.
     * @see GeneralizableElementFacade#getGeneralizations()
     */
    public Collection<GeneralizableElementFacade> getGeneralizations()
    {
        return this.getSuperService().getGeneralizations();
    }

    /**
     * Gets the direct specializations (i.e. sub elements) for this generalizatble element.
     * @see GeneralizableElementFacade#getSpecializations()
     */
    public Collection<GeneralizableElementFacade> getSpecializations()
    {
        return this.getSuperService().getSpecializations();
    }

    /**
     * Copies all tagged values from the given ModelElementFacade to this model element facade.
     * @see ModelElementFacade#copyTaggedValues(ModelElementFacade element)
     */
    public void copyTaggedValues(ModelElementFacade element)
    {
        this.getSuperService().copyTaggedValues(element);
    }

    /**
     * Finds the tagged value with the specified 'tagName'. In case there are more values the first
     * one found will be returned.
     * @see ModelElementFacade#findTaggedValue(String tagName)
     */
    public Object findTaggedValue(String tagName)
    {
        return this.getSuperService().findTaggedValue(tagName);
    }

    /**
     * Returns all the values for the tagged value with the specified name. The returned collection
     * will contains only String instances, or will be empty. Never null.
     * @see ModelElementFacade#findTaggedValues(String tagName)
     */
    public Collection<Object> findTaggedValues(String tagName)
    {
        return this.getSuperService().findTaggedValues(tagName);
    }

    /**
     * Returns the fully qualified name of the model element. The fully qualified name includes
     * complete package qualified name of the underlying model element. The templates parameter will
     * be replaced by the correct one given the binding relation of the parameter to this element.
     * @see ModelElementFacade#getBindedFullyQualifiedName(ModelElementFacade bindedElement)
     */
    public String getBindedFullyQualifiedName(ModelElementFacade bindedElement)
    {
        return this.getSuperService().getBindedFullyQualifiedName(bindedElement);
    }

    /**
     * Gets all constraints belonging to the model element.
     * @see ModelElementFacade#getConstraints()
     */
    public Collection<ConstraintFacade> getConstraints()
    {
        return this.getSuperService().getConstraints();
    }

    /**
     * Returns the constraints of the argument kind that have been placed onto this model. Typical
     * kinds are "inv", "pre" and "post". Other kinds are possible.
     * @see ModelElementFacade#getConstraints(String kind)
     */
    public Collection<ConstraintFacade> getConstraints(String kind)
    {
        return this.getSuperService().getConstraints(kind);
    }

    /**
     * Gets the documentation for the model element, The indent argument is prefixed to each line.
     * By default this method wraps lines after 64 characters.
     * This method is equivalent to <code>getDocumentation(indent, 64)</code>.
     * @see ModelElementFacade#getDocumentation(String indent)
     */
    public String getDocumentation(String indent)
    {
        return this.getSuperService().getDocumentation(indent);
    }

    /**
     * This method returns the documentation for this model element, with the lines wrapped after
     * the specified number of characters, values of less than 1 will indicate no line wrapping is
     * required. By default paragraphs are returned as HTML.
     * This method is equivalent to <code>getDocumentation(indent, lineLength, true)</code>.
     * @see ModelElementFacade#getDocumentation(String indent, int lineLength)
     */
    public String getDocumentation(String indent, int lineLength)
    {
        return this.getSuperService().getDocumentation(indent, lineLength);
    }

    /**
     * This method returns the documentation for this model element, with the lines wrapped after
     * the specified number of characters, values of less than 1 will indicate no line wrapping is
     * required. HTML style determines if HTML Escaping is applied.
     * @see ModelElementFacade#getDocumentation(String indent, int lineLength, boolean htmlStyle)
     */
    public String getDocumentation(String indent, int lineLength, boolean htmlStyle)
    {
        return this.getSuperService().getDocumentation(indent, lineLength, htmlStyle);
    }

    /**
     * The fully qualified name of this model element.
     * @see ModelElementFacade#getFullyQualifiedName()
     */
    public String getFullyQualifiedName()
    {
        return this.getSuperService().getFullyQualifiedName();
    }

    /**
     * Returns the fully qualified name of the model element. The fully qualified name includes
     * complete package qualified name of the underlying model element.  If modelName is true, then
     * the original name of the model element (the name contained within the model) will be the name
     * returned, otherwise a name from a language mapping will be returned.
     * @see ModelElementFacade#getFullyQualifiedName(boolean modelName)
     */
    public String getFullyQualifiedName(boolean modelName)
    {
        return this.getSuperService().getFullyQualifiedName(modelName);
    }

    /**
     * Returns the fully qualified name as a path, the returned value always starts with out a slash
     * '/'.
     * @see ModelElementFacade#getFullyQualifiedNamePath()
     */
    public String getFullyQualifiedNamePath()
    {
        return this.getSuperService().getFullyQualifiedNamePath();
    }

    /**
     * Gets the unique identifier of the underlying model element.
     * @see ModelElementFacade#getId()
     */
    public String getId()
    {
        return this.getSuperService().getId();
    }

    /**
     * UML2: Retrieves the keywords for this element. Used to modify implementation properties which
     * are not represented by other properties, i.e. native, transient, volatile, synchronized,
     * (added annotations) override, deprecated. Can also be used to suppress compiler warnings:
     * (added annotations) unchecked, fallthrough, path, serial, finally, all. Annotations require
     * JDK5 compiler level.
     * @see ModelElementFacade#getKeywords()
     */
    public Collection<String> getKeywords()
    {
        return this.getSuperService().getKeywords();
    }

    /**
     * UML2: Retrieves a localized label for this named element.
     * @see ModelElementFacade#getLabel()
     */
    public String getLabel()
    {
        return this.getSuperService().getLabel();
    }

    /**
     * The language mappings that have been set for this model element.
     * @see ModelElementFacade#getLanguageMappings()
     */
    public TypeMappings getLanguageMappings()
    {
        return this.getSuperService().getLanguageMappings();
    }

    /**
     * Return the model containing this model element (multiple models may be loaded and processed
     * at the same time).
     * @see ModelElementFacade#getModel()
     */
    public ModelFacade getModel()
    {
        return this.getSuperService().getModel();
    }

    /**
     * The name of the model element.
     * @see ModelElementFacade#getName()
     */
    public String getName()
    {
        return this.getSuperService().getName();
    }

    /**
     * Gets the package to which this model element belongs.
     * @see ModelElementFacade#getPackage()
     */
    public ModelElementFacade getPackage()
    {
        return this.getSuperService().getPackage();
    }

    /**
     * The name of this model element's package.
     * @see ModelElementFacade#getPackageName()
     */
    public String getPackageName()
    {
        return this.getSuperService().getPackageName();
    }

    /**
     * Gets the package name (optionally providing the ability to retrieve the model name and not
     * the mapped name).
     * @see ModelElementFacade#getPackageName(boolean modelName)
     */
    public String getPackageName(boolean modelName)
    {
        return this.getSuperService().getPackageName(modelName);
    }

    /**
     * Returns the package as a path, the returned value always starts with out a slash '/'.
     * @see ModelElementFacade#getPackagePath()
     */
    public String getPackagePath()
    {
        return this.getSuperService().getPackagePath();
    }

    /**
     * UML2: Returns the value of the 'Qualified Name' attribute. A name which allows the
     * NamedElement to be identified within a hierarchy of nested Namespaces. It is constructed from
     * the names of the containing namespaces starting at the root of the hierarchy and ending with
     * the name of the NamedElement itself.
     * @see ModelElementFacade#getQualifiedName()
     */
    public String getQualifiedName()
    {
        return this.getSuperService().getQualifiedName();
    }

    /**
     * Gets the root package for the model element.
     * @see ModelElementFacade#getRootPackage()
     */
    public PackageFacade getRootPackage()
    {
        return this.getSuperService().getRootPackage();
    }

    /**
     * Gets the dependencies for which this model element is the source.
     * @see ModelElementFacade#getSourceDependencies()
     */
    public Collection<DependencyFacade> getSourceDependencies()
    {
        return this.getSuperService().getSourceDependencies();
    }

    /**
     * If this model element is the context of an activity graph, this represents that activity
     * graph.
     * @see ModelElementFacade#getStateMachineContext()
     */
    public StateMachineFacade getStateMachineContext()
    {
        return this.getSuperService().getStateMachineContext();
    }

    /**
     * The collection of ALL stereotype names for this model element.
     * @see ModelElementFacade#getStereotypeNames()
     */
    public Collection<String> getStereotypeNames()
    {
        return this.getSuperService().getStereotypeNames();
    }

    /**
     * Gets all stereotypes for this model element.
     * @see ModelElementFacade#getStereotypes()
     */
    public Collection<StereotypeFacade> getStereotypes()
    {
        return this.getSuperService().getStereotypes();
    }

    /**
     * Return the TaggedValues associated with this model element, under all stereotypes.
     * @see ModelElementFacade#getTaggedValues()
     */
    public Collection<TaggedValueFacade> getTaggedValues()
    {
        return this.getSuperService().getTaggedValues();
    }

    /**
     * Gets the dependencies for which this model element is the target.
     * @see ModelElementFacade#getTargetDependencies()
     */
    public Collection<DependencyFacade> getTargetDependencies()
    {
        return this.getSuperService().getTargetDependencies();
    }

    /**
     * Get the template parameter for this model element having the parameterName
     * @see ModelElementFacade#getTemplateParameter(String parameterName)
     */
    public Object getTemplateParameter(String parameterName)
    {
        return this.getSuperService().getTemplateParameter(parameterName);
    }

    /**
     * Get the template parameters for this model element
     * @see ModelElementFacade#getTemplateParameters()
     */
    public Collection<TemplateParameterFacade> getTemplateParameters()
    {
        return this.getSuperService().getTemplateParameters();
    }

    /**
     * The visibility (i.e. public, private, protected or package) of the model element, will
     * attempt a lookup for these values in the language mappings (if any).
     * @see ModelElementFacade#getVisibility()
     */
    public String getVisibility()
    {
        return this.getSuperService().getVisibility();
    }

    /**
     * Returns true if the model element has the exact stereotype (meaning no stereotype inheritance
     * is taken into account when searching for the stereotype), false otherwise.
     * @see ModelElementFacade#hasExactStereotype(String stereotypeName)
     */
    public boolean hasExactStereotype(String stereotypeName)
    {
        return this.getSuperService().hasExactStereotype(stereotypeName);
    }

    /**
     * Does the UML Element contain the named Keyword? Keywords can be separated by space, comma,
     * pipe, semicolon, or << >>
     * @see ModelElementFacade#hasKeyword(String keywordName)
     */
    public boolean hasKeyword(String keywordName)
    {
        return this.getSuperService().hasKeyword(keywordName);
    }

    /**
     * Returns true if the model element has the specified stereotype.  If the stereotype itself
     * does not match, then a search will be made up the stereotype inheritance hierarchy, and if
     * one of the stereotype's ancestors has a matching name this method will return true, false
     * otherwise.
     * For example, if we have a certain stereotype called <<exception>> and a model element has a
     * stereotype called <<applicationException>> which extends <<exception>>, when calling this
     * method with 'stereotypeName' defined as 'exception' the method would return true since
     * <<applicationException>> inherits from <<exception>>.  If you want to check if the model
     * element has the exact stereotype, then use the method 'hasExactStereotype' instead.
     * @see ModelElementFacade#hasStereotype(String stereotypeName)
     */
    public boolean hasStereotype(String stereotypeName)
    {
        return this.getSuperService().hasStereotype(stereotypeName);
    }

    /**
     * True if there are target dependencies from this element that are instances of BindingFacade.
     * Deprecated in UML2: Use TemplateBinding parameters instead of dependencies.
     * @see ModelElementFacade#isBindingDependenciesPresent()
     */
    public boolean isBindingDependenciesPresent()
    {
        return this.getSuperService().isBindingDependenciesPresent();
    }

    /**
     * Indicates if any constraints are present on this model element.
     * @see ModelElementFacade#isConstraintsPresent()
     */
    public boolean isConstraintsPresent()
    {
        return this.getSuperService().isConstraintsPresent();
    }

    /**
     * Indicates if any documentation is present on this model element.
     * @see ModelElementFacade#isDocumentationPresent()
     */
    public boolean isDocumentationPresent()
    {
        return this.getSuperService().isDocumentationPresent();
    }

    /**
     * True if this element name is a reserved word in Java, C#, ANSI or ISO C, C++, JavaScript.
     * @see ModelElementFacade#isReservedWord()
     */
    public boolean isReservedWord()
    {
        return this.getSuperService().isReservedWord();
    }

    /**
     * True is there are template parameters on this model element. For UML2, applies to Class,
     * Operation, Property, and Parameter.
     * @see ModelElementFacade#isTemplateParametersPresent()
     */
    public boolean isTemplateParametersPresent()
    {
        return this.getSuperService().isTemplateParametersPresent();
    }

    /**
     * True if this element name is a valid identifier name in Java, C#, ANSI or ISO C, C++,
     * JavaScript. Contains no spaces, special characters etc. Constraint always applied on
     * Enumerations and Interfaces, optionally applies on other model elements.
     * @see ModelElementFacade#isValidIdentifierName()
     */
    public boolean isValidIdentifierName()
    {
        return this.getSuperService().isValidIdentifierName();
    }

    /**
     * Searches for the constraint with the specified 'name' on this model element, and if found
     * translates it using the specified 'translation' from a translation library discovered by the
     * framework.
     * @see ModelElementFacade#translateConstraint(String name, String translation)
     */
    public String translateConstraint(String name, String translation)
    {
        return this.getSuperService().translateConstraint(name, translation);
    }

    /**
     * Translates all constraints belonging to this model element with the given 'translation'.
     * @see ModelElementFacade#translateConstraints(String translation)
     */
    public String[] translateConstraints(String translation)
    {
        return this.getSuperService().translateConstraints(translation);
    }

    /**
     * Translates the constraints of the specified 'kind' belonging to this model element.
     * @see ModelElementFacade#translateConstraints(String kind, String translation)
     */
    public String[] translateConstraints(String kind, String translation)
    {
        return this.getSuperService().translateConstraints(kind, translation);
    }

    /**
     * Returns a collection of all entities this service and its ancestors have a relation to.
     * @see Service#getAllEntityReferences()
     */
    public Collection<DependencyFacade> getAllEntityReferences()
    {
        return this.getSuperService().getAllEntityReferences();
    }

    /**
     * All messaging destinations that belong to this service and all decendent services.
     * @see Service#getAllMessagingDestinations()
     */
    public Collection<Destination> getAllMessagingDestinations()
    {
        return this.getSuperService().getAllMessagingDestinations();
    }

    /**
     * All roles associated with the service, this includes both roles that have access to the
     * entire service, and any roles that have access to a single operation.
     * @see Service#getAllRoles()
     */
    public Collection<Role> getAllRoles()
    {
        return this.getSuperService().getAllRoles();
    }

    /**
     * Returns a collection of all services this service and its ancestors have a relation to.
     * @see Service#getAllServiceReferences()
     */
    public Collection<DependencyFacade> getAllServiceReferences()
    {
        return this.getSuperService().getAllServiceReferences();
    }

    /**
     * References to all entities to which this service has a dependency.
     * @see Service#getEntityReferences()
     */
    public Collection<DependencyFacade> getEntityReferences()
    {
        return this.getSuperService().getEntityReferences();
    }

    /**
     * All messaging destinations available to this service.
     * @see Service#getMessagingDestinations()
     */
    public Collection<Destination> getMessagingDestinations()
    {
        return this.getSuperService().getMessagingDestinations();
    }

    /**
     * The roles of the service, these are the actor's that can access this service.
     * @see Service#getRoles()
     */
    public Collection<Role> getRoles()
    {
        return this.getSuperService().getRoles();
    }

    /**
     * References to all services to which this service has a dependency.
     * @see Service#getServiceReferences()
     */
    public Collection<DependencyFacade> getServiceReferences()
    {
        return this.getSuperService().getServiceReferences();
    }

    /**
     * @see MetafacadeBase#initialize()
     */
    @Override
    public void initialize()
    {
        this.getSuperService().initialize();
    }

    /**
     * @return Object getSuperService().getValidationOwner()
     * @see MetafacadeBase#getValidationOwner()
     */
    @Override
    public Object getValidationOwner()
    {
        Object owner = this.getSuperService().getValidationOwner();
        return owner;
    }

    /**
     * @return String getSuperService().getValidationName()
     * @see MetafacadeBase#getValidationName()
     */
    @Override
    public String getValidationName()
    {
        String name = this.getSuperService().getValidationName();
        return name;
    }

    /**
     * <p><b>Constraint:</b> org::andromda::cartridges::spring::metafacades::SpringService::only one init-method pro service</p>
     * <p><b>Error:</b> Only one operation of the Springervice may be an init-method operation.</p>
     * <p><b>OCL:</b> context SpringService inv: operations->select(initMethod=true)->size()<=1</p>
     * <p><b>Constraint:</b> org::andromda::cartridges::spring::metafacades::SpringService::only one destroy-method pro service</p>
     * <p><b>Error:</b> Only one operation of a SpringService may be destroy-method operation.</p>
     * <p><b>OCL:</b> context SpringService inv: operations->select(destroyMethod=true)->size()<=1</p>
     * @param validationMessages Collection<ModelValidationMessage>
     * @see MetafacadeBase#validateInvariants(Collection validationMessages)
     */
    @Override
    public void validateInvariants(Collection<ModelValidationMessage> validationMessages)
    {
        this.getSuperService().validateInvariants(validationMessages);
        try
        {
            final Object contextElement = this.THIS();
            boolean constraintValid = OCLResultEnsurer.ensure(OCLExpressions.lessOrEqual(OCLCollections.size(OCLCollections.select(OCLIntrospector.invoke(contextElement,"operations"),new Predicate(){public boolean evaluate(Object object){return Boolean.valueOf(String.valueOf(OCLExpressions.equal(OCLIntrospector.invoke(object,"initMethod"),true))).booleanValue();}})),1));
            if (!constraintValid)
            {
                validationMessages.add(
                    new ModelValidationMessage(
                        (MetafacadeBase)contextElement ,
                        "org::andromda::cartridges::spring::metafacades::SpringService::only one init-method pro service",
                        "Only one operation of the Springervice may be an init-method operation."));
            }
        }
        catch (Throwable th)
        {
            Throwable cause = th.getCause();
            int depth = 0; // Some throwables have infinite recursion
            while (cause != null && depth < 7)
            {
                th = cause;
                depth++;
            }
            logger.error("Error validating constraint 'org::andromda::cartridges::spring::metafacades::SpringService::only one init-method pro service' ON "
                + this.THIS().toString() + ": " + th.getMessage(), th);
        }
        try
        {
            final Object contextElement = this.THIS();
            boolean constraintValid = OCLResultEnsurer.ensure(OCLExpressions.lessOrEqual(OCLCollections.size(OCLCollections.select(OCLIntrospector.invoke(contextElement,"operations"),new Predicate(){public boolean evaluate(Object object){return Boolean.valueOf(String.valueOf(OCLExpressions.equal(OCLIntrospector.invoke(object,"destroyMethod"),true))).booleanValue();}})),1));
            if (!constraintValid)
            {
                validationMessages.add(
                    new ModelValidationMessage(
                        (MetafacadeBase)contextElement ,
                        "org::andromda::cartridges::spring::metafacades::SpringService::only one destroy-method pro service",
                        "Only one operation of a SpringService may be destroy-method operation."));
            }
        }
        catch (Throwable th)
        {
            Throwable cause = th.getCause();
            int depth = 0; // Some throwables have infinite recursion
            while (cause != null && depth < 7)
            {
                th = cause;
                depth++;
            }
            logger.error("Error validating constraint 'org::andromda::cartridges::spring::metafacades::SpringService::only one destroy-method pro service' ON "
                + this.THIS().toString() + ": " + th.getMessage(), th);
        }
    }

    /**
     * The property that stores the name of the metafacade.
     */
    private static final String NAME_PROPERTY = "name";
    private static final String FQNAME_PROPERTY = "fullyQualifiedName";

    /**
     * @see Object#toString()
     */
    @Override
    public String toString()
    {
        final StringBuilder toString = new StringBuilder(this.getClass().getName());
        toString.append("[");
        try
        {
            toString.append(Introspector.instance().getProperty(this, FQNAME_PROPERTY));
        }
        catch (final Throwable tryAgain)
        {
            try
            {
                toString.append(Introspector.instance().getProperty(this, NAME_PROPERTY));
            }
            catch (final Throwable ignore)
            {
                // - just ignore when the metafacade doesn't have a name or fullyQualifiedName property
            }
        }
        toString.append("]");
        return toString.toString();
    }
}