/** * */ package org.topicquests.topicmap.json.merge; import java.util.*; import org.topicquests.common.api.IResult; import org.topicquests.model.api.node.INode; import org.topicquests.topicmap.json.model.JSONTopicmapEnvironment; import org.topicquests.topicmap.json.model.api.IMergeResultsListener; import org.topicquests.topicmap.json.model.api.IVirtualizer; /** * @author park * */ public class VirtualizerHandler { private JSONTopicmapEnvironment environment; private IVirtualizer virtualizer; private Worker worker; /** * */ public VirtualizerHandler(JSONTopicmapEnvironment env) { environment = env; virtualizer = environment.getVirtualizer(); worker = new Worker(); worker.start(); } public void performMerge(INode primary, INode merge, Map<String,Double> mergeData, double confidence, String userLocator, IMergeResultsListener listener) { worker.addWorkerObject(new WorkerObject(primary,merge,mergeData, confidence,userLocator,listener)); } public void shutDown() { if (worker != null) worker.shutDown(); } class WorkerObject { public INode primary, merge; public Map<String,Double>mergeData; public double confidence; public String userLocator; public IMergeResultsListener listener; public WorkerObject(INode primary, INode merge, Map<String,Double> mergeData, double confidence, String userLocator,IMergeResultsListener listener) { this.primary = primary; this.merge = merge; this.mergeData = mergeData; this.confidence = confidence; this.userLocator = userLocator; this.listener = listener; } } class Worker extends Thread { private List<WorkerObject>objects = new ArrayList<WorkerObject>(); private boolean isRunning = true; public void addWorkerObject(WorkerObject o) { synchronized(objects) { objects.add(o); objects.notify(); } } public void shutDown() { synchronized(objects) { isRunning = false; objects.notify(); } } public void run() { WorkerObject theO = null; while (isRunning) { synchronized(objects) { if (objects.isEmpty()) { try { objects.wait(); } catch (Exception e) {} } if (isRunning && !objects.isEmpty()) theO = objects.remove(0); } if (isRunning && theO != null) { doIt(theO); theO = null; } } } void doIt(WorkerObject wo) { IResult r = virtualizer.createVirtualNode(wo.primary, wo.merge, wo.mergeData, wo.confidence, wo.userLocator); if (wo.listener != null) { if (r.getResultObject() != null) wo.listener.acceptMergeResults((String)r.getResultObject(), wo.primary.getLocator(), wo.merge.getLocator(), r.getErrorString()); } } } }