package ru.codeinside.adm.ui; import com.vaadin.data.Property; import com.vaadin.ui.Button; import com.vaadin.ui.CheckBox; import com.vaadin.ui.Component; import com.vaadin.ui.CustomTable; import com.vaadin.ui.Table; import com.vaadin.ui.Window; import org.glassfish.embeddable.GlassFishException; import org.tepi.filtertable.FilterTable; import ru.codeinside.adm.AdminServiceProvider; import ru.codeinside.gses.webui.Configurator; import ru.codeinside.gses.webui.Flash; import ru.codeinside.gses.webui.gws.TRef; import ru.codeinside.gses.webui.osgi.LogCustomizer; import ru.codeinside.gses.webui.osgi.TRefRegistryImpl; import ru.codeinside.gws.api.Revision; import ru.codeinside.gws.api.Server; import java.io.File; import java.net.URL; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; final public class ServicesTable extends FilterTable { final static String FS_PREFIX = "file:" + System.getProperty("com.sun.aas.instanceRoot") + "/"; final static String GF_PREFIX = "reference:" + FS_PREFIX + "applications/"; ServicesTable() { super("Активные модули"); addStyleName("small striped"); addContainerProperty("name", String.class, null); addContainerProperty("symbolicName", String.class, null); addContainerProperty("version", String.class, null); addContainerProperty("revision", Revision.class, null); addContainerProperty("location", String.class, null); addContainerProperty("log", CheckBox.class, null); addContainerProperty("undeploy", Button.class, null); setVisibleColumns(new String[]{ "name", "symbolicName", "version", "revision", "location", "log", "undeploy" }); setColumnHeaders(new String[]{ "Компонент", "Название", "Вер.", "Рев.", "Модуль", "Журнал", "" }); setPageLength(0); setSelectable(false); // нет действий с выделением setSizeFull(); setSortContainerPropertyId("name"); setFilterBarVisible(true); setFilterDecorator(new FilterDecorator_()); setFilterFieldVisible("undeploy", false); setFilterFieldVisible("log", false); } void reload() { removeAllItems(); boolean serverLogEnabled = Boolean.TRUE == LogCustomizer.isServerLogEnabled(); List<TRef<Server>> serverRefs = TRefRegistryImpl.getServerRefs(); int i = 0; for (final TRef<Server> ref : serverRefs) { if (ref.getRef() != null) { final String name = ref.getName(); String componentName; String symbolicName = ref.getSymbolicName(); if (symbolicName.equals(name)) { componentName = null; } else { componentName = name; } String version = ref.getVersion(); String originalLocation = ref.getLocation(); String location; if (originalLocation.startsWith(GF_PREFIX)) { location = originalLocation.substring(GF_PREFIX.length(), originalLocation.length() - 1); } else if (originalLocation.startsWith(FS_PREFIX)) { int slash = originalLocation.lastIndexOf(File.separatorChar); location = originalLocation.substring(slash + 1); } else { location = originalLocation; } Revision revision = ref.getRef().getRevision(); CheckBox checkBox = new CheckBox(); checkBox.setImmediate(true); checkBox.setValue(LogCustomizer.isServerLogEnabled(name)); checkBox.addListener(new LogAction(name)); checkBox.setReadOnly(!serverLogEnabled); Button unDeploy = new Button("Удалить", new UndeployAction(originalLocation)); unDeploy.addStyleName("small"); addItem(new Object[]{componentName, symbolicName, version, revision, location, checkBox, unDeploy}, i++); } } sort(); } final static class LogAction implements ValueChangeListener { final String name; public LogAction(String name) { this.name = name; } @Override public void valueChange(Property.ValueChangeEvent event) { LogCustomizer.setServerLogEnabled(name, Boolean.TRUE == event.getProperty().getValue()); } } // Работает лишь для активированных через deploy! final class UndeployAction implements Button.ClickListener { private static final long serialVersionUID = 1L; final String location; public UndeployAction(String location) { this.location = location; } @Override public void buttonClick(Button.ClickEvent event) { if (location.startsWith(GF_PREFIX)) { try { String[] split = location.split("/"); String name = split[split.length - 1]; AdminServiceProvider.get().createLog(Flash.getActor(), "bundle", name, "undeploy", null, true); Configurator.getDeployer().undeploy(name); } catch (GlassFishException e) { // почти все ошибки валются лишь в консоль! getWindow().showNotification(e.getMessage(), Window.Notification.TYPE_HUMANIZED_MESSAGE); } } else if (location.startsWith(FS_PREFIX)) { File bundle = new File(location.substring(5)); AdminServiceProvider.get().createLog(Flash.getActor(), "bundle", bundle.getName(), "undeploy", null, true); if (bundle.exists()) { bundle.delete(); try { Thread.sleep(5100); // время реакции fileInstall } catch (InterruptedException e) { Thread.currentThread().interrupt(); return; } } } reload(); } } }