package eu.europeana.cloud.service.dps.storm.io; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.rits.cloning.Cloner; import eu.europeana.cloud.common.model.File; import eu.europeana.cloud.common.model.Representation; import eu.europeana.cloud.mcs.driver.FileServiceClient; import eu.europeana.cloud.service.dps.PluginParameterKeys; import eu.europeana.cloud.service.dps.storm.AbstractDpsBolt; import eu.europeana.cloud.service.dps.storm.StormTaskTuple; import org.apache.storm.task.OutputCollector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author krystian. */ public class ReadRepresentationBolt extends AbstractDpsBolt { private static final Logger LOGGER = LoggerFactory.getLogger(ReadRepresentationBolt.class); private final String ecloudMcsAddress; public ReadRepresentationBolt(String ecloudMcsAddress) { this.ecloudMcsAddress = ecloudMcsAddress; } /** * Should be used only on tests. */ public static ReadRepresentationBolt getTestInstance(String ecloudMcsAddress, OutputCollector outputCollector ) { ReadRepresentationBolt instance = new ReadRepresentationBolt(ecloudMcsAddress); instance.outputCollector = outputCollector; return instance; } @Override public void prepare() { } @Override public void execute(StormTaskTuple t) { readRepresentationBolt(t); } private void readRepresentationBolt(StormTaskTuple t) { FileServiceClient fileClient = new FileServiceClient(ecloudMcsAddress); final String authorizationHeader = t.getParameter(PluginParameterKeys.AUTHORIZATION_HEADER); final String jsonRepresentation = t.getParameter(PluginParameterKeys.REPRESENTATION); t.getParameters().remove(PluginParameterKeys.REPRESENTATION); final Representation representation = new Gson().fromJson(jsonRepresentation, new TypeToken<Representation>() { }.getType()); fileClient.useAuthorizationHeader(authorizationHeader); if (representation != null) { for (File file : representation.getFiles()) { final String fileUrl = fileClient.getFileUri(representation.getCloudId(), representation.getRepresentationName(), representation.getVersion(), file.getFileName()).toString(); StormTaskTuple stormTaskTuple = buildNextStormTuple(t, fileUrl); outputCollector.emit(inputTuple, stormTaskTuple.toStormTuple()); } } else { LOGGER.warn("Problem while reading representation"); emitDropNotification(t.getTaskId(), null, "Problem while reading representation", ""); } } private StormTaskTuple buildNextStormTuple(StormTaskTuple t, String fileUrl) { StormTaskTuple stormTaskTuple = new Cloner().deepClone(t); stormTaskTuple.getParameters().put(PluginParameterKeys.DPS_TASK_INPUT_DATA, fileUrl); return stormTaskTuple; } }