package uk.ac.ebi.fg.myequivalents.webservices.server; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.ws.rs.Consumes; import javax.ws.rs.FormParam; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import uk.ac.ebi.fg.myequivalents.managers.interfaces.BackupManager; import uk.ac.ebi.fg.myequivalents.resources.Resources; import com.sun.jersey.multipart.FormDataParam; /** * Server side for the web sevice that implements {@link BackupManager}. * * @author brandizi * <dl><dt>Date:</dt><dd>10 Mar 2015</dd> * */ @Path ( "/backup" ) public class BackupWebService { protected final Logger log = LoggerFactory.getLogger ( this.getClass () ); @POST @Path( "/dump" ) @Produces ( MediaType.APPLICATION_XML ) public Response dump ( @FormParam ( "login" ) final String email, @FormParam ( "login-secret" ) final String apiPassword, @FormParam ( "offset" ) final Integer offset, @FormParam ( "limit" ) final Integer limit ) { StreamingOutput stream = new StreamingOutput() { @Override public void write ( OutputStream out ) throws IOException, WebApplicationException { BackupManager bkpMgr = getBackupManager ( email, apiPassword ); int result = bkpMgr.dump ( out, offset, limit ); out.write ( String.format ( "<!-- dumped-items-count = %d -->\n", result ).getBytes () ); out.close (); } }; return Response.ok ( stream ).build (); } /** * Code taken from * <a href = 'http://neopatel.blogspot.de/2011/04/jersey-posting-multipart-data.html'>this post</a>. * */ @POST @Path( "/upload" ) @Produces ( MediaType.APPLICATION_XML ) @Consumes ( MediaType.MULTIPART_FORM_DATA ) public String upload ( @FormDataParam ( "login" ) String email, @FormDataParam ( "login-secret" ) String apiPassword, @FormDataParam ( "dump-xml" ) InputStream dumpXmlIn ) { BackupManager bkpMgr = getBackupManager ( email, apiPassword ); return Integer.toString ( bkpMgr.upload ( dumpXmlIn ) ); } /** * TODO: AOP */ private BackupManager getBackupManager ( String authEmail, String authApiPassword ) { log.trace ( "Returning backup manager for the user {}, {}", authEmail, authApiPassword == null ? null: "***" ); return Resources.getInstance ().getMyEqManagerFactory ().newBackupManager ( authEmail, authApiPassword ); } }