package org.archstudio.archipelago2.ext.structures.logics;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map.Entry;
import org.archstudio.bna.IBNAView;
import org.archstudio.bna.IBNAWorld;
import org.archstudio.bna.ICoordinate;
import org.archstudio.bna.IThing;
import org.archstudio.bna.logics.AbstractThingLogic;
import org.archstudio.bna.ui.IBNAAllEventsListener2;
import org.archstudio.bna.ui.IBNAMenuListener2;
import org.archstudio.bna.utils.Assemblies;
import org.archstudio.bna.utils.BNAAction;
import org.archstudio.bna.utils.BNAUtils;
import org.archstudio.bna.utils.BNAUtils2.ThingReference;
import org.archstudio.bna.utils.BNAUtils2.ThingsAtLocation;
import org.archstudio.myxgen.MyxGenBrick;
import org.archstudio.myxgen.MyxGenInterface;
import org.archstudio.myxgen.eclipse.extension.MyxGenWorkspaceExtensions;
import org.archstudio.sysutils.SystemUtils;
import org.archstudio.sysutils.UIDGenerator;
import org.archstudio.xadl.XadlUtils;
import org.archstudio.xadl.bna.facets.IHasObjRef;
import org.archstudio.xadl.bna.utils.XArchADTOperations;
import org.archstudio.xadl3.domain_3_0.Domain;
import org.archstudio.xadl3.domain_3_0.DomainExtension;
import org.archstudio.xadl3.domain_3_0.DomainType;
import org.archstudio.xadl3.domain_3_0.Domain_3_0Factory;
import org.archstudio.xadl3.domain_3_0.Domain_3_0Package;
import org.archstudio.xadl3.implementation_3_0.ImplementationExtension;
import org.archstudio.xadl3.implementation_3_0.Implementation_3_0Package;
import org.archstudio.xadl3.lookupimplementation_3_0.LookupImplementation;
import org.archstudio.xadl3.lookupimplementation_3_0.Lookupimplementation_3_0Factory;
import org.archstudio.xadl3.lookupimplementation_3_0.Lookupimplementation_3_0Package;
import org.archstudio.xadl3.myxgen_3_0.MyxGen;
import org.archstudio.xadl3.myxgen_3_0.Myxgen_3_0Factory;
import org.archstudio.xadl3.myxgen_3_0.Myxgen_3_0Package;
import org.archstudio.xadl3.structure_3_0.Brick;
import org.archstudio.xadl3.structure_3_0.Direction;
import org.archstudio.xadl3.structure_3_0.Interface;
import org.archstudio.xadl3.structure_3_0.Structure_3_0Factory;
import org.archstudio.xadl3.structure_3_0.Structure_3_0Package;
import org.archstudio.xarchadt.IXArchADT;
import org.archstudio.xarchadt.ObjRef;
import org.archstudio.xarchadt.XArchADTProxy;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
import com.google.common.collect.Multimaps;
public class AssignMyxGenLogic extends AbstractThingLogic
implements IBNAMenuListener2, IBNAAllEventsListener2 {
protected final IXArchADT xarch;
public AssignMyxGenLogic(IBNAWorld world, IXArchADT xarch) {
super(world);
this.xarch = xarch;
}
@Override
public void fillMenu(IBNAView view, ICoordinate location, ThingsAtLocation thingsAtLocation,
IMenuManager menuManager) {
BNAUtils.checkLock();
if (view.getBNAWorld() != world) {
return;
}
if (thingsAtLocation.getBackgroundThingAtLocation() != null) {
ThingReference thingReference = thingsAtLocation.getBackgroundThingAtLocation();
IThing thing =
Assemblies.getThingWithProperty(model, thingReference.getThing(), IHasObjRef.OBJREF_KEY);
if (thing != null) {
final ObjRef objRef = thing.get(IHasObjRef.OBJREF_KEY);
if (objRef != null) {
if (XadlUtils.isBrick(xarch, objRef)) {
MenuManager myxGenMenu = new MenuManager("Assign MyxGen Brick...");
myxGenMenu.addMenuListener(new IMenuListener() {
@Override
public void menuAboutToShow(IMenuManager manager) {
populateMenuWithMyxGenBricks(objRef, manager);
}
});
menuManager.add(myxGenMenu);
myxGenMenu.add(new BNAAction("Place holder needed to show menu") {
@Override
public void runWithLock() {}
});
}
}
}
}
}
protected void populateMenuWithMyxGenBricks(final ObjRef objRef, IMenuManager menuManager) {
menuManager.removeAll();
Multimap<String, MyxGenBrick> allMyxGenBricks =
MyxGenWorkspaceExtensions.getActiveMyxGenBricks();
for (final Entry<String, Collection<MyxGenBrick>> entry : SystemUtils
.sortedByKey(allMyxGenBricks.asMap().entrySet())) {
IMenuManager projectMenu = new MenuManager(entry.getKey());
menuManager.add(projectMenu);
List<MyxGenBrick> myxGenBricks = Lists.newArrayList(entry.getValue());
Collections.sort(myxGenBricks, new Comparator<MyxGenBrick>() {
@Override
public int compare(MyxGenBrick o1, MyxGenBrick o2) {
return o1.getName().compareTo(o2.getName());
}
});
for (final MyxGenBrick myxGenBrick : myxGenBricks) {
projectMenu.add(new BNAAction(myxGenBrick.getName()) {
@Override
public void runWithLock() {
assignMyxGenBrick(objRef, myxGenBrick);
}
});
}
}
}
protected void assignMyxGenBrick(ObjRef objRef, MyxGenBrick myxGenBrick) {
final XArchADTOperations xarch = new XArchADTOperations(this.xarch);
Domain_3_0Factory domainFactory =
XArchADTProxy.proxy(xarch, Domain_3_0Package.eINSTANCE.getNsURI());
Lookupimplementation_3_0Factory lookupFactory =
XArchADTProxy.proxy(xarch, Lookupimplementation_3_0Package.eINSTANCE.getNsURI());
Myxgen_3_0Factory myxGenFactory =
XArchADTProxy.proxy(xarch, Myxgen_3_0Package.eINSTANCE.getNsURI());
Structure_3_0Factory structureFactory =
XArchADTProxy.proxy(xarch, Structure_3_0Package.eINSTANCE.getNsURI());
Brick brick = XArchADTProxy.proxy(xarch, objRef);
brick.setSubStructure(null);
ImplementationExtension impl = XadlUtils.createExt(xarch, brick,
Implementation_3_0Package.Literals.IMPLEMENTATION_EXTENSION);
MyxGen myxGen = myxGenFactory.createMyxGen();
myxGen.setId(UIDGenerator.generateUID());
myxGen.setBrickID(myxGenBrick.getId());
impl.getImplementation().clear();
impl.getImplementation().add(myxGen);
Multimap<String, Interface> oldIfaces =
Multimaps.index(brick.getInterface().iterator(), new Function<Interface, String>() {
@Override
public String apply(Interface iface) {
LookupImplementation limpl = XArchADTProxy.proxy(xarch,
XadlUtils.getImplementation(xarch, XArchADTProxy.unproxy(iface),
Lookupimplementation_3_0Package.Literals.LOOKUP_IMPLEMENTATION));
if (limpl != null) {
String lookup = limpl.getLookup();
return lookup != null ? lookup : "";
}
return "";
}
});
List<Interface> newIfaces = Lists.newArrayList();
MyxGenBrick currentMyxGenBrick = myxGenBrick;
while (currentMyxGenBrick != null) {
for (MyxGenInterface mif : currentMyxGenBrick.getInterfaces()) {
Interface iface = SystemUtils.firstOrNull(oldIfaces.get(mif.getName()));
if (iface == null) {
iface = structureFactory.createInterface();
iface.setId(UIDGenerator.generateUID());
brick.getInterface().add(iface);
}
newIfaces.add(iface);
iface.setName(mif.getName());
iface.setDirection(Direction.getByName(mif.getDirection().name().toLowerCase()));
impl = XadlUtils.createExt(xarch, iface,
Implementation_3_0Package.Literals.IMPLEMENTATION_EXTENSION);
LookupImplementation lookup = lookupFactory.createLookupImplementation();
lookup.setId(UIDGenerator.generateUID());
lookup.setLookup(mif.getId());
impl.getImplementation().clear();
impl.getImplementation().add(lookup);
DomainExtension domainExt =
XadlUtils.createExt(xarch, iface, Domain_3_0Package.Literals.DOMAIN_EXTENSION);
Domain domain = domainFactory.createDomain();
domain.setType(DomainType.getByName(mif.getDomain()));
domainExt.setDomain(domain);
}
String parentBrickID = currentMyxGenBrick.getParentBrickId();
currentMyxGenBrick = MyxGenWorkspaceExtensions.getActiveMyxGenBrick(parentBrickID);
}
List<Interface> doomedIfaces = Lists.newArrayList(oldIfaces.values());
doomedIfaces.removeAll(newIfaces);
brick.getInterface().removeAll(doomedIfaces);
xarch.done("Assign MyxGen Brick");
}
}