package io.lumify.twitter; import io.lumify.core.exception.LumifyException; import io.lumify.core.ingest.graphProperty.GraphPropertyWorkData; import io.lumify.core.ingest.graphProperty.GraphPropertyWorker; import io.lumify.core.ingest.graphProperty.GraphPropertyWorkerPrepareData; import io.lumify.core.model.properties.LumifyProperties; import io.lumify.core.util.LumifyLogger; import io.lumify.core.util.LumifyLoggerFactory; import org.securegraph.Element; import org.securegraph.Property; import org.securegraph.Vertex; import org.securegraph.VertexBuilder; import org.securegraph.property.StreamingPropertyValue; import java.io.InputStream; import java.net.URL; import static com.google.common.base.Preconditions.checkNotNull; public class TwitterProfileImageDownloadGraphPropertyWorker extends GraphPropertyWorker { private static final LumifyLogger LOGGER = LumifyLoggerFactory.getLogger(TwitterProfileImageDownloadGraphPropertyWorker.class); private String entityHasImageIri; @Override public void prepare(GraphPropertyWorkerPrepareData workerPrepareData) throws Exception { super.prepare(workerPrepareData); this.entityHasImageIri = getOntologyRepository().getRequiredRelationshipIRIByIntent("entityHasImage"); } @Override public void execute(InputStream in, GraphPropertyWorkData data) throws Exception { String profileImageUrlString = getStringFromPropertyValue(data.getProperty().getValue()); if (profileImageUrlString == null || profileImageUrlString.trim().length() == 0) { return; } String profileImageId = "TWITTER_PROFILE_IMAGE_" + profileImageUrlString; Vertex profileImageVertex = getGraph().getVertex(profileImageId, getAuthorizations()); if (profileImageVertex != null) { return; } LOGGER.debug("downloading: %s", profileImageUrlString); URL profileImageUrl = new URL(profileImageUrlString); InputStream imageData = profileImageUrl.openStream(); try { String userTitle = LumifyProperties.TITLE.getPropertyValue(data.getElement()); StreamingPropertyValue imageValue = new StreamingPropertyValue(imageData, byte[].class); imageValue.searchIndex(false); VertexBuilder v = getGraph().prepareVertex(profileImageId, data.getVisibility()); LumifyProperties.TITLE.setProperty(v, "Profile Image of " + userTitle, data.getVisibility()); LumifyProperties.RAW.setProperty(v, imageValue, data.getVisibility()); LumifyProperties.CONCEPT_TYPE.setProperty(v, TwitterOntology.CONCEPT_TYPE_PROFILE_IMAGE, data.getVisibility()); profileImageVertex = v.save(getAuthorizations()); LOGGER.debug("created vertex: %s", profileImageVertex.getId()); getGraph().addEdge((Vertex) data.getElement(), profileImageVertex, entityHasImageIri, data.getVisibility(), getAuthorizations()); LumifyProperties.ENTITY_IMAGE_VERTEX_ID.setProperty(data.getElement(), profileImageVertex.getId(), data.getVisibility(), getAuthorizations()); getGraph().flush(); } finally { imageData.close(); } } private String getStringFromPropertyValue(Object value) { checkNotNull(value, "property value cannot be null"); if (value instanceof String) { return (String) value; } throw new ClassCastException("Could not convert " + value.getClass().getName() + " to string"); } @Override public boolean isHandled(Element element, Property property) { if (property == null) { return false; } return property.getName().equals(TwitterOntology.PROFILE_IMAGE_URL.getPropertyName()); } }