/** * */ package ecologylab.bigsemantics.metadata.builtins; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import ecologylab.bigsemantics.collecting.DownloadStatus; import ecologylab.bigsemantics.metadata.Metadata; import ecologylab.bigsemantics.metadata.mm_name; import ecologylab.bigsemantics.metadata.builtins.declarations.ClippingDeclaration; import ecologylab.bigsemantics.metametadata.MetaMetadataCompositeField; import ecologylab.net.ParsedURL; import ecologylab.serialization.TranslationContext; import ecologylab.serialization.annotations.simpl_collection; import ecologylab.serialization.annotations.simpl_inherit; import ecologylab.serialization.annotations.simpl_scope; import ecologylab.serialization.annotations.simpl_wrap; /** * Mix-in for adding the context of a clipping to the description of a Document. * Example: Image, Video. * * @author andruid */ @simpl_inherit public class Clipping<CM extends Metadata> extends ClippingDeclaration<CM> { private DocumentClosure outlinkClosure; protected static int numWithCaption; /** * Total number of images we have created within this session */ static int numConstructed; public Clipping() { numConstructed++; } public Clipping(MetaMetadataCompositeField metaMetadata) { super(metaMetadata); // NOTE is numConstructed++ missing? -- yin, 1/24/2012 } public Clipping(MetaMetadataCompositeField metaMetadata, Document source) { this(metaMetadata); this.setSourceDoc(source); } public Clipping(MetaMetadataCompositeField metaMetadata, Document source, Document outlink, String context) { this(metaMetadata, source); initClipping(this, outlink, context); } public static void initClipping(Clipping clipping, Document outlink, String context) { if (outlink != null) { if (outlink.getDownloadStatus() == DownloadStatus.DOWNLOAD_DONE) { //clipping.addToOutlinks(outlink); } else { DocumentClosure outlinkClosure = outlink.getOrConstructClosure(); clipping.outlinkClosure = outlinkClosure; //clipping.addToOutlinks(outlinkClosure.getDocument()); } } if (context != null) clipping.setContext(context); } public static void initMediaClipping( Clipping mediaClipping, Metadata clippedMedia, Document source, Document outlink, String caption, String context) { mediaClipping.setSourceDoc(source); Clipping.initClipping(mediaClipping, outlink, context); if (caption != null) mediaClipping.setCaption(caption); mediaClipping.setMedia(clippedMedia); } @Override public void serializationPreHook(TranslationContext translationContext) { //if (outlinkClosure != null && !outlinkClosure.isRecycled()) // addToOutlinks(outlinkClosure.getDocument()); } /** * used for deriving statistics that track how many images * on the web have alt text. * @return */ public static int hasCaptionPercent() { return (int) (100.0f * numWithCaption / numConstructed); } public boolean isNullXpath() { return getXpathMetadata() == null || getXpathMetadata().getValue() == null; } /** * @return the outlinkContainer */ public DocumentClosure getOutlinkClosure() { return outlinkClosure; } /** * @return the numWithCaption */ public static int getNumWithCaption() { return numWithCaption; } /** * @return the numConstructed */ public static int getNumConstructed() { return numConstructed; } /** * Called to free resources associated with this MediaElement. Removes references to this from * the associated <code>Container</code>, as well as freeing resources directly associated (such * as pixel buffers). * <p> * Checks to make sure that element is not on screen before it does anything. Then, calls * {@link #doRecycle() doRecycle()}. That is the method that really frees resources. It is the * one that derived classes need to override. This is why the routine is being declared final. */ public final synchronized void recycle(boolean unconditional, HashSet<Metadata> visitedMetadata) { if (getSourceDoc() != null) { getSourceDoc().recycle(); setSourceDoc(null); } /*if (getOutlinks() != null) { getOutlinks().clear(); setOutlinks(null); }*/ outlinkClosure = null; super.recycle(visitedMetadata); } @Override public boolean hasLocation() { return getSourceDoc() != null && getSourceDoc().hasLocation(); } @Override public ParsedURL getLocation() { return getSourceDoc() != null ? getSourceDoc().getLocation() : null; } @Override public boolean isClipping() { return true; } }