public arquitetura.representation.Class applyAdapter(Element target, Element adaptee) { arquitetura.representation.Class adapterClass = null; if (target != null && adaptee != null && (target instanceof arquitetura.representation.Class || target instanceof Interface) && (adaptee instanceof arquitetura.representation.Class || adaptee instanceof Interface)) { try { adapterClass = AdapterUtil.getAdapterClass(target, adaptee); if (adapterClass == null) { adapterClass = AdapterUtil.createAdapterClass(adaptee); } // Implements/Extends and add all methods. if (target instanceof arquitetura.representation.Class) { ElementUtil.extendClass(adapterClass, (arquitetura.representation.Class) target); } else { ElementUtil.implementInterface(adapterClass, (Interface) target); } RelationshipUtil.createNewUsageRelationship("adaptee", adapterClass, adaptee); Relationship relationshipToBeExcluded = null; if (adaptee.getClass().equals(target.getClass())) { for (Relationship relationship : ElementUtil.getRelationships(adaptee)) { if (target.equals(RelationshipUtil.getSuperElement(relationship))) { relationshipToBeExcluded = relationship; break; } } } else { for (Relationship relationship : ElementUtil.getRelationships(adaptee)) { if (target.equals(RelationshipUtil.getImplementedInterface(relationship))) { relationshipToBeExcluded = relationship; break; } } } if (relationshipToBeExcluded != null) { ArchitectureRepository.getCurrentArchitecture() .removeRelationship(relationshipToBeExcluded); } // Copy concerns for (Concern concern : CollectionUtils.union(target.getOwnConcerns(), adaptee.getOwnConcerns())) { try { adapterClass.addConcern(concern.getName()); } catch (ConcernNotFoundException ex) { Logger.getLogger(Adapter.class.getName()).log(Level.SEVERE, null, ex); } } // Move variants Variant variant = adaptee.getVariant(); if (variant != null) { adaptee.setVariant(null); adapterClass.setVariant(variant); variant.setVariantElement(adapterClass); } addStereotype(target); addStereotype(adaptee); addStereotype(adapterClass); } catch (Exception ex) { Logger.getLogger(Adapter.class.getName()).log(Level.SEVERE, null, ex); } } return adapterClass; }