001package org.andromda.metafacades.uml14; 002 003import java.util.List; 004import org.andromda.metafacades.uml.AssociationEndFacade; 005import org.andromda.metafacades.uml.MetafacadeUtils; 006import org.andromda.metafacades.uml.UMLMetafacadeProperties; 007import org.apache.commons.lang.StringUtils; 008import org.omg.uml.foundation.core.AssociationClass; 009import org.omg.uml.foundation.core.AssociationEnd; 010import org.omg.uml.foundation.core.UmlAssociation; 011 012/** 013 * Metaclass facade implementation. 014 * @author Bob Fields 015 */ 016public class AssociationFacadeLogicImpl 017 extends AssociationFacadeLogic 018{ 019 private static final long serialVersionUID = 34L; 020 /** 021 * @param metaObject 022 * @param context 023 */ 024 public AssociationFacadeLogicImpl( 025 UmlAssociation metaObject, 026 String context) 027 { 028 super(metaObject, context); 029 } 030 031 /** 032 * @see org.andromda.metafacades.uml.AssociationFacade#getAssociationEnds() 033 */ 034 @Override 035 public List<AssociationEnd> handleGetAssociationEnds() 036 { 037 return metaObject.getConnection(); 038 } 039 040 /** 041 * @see org.andromda.metafacades.uml14.ModelElementFacadeLogic#handleGetName() 042 */ 043 public String handleGetName() 044 { 045 String name = super.handleGetName(); 046 047 // if the name isn't defined, use the relation name 048 if (StringUtils.isEmpty(name)) 049 { 050 name = this.handleGetRelationName(); 051 } 052 return name; 053 } 054 055 /** 056 * @see org.andromda.metafacades.uml.AssociationFacade#getRelationName() 057 */ 058 @Override 059 public String handleGetRelationName() 060 { 061 //Avoid StackOverflow with getName calling shieldedElements. 062 /* final String firstEnd = this.handleGetAssociationEndA().getName(); 063 String secondEnd = ""; 064 if (!(metaObject.getConnection().size()>1)) 065 { 066 secondEnd = this.handleGetAssociationEndB().getName(); 067 } 068 return MetafacadeUtils.toRelationName( 069 (firstEnd==null ? "" : firstEnd), 070 (secondEnd==null ? "" : secondEnd), 071 String.valueOf(this.getConfiguredProperty(UMLMetafacadeProperties.RELATION_NAME_SEPARATOR))); */ 072 /*final AssociationEndFacade firstEnd = (AssociationEndFacade)this.shieldedElement(this.handleGetAssociationEndA()); 073 final AssociationEndFacade secondEnd = (AssociationEndFacade)this.shieldedElement(this.handleGetAssociationEndB()); 074 return MetafacadeUtils.toRelationName( 075 firstEnd.getName(), 076 secondEnd.getName(), 077 String.valueOf(this.getConfiguredProperty(UMLMetafacadeProperties.RELATION_NAME_SEPARATOR))); */ 078 final AssociationEndFacade firstEnd = this.getAssociationEndA(); 079 final AssociationEndFacade secondEnd = this.getAssociationEndB(); 080 //System.out.println("firstEnd=" + firstEnd + " secondEnd=" + secondEnd); 081 final String nameA = firstEnd==null ? "" :firstEnd.getName(); 082 final String nameB = secondEnd==null ? "" : secondEnd.getName(); 083 //System.out.println("nameA=" + nameA + " nameB=" + nameB); 084 return MetafacadeUtils.toRelationName( 085 nameA, 086 nameB, 087 String.valueOf(this.getConfiguredProperty(UMLMetafacadeProperties.RELATION_NAME_SEPARATOR))); 088 } 089 090 /** 091 * @see org.andromda.metafacades.uml.AssociationFacade#isMany2Many() 092 */ 093 @Override 094 protected boolean handleIsMany2Many() 095 { 096 return (this.getAssociationEnds().iterator().next()).isMany2Many(); 097 } 098 099 /** 100 * @see org.andromda.metafacades.uml.AssociationFacade#isAssociationClass() 101 */ 102 @Override 103 protected boolean handleIsAssociationClass() 104 { 105 return AssociationClass.class.isAssignableFrom(this.metaObject.getClass()); 106 } 107 108 /** 109 * @see org.andromda.metafacades.uml.AssociationFacade#getAssociationEndA() 110 */ 111 @Override 112 protected AssociationEnd handleGetAssociationEndA() 113 { 114 List<AssociationEnd> ends = this.handleGetAssociationEnds(); 115 if (!ends.isEmpty()) 116 { 117 return ends.get(0); 118 } 119 else 120 { 121 return null; 122 } 123 } 124 125 /** 126 * @see org.andromda.metafacades.uml.AssociationFacade#getAssociationEndB() 127 */ 128 @Override 129 protected AssociationEnd handleGetAssociationEndB() 130 { 131 List<AssociationEnd> ends = this.handleGetAssociationEnds(); 132 if (ends.size()>1) 133 { 134 return ends.get(1); 135 } 136 else 137 { 138 return null; 139 } 140 } 141 142 /** 143 * @see org.andromda.metafacades.uml.AssociationFacade#isAbstract() 144 */ 145 @Override 146 protected boolean handleIsAbstract() 147 { 148 return this.metaObject.isAbstract(); 149 } 150 151 /** 152 * 153 * @return true always 154 * @see org.andromda.metafacades.uml.AssociationFacade#isBinary() 155 */ 156 @Override 157 protected boolean handleIsBinary() 158 { 159 return true; 160 } 161 162 /** 163 * 164 * @return false always 165 * @see org.andromda.metafacades.uml.AssociationFacade#isDerived() 166 */ 167 @Override 168 protected boolean handleIsDerived() 169 { 170 return false; 171 } 172 173 /** 174 * @see org.andromda.metafacades.uml.AssociationFacade#isLeaf 175 */ 176 @Override 177 protected boolean handleIsLeaf() 178 { 179 return this.metaObject.isLeaf(); 180 } 181}