package org.activityinfo.server.endpoint.export; import com.google.appengine.tools.cloudstorage.GcsFileOptions; import com.google.appengine.tools.cloudstorage.GcsFilename; import com.google.appengine.tools.cloudstorage.GcsService; import com.google.appengine.tools.cloudstorage.GcsServiceFactory; import com.google.inject.Inject; import com.google.inject.Singleton; import org.activityinfo.legacy.shared.command.Filter; import org.activityinfo.legacy.shared.command.FilterUrlSerializer; import org.activityinfo.model.auth.AuthenticatedUser; import org.activityinfo.server.authentication.ServerSideAuthProvider; import org.activityinfo.server.command.DispatcherSync; import javax.inject.Provider; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.nio.channels.Channels; @Singleton public class ExportSitesTask extends HttpServlet { public static final String END_POINT = "/tasks/export"; public static final String EXPORT_BUCKET_NAME = "activityinfo-generated"; private Provider<DispatcherSync> dispatcher; private ServerSideAuthProvider authProvider; @Inject public ExportSitesTask(Provider<DispatcherSync> dispatcher, ServerSideAuthProvider authProvider) { this.dispatcher = dispatcher; this.authProvider = authProvider; } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // authenticate this task authProvider.set(new AuthenticatedUser("", Integer.parseInt(req.getParameter("userId")), req.getParameter("userEmail"))); // create the workbook Filter filter = FilterUrlSerializer.fromQueryParameter(req.getParameter("filter")); SiteExporter export = new SiteExporter(dispatcher.get()).buildExcelWorkbook(filter); // Save to GCS GcsService gcs = GcsServiceFactory.createGcsService(); GcsFileOptions fileOptions = new GcsFileOptions.Builder() .mimeType("application/vnd.ms-excel") .contentDisposition("attachment; filename=" + req.getParameter("filename")) .build(); GcsFilename fileName = new GcsFilename(EXPORT_BUCKET_NAME, req.getParameter("exportId")); try(OutputStream outputStream = Channels.newOutputStream(gcs.createOrReplace(fileName, fileOptions))) { export.getBook().write(outputStream); } } }