001package org.andromda.cartridges.ejb3.metafacades;
002
003import java.text.MessageFormat;
004import java.util.ArrayList;
005import java.util.Collection;
006import java.util.Iterator;
007import java.util.LinkedHashSet;
008import java.util.List;
009import org.andromda.cartridges.ejb3.EJB3Globals;
010import org.andromda.cartridges.ejb3.EJB3Profile;
011import org.andromda.metafacades.uml.DependencyFacade;
012import org.andromda.metafacades.uml.ModelElementFacade;
013import org.andromda.metafacades.uml.OperationFacade;
014import org.andromda.metafacades.uml.ParameterFacade;
015import org.andromda.metafacades.uml.Role;
016import org.apache.commons.collections.Closure;
017import org.apache.commons.collections.CollectionUtils;
018import org.apache.commons.collections.Predicate;
019import org.apache.commons.collections.Transformer;
020import org.apache.commons.lang.BooleanUtils;
021import org.apache.commons.lang.StringUtils;
022
023/**
024 * MetafacadeLogic implementation for org.andromda.cartridges.ejb3.metafacades.EJB3SessionOperationFacade.
025 *
026 * @see EJB3SessionOperationFacade
027 */
028public class EJB3SessionOperationFacadeLogicImpl
029    extends EJB3SessionOperationFacadeLogic
030{
031    private static final long serialVersionUID = 34L;
032    /**
033     * The property which stores the pattern used to generate the service operation test name
034     */
035    private static final String SERVICE_OPERATION_TEST_NAME_PATTERN = "serviceOperationTestNamePattern";
036
037    /**
038     * @param metaObject
039     * @param context
040     */
041    public EJB3SessionOperationFacadeLogicImpl(final Object metaObject, final String context)
042    {
043        super (metaObject, context);
044    }
045
046    /**
047     * @see EJB3SessionOperationFacade#getViewType()
048     */
049    @Override
050    protected String handleGetViewType()
051    {
052        String viewType = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_EJB_VIEWTYPE);
053        if (StringUtils.isBlank(viewType))
054        {
055            EJB3SessionFacade sessionFacade = (EJB3SessionFacade)this.getOwner();
056            if (StringUtils.isNotBlank(sessionFacade.getViewType()))
057            {
058                viewType = sessionFacade.getViewType();
059            }
060            else
061            {
062                viewType = EJB3Globals.VIEW_TYPE_BOTH;
063            }
064        }
065        return viewType;
066    }
067
068    /**
069     * @see EJB3SessionOperationFacadeLogic#handleIsViewTypeRemote()
070     */
071    @Override
072    protected boolean handleIsViewTypeRemote()
073    {
074        boolean isRemote = false;
075        if (this.getViewType().equalsIgnoreCase(EJB3Globals.VIEW_TYPE_REMOTE))
076        {
077            isRemote = true;
078        }
079        return isRemote;
080    }
081
082    /**
083     * @see EJB3SessionOperationFacadeLogic#handleIsViewTypeLocal()
084     */
085    @Override
086    protected boolean handleIsViewTypeLocal()
087    {
088        boolean isLocal = false;
089        if (this.getViewType().equalsIgnoreCase(EJB3Globals.VIEW_TYPE_LOCAL))
090        {
091            isLocal = true;
092        }
093        return isLocal;
094    }
095
096    /**
097     * @see EJB3SessionOperationFacadeLogic#handleIsViewTypeBoth()
098     */
099    @Override
100    protected boolean handleIsViewTypeBoth()
101    {
102        boolean isBoth = false;
103        if (this.getViewType().equalsIgnoreCase(EJB3Globals.VIEW_TYPE_BOTH))
104        {
105            isBoth = true;
106        }
107        return isBoth;
108    }
109
110    /**
111     * @see EJB3SessionOperationFacadeLogic#handleIsViewTypeStrictlyLocal()
112     */
113    @Override
114    protected boolean handleIsViewTypeStrictlyLocal()
115    {
116        boolean isViewTypeStrictlyLocal = false;
117        String viewType = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_EJB_VIEWTYPE);
118        if (StringUtils.equalsIgnoreCase(viewType, EJB3Globals.VIEW_TYPE_LOCAL) || this.isViewTypeStrictlyBoth())
119        {
120            isViewTypeStrictlyLocal = true;
121        }
122        return isViewTypeStrictlyLocal;
123    }
124
125    /**
126     * @see EJB3SessionOperationFacadeLogic#handleIsViewTypeStrictlyRemote()
127     */
128    @Override
129    protected boolean handleIsViewTypeStrictlyRemote()
130    {
131        boolean isViewTypeStrictlyRemote = false;
132        String viewType = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_EJB_VIEWTYPE);
133        if (StringUtils.equalsIgnoreCase(viewType, EJB3Globals.VIEW_TYPE_REMOTE) || this.isViewTypeStrictlyBoth())
134        {
135            isViewTypeStrictlyRemote = true;
136        }
137        return isViewTypeStrictlyRemote;
138    }
139
140    /**
141     * @see EJB3SessionOperationFacadeLogic#handleIsViewTypeStrictlyBoth()
142     */
143    @Override
144    protected boolean handleIsViewTypeStrictlyBoth()
145    {
146        boolean isViewTypeStrictlyBoth = false;
147        String viewType = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_EJB_VIEWTYPE);
148        if (StringUtils.equalsIgnoreCase(viewType, EJB3Globals.VIEW_TYPE_BOTH))
149        {
150            isViewTypeStrictlyBoth = true;
151        }
152        return isViewTypeStrictlyBoth;
153    }
154
155    /**
156     * @see EJB3SessionOperationFacadeLogic#handleIsViewTypeAbsoluteLocal()
157     */
158    @Override
159    protected boolean handleIsViewTypeAbsoluteLocal()
160    {
161        boolean isViewTypeAsbolutelyLocal = false;
162        EJB3SessionFacade session = (EJB3SessionFacade)this.getOwner();
163        if (!this.isLifecycleCallback() &&
164            StringUtils.equalsIgnoreCase(this.getVisibility(), "public") &&
165            ((session.isViewTypeBoth() &&
166                ((session.isViewTypeStrictlyRemote() && this.isViewTypeStrictlyLocal()) ||
167                ((session.isViewTypeStrictlyLocal() || session.isViewTypeStrictlyBoth()) &&
168                        !this.isViewTypeStrictlyRemote()))) ||
169            (session.isViewTypeStrictlyLocal() && !this.isViewTypeStrictlyRemote()) ||
170            this.isViewTypeStrictlyBoth()))
171        {
172            isViewTypeAsbolutelyLocal = true;
173        }
174        return isViewTypeAsbolutelyLocal;
175    }
176
177    /**
178     * @see EJB3SessionOperationFacadeLogic#handleIsViewTypeAbsoluteRemote()
179     */
180    @Override
181    protected boolean handleIsViewTypeAbsoluteRemote()
182    {
183        boolean isViewTypeAsbolutelyRemote = false;
184        EJB3SessionFacade session = (EJB3SessionFacade)this.getOwner();
185        if (!this.isLifecycleCallback() &&
186            StringUtils.equalsIgnoreCase(this.getVisibility(), "public") &&
187            ((session.isViewTypeBoth() &&
188                ((session.isViewTypeStrictlyLocal() && this.isViewTypeStrictlyRemote()) ||
189                ((session.isViewTypeStrictlyRemote() || session.isViewTypeStrictlyBoth()) &&
190                        !this.isViewTypeStrictlyLocal()))) ||
191            (session.isViewTypeStrictlyRemote() && !this.isViewTypeStrictlyLocal()) ||
192            this.isViewTypeStrictlyBoth()))
193        {
194            isViewTypeAsbolutelyRemote = true;
195        }
196        return isViewTypeAsbolutelyRemote;
197    }
198
199    /**
200     * @see EJB3SessionOperationFacadeLogic#handleIsViewTypeAbsoluteBoth()
201     */
202    @Override
203    protected boolean handleIsViewTypeAbsoluteBoth()
204    {
205        boolean isViewTypeAbsolutelyBoth = false;
206        if (this.isViewTypeAbsoluteLocal() && this.isViewTypeAbsoluteRemote())
207        {
208            isViewTypeAbsolutelyBoth = true;
209        }
210        return isViewTypeAbsolutelyBoth;
211    }
212
213    /**
214     * @see EJB3SessionOperationFacadeLogic#getSignature()
215     *
216     * Override the default implementation to check for timer service and
217     * replace all attributes with javax.ejb.Timer attribute.
218     */
219    public String getSignature()
220    {
221        String signature = super.getSignature();
222        if (this.isTimeoutCallback())
223        {
224            final StringBuilder timeoutSignature = new StringBuilder(this.getName());
225            timeoutSignature.append("(");
226            timeoutSignature.append("javax.ejb.Timer timer");
227            timeoutSignature.append(")");
228            signature = timeoutSignature.toString();
229        }
230        return signature;
231    }
232
233    /**
234     * @see EJB3SessionOperationFacadeLogic#handleGetTestSignature()
235     */
236    @Override
237    protected String handleGetTestSignature()
238    {
239        return this.getTestName() + "()";
240    }
241
242    /**
243     * @see EJB3SessionOperationFacadeLogic#handleGetTestName()
244     */
245    @Override
246    protected String handleGetTestName()
247    {
248        String serviceOperationTestNamePattern =
249            (String)this.getConfiguredProperty(SERVICE_OPERATION_TEST_NAME_PATTERN);
250
251        String name = this.getName();
252        // Determine if any overloaded operations exist - test name must be unique even if operation name is not
253        List<OperationFacade> operations = this.getOwner().getOperations();
254        for (OperationFacade operation : operations)
255        {
256            if (operation.getName().equals(name) &&
257                !operation.getArgumentNames().equals(this.getArgumentNames()))
258            {
259                // Two methods with the same name different arguments exist, use argument names to distinguish
260                for (ParameterFacade argument : this.getArguments())
261                {
262                    name += StringUtils.capitalize(argument.getName());
263                }
264            }
265        }
266
267        // default = testOperationname[Parameternames]
268        return MessageFormat.format(
269                serviceOperationTestNamePattern,
270                StringUtils.trimToEmpty(StringUtils.capitalize(name)));
271    }
272
273    /**
274     * @see EJB3SessionOperationFacadeLogic#getCall()
275     *
276     * Override the default implementation to check for timer service and
277     * add the javax.ejb.Timer attribute to the call.
278     */
279    public String getCall()
280    {
281        String call = super.getCall();
282        if (this.isTimeoutCallback())
283        {
284            final StringBuilder buffer = new StringBuilder(this.getName());
285            buffer.append("(");
286            buffer.append("timer");
287            buffer.append(")");
288            call =  buffer.toString();
289        }
290        return call;
291    }
292
293    /**
294     * @see EJB3SessionOperationFacadeLogic#handleGetTransactionType()
295     *
296     * If no method level transaction type specified, take it from the class level if it exists there.
297     */
298    @Override
299    protected String handleGetTransactionType()
300    {
301        String transType = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_EJB_TRANSACTION_TYPE);
302        if (StringUtils.isNotBlank(transType))
303        {
304            transType = EJB3MetafacadeUtils.convertTransactionType(transType);
305        }
306        else
307        {
308            EJB3SessionFacade session = (EJB3SessionFacade)this.getOwner();
309            transType = session.getTransactionType();
310        }
311        return transType;
312    }
313
314    /**
315     * @see EJB3SessionOperationFacadeLogic#handleIsBusinessOperation()
316     */
317    @Override
318    protected boolean handleIsBusinessOperation()
319    {
320        return !this.hasStereotype(EJB3Profile.STEREOTYPE_CREATE_METHOD);
321    }
322
323    /**
324     * @see EJB3SessionOperationFacadeLogic#handleGetRolesAllowed()
325     */
326    @Override
327    protected String handleGetRolesAllowed()
328    {
329        StringBuilder rolesAllowed = null;
330        String separator = "";
331
332        for (final Iterator iter = this.getNonRunAsRoles().iterator(); iter.hasNext(); )
333        {
334            if (rolesAllowed == null)
335            {
336                rolesAllowed = new StringBuilder();
337            }
338            rolesAllowed.append(separator);
339            Role role = (Role)iter.next();
340            rolesAllowed.append('"');
341            rolesAllowed.append(role.getName());
342            rolesAllowed.append('"');
343            separator = ", ";
344        }
345        return rolesAllowed != null ? rolesAllowed.toString() : null;
346    }
347
348    /**
349     * @see EJB3SessionOperationFacadeLogic#handleIsPermitAll()
350     */
351    @Override
352    protected boolean handleIsPermitAll()
353    {
354        boolean permitAll = false;
355        String permitAllStr = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_EJB_SECURITY_PERMIT_ALL);
356        if (StringUtils.isNotBlank(permitAllStr))
357        {
358            permitAll = BooleanUtils.toBoolean(permitAllStr);
359        }
360        return permitAll;
361    }
362
363    /**
364     * @see EJB3SessionOperationFacadeLogic#handleIsDenyAll()
365     */
366    @Override
367    protected boolean handleIsDenyAll()
368    {
369        boolean denyAll = false;
370        String denyAllStr = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_EJB_SECURITY_DENY_ALL);
371        if (StringUtils.isNotBlank(denyAllStr))
372        {
373            denyAll = BooleanUtils.toBoolean(denyAllStr);
374        }
375        return denyAll;
376    }
377
378    /**
379     * @see EJB3SessionOperationFacadeLogic#handleGetFlushMode()
380     */
381    @Override
382    protected String handleGetFlushMode()
383    {
384        return (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_EJB_PERSISTENCE_FLUSH_MODE);
385    }
386
387    /**
388     * @see EJB3SessionOperationFacadeLogic#handleGetThrowsClause()
389     */
390    @Override
391    protected String handleGetThrowsClause()
392    {
393        StringBuilder throwsClause = null;
394        if (this.isExceptionsPresent())
395        {
396            throwsClause = new StringBuilder(this.getExceptionList());
397        }
398        if (throwsClause != null)
399        {
400            throwsClause.insert(0, "throws ");
401        }
402        return throwsClause != null ? throwsClause.toString() : null;
403    }
404
405    /**
406     * @see EJB3SessionOperationFacadeLogic#handleGetThrowsClause(String)
407     */
408    @Override
409    protected String handleGetThrowsClause(String initialExceptions)
410    {
411        final StringBuilder throwsClause = new StringBuilder(initialExceptions);
412        if (this.getThrowsClause() != null)
413        {
414            throwsClause.insert(0, ", ");
415            throwsClause.insert(0, this.getThrowsClause());
416        }
417        else
418        {
419            throwsClause.insert(0, "throws ");
420        }
421        return throwsClause.toString();
422    }
423
424    /**
425     * @see EJB3SessionOperationFacadeLogic#handleGetNonRunAsRoles()
426     */
427    protected Collection<Role> handleGetNonRunAsRoles()
428    {
429        final Collection<Role> roles = new LinkedHashSet<Role>();
430        if (this.getOwner() instanceof EJB3SessionFacade)
431        {
432            roles.addAll(((EJB3SessionFacade)this.getOwner()).getNonRunAsRoles());
433        }
434        Collection operationRoles = this.getTargetDependencies();
435        CollectionUtils.filter(
436            operationRoles,
437            new Predicate()
438            {
439                public boolean evaluate(Object object)
440                {
441                    DependencyFacade dependency = (DependencyFacade)object;
442                    return dependency != null
443                        && dependency.getSourceElement() != null
444                        && Role.class.isAssignableFrom(dependency.getSourceElement().getClass())
445                        && !dependency.hasStereotype(EJB3Profile.STEREOTYPE_SECURITY_RUNAS);
446                }
447            });
448        CollectionUtils.transform(
449            operationRoles,
450            new Transformer()
451            {
452                public Object transform(Object object)
453                {
454                    return ((DependencyFacade)object).getSourceElement();
455                }
456            });
457        roles.addAll(operationRoles);
458        final Collection allRoles = new LinkedHashSet(roles);
459
460        // add all roles which are specializations of this one
461        CollectionUtils.forAllDo(
462            roles,
463            new Closure()
464            {
465                public void execute(Object object)
466                {
467                    if (object instanceof Role)
468                    {
469                        allRoles.addAll(((Role)object).getAllSpecializations());
470                    }
471                }
472            });
473        return allRoles;
474    }
475
476    /**
477     * @see EJB3SessionOperationFacadeLogic#handleIsTimeoutCallback()
478     */
479    @Override
480    protected boolean handleIsTimeoutCallback()
481    {
482        return this.hasStereotype(EJB3Profile.STEREOTYPE_SERVICE_TIMER_TIMEOUT);
483    }
484
485    /**
486     * @see EJB3SessionOperationFacadeLogic#handleGetImplementationName()
487     */
488    @Override
489    protected String handleGetImplementationName()
490    {
491        return this.getImplementationOperationName(StringUtils.capitalize(this.getName()));
492    }
493
494    /**
495     * @see EJB3SessionOperationFacadeLogic#handleGetImplementationCall()
496     */
497    @Override
498    protected String handleGetImplementationCall()
499    {
500        return this.getImplementationOperationName(StringUtils.capitalize(this.getCall()));
501    }
502
503    /**
504     * @see EJB3SessionOperationFacadeLogic#handleGetImplementationSignature()
505     */
506    @Override
507    protected String handleGetImplementationSignature()
508    {
509        return ("public".equalsIgnoreCase(this.getVisibility()) ?
510                this.getImplementationOperationName(StringUtils.capitalize(this.getSignature())) :
511                    this.getSignature());
512    }
513
514    /**
515     * Retrieves the implementationOperatName by replacing the <code>replacement</code> in the {@link
516     * EJB3Globals#IMPLEMENTATION_OPERATION_NAME_PATTERN}
517     *
518     * @param replacement the replacement string for the pattern.
519     * @return the operation name
520     */
521    private String getImplementationOperationName(String replacement)
522    {
523        String implementationNamePattern =
524            (String)this.getConfiguredProperty(EJB3Globals.IMPLEMENTATION_OPERATION_NAME_PATTERN);
525
526        return MessageFormat.format(
527                implementationNamePattern,
528                StringUtils.trimToEmpty(replacement));
529    }
530
531    /**
532     * @see EJB3SessionOperationFacadeLogic#handleGetInterceptorReferences()
533     */
534    protected Collection handleGetInterceptorReferences()
535    {
536        Collection references = this.getSourceDependencies();
537        CollectionUtils.filter(
538            references,
539            new Predicate()
540            {
541                public boolean evaluate(Object object)
542                {
543                    DependencyFacade dependency = (DependencyFacade)object;
544                    ModelElementFacade targetElement = dependency.getTargetElement();
545                    return (targetElement != null && targetElement.hasStereotype(EJB3Profile.STEREOTYPE_INTERCEPTOR));
546                }
547            });
548        CollectionUtils.transform(
549            references,
550            new Transformer()
551            {
552                public Object transform(final Object object)
553                {
554                    return ((DependencyFacade)object).getTargetElement();
555                }
556            });
557        final Collection interceptors = new LinkedHashSet(references);
558        CollectionUtils.forAllDo(
559                references,
560                new Closure()
561                {
562                    public void execute(Object object)
563                    {
564                        if (object instanceof EJB3InterceptorFacade)
565                        {
566                            interceptors.addAll(((EJB3InterceptorFacade)object).getInterceptorReferences());
567                        }
568                    }
569                });
570        return interceptors;
571    }
572
573    /**
574     * @see EJB3SessionOperationFacadeLogic#handleIsExcludeDefaultInterceptors()
575     */
576    @Override
577    protected boolean handleIsExcludeDefaultInterceptors()
578    {
579        boolean excludeDefault = false;
580        String excludeDefaultStr =
581            (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_SERVICE_INTERCEPTOR_EXCLUDE_DEFAULT);
582        if (excludeDefaultStr != null)
583        {
584            excludeDefault = BooleanUtils.toBoolean(excludeDefaultStr);
585        }
586        return excludeDefault;
587    }
588
589    /**
590     * @see EJB3SessionOperationFacadeLogic#handleIsExcludeClassInterceptors()
591     */
592    @Override
593    protected boolean handleIsExcludeClassInterceptors()
594    {
595        boolean excludeClass = false;
596        String excludeClassStr =
597            (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_SERVICE_INTERCEPTOR_EXCLUDE_CLASS);
598        if (excludeClassStr != null)
599        {
600            excludeClass = BooleanUtils.toBoolean(excludeClassStr);
601        }
602        return excludeClass;
603    }
604
605    /**
606     * @see EJB3SessionOperationFacadeLogic#handleIsPostConstruct()
607     */
608    @Override
609    protected boolean handleIsPostConstruct()
610    {
611        return this.hasStereotype(EJB3Profile.STEREOTYPE_POST_CONSTRUCT);
612    }
613
614    /**
615     * @see EJB3SessionOperationFacadeLogic#handleIsPreDestroy()
616     */
617    @Override
618    protected boolean handleIsPreDestroy()
619    {
620        return this.hasStereotype(EJB3Profile.STEREOTYPE_PRE_DESTROY);
621    }
622
623    /**
624     * @see EJB3SessionOperationFacadeLogic#handleIsPostActivate()
625     */
626    @Override
627    protected boolean handleIsPostActivate()
628    {
629        return this.hasStereotype(EJB3Profile.STEREOTYPE_POST_ACTIVATE);
630    }
631
632    /**
633     * @see EJB3SessionOperationFacadeLogic#handleIsPrePassivate()
634     */
635    @Override
636    protected boolean handleIsPrePassivate()
637    {
638        return this.hasStereotype(EJB3Profile.STEREOTYPE_PRE_PASSIVATE);
639    }
640
641    /**
642     * @see EJB3SessionOperationFacadeLogic#handleIsLifecycleCallback()
643     */
644    @Override
645    protected boolean handleIsLifecycleCallback()
646    {
647        return this.isPostConstruct() || this.isPreDestroy() || this.isPostActivate() || this.isPrePassivate();
648    }
649
650    /**
651     * @see EJB3SessionOperationFacadeLogic#handleIsSeamValidationValidator()
652     */
653    @Override
654    protected boolean handleIsSeamValidationValidator()
655    {
656        boolean isSeamValidorMethod = false;
657        if (this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_VALIDATION_VALIDATOR))
658        {
659            isSeamValidorMethod = true;
660        }
661        return isSeamValidorMethod;
662    }
663
664    /**
665     * @see EJB3SessionOperationFacadeLogic#handleGetSeamValidationOutcome()
666     */
667    @Override
668    protected String handleGetSeamValidationOutcome()
669    {
670        String validationOutcome = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_SEAM_VALIDATION_OUTCOME);
671        if (StringUtils.isNotBlank(validationOutcome) &&
672                !StringUtils.equals(validationOutcome, "org.jboss.seam.annotations.Outcome.REDISPLAY"))
673        {
674            validationOutcome = "\"" + validationOutcome + "\"";
675        }
676        return validationOutcome;
677    }
678
679    /**
680     * @see EJB3SessionOperationFacadeLogic#handleIsSeamValidationRefreshEntities()
681     */
682    @Override
683    protected boolean handleIsSeamValidationRefreshEntities()
684    {
685        return BooleanUtils.toBoolean(
686                (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_SEAM_VALIDATION_REFRESH_ENTITIES));
687    }
688
689    /**
690     * @see EJB3SessionOperationFacadeLogic#handleIsSeamLifecycleCreate()
691     */
692    @Override
693    protected boolean handleIsSeamLifecycleCreate()
694    {
695        boolean isSeamLifecycleCreate = false;
696        if (this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_LIFECYCLE_CREATE))
697        {
698            isSeamLifecycleCreate = true;
699        }
700        return isSeamLifecycleCreate;
701    }
702
703    /**
704     * @see EJB3SessionOperationFacadeLogic#handleIsSeamLifecycleDestroy()
705     */
706    @Override
707    protected boolean handleIsSeamLifecycleDestroy()
708    {
709        boolean isSeamLifecycleCreate = false;
710        if (this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_LIFECYCLE_DESTROY))
711        {
712            isSeamLifecycleCreate = true;
713        }
714        return isSeamLifecycleCreate;
715    }
716
717    /**
718     * @see EJB3SessionOperationFacadeLogic#handleIsSeamObserver()
719     */
720    @Override
721    protected boolean handleIsSeamObserver()
722    {
723        boolean isSeamObserver = false;
724        if (this.findTaggedValue(EJB3Profile.TAGGEDVALUE_SEAM_LIFECYCLE_OBSERVER_EVENT) != null)
725        {
726            isSeamObserver = true;
727        }
728        return isSeamObserver;
729    }
730
731    /**
732     * @see EJB3SessionOperationFacadeLogic#handleGetSeamObserverEventName()
733     */
734    @Override
735    protected String handleGetSeamObserverEventName()
736    {
737        return "(\"" +  this.findTaggedValue(EJB3Profile.TAGGEDVALUE_SEAM_LIFECYCLE_OBSERVER_EVENT) + "\")";
738    }
739
740    /**
741     * @see EJB3SessionOperationFacadeLogic#handleIsSeamAsynchronous()
742     */
743    @Override
744    protected boolean handleIsSeamAsynchronous()
745    {
746        return this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_ASYNCHRONOUS);
747    }
748
749    /**
750     * @see EJB3SessionOperationFacadeLogic#handleIsSeamBijectionFactory()
751     */
752    @Override
753    protected boolean handleIsSeamBijectionFactory()
754    {
755        return this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_BIJECTION_FACTORY);
756    }
757
758    /**
759     * @see EJB3SessionOperationFacadeLogic#handleGetSeamBijectionFactoryParameters()
760     */
761    @Override
762    protected String handleGetSeamBijectionFactoryParameters()
763    {
764        List<String> parameters = new ArrayList<String>();
765        String value = (String) this.findTaggedValue(EJB3Profile.TAGGEDVALUE_SEAM_BIJECTION_FACTORY_VALUE);
766        if(StringUtils.isNotBlank(value))
767        {
768            parameters.add("value = \"" + value + "\"");
769        }
770
771        String scope = (String) this.findTaggedValue(EJB3Profile.TAGGEDVALUE_SEAM_BIJECTION_FACTORY_SCOPE_TYPE);
772        if(StringUtils.isNotBlank(scope))
773        {
774            parameters.add("scope = org.jboss.seam.ScopeType." + scope);
775        }
776
777        return EJB3MetafacadeUtils.buildAnnotationParameters(parameters);
778    }
779
780    /**
781     * @see EJB3SessionOperationFacadeLogic#handleIsSeamConversationBegin()
782     */
783    @Override
784    protected boolean handleIsSeamConversationBegin()
785    {
786        return this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_CONVERSATION_BEGIN);
787    }
788
789    /**
790     * @see EJB3SessionOperationFacadeLogic#handleGetSeamConversationBeginParameters()
791     */
792    @Override
793    protected String handleGetSeamConversationBeginParameters()
794    {
795        if(!this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_CONVERSATION_BEGIN))
796        {
797            return null;
798        }
799        else
800        {
801            List<String> parameters = new ArrayList<String>();
802            String flushMode = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_SEAM_CONVERSATION_BEGIN_FLUSH_MODE);
803            if(StringUtils.isNotBlank(flushMode))
804            {
805                parameters.add("flushMode = org.jboss.seam.annotations.FlushModeType." + flushMode);
806            }
807
808            String pageflow = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_SEAM_CONVERSATION_BEGIN_PAGEFLOW);
809            if(StringUtils.isNotBlank(pageflow))
810            {
811                parameters.add("pageflow = \"" + pageflow + "\"");
812            }
813
814            String join = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_SEAM_CONVERSATION_BEGIN_JOIN);
815            if(StringUtils.isNotBlank(join))
816            {
817                parameters.add("join = " + join.toLowerCase());
818            }
819
820            String nested = (String)this.findTaggedValue(EJB3Profile.TAGGEDVALUE_SEAM_CONVERSATION_BEGIN_NESTED);
821            if(StringUtils.isNotBlank(nested))
822            {
823                parameters.add("nested = " + nested.toLowerCase());
824            }
825
826            Collection ifOutcome = this.findTaggedValues(EJB3Profile.TAGGEDVALUE_SEAM_CONVERSATION_BEGIN_IF_OUTCOME);
827            if(ifOutcome != null && !ifOutcome.isEmpty())
828            {
829                parameters.add(EJB3MetafacadeUtils.buildAnnotationMultivalueParameter("ifOutcome", ifOutcome));
830            }
831            return EJB3MetafacadeUtils.buildAnnotationParameters(parameters);
832        }
833    }
834
835    /**
836     * @see EJB3SessionOperationFacadeLogic#handleIsSeamConversationBeginTask()
837     */
838    @Override
839    protected boolean handleIsSeamConversationBeginTask()
840    {
841        return this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_CONVERSATION_BEGIN_TASK);
842    }
843
844    /**
845     * @see EJB3SessionOperationFacadeLogic#handleGetSeamConversationBeginTaskParameters()
846     */
847    @Override
848    protected String handleGetSeamConversationBeginTaskParameters()
849    {
850        if(!this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_CONVERSATION_BEGIN_TASK))
851        {
852            return null;
853        }
854        else
855        {
856            List<String> parameters = new ArrayList<String>();
857            String flushMode = (String)this.findTaggedValue(
858                    EJB3Profile.TAGGEDVALUE_SEAM_CONVERSATION_BEGIN_TASK_FLUSH_MODE);
859            if(StringUtils.isNotBlank(flushMode))
860            {
861                parameters.add("flushMode = org.jboss.seam.annotations.FlushModeType." + flushMode + "\"");
862            }
863
864            String taskIdParameter = (String)this.findTaggedValue(
865                    EJB3Profile.TAGGEDVALUE_SEAM_CONVERSATION_BEGIN_TASK_ID_PARAMETER);
866            if(StringUtils.isNotBlank(taskIdParameter))
867            {
868                parameters.add("taskIdParameter = \"" + taskIdParameter + "\"");
869            }
870            return EJB3MetafacadeUtils.buildAnnotationParameters(parameters);
871        }
872    }
873
874    /**
875     * @see EJB3SessionOperationFacadeLogic#handleIsSeamConversationCreateProcess()
876     */
877    @Override
878    protected boolean handleIsSeamConversationCreateProcess()
879    {
880        return this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_CONVERSATION_CREATE_PROCESS);
881    }
882
883    /**
884     * @see EJB3SessionOperationFacadeLogic#handleGetSeamConversationCreateProcessParameters()
885     */
886    @Override
887    protected String handleGetSeamConversationCreateProcessParameters()
888    {
889        return "(definition = \"" +
890            this.findTaggedValue(EJB3Profile.TAGGEDVALUE_SEAM_CONVERSATION_CREATE_PROCESS_DEFINITION) + "\")";
891    }
892
893    /**
894     * @see EJB3SessionOperationFacadeLogic#handleIsSeamConversationEnd()
895     */
896    @Override
897    protected boolean handleIsSeamConversationEnd()
898    {
899        return this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_CONVERSATION_END);
900    }
901
902    /**
903     * @see EJB3SessionOperationFacadeLogic#handleGetSeamConversationEndParameters()
904     */
905    @Override
906    protected String handleGetSeamConversationEndParameters()
907    {
908        if(!this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_CONVERSATION_END))
909        {
910            return null;
911        }
912        else
913        {
914            List<String> parameters = new ArrayList<String>();
915            String beforeRedirect = (String)this.findTaggedValue(
916                    EJB3Profile.TAGGEDVALUE_SEAM_CONVERSATION_END_TASK_BEFORE_REDIRECT);
917            if(StringUtils.isNotBlank(beforeRedirect))
918            {
919                parameters.add("beforeRedirect = " + beforeRedirect.toLowerCase());
920            }
921
922            Collection ifOutcome = this.findTaggedValues(EJB3Profile.TAGGEDVALUE_SEAM_CONVERSATION_END_IF_OUTCOME);
923            if(ifOutcome != null && !ifOutcome.isEmpty())
924            {
925                parameters.add(EJB3MetafacadeUtils.buildAnnotationMultivalueParameter("ifOutcome", ifOutcome));
926            }
927
928            Collection exceptions = this.findTaggedValues(
929                    EJB3Profile.TAGGEDVALUE_SEAM_CONVERSATION_END_EVEN_IF_EXCEPTION);
930            if(exceptions != null && !exceptions.isEmpty())
931            {
932                parameters.add(
933                        EJB3MetafacadeUtils.buildAnnotationMultivalueParameter(
934                                "ifOutcome",
935                                ifOutcome,
936                                false,
937                                ".class"));
938            }
939            return EJB3MetafacadeUtils.buildAnnotationParameters(parameters);
940        }
941    }
942    /**
943     * @see EJB3SessionOperationFacadeLogic#handleIsSeamConversationEndTask()
944     */
945    @Override
946    protected boolean handleIsSeamConversationEndTask()
947    {
948        return this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_CONVERSATION_END_TASK);
949    }
950
951    /**
952     * @see EJB3SessionOperationFacadeLogic#handleGetSeamConversationEndTaskParameters()
953     */
954    @Override
955    protected String handleGetSeamConversationEndTaskParameters()
956    {
957        if(!this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_CONVERSATION_END_TASK))
958        {
959            return null;
960        }
961        else
962        {
963            List<String> parameters = new ArrayList<String>();
964            String transition = (String)this.findTaggedValue(
965                    EJB3Profile.TAGGEDVALUE_SEAM_CONVERSATION_END_TASK_TRANSITION_NAME);
966            if(StringUtils.isNotBlank(transition))
967            {
968                parameters.add("transition = \"" + transition + "\"");
969            }
970
971            String beforeRedirect = (String)this.findTaggedValue(
972                    EJB3Profile.TAGGEDVALUE_SEAM_CONVERSATION_END_TASK_BEFORE_REDIRECT);
973            if(StringUtils.isNotBlank(beforeRedirect))
974            {
975                parameters.add("beforeRedirect = " + beforeRedirect.toLowerCase());
976            }
977            Collection ifOutcome = this.findTaggedValues(EJB3Profile.TAGGEDVALUE_SEAM_CONVERSATION_END_TASK_IF_OUTCOME);
978            if(ifOutcome != null && !ifOutcome.isEmpty())
979            {
980                parameters.add(EJB3MetafacadeUtils.buildAnnotationMultivalueParameter("ifOutcome", ifOutcome));
981            }
982            return EJB3MetafacadeUtils.buildAnnotationParameters(parameters);
983        }
984    }
985
986    /**
987     * @see EJB3SessionOperationFacadeLogic#handleIsSeamConversationResumeProcess()
988     */
989    @Override
990    protected boolean handleIsSeamConversationResumeProcess()
991    {
992        return this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_CONVERSATION_RESUME_PROCESS);
993    }
994
995    /**
996     * @see EJB3SessionOperationFacadeLogic#handleGetSeamConversationResumeProcessParameters()
997     */
998    @Override
999    protected String handleGetSeamConversationResumeProcessParameters()
1000    {
1001        return "(processIdParameter = \"" +
1002            this.findTaggedValue(
1003                    EJB3Profile.TAGGEDVALUE_SEAM_CONVERSATION_RESUME_PROCESS_PROCESS_ID_PARAMETER) + "\")";
1004    }
1005
1006    /**
1007     * @see EJB3SessionOperationFacadeLogic#handleIsSeamConversationStartTask()
1008     */
1009    @Override
1010    protected boolean handleIsSeamConversationStartTask()
1011    {
1012        return this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_CONVERSATION_START_TASK);
1013    }
1014
1015    /**
1016     * @see EJB3SessionOperationFacadeLogic#handleGetSeamConversationStartTaskParameters()
1017     */
1018    @Override
1019    protected String handleGetSeamConversationStartTaskParameters()
1020    {
1021        if (!this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_CONVERSATION_START_TASK))
1022        {
1023            return null;
1024        }
1025        else
1026        {
1027            List<String> parameters = new ArrayList<String>();
1028            String flushMode = (String)this.findTaggedValue(
1029                    EJB3Profile.TAGGEDVALUE_SEAM_CONVERSATION_START_TASK_FLUSH_MODE);
1030            if (StringUtils.isNotBlank(flushMode))
1031            {
1032                parameters.add("flushMode = org.jboss.seam.annotations.FlushModeType." + flushMode);
1033            }
1034
1035            String taskIdParameter = (String)this.findTaggedValue(
1036                    EJB3Profile.TAGGEDVALUE_SEAM_CONVERSATION_START_TASK_ID_PARAMETER);
1037            if (StringUtils.isNotBlank(taskIdParameter))
1038            {
1039                parameters.add("taskIdParameter = \"" + taskIdParameter + "\"");
1040            }
1041
1042            return EJB3MetafacadeUtils.buildAnnotationParameters(parameters);
1043        }
1044    }
1045
1046    /**
1047     * @see EJB3SessionOperationFacadeLogic#handleIsSeamTransactional()
1048     */
1049    @Override
1050    protected boolean handleIsSeamTransactional()
1051    {
1052        return this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_TRANSACTION_TRANSACTIONAL);
1053    }
1054
1055    /**
1056     * @see EJB3SessionOperationFacadeLogic#handleIsSeamTransactionRollback()
1057     */
1058    @Override
1059    protected boolean handleIsSeamTransactionRollback()
1060    {
1061        return this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_TRANSACTION_ROLLBACK);
1062    }
1063
1064    /**
1065     * @see EJB3SessionOperationFacadeLogic#handleGetSeamTransactionRollbackParameters()
1066     */
1067    @Override
1068    protected String handleGetSeamTransactionRollbackParameters()
1069    {
1070        Collection outcomes =  this.findTaggedValues(EJB3Profile.TAGGEDVALUE_SEAM_TRANSACTION_ROLLBACK_IF_OUTCOME);
1071        if (outcomes == null || outcomes.isEmpty())
1072        {
1073            return null;
1074        }
1075        else
1076        {
1077            return "(" + EJB3MetafacadeUtils.buildAnnotationMultivalueParameter("ifOutcome", outcomes) + ")";
1078        }
1079    }
1080
1081    /**
1082     * @see EJB3SessionOperationFacadeLogic#handleIsSeamWebRemote()
1083     */
1084    @Override
1085    protected boolean handleIsSeamWebRemote()
1086    {
1087        return this.hasStereotype(EJB3Profile.STEREOTYPE_SEAM_WEBREMOTE);
1088    }
1089
1090    /**
1091     * @see EJB3SessionOperationFacadeLogic#handleGetSeamWebRemoteParameters()
1092     */
1093    @Override
1094    protected String handleGetSeamWebRemoteParameters()
1095    {
1096        Collection excludes = this.findTaggedValues(EJB3Profile.TAGGEDVALUE_SEAM_WEBREMOTE_EXCLUDE);
1097        if(excludes == null || excludes.isEmpty())
1098        {
1099            return null;
1100        }
1101        else
1102        {
1103            return "(" + EJB3MetafacadeUtils.buildAnnotationMultivalueParameter("exclude", excludes) + ")";
1104        }
1105    }
1106}