package org.infoobject.magicmap.node.application; import net.sf.magicmap.client.interfaces.NodeModelListener; import net.sf.magicmap.client.model.node.Node; import org.apache.commons.collections15.CollectionUtils; import org.apache.commons.collections15.Transformer; import org.infoobject.core.infoobject.domain.InformationObjectModel; import org.infoobject.core.infoobject.domain.ObjectLink; import org.infoobject.core.infoobject.domain.ObjectName; import org.infoobject.core.infoobject.domain.support.DefaultInformationObject; import org.infoobject.core.infoobject.event.InformationObjectListenerAdapter; import org.infoobject.core.infoobject.event.ObjectLinkingEvent; import org.infoobject.core.relation.domain.PositionRelation; import org.infoobject.core.relation.domain.PositionRelationEdge; import org.infoobject.magicmap.node.model.InformationObjectNode; import org.infoobject.magicmap.node.model.InformationObjectNodeGraph; import org.infoobject.magicmap.node.model.InformationObjectNodeModel; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /** * <p> * Cares for infoobject to pyhsical nodes reltions. * </p> * <p> * DETAILS * </p> * * @author Jan Friderici * Date: 16.08.2008 * Time: 13:30:08 */ public class PositionLinkRelationManager extends InformationObjectListenerAdapter implements NodeModelListener { private final InformationObjectNodeModel objectNodeModel; private final InformationObjectNodeGraph informationNodeGraph; private final InformationObjectModel informationObjectModel; private final Set<String> ignordTypes = new HashSet<String>(); private final Set<String> ignoredAgents = new HashSet<String>(); private final Map<ObjectName, ObjectLink> orphanedLinks = new HashMap<ObjectName,ObjectLink>(); public void nodeAddedEvent(Node node) { if (node.isPhysical()) { ObjectName name = new ObjectName(node.getName(), node.getModel().getServerID()); add(name); } } public void nodeUpdatedEvent(Node node, int i, Object o) { //To change body of implemented methods use File | Settings | File Templates. } public void nodeRemovedEvent(Node node) { if (node.isPhysical()) { } } static class ObjectRelationFactory implements PositionRelation.Factory{ private final ObjectLink link; public ObjectRelationFactory(ObjectLink link) { this.link = link; } public PositionRelation create(PositionRelationEdge edge) { return new PositionRelation(link, edge); } } public void ignoreTypes(Iterable<String> typesToIgnore) { this.ignordTypes.clear(); for (String type : typesToIgnore) { this.ignordTypes.add(type); } // Todo update filter.... } public void ignoreAgents(Iterable<String> agentsToIgnore) { this.ignoredAgents.clear(); for (String type : agentsToIgnore) { this.ignoredAgents.add(type); } // Todo } public PositionLinkRelationManager(InformationObjectNodeModel objectNodeModel, InformationObjectNodeGraph informationNodeGraph, InformationObjectModel informationObjectModel) { this.objectNodeModel = objectNodeModel; this.informationNodeGraph = informationNodeGraph; this.informationObjectModel = informationObjectModel; } @Override public void onObjectLinking(ObjectLinkingEvent linEvent) { addObjectRelation(linEvent.getLinking().getObjectLink()); } @Override public void onObjectLinkingRemoved(ObjectLinkingEvent linEvent) { super.onObjectLinkingRemoved(linEvent); } /** * * @param linking */ private void addObjectRelation (ObjectLink linking) { Node node = objectNodeModel.findNode(linking.getObjectName().getName()); System.out.println("nodes = " + CollectionUtils.collect(objectNodeModel.getNodes(), new Transformer<Node, Object>() { public Object transform(Node node) { return node.getName(); } })); DefaultInformationObject informationObject = linking.getInformationObject(); System.out.print("Linking from: " + linking.getInformationObject().getUri()); System.out.println(" => Linking to: " + linking.getObjectName().getName()); InformationObjectNode informationNode = objectNodeModel.findInformationNode(informationObject.getUri()); if (informationNode == null){ informationNode = new InformationObjectNode(objectNodeModel, informationObject); objectNodeModel.addNode(informationNode); } if (node != null) { PositionRelationEdge edge = informationNodeGraph.getObjectEdge(informationNode, node); if (edge == null) { edge = informationNodeGraph.addRelation(informationNode, node, new ObjectRelationFactory(linking)); System.out.println("Adding edge = " + edge); } else { System.out.println("No need to add edge"); } // edge knows about posts... no update needed edge.update(); }else { orphanedLinks.put(linking.getObjectName(), linking); } } private void add(ObjectName name) { final ObjectLink objectLink = orphanedLinks.remove(name); if (objectLink != null) { addObjectRelation(objectLink); } else { orphanedLinks.put(name, objectLink); } } }