00001 package org.andromda.cartridges.arc.metafacades;
00002
00003 import org.andromda.metafacades.uml.AttributeFacade;
00004 import org.andromda.metafacades.uml.AssociationEndFacade;
00005 import org.andromda.metafacades.uml.ClassifierFacade;
00006 import org.andromda.cartridges.arc.Debug;
00007 import org.andromda.cartridges.arc.Responsibility;
00008 import org.andromda.cartridges.arc.KeyResponsibility;
00009 import org.andromda.cartridges.arc.CardinalityResponsibility;
00010 import java.util.Collection;
00011 import java.util.Iterator;
00012 import java.util.ArrayList;
00013
00019 public class ARC_ClassifierFacadeLogicImpl
00020 extends ARC_ClassifierFacadeLogic
00021 {
00022
00023 public ARC_ClassifierFacadeLogicImpl (Object metaObject, String context)
00024 {
00025 super (metaObject, context);
00026 }
00027
00031 protected java.util.Collection handleGetResponsibilities()
00032 {
00033 ArrayList Responsibilities=new ArrayList();
00034
00035 Responsibility resp=keyResponsibility();
00036 if(resp!=null) Responsibilities.add(resp);
00037
00038 Responsibilities.addAll(cardinalityResponsibilities());
00039
00041
00042
00043
00044 return Responsibilities;
00045 }
00046
00050 protected Responsibility handleGetResponsibility(java.lang.String name)
00051 {
00052 Iterator iter=handleGetResponsibilities().iterator();
00053 while(iter.hasNext()) {
00054 Responsibility resp=(Responsibility)iter.next();
00055 if(resp.getName().equals(name)) return resp;
00056 }
00057 return null;
00058 }
00059
00060
00064 protected Responsibility keyResponsibility()
00065 {
00066 Collection keyColl=getKey();
00067 if(keyColl.isEmpty()) return null;
00068
00069 return new KeyResponsibility(getName(), keyStrings(keyColl), keyStrings(getAlternativeKey()));
00070 }
00071
00075 protected Collection keyStrings(Collection key)
00076 {
00077 ArrayList coll=new ArrayList();
00078 Iterator key_iter=key.iterator();
00079 while(key_iter.hasNext()) {
00080 AttributeFacade atr=(AttributeFacade)key_iter.next();
00081 if(!atr.getOwner().equals(this)) coll.add(atr.getOwner().getName()+"."+atr.getName());
00082 else coll.add(atr.getName());
00083 }
00084 return coll;
00085 }
00086
00093 protected Collection getKey()
00094 {
00095 boolean weak=false;
00096 ArrayList coll=new ArrayList();
00097 Iterator attr_iter=getAttributes().iterator();
00098 while(attr_iter.hasNext()) {
00099 AttributeFacade atr=(AttributeFacade)attr_iter.next();
00100 if(atr.hasStereotype("Key")) coll.add(atr);
00101 if(atr.hasStereotype("WeakKey")) {
00102 coll.add(atr);
00103 weak=true;
00104 }
00105 }
00106 if(weak) {
00107 Iterator end_iter=getAssociationEnds().iterator();
00108 while(end_iter.hasNext()) {
00109 AssociationEndFacade asso=(AssociationEndFacade)end_iter.next();
00110 ARC_ClassifierFacadeLogicImpl target=(ARC_ClassifierFacadeLogicImpl)asso.getOtherEnd().getType();
00111 if (asso.isMany2One() && asso.getOtherEnd().isComposition()) coll.addAll(target.getKey());
00112 }
00113 }
00114 return coll;
00115 }
00116
00120 protected Collection getAlternativeKey()
00121 {
00122 ArrayList coll=new ArrayList();
00123 Iterator attr_iter=getAttributes().iterator();
00124 while(attr_iter.hasNext()) {
00125 AttributeFacade atr=(AttributeFacade)attr_iter.next();
00126 if(atr.hasStereotype("AlternativeKey")) coll.add(atr);
00127 }
00128 return coll;
00129 }
00130
00136 public void validateInvariants(java.util.Collection validationMessages)
00137 {
00138 super.validateInvariants(validationMessages);
00139
00140 boolean cicle_detected=false;
00141 if(haveWeak()) {
00142 ARC_ClassifierFacadeLogicImpl currentClass=this, prevClass=null;
00143 do {
00144 Iterator end_iter=currentClass.getAssociationEnds().iterator();
00145 while(end_iter.hasNext()) {
00146 AssociationEndFacade asso=(AssociationEndFacade)end_iter.next();
00147 if (asso.isMany2One() && asso.getOtherEnd().isComposition())
00148 prevClass=currentClass;
00149 currentClass=(ARC_ClassifierFacadeLogicImpl)asso.getOtherEnd().getType();
00150 if(currentClass==prevClass) cicle_detected=true;
00151 else if(getName().equals(currentClass.getName())) cicle_detected=true;
00152 }
00153 } while(currentClass.haveWeak() && !cicle_detected);
00154
00155 if (cicle_detected) validationMessages.add(
00156 new org.andromda.core.metafacade.ModelValidationMessage(this, "org::andromda::cartridges::arc::metafacades::ARC_ClassifierFacade::WeakKey Cicle Check", "You can NOT set a cicle of weak classes."));
00157 }
00158 }
00159
00163 protected boolean haveWeak()
00164 {
00165 boolean weak=false;
00166 Iterator attr_iter=getAttributes().iterator();
00167 while(attr_iter.hasNext() && !weak) {
00168 AttributeFacade atr=(AttributeFacade)attr_iter.next();
00169 if(atr.hasStereotype("WeakKey")) weak=true;
00170 }
00171 return weak;
00172 }
00173
00177 protected java.util.Collection cardinalityResponsibilities()
00178 {
00179 ArrayList Responsibilities=new ArrayList();
00180 Iterator end_iter=getAssociationEnds().iterator();
00181 while(end_iter.hasNext()) {
00182 Responsibility resp=cardinalityResponsibility(((AssociationEndFacade)end_iter.next()).getOtherEnd());
00183 if(resp!=null) Responsibilities.add(resp);
00184 }
00185 return Responsibilities;
00186 }
00187
00191 protected Responsibility cardinalityResponsibility(AssociationEndFacade assoc_end)
00192 {
00193 if(assoc_end.getUpper() == -1 && assoc_end.getLower() <= 0) return null;
00194 return new CardinalityResponsibility("Class", getName(), "Association", new Integer(assoc_end.getLower()), new Integer(assoc_end.getUpper()), assoc_end.getType().getName());
00195 }
00196 }