package io.lumify.core.ingest.graphProperty; import io.lumify.core.bootstrap.InjectHelper; import io.lumify.core.exception.LumifyException; import io.lumify.core.model.audit.AuditAction; import io.lumify.core.model.properties.LumifyProperties; import io.lumify.core.util.LumifyLogger; import io.lumify.core.util.LumifyLoggerFactory; import io.lumify.web.clientapi.model.VisibilityJson; import org.securegraph.Element; import org.securegraph.Metadata; import org.securegraph.Property; import org.securegraph.Vertex; import org.securegraph.mutation.ExistingElementMutation; import java.io.InputStream; import java.util.Collection; public abstract class MimeTypeGraphPropertyWorker extends GraphPropertyWorker { private static final LumifyLogger LOGGER = LumifyLoggerFactory.getLogger(MimeTypeGraphPropertyWorker.class); private Collection<PostMimeTypeWorker> postMimeTypeWorkers; @Override public void prepare(GraphPropertyWorkerPrepareData workerPrepareData) throws Exception { super.prepare(workerPrepareData); postMimeTypeWorkers = InjectHelper.getInjectedServices(PostMimeTypeWorker.class, getConfiguration()); for (PostMimeTypeWorker postMimeTypeWorker : postMimeTypeWorkers) { try { postMimeTypeWorker.prepare(workerPrepareData); } catch (Exception ex) { throw new LumifyException("Could not prepare post mime type worker " + postMimeTypeWorker.getClass().getName(), ex); } } } @Override public boolean isHandled(Element element, Property property) { if (property == null) { return false; } if (!property.getName().equals(LumifyProperties.RAW.getPropertyName())) { return false; } if (LumifyProperties.MIME_TYPE.getPropertyValue(element) != null) { return false; } return true; } @Override public void execute(InputStream in, GraphPropertyWorkData data) throws Exception { String fileName = LumifyProperties.FILE_NAME.getPropertyValue(data.getElement()); String mimeType = getMimeType(in, fileName); if (mimeType == null) { return; } ExistingElementMutation<Vertex> m = ((Vertex) data.getElement()).prepareMutation(); Metadata mimeTypeMetadata = data.createPropertyMetadata(); VisibilityJson visibilityJson = LumifyProperties.VISIBILITY_JSON.getPropertyValue(data.getElement()); if (visibilityJson != null) { LumifyProperties.VISIBILITY_JSON.setMetadata(mimeTypeMetadata, visibilityJson, getVisibilityTranslator().getDefaultVisibility()); } LumifyProperties.MIME_TYPE.setProperty(m, mimeType, mimeTypeMetadata, data.getVisibility()); m.setPropertyMetadata(data.getProperty(), LumifyProperties.MIME_TYPE.getPropertyName(), mimeType, getVisibilityTranslator().getDefaultVisibility()); Vertex v = m.save(getAuthorizations()); getAuditRepository().auditVertexElementMutation(AuditAction.UPDATE, m, v, this.getClass().getName(), getUser(), data.getVisibility()); getAuditRepository().auditAnalyzedBy(AuditAction.ANALYZED_BY, v, getClass().getSimpleName(), getUser(), v.getVisibility()); getGraph().flush(); runPostMimeTypeWorkers(mimeType, data); getWorkQueueRepository().pushGraphPropertyQueue(data.getElement(), data.getProperty(), data.getWorkspaceId(), data.getVisibilitySource()); } private void runPostMimeTypeWorkers(String mimeType, GraphPropertyWorkData data) { for (PostMimeTypeWorker postMimeTypeWorker : postMimeTypeWorkers) { try { LOGGER.debug("running PostMimeTypeWorker: %s on element: %s, mimeType: %s", postMimeTypeWorker.getClass().getName(), data.getElement().getId(), mimeType); postMimeTypeWorker.executeAndCleanup(mimeType, data, getAuthorizations()); } catch (Exception ex) { throw new LumifyException("Failed running PostMimeTypeWorker " + postMimeTypeWorker.getClass().getName(), ex); } } if (postMimeTypeWorkers.size() > 0) { getGraph().flush(); } } protected abstract String getMimeType(InputStream in, String fileName) throws Exception; }