org/andromda/cartridges/arc/metafacades/ARC_ClassifierFacadeLogicImpl.java

Go to the documentation of this file.
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                 //Debug dbg=new Debug();
00042                 //dbg.printResponsibilities(Responsibilities);
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 }

Generated on Tue Jan 9 16:10:05 2007 for AndroMDA ARC by  doxygen 1.4.7