/** * */ package org.topicquests.topicmap.json.merge; import java.util.*; import org.topicquests.common.ResultPojo; import org.topicquests.common.api.IResult; import org.topicquests.common.api.ITopicQuestsOntology; import org.topicquests.model.TicketPojo; import org.topicquests.model.api.IEnvironment; import org.topicquests.model.api.node.INode; import org.topicquests.model.api.ITicket; import org.topicquests.topicmap.json.model.api.IVirtualizer; import org.topicquests.topicmap.json.model.api.IJSONTopicDataProvider; import org.topicquests.topicmap.json.model.JSONTopicmapEnvironment; /** * @author park * <p>Decide what, if anything to merge:<br/> * <li>If no VirtualNode exists, create one</li> * <li>If VirtualNode exists, use it</li> * <li>Then use SetUnion tools in {@link BaseVirtualizer} to merge nodes</li> * </p> * <p>This is just a tool for any {@link IMergeImplementation} MergeBean</p> */ public class DefaultVirtualizer extends BaseVirtualizer implements IVirtualizer { /* (non-Javadoc) * @see org.topicquests.topicmap.json.model.api.IVirtualizer#createVirtualNode(org.topicquests.model.api.INode, org.topicquests.model.api.INode, java.lang.String) * Must return the virtualNode's locator * <code>mergeData</code> is a key=reason string, value=double weight */ @Override public IResult createVirtualNode(INode primary, INode merge, Map<String,Double> mergeData, double confidence, String userLocator) { environment.logDebug("DefaultVirtualizer.createVirtualNode- "+primary+" "+merge+" "+userLocator); ITicket credentials = new TicketPojo(userLocator); IResult result = new ResultPojo(); // Both are the same node? if (primary.getLocator().equals(merge.getLocator())) return result; INode virtualNode = null; boolean primaryHadVirtual = false; boolean primaryIsMerged = (primary.getProperty(ITopicQuestsOntology.MERGE_TUPLE_PROPERTY) != null); boolean mergeIsMerged = (merge.getProperty(ITopicQuestsOntology.MERGE_TUPLE_PROPERTY) != null); // Both already merged? if (primaryIsMerged && mergeIsMerged) return result; //Have these two, or either one of them, been merged before? //TODO rewrite this with primaryIsMerged and mergedIsMerged IResult r = database.getVirtualNodeIfExists(primary, credentials); if (r.hasError()) result.addErrorString(r.getErrorString()); if (r.getResultObject() != null) { virtualNode = (INode)r.getResultObject(); primaryHadVirtual = true; } else { r = database.getVirtualNodeIfExists(merge, credentials); if (r.hasError()) result.addErrorString(r.getErrorString()); if (r.getResultObject() != null) virtualNode = (INode)r.getResultObject(); } String theType; List<String>sups; String smallImagePath, largeImagePath; boolean isPrivate = false; //If so, then get that virtual proxy and use it if (virtualNode != null) { //the case where we are updating the virtual node due to // another merge with it INode mymerge = merge; if (!primaryHadVirtual) mymerge = primary; theType = mymerge.getNodeType(); sups = mymerge.listSuperclassIds(); smallImagePath = mymerge.getSmallImage(); largeImagePath = mymerge.getImage(); //WARNING: we presently do not test privacy in merge testing isPrivate = mymerge.getIsPrivate(); virtualNode = nodeModel.newNode(null, null, "", userLocator, smallImagePath, largeImagePath, isPrivate); virtualNode.setIsVirtualProxy(true); if (theType != null) virtualNode.setNodeType(theType); if (sups != null && !sups.isEmpty()) { Iterator<String>itr = sups.iterator(); while (itr.hasNext()) virtualNode.addSuperclassId(itr.next()); } setUnionProperties(virtualNode,mymerge); r = database.putNode(virtualNode, true); if (r.hasError()) result.addErrorString(r.getErrorString()); r = super.wireMerge(virtualNode, mymerge, mergeData, confidence, userLocator); if (r.hasError()) result.addErrorString(r.getErrorString()); String tupleLocator = (String)r.getResultObject(); r = database.putNode(virtualNode, true); if (r.hasError()) result.addErrorString(r.getErrorString()); r = database.putNode(mymerge, true); if (r.hasError()) result.addErrorString(r.getErrorString()); r = super.reWireNodeGraph(mymerge.getLocator(), virtualNode.getLocator(), tupleLocator, credentials); if (r.hasError()) result.addErrorString(r.getErrorString()); } else { //Otherwise, create a new virtual proxy theType = primary.getNodeType(); sups = primary.listSuperclassIds(); smallImagePath = primary.getSmallImage(); largeImagePath = primary.getImage(); //WARNING: we presently do not test privacy in merge testing isPrivate = primary.getIsPrivate(); virtualNode = nodeModel.newNode(null, null, "", userLocator, smallImagePath, largeImagePath, isPrivate); virtualNode.setIsVirtualProxy(true); if (theType != null) virtualNode.setNodeType(theType); if (sups != null && !sups.isEmpty()) { Iterator<String>itr = sups.iterator(); while (itr.hasNext()) virtualNode.addSuperclassId(itr.next()); } setUnionProperties(virtualNode,primary); setUnionProperties(virtualNode,merge); r = database.putNode(virtualNode, true); if (r.hasError()) result.addErrorString(r.getErrorString()); //virtualNode is now constructed //Time to wire them together r = super.wireMerge(virtualNode, primary, mergeData, confidence, userLocator); if (r.hasError()) result.addErrorString(r.getErrorString()); String tupleLocator = (String)r.getResultObject(); //now, save these nodes r = database.putNode(virtualNode, true); if (r.hasError()) result.addErrorString(r.getErrorString()); r = database.putNode(primary, true); if (r.hasError()) result.addErrorString(r.getErrorString()); r = super.reWireNodeGraph(primary.getLocator(), virtualNode.getLocator(), tupleLocator, credentials); if (r.hasError()) result.addErrorString(r.getErrorString()); r = super.wireMerge(virtualNode, merge, mergeData, confidence, userLocator); if (r.hasError()) result.addErrorString(r.getErrorString()); tupleLocator = (String)r.getResultObject(); r = database.putNode(merge, true); if (r.hasError()) result.addErrorString(r.getErrorString()); r = super.reWireNodeGraph(primary.getLocator(), merge.getLocator(), tupleLocator, credentials); if (r.hasError()) result.addErrorString(r.getErrorString()); } result.setResultObject(virtualNode.getLocator()); environment.logDebug("DefaultVirtualizer.createVirtualNode+ "+result.getResultObject()); return result; } }