From aa2e6ffa9890a4554ac0998f64a13314e05aa0b2 Mon Sep 17 00:00:00 2001 From: Michael Clay Date: Wed, 16 Apr 2014 13:34:53 +0200 Subject: [PATCH] RTGOV-402 --- .../rtgov/devsvr/RTGovUIDevServer.java | 4 ++ .../impl/SituationsProviderServiceImpl.java | 6 ++ .../ui/client/local/pages/SituationsPage.java | 20 ++++++ .../services/ISituationsServiceImpl.java | 8 +++ .../impl/MockSituationsServiceImpl.java | 18 +++++ .../servlet/SituationsExportServlet.java | 66 +++++++++++++++++++ .../src/main/webapp/WEB-INF/web.xml | 9 +++ .../rtgov/ui/provider/SituationsProvider.java | 13 +++- .../situations/RTGovSituationsProvider.java | 27 ++++++++ 9 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 overlord-rtgov-ui-war/src/main/java/org/overlord/rtgov/ui/server/servlet/SituationsExportServlet.java diff --git a/overlord-rtgov-ui-dev-server/src/main/java/org/overlord/rtgov/devsvr/RTGovUIDevServer.java b/overlord-rtgov-ui-dev-server/src/main/java/org/overlord/rtgov/devsvr/RTGovUIDevServer.java index 3b0cbb3..ddf14b8 100644 --- a/overlord-rtgov-ui-dev-server/src/main/java/org/overlord/rtgov/devsvr/RTGovUIDevServer.java +++ b/overlord-rtgov-ui-dev-server/src/main/java/org/overlord/rtgov/devsvr/RTGovUIDevServer.java @@ -43,6 +43,7 @@ import org.overlord.commons.gwt.server.filters.ResourceCacheControlFilter; import org.overlord.commons.ui.header.OverlordHeaderDataJS; import org.overlord.rtgov.ui.server.RtgovUI; +import org.overlord.rtgov.ui.server.servlet.SituationsExportServlet; import com.google.common.collect.Lists; @@ -156,6 +157,9 @@ protected void addModulesToJetty(DevServerEnvironment environment, ContextHandle for (String fileType : fileTypes) { rtgovUI.addServlet(resources, "*." + fileType); } + ServletHolder servletHolder = new ServletHolder(SituationsExportServlet.class); + servletHolder.setInitOrder(2); + rtgovUI.addServlet(servletHolder, "/situations/export"); rtgovUI.setSecurityHandler(createSecurityHandler()); handlers.addHandler(rtgovUI); diff --git a/overlord-rtgov-ui-war-eap61/src/main/java/org/overlord/rtgov/ui/server/services/impl/SituationsProviderServiceImpl.java b/overlord-rtgov-ui-war-eap61/src/main/java/org/overlord/rtgov/ui/server/services/impl/SituationsProviderServiceImpl.java index 24dac60..f862bd4 100644 --- a/overlord-rtgov-ui-war-eap61/src/main/java/org/overlord/rtgov/ui/server/services/impl/SituationsProviderServiceImpl.java +++ b/overlord-rtgov-ui-war-eap61/src/main/java/org/overlord/rtgov/ui/server/services/impl/SituationsProviderServiceImpl.java @@ -15,6 +15,7 @@ */ package org.overlord.rtgov.ui.server.services.impl; +import java.io.OutputStream; import java.util.Collections; import javax.enterprise.context.ApplicationScoped; @@ -192,4 +193,9 @@ public void updateResolutionState(String situationId, ResolutionState resolutionState) throws UiException { _provider.updateResolutionState(situationId, resolutionState); } + + @Override + public void export(SituationsFilterBean situationsFilterBean, OutputStream outputStream) { + _provider.export(situationsFilterBean, outputStream); + } } diff --git a/overlord-rtgov-ui-war/src/main/java/org/overlord/rtgov/ui/client/local/pages/SituationsPage.java b/overlord-rtgov-ui-war/src/main/java/org/overlord/rtgov/ui/client/local/pages/SituationsPage.java index 26d76a5..e5536d2 100644 --- a/overlord-rtgov-ui-war/src/main/java/org/overlord/rtgov/ui/client/local/pages/SituationsPage.java +++ b/overlord-rtgov-ui-war/src/main/java/org/overlord/rtgov/ui/client/local/pages/SituationsPage.java @@ -19,6 +19,8 @@ import javax.enterprise.context.Dependent; import javax.inject.Inject; +import org.jboss.errai.bus.client.ErraiBus; +import org.jboss.errai.bus.client.api.base.MessageBuilder; import org.jboss.errai.bus.client.api.messaging.Message; import org.jboss.errai.bus.client.api.messaging.MessageCallback; import org.jboss.errai.ui.nav.client.local.Page; @@ -55,6 +57,8 @@ import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; +import com.google.gwt.http.client.UrlBuilder; +import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Button; @@ -89,6 +93,10 @@ public class SituationsPage extends AbstractPage { @Inject @DataField protected Button retrySituations; + @Inject + @DataField + protected Button exportSituations; + private boolean applyActionToFilteredRowsOnly = true; @Inject @DataField("btn-refresh") @@ -360,4 +368,16 @@ public void doOnComplete(RpcResult result) { }); } + @EventHandler("exportSituations") + public void onExportClick(ClickEvent event) { + SituationsFilterBean situationsFilterBean = applyActionToFilteredRowsOnly ? filtersPanel.getValue() + : new SituationsFilterBean(); + String exportKey = String.valueOf(System.currentTimeMillis()); + MessageBuilder.createMessage().toSubject("situations/export").with("exportKey", exportKey) + .with("exportFilter", situationsFilterBean).noErrorHandling().sendNowWith(ErraiBus.get()); + UrlBuilder urlBuilder = Window.Location.createUrlBuilder(); + String exportLocation = urlBuilder.setPath("rtgov-ui/situations/export") + .setParameter("_k", exportKey).buildString(); + Window.open(exportLocation, "_blank", ""); + } } diff --git a/overlord-rtgov-ui-war/src/main/java/org/overlord/rtgov/ui/server/services/ISituationsServiceImpl.java b/overlord-rtgov-ui-war/src/main/java/org/overlord/rtgov/ui/server/services/ISituationsServiceImpl.java index 8faaf6f..280b272 100644 --- a/overlord-rtgov-ui-war/src/main/java/org/overlord/rtgov/ui/server/services/ISituationsServiceImpl.java +++ b/overlord-rtgov-ui-war/src/main/java/org/overlord/rtgov/ui/server/services/ISituationsServiceImpl.java @@ -15,6 +15,8 @@ */ package org.overlord.rtgov.ui.server.services; +import java.io.OutputStream; + import org.jboss.errai.bus.server.annotations.Remote; import org.overlord.rtgov.ui.client.model.BatchRetryResult; import org.overlord.rtgov.ui.client.model.ResolutionState; @@ -86,4 +88,10 @@ public SituationResultSetBean search(SituationsFilterBean filters, int page, Str */ BatchRetryResult resubmit(SituationsFilterBean situationsFilterBean) throws UiException; + /** + * Export the content of all message's matching the given filter criteria. + * @param situationsFilterBean + */ + void export(SituationsFilterBean situationsFilterBean, OutputStream outputStream); + } diff --git a/overlord-rtgov-ui-war/src/main/java/org/overlord/rtgov/ui/server/services/impl/MockSituationsServiceImpl.java b/overlord-rtgov-ui-war/src/main/java/org/overlord/rtgov/ui/server/services/impl/MockSituationsServiceImpl.java index 90571b2..10410e4 100644 --- a/overlord-rtgov-ui-war/src/main/java/org/overlord/rtgov/ui/server/services/impl/MockSituationsServiceImpl.java +++ b/overlord-rtgov-ui-war/src/main/java/org/overlord/rtgov/ui/server/services/impl/MockSituationsServiceImpl.java @@ -23,6 +23,8 @@ import static java.lang.System.currentTimeMillis; import static org.overlord.rtgov.ui.client.model.ResolutionState.RESOLVED; +import java.io.OutputStream; +import java.io.PrintWriter; import java.util.Comparator; import java.util.Date; import java.util.HashMap; @@ -403,5 +405,21 @@ public BatchRetryResult resubmit(SituationsFilterBean situationsFilterBean) { return batchRetryResult; } + @Override + public void export(SituationsFilterBean situationsFilterBean, OutputStream outputStream) { + String situationId = idToSituation.keySet().iterator().next(); + PrintWriter printWriter = new PrintWriter(outputStream); + try { + SituationBean situationBean = get(situationId); + printWriter.println(situationBean.getMessage().getContent()); + } catch (UiException e) { + e.printStackTrace(); + } finally { + if (null != printWriter) { + printWriter.close(); + } + } + } + } diff --git a/overlord-rtgov-ui-war/src/main/java/org/overlord/rtgov/ui/server/servlet/SituationsExportServlet.java b/overlord-rtgov-ui-war/src/main/java/org/overlord/rtgov/ui/server/servlet/SituationsExportServlet.java new file mode 100644 index 0000000..1c52e7f --- /dev/null +++ b/overlord-rtgov-ui-war/src/main/java/org/overlord/rtgov/ui/server/servlet/SituationsExportServlet.java @@ -0,0 +1,66 @@ +package org.overlord.rtgov.ui.server.servlet; + +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.concurrent.TimeUnit; + +import javax.inject.Inject; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.jboss.errai.bus.client.api.messaging.Message; +import org.jboss.errai.bus.client.api.messaging.MessageBus; +import org.jboss.errai.bus.client.api.messaging.MessageCallback; +import org.overlord.rtgov.ui.client.model.SituationsFilterBean; +import org.overlord.rtgov.ui.server.services.ISituationsServiceImpl; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; + +/** + * Used to export the message content of filtered Situations. + */ +public class SituationsExportServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + private static final String DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss"; + @Inject + private ISituationsServiceImpl situationsServiceImpl; + private MessageBus messageBus; + private Cache exportFilterCache = CacheBuilder.newBuilder() + .expireAfterWrite(1, TimeUnit.MINUTES).expireAfterAccess(1, TimeUnit.SECONDS) + . build(); + + /** + * @param messageBus + * the messageBus to set + */ + @Inject + public void setMessageBus(MessageBus messageBus) { + this.messageBus = messageBus; + this.messageBus.subscribe("situations/export", new MessageCallback() { + @Override + public void callback(Message message) { + String exportKey = message.get(String.class, "exportKey"); + SituationsFilterBean exportFilter = message.get(SituationsFilterBean.class, "exportFilter"); + exportFilterCache.put(exportKey, exportFilter); + } + }); + } + + @Override + protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) + throws ServletException, IOException { + httpServletResponse.setContentType("text/plain"); + httpServletResponse.setHeader("Content-Disposition", "attachment; filename=situations_export_" + + new SimpleDateFormat(DATE_TIME_FORMAT).format(new Date()) + ".txt"); + String exportKey = httpServletRequest.getParameter("_k"); + SituationsFilterBean situationsFilterBean = exportFilterCache.getIfPresent(exportKey); + if (situationsFilterBean != null) { + situationsServiceImpl.export(situationsFilterBean, httpServletResponse.getOutputStream()); + } + } + +} diff --git a/overlord-rtgov-ui-war/src/main/webapp/WEB-INF/web.xml b/overlord-rtgov-ui-war/src/main/webapp/WEB-INF/web.xml index b9e24ec..0749fab 100644 --- a/overlord-rtgov-ui-war/src/main/webapp/WEB-INF/web.xml +++ b/overlord-rtgov-ui-war/src/main/webapp/WEB-INF/web.xml @@ -50,6 +50,15 @@ ErraiServlet *.erraiBus + + SituationsExportServlet + org.overlord.rtgov.ui.server.servlet.SituationsExportServlet + 2 + + + SituationsExportServlet + /situations/export + Object factory for the CDI Bean Manager BeanManager diff --git a/rtgov-ui-core/src/main/java/org/overlord/rtgov/ui/provider/SituationsProvider.java b/rtgov-ui-core/src/main/java/org/overlord/rtgov/ui/provider/SituationsProvider.java index 27c6b18..3248251 100644 --- a/rtgov-ui-core/src/main/java/org/overlord/rtgov/ui/provider/SituationsProvider.java +++ b/rtgov-ui-core/src/main/java/org/overlord/rtgov/ui/provider/SituationsProvider.java @@ -15,6 +15,8 @@ */ package org.overlord.rtgov.ui.provider; +import java.io.OutputStream; + import org.overlord.rtgov.ui.client.model.BatchRetryResult; import org.overlord.rtgov.ui.client.model.MessageBean; import org.overlord.rtgov.ui.client.model.ResolutionState; @@ -77,7 +79,16 @@ public interface SituationsProvider { * @throws UiException */ public void resubmit(String situationId, MessageBean message) throws UiException; - + + /** + * This method export all situation's matching the given filter criteria + * + * @param situationsFilterBean + * @param outputStream + * Failed to search situations + */ + public void export(SituationsFilterBean situationsFilterBean, OutputStream outputStream); + /** * This method resubmits all situation's matching the given filter criteria * diff --git a/rtgov-ui-situations/src/main/java/org/overlord/rtgov/ui/provider/situations/RTGovSituationsProvider.java b/rtgov-ui-situations/src/main/java/org/overlord/rtgov/ui/provider/situations/RTGovSituationsProvider.java index b4aadfa..d0c95d7 100644 --- a/rtgov-ui-situations/src/main/java/org/overlord/rtgov/ui/provider/situations/RTGovSituationsProvider.java +++ b/rtgov-ui-situations/src/main/java/org/overlord/rtgov/ui/provider/situations/RTGovSituationsProvider.java @@ -18,6 +18,8 @@ import static com.google.common.collect.Iterables.any; import static com.google.common.collect.Iterables.tryFind; +import java.io.OutputStream; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; @@ -537,6 +539,31 @@ public BatchRetryResult resubmit(SituationsFilterBean situationsFilterBean) thro return new BatchRetryResult(processedCount, failedCount, ignoredCount); } + + @Override + public void export(SituationsFilterBean situationsFilterBean, OutputStream outputStream) { + List situationIdToactivityTypeIds = _situationStore + .getSituations(createQuery(situationsFilterBean)); + PrintWriter printWriter = new PrintWriter(outputStream); + try { + for (Situation situation : situationIdToactivityTypeIds) { + MessageBean message = getMessage(situation); + if (message == null) { + continue; + } + printWriter.println(message.getContent()); + + } + } catch (UiException uiException) { + Throwables.propagate(uiException); + } finally { + if (null != printWriter) { + printWriter.close(); + } + } + + } + /** * {@inheritDoc} */