/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * Copyright (c) 2013, MPL CodeInside http://codeinside.ru */ package ru.codeinside.adm.ui; import com.vaadin.addon.jpacontainer.JPAContainer; import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider; import com.vaadin.data.Property; import com.vaadin.terminal.DownloadStream; import com.vaadin.terminal.StreamResource; import com.vaadin.ui.Button; import com.vaadin.ui.Component; import com.vaadin.ui.FormLayout; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.Panel; import com.vaadin.ui.TabSheet; import com.vaadin.ui.Table; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.VerticalSplitPanel; import com.vaadin.ui.Window; import com.vaadin.ui.themes.BaseTheme; import com.vaadin.ui.themes.Reindeer; import org.tepi.filtertable.FilterTable; import ru.codeinside.adm.AdminServiceProvider; import ru.codeinside.adm.database.SoapPacket; import ru.codeinside.jpa.ActivitiEntityManager; import ru.codeinside.jpa.LogEntityManager; import javax.persistence.EntityManager; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.Arrays; public class LogTab extends VerticalLayout implements TabSheet.SelectedTabChangeListener { FilterTable sl; FilterTable ul; SmevLog smevLog; TabSheet tabSheet; public LogTab() { setSizeFull(); tabSheet = new TabSheet(); tabSheet.addStyleName(Reindeer.TABSHEET_MINIMAL); tabSheet.addStyleName(Reindeer.TABSHEET_BORDERLESS); tabSheet.addListener(this); tabSheet.setSizeFull(); addComponent(tabSheet); } final class SmevLog extends VerticalLayout { VerticalSplitPanel splitPanel; public SmevLog() { splitPanel = new VerticalSplitPanel(); sl = new FilterTable(); splitPanel.setFirstComponent(sl); addComponent(splitPanel); setSizeFull(); sl.setSizeFull(); sl.setFilterBarVisible(true); sl.setSelectable(true); sl.setImmediate(true); sl.setRowHeaderMode(Table.ROW_HEADER_MODE_ID); sl.setColumnCollapsingAllowed(true); sl.setColumnReorderingAllowed(true); sl.setFilterDecorator(new FilterDecorator_()); sl.setFilterGenerator(new FilterGenerator_(Arrays.asList("bidId"), Arrays.asList("client"))); final HorizontalLayout hl = new HorizontalLayout(); hl.setMargin(true); hl.setSpacing(true); hl.setSizeFull(); splitPanel.setSecondComponent(hl); Panel sendPanel = new Panel("Отправленое сообщение"); sendPanel.setSizeFull(); final FormLayout sendForm = new FormLayout(); sendPanel.setContent(sendForm); hl.addComponent(sendPanel); Panel receivePanel = new Panel("Принятое сообщение"); receivePanel.setSizeFull(); final FormLayout receiveForm = new FormLayout(); receivePanel.setContent(receiveForm); hl.addComponent(receivePanel); final Panel error = new Panel("Error"); error.setSizeFull(); sl.setContainerDataSource(jpaContainer(ru.codeinside.adm.database.SmevLog.class, ActivitiEntityManager.INSTANCE)); sl.setVisibleColumns(new String[]{"bidId", "infoSystem", "component", "client", "logDate"}); sl.setColumnHeaders(new String[]{"№ заявки", "Информационная система", "Модуль", "Клиент", "Дата"}); sl.setSortContainerPropertyId("logDate"); sl.setSortAscending(false); sl.addGeneratedColumn("client", new YesNoColumnGenerator()); sl.addGeneratedColumn("logDate", new DateColumnGenerator("dd.MM.yyyy HH:mm:ss.SSS")); sl.addListener(new Property.ValueChangeListener() { @Override public void valueChange(Property.ValueChangeEvent event) { sendForm.removeAllComponents(); receiveForm.removeAllComponents(); error.removeAllComponents(); hl.removeComponent(error); if (event.getProperty().getValue() == null) { return; } final ru.codeinside.adm.database.SmevLog oepLog = ActivitiEntityManager.INSTANCE. find(ru.codeinside.adm.database.SmevLog.class, event.getProperty().getValue()); if (oepLog != null) { final String componentName = oepLog.getComponent() == null ? "" : oepLog.getComponent() + "_"; final SoapPacket sendPacket = oepLog.getSendPacket(); if (sendPacket != null) { sendForm.addComponent(new RoTextField("Sender", sendPacket.getSender())); sendForm.addComponent(new RoTextField("Recipient", sendPacket.getRecipient())); sendForm.addComponent(new RoTextField("Originator", sendPacket.getOriginator())); sendForm.addComponent(new RoTextField("Service", sendPacket.getService())); sendForm.addComponent(new RoTextField("Type code", sendPacket.getTypeCode())); sendForm.addComponent(new RoTextField("Status", sendPacket.getStatus())); sendForm.addComponent(new RoTextField("Date", sendPacket.getDate() == null ? null : sendPacket.getDate().toString())); sendForm.addComponent(new RoTextField("Request ID ref", sendPacket.getRequestIdRef())); sendForm.addComponent(new RoTextField("Origin request ID ref", sendPacket.getOriginRequestIdRef())); sendForm.addComponent(new RoTextField("Service code", sendPacket.getServiceCode())); sendForm.addComponent(new RoTextField("Case number", sendPacket.getCaseNumber())); sendForm.addComponent(new RoTextField("Exchange type", sendPacket.getExchangeType())); } if (oepLog.getSendHttp() != null) { Button sendHttp = new Button("Скачать http-log"); sendHttp.addStyleName(BaseTheme.BUTTON_LINK); sendHttp.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { StreamResource.StreamSource streamSource = new StreamResource.StreamSource() { private static final long serialVersionUID = 456334952891567271L; public InputStream getStream() { return new ByteArrayInputStream(oepLog.getSendHttp().getData()); } }; String ddMMyy_hhmmss = new SimpleDateFormat("ddMMyy_hhmmss").format(oepLog.getLogDate()); StreamResource resource = new StreamResource( streamSource, componentName + "send_" + ddMMyy_hhmmss + ".log", event.getButton().getApplication() ) { private static final long serialVersionUID = -3869546661105532851L; public DownloadStream getStream() { final StreamSource ss = getStreamSource(); if (ss == null) { return null; } DownloadStream ds = new DownloadStream(ss.getStream(), "text/plain", getFilename()); ds.setParameter("Content-Disposition", "attachment; filename=\"" + getFilename() + "\""); return ds; } }; Window window = event.getButton().getWindow(); window.open(resource, "_top", false); } }); sendForm.addComponent(sendHttp); } final SoapPacket receivePacket = oepLog.getReceivePacket(); if (receivePacket != null) { receiveForm.addComponent(new RoTextField("Sender", receivePacket.getSender())); receiveForm.addComponent(new RoTextField("Recipient", receivePacket.getRecipient())); receiveForm.addComponent(new RoTextField("Originator", receivePacket.getOriginator())); receiveForm.addComponent(new RoTextField("Service", receivePacket.getService())); receiveForm.addComponent(new RoTextField("Type code", receivePacket.getTypeCode())); receiveForm.addComponent(new RoTextField("Status", receivePacket.getStatus())); receiveForm.addComponent(new RoTextField("Date", receivePacket.getDate() == null ? null : receivePacket.getDate().toString())); receiveForm.addComponent(new RoTextField("Request ID ref", receivePacket.getRequestIdRef())); receiveForm.addComponent(new RoTextField("Origin request ID ref", receivePacket.getOriginRequestIdRef())); receiveForm.addComponent(new RoTextField("Service code", receivePacket.getServiceCode())); receiveForm.addComponent(new RoTextField("Case number", receivePacket.getCaseNumber())); receiveForm.addComponent(new RoTextField("Exchange type", receivePacket.getExchangeType())); } if (oepLog.getReceiveHttp() != null) { Button receiveHttp = new Button("Скачать http-log"); receiveHttp.addStyleName(BaseTheme.BUTTON_LINK); receiveHttp.addListener(new Button.ClickListener() { @Override public void buttonClick(Button.ClickEvent event) { StreamResource.StreamSource streamSource = new StreamResource.StreamSource() { private static final long serialVersionUID = 456334952891567271L; public InputStream getStream() { return new ByteArrayInputStream(oepLog.getReceiveHttp().getData()); } }; String ddMMyy_hhmmss = new SimpleDateFormat("ddMMyy_hhmmss").format(oepLog.getLogDate()); StreamResource resource = new StreamResource( streamSource, componentName + "receive_" + ddMMyy_hhmmss + ".log", event.getButton().getApplication() ) { private static final long serialVersionUID = -3869546661105537851L; public DownloadStream getStream() { final StreamSource ss = getStreamSource(); if (ss == null) { return null; } DownloadStream ds = new DownloadStream(ss.getStream(), "text/plain", getFilename()); ds.setParameter("Content-Disposition", "attachment; filename=\"" + getFilename() + "\""); return ds; } }; Window window = event.getButton().getWindow(); window.open(resource, "_top", false); } }); receiveForm.addComponent(receiveHttp); } if (oepLog.getError() != null && !oepLog.getError().equals("")) { FormLayout newContent = new FormLayout(); newContent.addComponent(new Label(oepLog.getError())); error.setContent(newContent); hl.addComponent(error); } } } }); } private class RoTextField extends Label { RoTextField(String caption, String value) { super(value); setCaption(caption); } } } final class UserLog extends FilterTable { public UserLog() { ul = this; setSizeFull(); setFilterBarVisible(true); setSelectable(true); setImmediate(true); setRowHeaderMode(Table.ROW_HEADER_MODE_ID); setColumnCollapsingAllowed(true); setColumnReorderingAllowed(true); setFilterDecorator(new FilterDecorator_()); //TODO: не ясно ещё как поведёт себя в кластере, нужно проверить JPAContainer<ru.codeinside.log.Log> container = jpaContainer(ru.codeinside.log.Log.class, LogEntityManager.INSTANCE); container.addNestedContainerProperty("actor.name"); container.addNestedContainerProperty("actor.ip"); container.addNestedContainerProperty("actor.browser"); container.addNestedContainerProperty("actor.os"); setContainerDataSource(container); setVisibleColumns( new Object[]{"actor.name", "actor.browser", "actor.ip", "actor.os", "entityName", "entityId", "action", "info", "date"}); setColumnHeaders(new String[]{"Субъект", "Браузер", "IP", "ОС", "Объект", "ID", "Действие", "Дополнительно", "Дата"}); setSortContainerPropertyId("date"); setSortAscending(false); addGeneratedColumn("date", new DateColumnGenerator("dd.MM.yyyy HH:mm:ss.SSS")); } } /** * сбрасываем состояние. */ @Override public void selectedTabChange(TabSheet.SelectedTabChangeEvent event) { Component tab = event.getTabSheet().getSelectedTab(); if (this == tab) { if (smevLog == null) { tabSheet.addTab(smevLog = new SmevLog(), "СМЭВ"); tabSheet.addTab(new UserLog(), "Действия пользователя"); } return; } if (this == tab || smevLog == tab) { ((JPAContainer) sl.getContainerDataSource()).getEntityProvider().refresh(); sl.refreshRowCache(); } if (this == tab || ul == tab) { ((JPAContainer) ul.getContainerDataSource()).getEntityProvider().refresh(); ul.refreshRowCache(); } } //TODO: не ясно ещё как поведёт себя в кластере, нужно проверить <T> JPAContainer<T> jpaContainer(Class<T> clazz, EntityManager entityManager) { JPAContainer<T> container = new JPAContainer<T>(clazz); container.setReadOnly(true); container.setEntityProvider(new CachingLocalEntityProvider<T>(clazz, entityManager)); return container; } }