001package org.andromda.cartridges.ejb3.metafacades;
002
003import java.text.MessageFormat;
004import org.andromda.cartridges.ejb3.EJB3Globals;
005import org.andromda.cartridges.ejb3.EJB3Profile;
006import org.andromda.cartridges.ejb3.EJB3ScriptHelper;
007import org.andromda.metafacades.uml.OperationFacade;
008import org.andromda.metafacades.uml.UMLProfile;
009import org.apache.commons.collections.CollectionUtils;
010import org.apache.commons.collections.Predicate;
011import org.apache.commons.lang.StringUtils;
012
013/**
014 * MetafacadeLogic implementation for org.andromda.cartridges.ejb3.metafacades.EJB3WebServiceFacade.
015 *
016 * @see EJB3WebServiceFacade
017 */
018public class EJB3WebServiceFacadeLogicImpl
019    extends EJB3WebServiceFacadeLogic
020{
021    private static final long serialVersionUID = 34L;
022    /**
023     * The property which stores the pattern defining the web service interface name.
024     */
025    private static final String WEB_SERVICE_INTERFACE_NAME_PATTERN = "webServiceInterfaceNamePattern";
026
027    /**
028     * The property defining the default style to give the web services.
029     */
030    private static final String PROPERTY_DEFAULT_STYLE = "webServiceDefaultStyle";
031
032    /**
033     * Represents a "document" style.
034     */
035    private static final String STYLE_DOCUMENT = "document";
036
037    /**
038     * Represents a "rpc" style.
039     */
040    private static final String STYLE_RPC = "rpc";
041
042    /**
043     * The property defining the default style to give the web services.
044     */
045    private static final String PROPERTY_DEFAULT_USE = "webServiceDefaultUse";
046
047    /**
048     * Represents a "literal" use.
049     */
050    private static final String USE_LITERAL = "literal";
051
052    /**
053     * Represents an "encoded" use.
054     */
055    private static final String USE_ENCODED = "encoded";
056
057    /**
058     * Represents the default parameter encoding style
059     */
060    private static final String PROPERTY_DEFAULT_PARAMETER_STYLE = "webServiceDefaultParameterStyle";
061
062    /**
063     * Represents a "wrapped" parameter style.
064     */
065    private static final String PARAMETER_STYLE_WRAPPED = "wrapped";
066
067    /**
068     * Represents a "bare" parameter style.
069     */
070    private static final String PARAMETER_STYLE_BARE = "bare";
071
072    /**
073     * Represents the qualified name local part pattern
074     */
075    private static final String QNAME_LOCAL_PART_PATTERN = "webServiceQualifiedNameLocalPartPattern";
076
077    /**
078     * Determine if the namespace should be reversed
079     */
080    private static final String REVERSE_NAMESPACE = "webServiceReverseNamespace";
081
082    /**
083     * Retrieve the namespace pattern used to generate the namespace
084     */
085    private static final String NAMESPACE_PATTERN = "webServiceNamespacePattern";
086
087    /**
088     *
089     * @param metaObject
090     * @param context
091     */
092    public EJB3WebServiceFacadeLogicImpl(final Object metaObject, final String context)
093    {
094        super (metaObject, context);
095    }
096
097    /**
098     * @see EJB3WebServiceFacade#getFullyQualifiedWebServiceInterfaceName()
099     */
100    @Override
101    protected String handleGetFullyQualifiedWebServiceInterfaceName()
102    {
103        return EJB3MetafacadeUtils.getFullyQualifiedName(
104                this.getPackageName(),
105                this.getWebServiceInterfaceName(),
106                null);
107    }
108
109    /**
110     * @see EJB3WebServiceFacade#getWebServiceInterfaceName()
111     */
112    @Override
113    protected String handleGetWebServiceInterfaceName()
114    {
115        String webServiceInterfaceNamePattern =
116            String.valueOf(this.getConfiguredProperty(WEB_SERVICE_INTERFACE_NAME_PATTERN));
117
118        return MessageFormat.format(
119                webServiceInterfaceNamePattern,
120                StringUtils.trimToEmpty(this.getName()));
121    }
122
123    /**
124     * @see EJB3WebServiceFacade#getStyle()
125     */
126    @Override
127    protected String handleGetStyle()
128    {
129        String style = (String)this.findTaggedValue(UMLProfile.TAGGEDVALUE_WEBSERVICE_STYLE);
130        if (StringUtils.isBlank(style))
131        {
132            style = String.valueOf(this.getConfiguredProperty(PROPERTY_DEFAULT_STYLE));
133        }
134        return style;
135    }
136
137    /**
138     * @see EJB3WebServiceFacade#getUse()
139     */
140    @Override
141    protected String handleGetUse()
142    {
143        String use = (String)this.findTaggedValue(UMLProfile.TAGGEDVALUE_WEBSERVICE_USE);
144        if (StringUtils.isBlank(use))
145        {
146            use = String.valueOf(this.getConfiguredProperty(PROPERTY_DEFAULT_USE));
147        }
148        return use;
149    }
150
151    /**
152     * @see EJB3WebServiceFacade#isRpcStyle()
153     */
154    @Override
155    protected boolean handleIsRpcStyle()
156    {
157        return STYLE_RPC.equalsIgnoreCase(this.getStyle());
158    }
159
160    /**
161     * @see EJB3WebServiceFacade#isDocumentStyle()
162     */
163    @Override
164    protected boolean handleIsDocumentStyle()
165    {
166        return STYLE_DOCUMENT.equalsIgnoreCase(this.getStyle());
167    }
168
169    /**
170     * @see EJB3WebServiceFacade#isEncodedUse()
171     */
172    @Override
173    protected boolean handleIsEncodedUse()
174    {
175        return USE_ENCODED.equalsIgnoreCase(this.getStyle());
176    }
177
178    /**
179     * @see EJB3WebServiceFacade#isLiteralUse()
180     */
181    @Override
182    protected boolean handleIsLiteralUse()
183    {
184        return USE_LITERAL.equalsIgnoreCase(this.getStyle());
185    }
186
187    /**
188     * @see EJB3WebServiceFacadeLogic#handleIsWebServiceOperationsExist()
189     */
190    @Override
191    protected boolean handleIsWebServiceOperationsExist()
192    {
193        return CollectionUtils.find(
194            this.getOperations(),
195            new Predicate()
196            {
197                public boolean evaluate(final Object object)
198                {
199                    boolean isWebService = false;
200                    final OperationFacade operation = (OperationFacade)object;
201                    if (operation.hasStereotype(UMLProfile.STEREOTYPE_WEBSERVICE_OPERATION))
202                    {
203                        isWebService = true;
204                    }
205                    return isWebService;
206                }
207            }) != null;
208    }
209
210    /**
211     * @see EJB3WebServiceFacadeLogic#handleGetParameterStyle()
212     */
213    @Override
214    protected String handleGetParameterStyle()
215    {
216        String parameterStyle = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_WEBSERVICE_PARAMETER_STYLE);
217        if (StringUtils.isBlank(parameterStyle))
218        {
219            parameterStyle = String.valueOf(this.getConfiguredProperty(PROPERTY_DEFAULT_PARAMETER_STYLE));
220        }
221        return parameterStyle;
222    }
223
224    /**
225     * @see EJB3WebServiceFacadeLogic#handleIsWrappedParameterStyle()
226     */
227    @Override
228    protected boolean handleIsWrappedParameterStyle()
229    {
230        return PARAMETER_STYLE_WRAPPED.equalsIgnoreCase(this.getParameterStyle());
231    }
232
233    /**
234     * @see EJB3WebServiceFacadeLogic#handleIsBareParameterStyle()
235     */
236    @Override
237    protected boolean handleIsBareParameterStyle()
238    {
239        return PARAMETER_STYLE_BARE.equalsIgnoreCase(this.getParameterStyle());
240    }
241
242    /**
243     * @see EJB3WebServiceFacadeLogic#handleGetQName()
244     */
245    @Override
246    protected String handleGetQName()
247    {
248        String qnameLocalPartPattern = String.valueOf(this.getConfiguredProperty(QNAME_LOCAL_PART_PATTERN));
249        return MessageFormat.format(
250                qnameLocalPartPattern,
251                StringUtils.trimToEmpty(this.getName()));
252    }
253
254    /**
255     * @see EJB3WebServiceFacadeLogic#handleGetNamespace()
256     */
257    @Override
258    protected String handleGetNamespace()
259    {
260        String packageName = this.getPackageName();
261        if (this.isReverseNamespace())
262        {
263            packageName = EJB3ScriptHelper.reversePackage(packageName);
264        }
265        String namespacePattern = String.valueOf(this.getConfiguredProperty(NAMESPACE_PATTERN));
266        return MessageFormat.format(
267            namespacePattern,
268                StringUtils.trimToEmpty(
269                    StringUtils.substringBeforeLast(packageName, String.valueOf(EJB3Globals.NAMESPACE_DELIMITER))),
270                StringUtils.trimToEmpty(
271                    StringUtils.substringAfterLast(packageName, String.valueOf(EJB3Globals.NAMESPACE_DELIMITER))));
272    }
273
274    /**
275     * Gets whether or not <code>reverseNamespace</code> is true/false for this type.
276     *
277     * @return boolean true/false
278     */
279    protected boolean isReverseNamespace()
280    {
281        return Boolean.valueOf(String.valueOf(this.getConfiguredProperty(REVERSE_NAMESPACE))).booleanValue();
282    }
283}