package org.jvalue.ods.rest;
import com.google.inject.Inject;
import org.glassfish.jersey.media.multipart.FormDataBodyPart;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;
import org.jvalue.commons.auth.RestrictedTo;
import org.jvalue.commons.auth.Role;
import org.jvalue.commons.auth.User;
import org.jvalue.commons.rest.RestUtils;
import org.jvalue.ods.api.processors.PluginMetaData;
import org.jvalue.ods.api.sources.DataSource;
import org.jvalue.ods.data.DataSourceManager;
import org.jvalue.ods.processor.plugin.PluginMetaDataManager;
import java.io.InputStream;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
@Path(AbstractApi.BASE_URL + "/{sourceId}/plugins")
@Produces(MediaType.APPLICATION_JSON)
public final class PluginApi extends AbstractApi {
private static final String
TYPE_X_JAVA_ARCHIVE = "application/x-java-archive",
TYPE_JAVA_ARCHIVE = "application/java-archive";
private final DataSourceManager sourceManager;
private final PluginMetaDataManager pluginManager;
@Inject
PluginApi(
PluginMetaDataManager pluginManager,
DataSourceManager sourceManager) {
this.pluginManager = pluginManager;
this.sourceManager = sourceManager;
}
@PUT
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("/{pluginId}")
public PluginMetaData addPlugin(
@RestrictedTo(Role.ADMIN) User user,
@PathParam("sourceId") String sourceId,
@PathParam("pluginId") String pluginId,
@FormDataParam("file") InputStream fileInputStream,
@FormDataParam("file") FormDataContentDisposition contentDisposition,
@FormDataParam("file") FormDataBodyPart bodyPart) {
DataSource source = sourceManager.findBySourceId(sourceId);
if (pluginManager.contains(source, pluginId)) throw RestUtils.createJsonFormattedException("plugin with id " + pluginId + " already exists", 409);
String contentType = bodyPart.getMediaType().toString();
System.out.println("contentType = " + contentType);
if (!contentType.equals(TYPE_X_JAVA_ARCHIVE) && !contentType.equals(TYPE_JAVA_ARCHIVE))
throw RestUtils.createJsonFormattedException("content type must be " + TYPE_X_JAVA_ARCHIVE + " or " + TYPE_JAVA_ARCHIVE, 415);
PluginMetaData metaData = new PluginMetaData(pluginId, "someDummyAuthorForNow");
pluginManager.addFile(source, metaData, fileInputStream, contentType);
return metaData;
}
@GET
public List<PluginMetaData> getAllPlugins(
@PathParam("sourceId") String sourceId) {
return pluginManager.getAll(sourceManager.findBySourceId(sourceId));
}
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.MULTIPART_FORM_DATA})
@Path("/{pluginId}")
public Response getPlugin(
@PathParam("sourceId") String sourceId,
@PathParam("pluginId") String pluginId,
@QueryParam("download") boolean download) {
DataSource source = sourceManager.findBySourceId(sourceId);
PluginMetaData metaData = pluginManager.get(source, pluginId);
if (!download) return Response.ok(metaData, MediaType.APPLICATION_JSON).build();
else {
InputStream stream = pluginManager.getFile(source, metaData);
return Response.ok(stream, MediaType.MULTIPART_FORM_DATA_TYPE).header("Content-Disposition", "attachment; filename=\"" + pluginId + "\"").build();
}
}
@DELETE
@Path("/{pluginId}")
public void deletePlugin(
@RestrictedTo(Role.ADMIN) User user,
@PathParam("sourceId") String sourceId,
@PathParam("pluginId") String pluginId) {
DataSource source = sourceManager.findBySourceId(sourceId);
pluginManager.remove(source, sourceManager.getDataRepository(source), pluginManager.get(source, pluginId));
}
}