ru.codeinside.adm.ui.GwsClientsTab.java Source code

Java tutorial

Introduction

Here is the source code for ru.codeinside.adm.ui.GwsClientsTab.java

Source

  /*
   * 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) 2014, 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.Container;
  import com.vaadin.data.Item;
  import com.vaadin.data.Property;
  import com.vaadin.data.Validator;
  import com.vaadin.data.util.ObjectProperty;
  import com.vaadin.data.util.PropertysetItem;
  import com.vaadin.data.util.filter.Compare;
  import com.vaadin.data.util.filter.IsNull;
  import com.vaadin.data.validator.AbstractValidator;
  import com.vaadin.ui.Alignment;
  import com.vaadin.ui.Button;
  import com.vaadin.ui.CheckBox;
  import com.vaadin.ui.ComboBox;
  import com.vaadin.ui.CustomTable;
  import com.vaadin.ui.Form;
  import com.vaadin.ui.HorizontalLayout;
  import com.vaadin.ui.TabSheet;
  import com.vaadin.ui.TextField;
  import com.vaadin.ui.VerticalLayout;
  import com.vaadin.ui.Window;
  import org.tepi.filtertable.FilterTable;
  import ru.codeinside.adm.AdminServiceProvider;
  import ru.codeinside.adm.database.InfoSystem;
  import ru.codeinside.adm.database.ServiceUnavailable;
  import ru.codeinside.gses.API;
  import ru.codeinside.gses.lazyquerycontainer.LazyQueryContainer;
  import ru.codeinside.gses.lazyquerycontainer.LazyQueryDefinition;
  import ru.codeinside.gses.lazyquerycontainer.Query;
  import ru.codeinside.gses.lazyquerycontainer.QueryDefinition;
  import ru.codeinside.gses.lazyquerycontainer.QueryFactory;
  import ru.codeinside.gses.webui.Flash;
  import ru.codeinside.gses.webui.components.api.IRefresh;
  import ru.codeinside.gws.api.Revision;
  import ru.codeinside.jpa.ActivitiEntityManager;

  import java.io.Serializable;
  import java.text.SimpleDateFormat;
  import java.util.ArrayList;
  import java.util.List;

  public class GwsClientsTab extends HorizontalLayout implements TabSheet.SelectedTabChangeListener {

      final GwsClientsTable gwsClientsTable;
      final ComboBox infosys;
      final ActiveGwsClientsTable activeGwsClientsTable;
      final FilterTable serviceUnavailableTable;
      final UnavailableServiceQ.Factory unavailableQF;
final JPAContainer<ServiceUnavailable> unavailableontainer;
      final GwsClientSink sink;
      final Button removeButton;
      final CheckBox logEnabled;

      String currentName;
      String currentVersion;

      final LazyQueryContainer systemContainer;
      final LazyQueryContainer sourceContainer;
      final ComboBox source;

GwsClientsTab() {
  String fieldWidth = "300px";

  InfoSysQ query = new InfoSysQ(false);
  systemContainer = new LazyQueryContainer(query, query);
  infosys = new ComboBox("? ??", systemContainer);
  infosys.setImmediate(true);
  infosys.setWidth(fieldWidth);
  infosys.setItemCaptionPropertyId("name");
  infosys.setDescription("  ?,  ?? ?? ? ");
  infosys.setInvalidAllowed(true);
  infosys.setInvalidCommitted(false);
  infosys.setRequired(true);
  infosys.setRequiredError("? ?? - ?  ");


  InfoSysQ sourceQuery = new InfoSysQ(true);
  sourceContainer = new LazyQueryContainer(sourceQuery, sourceQuery);
  source = new ComboBox("?", sourceContainer);
  source.setImmediate(true);
  source.setWidth(fieldWidth);
  source.setItemCaptionPropertyId("name");
  source.setDescription("?-?");
  source.setInvalidAllowed(true);
  source.setRequired(false);


  final TextField id = text("Id", fieldWidth, false, false, null);
  final TextField address = text("??", fieldWidth, true, true, "?? HTTP ?  ?? ?");
  final TextField revision = text("?", fieldWidth, false, true, "? ?  ");
  final TextField sname = text("?", fieldWidth, false, true, "?,   ?????   ");
  final TextField sversion = text("??", fieldWidth, false, true, null);
  final TextField name = text("?", fieldWidth, true, true, null);
  final CheckBox available = new CheckBox("?  ");
  logEnabled = new CheckBox("?  ?");
  logEnabled.setReadOnly(!Boolean.TRUE.equals(AdminServiceProvider.getBoolProperty(API.ENABLE_CLIENT_LOG)));

  gwsClientsTable = new GwsClientsTable();

  final Form form = new Form();
  form.addField("id", id);
  form.addField("sname", sname);
  form.addField("sversion", sversion);
  form.addField("revision", revision);
  form.addField("infosys", infosys);
  form.addField("source", source);
  form.addField("name", name);
  form.addField("address", address);
  form.addField("available", available);
  form.addField("log", logEnabled);
  form.setEnabled(false);
  form.setWriteThrough(false);


  final Button commit = new Button("", new Button.ClickListener() {
    @Override
    public void buttonClick(Button.ClickEvent event) {
      try {
        form.commit();
      } catch (Validator.InvalidValueException e) {
        return;
      }
      String infosysCode = (String) infosys.getContainerProperty(infosys.getValue(), "code").getValue();
      String sourceCode = null;
      if (source.getValue() != null) {
        sourceCode = (String) source.getContainerProperty(source.getValue(), "code").getValue();
      }
      String sversionValue = (String) sversion.getValue();
      String snameValue = (String) sname.getValue();
      Long entityId = (Long) id.getValue();

      boolean serviceEnabled = Boolean.TRUE.equals(available.getValue());
      boolean _logEnabled = Boolean.TRUE.equals(logEnabled.getValue());
      String revisionName = ((Revision) revision.getValue()).name();
      String description = (String) name.getValue();
      String url = (String) address.getValue();

      if (entityId != null) {
        AdminServiceProvider
          .get()
          .updateInfoSystemService(entityId.toString(),
            infosysCode, sourceCode, url, revisionName, snameValue, sversionValue,
            description, serviceEnabled, _logEnabled
          );
        AdminServiceProvider
          .get()
          .createLog(Flash.getActor(), "InfoSystemService", entityId.toString(),
            "update", "Update from adm interface", true);
      } else {
        // TODO: strange method name
        if (AdminServiceProvider.get().findUsesInfoSystemService(snameValue, sversionValue)) {
          Long infoSystemService = AdminServiceProvider.get().createInfoSystemService(
            infosysCode, sourceCode, url, revisionName, snameValue, sversionValue,
            description, serviceEnabled, _logEnabled
          );
          id.setValue(infoSystemService);
          removeButton.setEnabled(true);
          AdminServiceProvider
            .get()
            .createLog(Flash.getActor(), "InfoSystemService", infoSystemService.toString(),
              "create", "Create from adm interface", true);
        } else {
          getWindow()
            .showNotification("? OSGI-  OSGI-?   ",
              Window.Notification.TYPE_ERROR_MESSAGE);
          return;
        }
      }
      activeGwsClientsTable.setCurrent(currentName, currentVersion);
      ((JPAContainer) gwsClientsTable.getContainerDataSource()).refresh();
      gwsClientsTable.setCurrent(currentName, currentVersion, true);
    }
  });

  final Button clean = new Button("?", new Button.ClickListener() {
    @Override
    public void buttonClick(Button.ClickEvent event) {
      disableForm();
    }
  });

  removeButton = new Button("", new Button.ClickListener() {
    @Override
    public void buttonClick(Button.ClickEvent event) {
      Long _id = (Long) id.getValue();
      AdminServiceProvider.get().removeInfoSystemService(_id);
      gwsClientsTable.container.refresh();
      disableForm();
    }
  });


  final HorizontalLayout buttons = new HorizontalLayout();
  buttons.setSpacing(true);
  buttons.setWidth(100, UNITS_PERCENTAGE);
  buttons.addComponent(clean);
  buttons.addComponent(commit);
  buttons.addComponent(removeButton);
  buttons.setComponentAlignment(clean, Alignment.MIDDLE_LEFT);
  buttons.setComponentAlignment(commit, Alignment.MIDDLE_CENTER);
  buttons.setComponentAlignment(removeButton, Alignment.MIDDLE_RIGHT);
  form.setFooter(buttons);

  activeGwsClientsTable = new ActiveGwsClientsTable();

  HorizontalLayout newContent = new HorizontalLayout();
  newContent.setMargin(false, false, false, true);
  newContent.setSpacing(true);
  newContent.setSizeFull();
  newContent.addComponent(form);

  UnavailableServiceQ unavailableQuery = new UnavailableServiceQ();
  unavailableQF = unavailableQuery.getFactory();
  unavailableontainer = new JPAContainer<ServiceUnavailable>(ServiceUnavailable.class);
  unavailableontainer.setEntityProvider(
    new CachingLocalEntityProvider<ServiceUnavailable>(
      ServiceUnavailable.class,
      ActivitiEntityManager.INSTANCE
    )
  );
  unavailableontainer.addContainerFilter(new IsNull("infoSystemService"));
  serviceUnavailableTable = new FilterTable();
  serviceUnavailableTable.setCaption("??? ??:");
  serviceUnavailableTable.setContainerDataSource(unavailableontainer);
  serviceUnavailableTable.setSizeFull();
  serviceUnavailableTable.setWidth("100%");
  serviceUnavailableTable.setImmediate(true);
  serviceUnavailableTable.setVisibleColumns(new String[]{"name", "address", "createdDate"});
  serviceUnavailableTable.setColumnHeaders(new String[]{"? ??", "??", "-?"});
  serviceUnavailableTable.setFilterBarVisible(true);
  serviceUnavailableTable.setFilterDecorator(new FilterDecorator_());
  serviceUnavailableTable.addGeneratedColumn("createdDate", new CustomTable.ColumnGenerator() {
    @Override
    public Object generateCell(CustomTable source, Object itemId, Object columnId) {
      Container containerDataSource = source.getContainerDataSource();
      Property containerProperty = containerDataSource.getContainerProperty(itemId, columnId);
      if (containerProperty != null) {
        Object object = containerProperty.getValue();
        return new SimpleDateFormat("dd.MM.yyyy HH:mm").format(object);
      }
      return null;
    }
  });

  VerticalLayout vl = new VerticalLayout();
  vl.addComponent(serviceUnavailableTable);
  vl.setSizeFull();
  vl.setSpacing(true);
  vl.setExpandRatio(serviceUnavailableTable, 1f);
  newContent.addComponent(vl);

  VerticalLayout right = new VerticalLayout();
  right.setSizeFull();
  right.setSpacing(true);
  right.addComponent(gwsClientsTable);
  right.addComponent(newContent);
  right.setExpandRatio(newContent, 0.6f);
  right.setExpandRatio(gwsClientsTable, 0.4f);

  setSpacing(true);
  setSizeFull();

  addComponent(activeGwsClientsTable);
  addComponent(right);
  setExpandRatio(activeGwsClientsTable, 0.15f);
  setExpandRatio(right, 0.85f);
  setMargin(true);

  sink = new GwsClientSink() {
    @Override
    public void selectClient(Long _id, Revision _revision, String _url, String _componentName, String _version,
                             String _infoSys, String _source, String _description, Boolean _available, Boolean _logEnabled) {

      // re-routing
      if (_id == null && gwsClientsTable.setCurrent(_componentName, _version, false)) {
        return;
      }
      currentName = _componentName;
      currentVersion = _version;

      boolean enabled = _componentName != null;
      form.setEnabled(enabled);
      form.setValidationVisible(false);
      buttons.setEnabled(enabled);
      removeButton.setEnabled(_id != null);

      id.setValue(_id);
      infosys.setValue(findInfoSystem(infosys, _infoSys));
      source.setValue(findInfoSystem(source, _source));
      address.setValue(_url);
      revision.setValue(_revision);
      sname.setValue(_componentName);
      sversion.setValue(_version);
      name.setValue(_description);
      available.setValue(_available);
      logEnabled.setReadOnly(false);
      logEnabled.setValue(_logEnabled);
      logEnabled.setReadOnly(!Boolean.TRUE.equals(AdminServiceProvider.getBoolProperty(API.ENABLE_CLIENT_LOG)));

      activeGwsClientsTable.setCurrent(_componentName, _version);
      serviceUnavailableTable.setEnabled(_id != null && _id > 0);
      unavailableQF.setInfoSystemId(_id);
      unavailableontainer.removeAllContainerFilters();
      unavailableontainer.addContainerFilter(new Compare.Equal("infoSystemService.id", _id));
    }
  };
  gwsClientsTable.setSink(sink);
  activeGwsClientsTable.setSink(sink);
}

      private void disableForm() {
          currentName = null;
          currentVersion = null;
          sink.selectClient(null, null, null, null, null, null, null, null, null, null);
      }

@Override
public void selectedTabChange(TabSheet.SelectedTabChangeEvent event) {
  if (this == event.getTabSheet().getSelectedTab()) {
    activeGwsClientsTable.setCurrent(currentName, currentVersion);
    gwsClientsTable.setCurrent(currentName, currentVersion, true);
    unavailableontainer.refresh();
    refreshSystem(infosys);
    refreshSystem(source);

    logEnabled.setReadOnly(!Boolean.TRUE.equals(AdminServiceProvider.getBoolProperty(API.ENABLE_CLIENT_LOG)));
  }
}

      void refreshSystem(ComboBox box) {
          Object itemId = box.getValue();
          String systeId = null;
          if (itemId != null) {
              systeId = (String) box.getContainerProperty(itemId, "code").getValue();
          }
          ((IRefresh) box.getContainerDataSource()).refresh();
          if (systeId != null) {
              box.setValue(findInfoSystem(box, systeId));
          }
      }

      Object findInfoSystem(Container.Viewer viewer, String code) {
          if (code != null) {
              Container container = viewer.getContainerDataSource();
              for (Object itemId : container.getItemIds()) {
                  if (code.equals(container.getContainerProperty(itemId, "code").getValue())) {
                      return itemId;
                  }
              }
          }
          return null;
      }

      TextField text(String name, String fieldWidth, boolean enabled, boolean required, String description) {
          final TextField field = new TextField(name);
          field.setImmediate(true);
          field.setNullRepresentation("");
          field.setWidth(fieldWidth);
          field.setMaxLength(255);
          field.setEnabled(enabled);
          field.setDescription(description);
          if (required) {
              String msg = name + " - ?  ";
              field.setRequired(true);
              field.setRequiredError(msg);
              field.addValidator(new AbstractValidator(msg) {
                  @Override
                  public boolean isValid(Object value) {
                      return value != null && !value.toString().trim().isEmpty();
                  }
              });
          }
          return field;
      }

      static final class InfoSysQ extends LazyQueryDefinition implements QueryFactory, Serializable {

          private static final long serialVersionUID = 1L;

          final boolean source;

          public InfoSysQ(boolean source) {
              super(false, 10);
              this.source = source;
              addProperty("code", String.class, null, true, true);
              addProperty("name", String.class, null, true, true);
          }

          @Override
          public void setQueryDefinition(QueryDefinition queryDefinition) {
          }

          @Override
          public Query constructQuery(Object[] sortPropertyIds, boolean[] asc) {
              return new QueryImpl(source, convertTypes(sortPropertyIds), asc);
          }

          private String[] convertTypes(final Object[] objects) {
              boolean notEmpty = objects != null && objects.length > 0;
              String[] strings = null;
              if (notEmpty) {
                  strings = new String[objects.length];
                  for (int i = 0; i < objects.length; i++) {
                      strings[i] = (String) objects[i];
                  }
              }
              return strings;
          }
      }

      final static class QueryImpl implements Query, Serializable {

          private static final long serialVersionUID = 1L;

          final boolean source;
          final String[] ids;
          final boolean[] asc;

          public QueryImpl(boolean source, String[] ids, boolean[] asc) {
              this.source = source;
              this.ids = ids;
              this.asc = asc;
          }

          @Override
          public int size() {
              return AdminServiceProvider.get().countInfoSystems(source);
          }

          @Override
          public List<Item> loadItems(final int start, final int count) {
              final List<InfoSystem> systems = AdminServiceProvider.get().queryInfoSystems(source, ids, asc, start,
                      count);
              final List<Item> items = new ArrayList<Item>(systems.size());
              for (final InfoSystem s : systems) {
                  final PropertysetItem item = new PropertysetItem();
                  item.addItemProperty("code", new ObjectProperty<String>(s.getCode()));
                  item.addItemProperty("name", new ObjectProperty<String>(s.getCode() + " - " + s.getName()));
                  items.add(item);
              }
              return items;
          }

          @Override
          public void saveItems(List<Item> addedItems, List<Item> modifiedItems, List<Item> removedItems) {
              throw new UnsupportedOperationException();
          }

          @Override
          public boolean deleteAllItems() {
              throw new UnsupportedOperationException();
          }

          @Override
          public Item constructItem() {
              throw new UnsupportedOperationException();
          }

      }

  }