001    package org.andromda.cartridges.java.metafacades;
002    
003    import java.util.Collection;
004    import java.util.Iterator;
005    import org.andromda.metafacades.uml.ClassifierFacade;
006    import org.andromda.metafacades.uml.GeneralizableElementFacade;
007    import org.andromda.metafacades.uml.ModelElementFacade;
008    import org.andromda.metafacades.uml.ParameterFacade;
009    import org.andromda.metafacades.uml.TemplateParameterFacade;
010    import org.andromda.metafacades.uml.UMLMetafacadeProperties;
011    import org.apache.commons.lang.BooleanUtils;
012    import org.apache.commons.lang.ObjectUtils;
013    import org.apache.commons.lang.StringUtils;
014    
015    
016    /**
017     * MetafacadeLogic implementation for org.andromda.cartridges.java.metafacades.JavaClass.
018     *
019     * @see org.andromda.cartridges.java.metafacades.JavaClass
020     */
021    public class JavaClassLogicImpl
022        extends JavaClassLogic
023    {
024        private static final long serialVersionUID = 34L;
025        /**
026         * @param metaObject
027         * @param context
028         */
029        public JavaClassLogicImpl(
030            Object metaObject,
031            String context)
032        {
033            super(metaObject, context);
034        }
035    
036        /**
037         * If WebFault stereotype, change name from XXException to XXFault. Class should
038         * also have XXException stereotype so that the corresponding Exception referencing the
039         * fault is also created.
040         * @param fault true if name is to be converted to Fault version, for VO Template only
041         * @return the class name.
042         */
043        public String getName(boolean fault)
044        {
045            String name = super.getName();
046            if (fault && this.hasStereotype("WebFault"))
047            {
048                name = name.replace("Exception", "Fault");
049                if (!name.contains("Fault"))
050                {
051                    name += "Fault";
052                }
053            }
054            return name;
055        }
056    
057        /**
058         * UML22 implementation for TemplateParameter logic
059         * @return the class name.
060         */
061        public Object getType()
062        {
063            /*if (this.metaObject instanceof TemplateParameterFacade)
064            {
065                return
066            }
067            System.out.println(this.metaObject);*/
068            return this.metaObject;
069        }
070    
071        /**
072         * UML22 implementation for TemplateParameter logic
073         * @return the class name.
074        public Object getOwner()
075        {
076            if (this.metaObject instanceof ClassifierFacade)
077            {
078                ClassifierFacade facade = (ClassifierFacade)this.metaObject;
079                return facade.getOwner();
080            }
081            return this.metaObject;
082        }
083         */
084    
085        /**
086         * @return InterfaceImplementionName
087         * @see org.andromda.cartridges.java.metafacades.JavaClass#getInterfaceImplementationName()
088         */
089        @Override
090        protected String handleGetInterfaceImplementationName()
091        {
092            return this.getInterfaceImplementionName().replaceAll(
093                "\\{0\\}",
094                this.getName());
095        }
096    
097        /**
098         * Gets the value of the {@link JavaGlobals#INTERFACE_IMPLEMENTATION_NAME_PATTERN}.
099         *
100         * @return the interface implementation name..
101         */
102        private String getInterfaceImplementionName()
103        {
104            return String.valueOf(this.getConfiguredProperty(JavaGlobals.INTERFACE_IMPLEMENTATION_NAME_PATTERN));
105        }
106    
107        /**
108         * @return InterfaceImplementationName
109         * @see org.andromda.cartridges.java.metafacades.JavaClass#getFullyQualifiedInterfaceImplementationName()
110         */
111        @Override
112        protected String handleGetFullyQualifiedInterfaceImplementationName()
113        {
114            final StringBuilder fullName = new StringBuilder();
115            final String packageName = this.getPackageName();
116            if (StringUtils.isNotBlank(packageName))
117            {
118                fullName.append(packageName).append('.');
119            }
120            return fullName.append(this.getInterfaceImplementationName()).toString();
121        }
122    
123        /**
124         * @return abstractImplementation
125         * @see org.andromda.cartridges.java.metafacades.JavaClass#isAbstractInterfaceImplementation()
126         */
127        @Override
128        protected boolean handleIsAbstractInterfaceImplementation()
129        {
130            boolean abstractImplementation = !this.getOperations().isEmpty();
131            if (!abstractImplementation)
132            {
133                for (GeneralizableElementFacade generalizableElementFacade : this.getAllGeneralizations())
134                {
135                    final ClassifierFacade classifier = (ClassifierFacade) generalizableElementFacade;
136                    abstractImplementation = !classifier.getOperations().isEmpty();
137                    if (abstractImplementation)
138                    {
139                        break;
140                    }
141                }
142            }
143            return abstractImplementation;
144        }
145    
146        /**
147         * @return templateParams
148         * @see org.andromda.cartridges.java.metafacades.JavaClassLogic#getTemplateParameters()
149         */
150        //@Override
151        protected String handleGetTemplateParams()
152        {
153            String fullName = "";
154            if (this.isTemplateParametersPresent() &&
155                BooleanUtils.toBoolean(
156                    ObjectUtils.toString(this.getConfiguredProperty(UMLMetafacadeProperties.ENABLE_TEMPLATING))))
157            {
158                // we'll be constructing the parameter list in this buffer
159                final StringBuilder buffer = new StringBuilder();
160    
161                // add the name we've constructed so far
162                buffer.append(fullName);
163    
164                // start the parameter list
165                buffer.append('<');
166    
167                // loop over the parameters, we are so to have at least one (see
168                // outer condition)
169                final Collection<TemplateParameterFacade> templateParameters = this.getTemplateParameters();
170                for (Iterator<TemplateParameterFacade> parameterIterator = templateParameters.iterator(); parameterIterator.hasNext();)
171                {
172                    final ModelElementFacade modelElement =
173                        (parameterIterator.next()).getParameter();
174    
175                    // TODO: UML14 returns ParameterFacade, UML2 returns ModelElementFacade, so types are wrong from fullyQualifiedName
176                    // Mapping from UML2 should return ParameterFacade, with a getType method. Need TemplateParameter.getName method.
177                    if (modelElement instanceof ParameterFacade)
178                    {
179                        buffer.append(((ParameterFacade)modelElement).getType().getFullyQualifiedName());
180                    }
181                    else
182                    {
183                        buffer.append(modelElement.getFullyQualifiedName());
184                    }
185    
186                    if (parameterIterator.hasNext())
187                    {
188                        buffer.append(", ");
189                    }
190                }
191    
192                // we're finished listing the parameters
193                buffer.append('>');
194    
195                // we have constructed the full name in the buffer
196                fullName = buffer.toString();
197            }
198            return fullName;
199        }
200    }