package ecologylab.bigsemantics.actions;
import ecologylab.bigsemantics.metadata.Metadata;
import ecologylab.bigsemantics.metadata.builtins.Document;
import ecologylab.bigsemantics.metametadata.LinkWith;
import ecologylab.bigsemantics.metametadata.MetaMetadata;
import ecologylab.net.ParsedURL;
import ecologylab.serialization.annotations.simpl_inherit;
import ecologylab.serialization.annotations.simpl_tag;
@simpl_inherit
@simpl_tag(SemanticActionStandardMethods.GET_LINKED_METADATA)
public class GetLinkedMetadataSemanticAction extends SemanticAction
{
@Override
public String getActionName()
{
return SemanticActionStandardMethods.GET_LINKED_METADATA;
}
@Override
public void handleError()
{
// TODO Auto-generated method stub
}
@Override
public Object perform(Object obj)
{
if (sessionScope.isService())
{
return null;
}
if (obj != null && obj instanceof Metadata)
{
Metadata metadata = (Metadata) obj;
String name = getReturnObjectName();
Metadata linkedMetadata = metadata.getLinkedMetadata(name);
if (linkedMetadata == null)
{
if (metadata.getMetaMetadata() instanceof MetaMetadata)
{
MetaMetadata thisMmd = (MetaMetadata) metadata.getMetaMetadata();
LinkWith linkWith = thisMmd.getLinkWiths().get(name);
MetaMetadata linkedMmd = sessionScope.getMetaMetadataRepository().getMMByName(name);
if (linkedMmd != null)
{
String id = linkWith.getById();
ParsedURL purl = linkedMmd.generateUrl(id, metadata.getNaturalIdValue(id));
// the generated purl may not be associated with linkedMmd! e.g. linkedMmd is a
// citeseerx_summary, while generated purl is a citeseerx search.
Document linkedDocument = (Document) sessionScope.getOrConstructDocument(purl);
linkedDocument.setSemanticsSessionScope(sessionScope);
if (linkedDocument != null)
{
linkedDocument.queueDownload();
metadata.pendingSemanticActionHandler = semanticActionHandler;
semanticActionHandler.requestWaiting = true;
}
}
}
}
return linkedMetadata;
}
return null;
}
}