001package org.andromda.metafacades.uml14; 002 003import java.util.ArrayList; 004import java.util.Collection; 005import java.util.Iterator; 006import java.util.LinkedHashMap; 007import java.util.List; 008import java.util.Map; 009import org.andromda.metafacades.uml.FrontEndActivityGraph; 010import org.andromda.metafacades.uml.FrontEndForward; 011import org.andromda.metafacades.uml.FrontEndParameter; 012import org.andromda.metafacades.uml.FrontEndUseCase; 013import org.andromda.metafacades.uml.TransitionFacade; 014import org.andromda.metafacades.uml.UMLProfile; 015import org.andromda.metafacades.uml.UseCaseFacade; 016import org.apache.commons.lang.StringUtils; 017 018/** 019 * MetafacadeLogic implementation for org.andromda.metafacades.uml.FrontEndFinalState. 020 * 021 * @see org.andromda.metafacades.uml.FrontEndFinalState 022 * @author Bob Fields 023 */ 024public class FrontEndFinalStateLogicImpl 025 extends FrontEndFinalStateLogic 026{ 027 private static final long serialVersionUID = -3707764533520958069L; 028 029 /** 030 * @param metaObject 031 * @param context 032 */ 033 public FrontEndFinalStateLogicImpl (Object metaObject, String context) 034 { 035 super (metaObject, context); 036 } 037 038 /** 039 * @see org.andromda.metafacades.uml.FrontEndFinalState#isContainedInFrontEndUseCase() 040 */ 041 @Override 042 protected boolean handleIsContainedInFrontEndUseCase() 043 { 044 return this.getStateMachine() instanceof FrontEndActivityGraph; 045 } 046 047 /** 048 * @see org.andromda.metafacades.uml14.ModelElementFacadeLogicImpl#handleGetName() 049 */ 050 @Override 051 public String handleGetName() 052 { 053 String name = super.handleGetName(); 054 if (name == null) 055 { 056 FrontEndUseCase useCase = this.getTargetUseCase(); 057 if (useCase != null) 058 { 059 name = useCase.getName(); 060 } 061 } 062 return name; 063 } 064 065 /** 066 * @see org.andromda.metafacades.uml.FrontEndFinalState#getTargetUseCase() 067 */ 068 @Override 069 protected Object handleGetTargetUseCase() 070 { 071 Object targetUseCase = null; 072 073 // first check if there is a hyperlink from this final state to a use-case 074 // this works at least in MagicDraw 075 final Object taggedValue = this.findTaggedValue(UMLProfile.TAGGEDVALUE_MODEL_HYPERLINK); 076 if (taggedValue != null) 077 { 078 if (taggedValue instanceof FrontEndActivityGraph) 079 { 080 targetUseCase = ((FrontEndActivityGraph)taggedValue).getUseCase(); 081 } 082 else if (taggedValue instanceof FrontEndUseCase) 083 { 084 targetUseCase = taggedValue; 085 } 086 } 087 088 // maybe the name points to a use-case ? 089 if (targetUseCase == null) 090 { 091 final String name = super.handleGetName(); 092 if (StringUtils.isNotBlank(name)) 093 { 094 final UseCaseFacade useCase = getModel().findUseCaseByName(name); 095 if (useCase instanceof FrontEndUseCase) 096 { 097 targetUseCase = useCase; 098 } 099 } 100 } 101 return targetUseCase; 102 } 103 104 /** 105 * @see org.andromda.metafacades.uml.FrontEndFinalState#getInterUseCaseParameters() 106 */ 107 @Override 108 protected List<FrontEndParameter> handleGetInterUseCaseParameters() 109 { 110 // we don't want to list parameters with the same name to we use a hash map 111 final Map<String, FrontEndParameter> parameterMap = new LinkedHashMap<String, FrontEndParameter>(); 112 113 final Collection<TransitionFacade> transitions = getIncomings(); 114 for (final Iterator<TransitionFacade> transitionIterator = transitions.iterator(); transitionIterator.hasNext();) 115 { 116 final FrontEndForward forward = (FrontEndForward)transitionIterator.next(); 117 final List<FrontEndParameter> forwardParameters = forward.getForwardParameters(); 118 for (int i = 0; i < forwardParameters.size(); i++) 119 { 120 final FrontEndParameter parameter = forwardParameters.get(i); 121 parameterMap.put(parameter.getName(), parameter); 122 } 123 } 124 125 return new ArrayList<FrontEndParameter>(parameterMap.values()); 126 } 127}