/**
*
*/
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.node.INode;
import org.topicquests.model.api.node.INodeModel;
import org.topicquests.model.api.ITicket;
import org.topicquests.persist.json.api.IJSONDocStoreModel;
import org.topicquests.topicmap.json.model.api.IJSONTopicDataProvider;
import org.topicquests.topicmap.json.model.api.ISameLabelListener;
import org.topicquests.topicmap.json.model.JSONTopicmapEnvironment;
/**
* @author park
*
*/
public class SameLabelMergeHandler {
private JSONTopicmapEnvironment environment;
private IJSONTopicDataProvider database;
private IJSONDocStoreModel jsonModel;
private INodeModel nodeModel;
private ITicket credentials;
private Worker worker;
private VirtualizerHandler virtualizerHandler;
/**
*
*/
public SameLabelMergeHandler(JSONTopicmapEnvironment env) {
environment = env;
database = (IJSONTopicDataProvider)environment.getDataProvider();
nodeModel = database.getNodeModel();
credentials = new TicketPojo(ITopicQuestsOntology.SYSTEM_USER);
virtualizerHandler = environment.getVirtualizerHandler();
worker = new Worker();
}
public void studySameLabel(String nodeLocatorA, String nodeLocatorB, ISameLabelListener l) {
worker.addHit(new WorkerObject(nodeLocatorA, nodeLocatorB, l));
}
public void shutDown() {
if (worker != null)
worker.shutDown();
}
class WorkerObject {
public String locatorA;
public String locatorB;
public ISameLabelListener listener;
public WorkerObject(String a, String b, ISameLabelListener l) {
locatorA = a;
locatorB = b;
listener = l;
}
}
class Worker extends Thread {
private List<WorkerObject>hits;
private boolean isRunning = true;
public Worker() {
hits = new ArrayList<WorkerObject>();
this.start();
}
public void addHit(WorkerObject o) {
synchronized(hits) {
hits.add(o);
hits.notify();
}
}
public void shutDown() {
synchronized(hits) {
isRunning = false;
hits.notify();
}
}
public void run() {
WorkerObject o = null;
while(isRunning) {
synchronized(hits) {
if (hits.isEmpty()) {
try {
hits.wait();
} catch (Exception e) {}
}
if (isRunning & !hits.isEmpty())
o = hits.remove(0);
}
if (isRunning && o != null) {
studySameLableNodes(o);
o = null;
}
}
}
}
/**
* Study two {@link INode} objects with same labels. If a new
* <em>VirtualNode</em> is created, return its locator in the
* output PLUS the two original locators space-separated in resultA
* @param nodeLocatorA
* @param nodeLocatorB
* @return
*/
public void studySameLableNodes(WorkerObject o) {
String nodeLocatorA = o.locatorA;
String nodeLocatorB = o.locatorA;
String virtualNodeLocator = null;
IResult result = new ResultPojo();
IResult rA = database.getNode(nodeLocatorA, credentials);
if (rA.hasError())
result.addErrorString(rA.getErrorString());
IResult rB = database.getNode(nodeLocatorB, credentials);
if (rB.hasError())
result.addErrorString(rB.getErrorString());
INode nodeA = (INode)rA.getResultObject();
INode nodeB = (INode)rB.getResultObject();
String typeA, typeB;
//sanity
if (nodeA != null && nodeB != null) {
IResult rC;
//NOW, sort out if these are somehow the same subject
typeA = nodeA.getNodeType();
typeB = nodeB.getNodeType();
if (typeA.equals(typeB)) {
rC = studySameTypeNodes(nodeA, nodeB);
if (rC.hasError())
result.addErrorString(rC.getErrorString());
virtualNodeLocator = (String)rC.getResultObject();
} else {
//TODO
}
}
if (virtualNodeLocator != null)
o.listener.acceptSameLabelResults(virtualNodeLocator, nodeLocatorA, nodeLocatorB, result.getErrorString());
}
//////////////////////////////////////
//NOTES
// If instanceOf OntologyClassType
// If memberOf same Ontology
// Then less likely
// Else...
//
//////////////////////////////////////
/**
* Returns a virtual node locator if created
* @param nodeA
* @param nodeB
* @return
*/
IResult studySameTypeNodes(INode nodeA, INode nodeB) {
IResult result = new ResultPojo();
//TODO
return result;
}
}