package org.nightlabs.jfire.issuetracking.ui.issuelink;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.jdo.JDOHelper;
import org.nightlabs.jdo.ObjectID;
import org.nightlabs.jfire.issue.IssueLink;
import org.nightlabs.jfire.issuetracking.ui.resource.Messages;
import org.nightlabs.progress.ProgressMonitor;
import org.nightlabs.progress.SubProgressMonitor;
public abstract class AbstractIssueLinkHandler <LinkedObjectID extends ObjectID, LinkedObject>
implements IssueLinkHandler<LinkedObjectID, LinkedObject>
{
@SuppressWarnings("unchecked")
@Override
public Map<IssueLink, LinkedObject> getLinkedObjects(Set<IssueLink> issueLinks, ProgressMonitor monitor)
{
monitor.beginTask(Messages.getString("org.nightlabs.jfire.issuetracking.ui.issuelink.AbstractIssueLinkHandler.monitor.loadingObjectsLinked.text"), 100); //$NON-NLS-1$
Set<LinkedObjectID> linkedObjectIDs = new HashSet<LinkedObjectID>(issueLinks.size());
for (IssueLink issueLink : issueLinks)
linkedObjectIDs.add((LinkedObjectID) issueLink.getLinkedObjectID());
monitor.worked(10);
Map<IssueLink, LinkedObject> linkedObjectMap = new HashMap<IssueLink, LinkedObject>(issueLinks.size());
Collection<? extends LinkedObject> linkedObjects = _getLinkedObjects(
issueLinks,
linkedObjectIDs,
new SubProgressMonitor(monitor, 80));
if (linkedObjects == null) {
for (IssueLink issueLink : issueLinks)
linkedObjectMap.put(issueLink, null);
}
else {
Map<ObjectID, LinkedObject> objectID2objectMap = new HashMap<ObjectID, LinkedObject>(linkedObjects.size());
for (LinkedObject lo : linkedObjects)
objectID2objectMap.put((ObjectID) JDOHelper.getObjectId(lo), lo);
for (IssueLink issueLink : issueLinks) {
LinkedObject lo = objectID2objectMap.get(issueLink.getLinkedObjectID());
if (lo == null)
throw new IllegalStateException("Object missing in result set! " + issueLink.getLinkedObjectID()); //$NON-NLS-1$
linkedObjectMap.put(issueLink, lo);
}
}
monitor.worked(10);
monitor.done();
return linkedObjectMap;
}
protected abstract Collection<LinkedObject> _getLinkedObjects(
Set<IssueLink> issueLinks,
Set<LinkedObjectID> linkedObjectIDs,
ProgressMonitor monitor);
}