CustomLibrariesView.java

/*
** Module   : CustomLibrariesView.java
** Abstract : MVP view.
**
** Copyright (c) 2017, Golden Code Development Corporation.
**
** -#- -I- --Date-- --------------------------------Description-----------------------------------
** 001 HC  20170612 Initial version.
*/
/*
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU Affero General Public License as
** published by the Free Software Foundation, either version 3 of the
** License, or (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU Affero General Public License for more details.
**
** You may find a copy of the GNU Affero GPL version 3 at the following
** location: https://www.gnu.org/licenses/agpl-3.0.en.html
**
** Additional terms under GNU Affero GPL version 3 section 7:
**
**   Under Section 7 of the GNU Affero GPL version 3, the following additional
**   terms apply to the works covered under the License.  These additional terms
**   are non-permissive additional terms allowed under Section 7 of the GNU
**   Affero GPL version 3 and may not be removed by you.
**
**   0. Attribution Requirement.
**
**     You must preserve all legal notices or author attributions in the covered
**     work or Appropriate Legal Notices displayed by works containing the covered
**     work.  You may not remove from the covered work any author or developer
**     credit already included within the covered work.
**
**   1. No License To Use Trademarks.
**
**     This license does not grant any license or rights to use the trademarks
**     Golden Code, FWD, any Golden Code or FWD logo, or any other trademarks
**     of Golden Code Development Corporation. You are not authorized to use the
**     name Golden Code, FWD, or the names of any author or contributor, for
**     publicity purposes without written authorization.
**
**   2. No Misrepresentation of Affiliation.
**
**     You may not represent yourself as Golden Code Development Corporation or FWD.
**
**     You may not represent yourself for publicity purposes as associated with
**     Golden Code Development Corporation, FWD, or any author or contributor to
**     the covered work, without written authorization.
**
**   3. No Misrepresentation of Source or Origin.
**
**     You may not represent the covered work as solely your work.  All modified
**     versions of the covered work must be marked in a reasonable way to make it
**     clear that the modified work is not originating from Golden Code Development
**     Corporation or FWD.  All modified versions must contain the notices of
**     attribution required in this license.
*/
package com.goldencode.p2j.admin.client.application.home.runtime.customlib;

import com.goldencode.p2j.admin.*;
import com.goldencode.p2j.admin.client.*;
import com.goldencode.p2j.admin.client.application.*;
import com.goldencode.p2j.admin.client.widget.dialog.*;
import com.goldencode.p2j.admin.shared.*;
import com.google.gwt.event.logical.shared.*;
import com.google.gwt.uibinder.client.*;
import com.google.gwt.user.client.ui.*;
import com.google.inject.*;
import com.gwtplatform.mvp.client.*;
import org.gwtbootstrap3.client.ui.*;
import org.gwtbootstrap3.client.ui.constants.*;

/**
 * Custom libraries view.
 */
public class CustomLibrariesView
extends ViewImpl
implements CustomLibrariesPresenter.MyView
{
   /**
    * GWT binder.
    */
   interface Binder
   extends UiBinder<Container, CustomLibrariesView>
   {}

   /** widget */
   @UiField
   InlineRadio bServerHooks;

   /** widget */
   @UiField
   InlineRadio bGlobalHooks;

   /** widget */
   @UiField
   Alert libDirInfo;

   /** widget */
   @UiField
   Alert libDirDanger;

   /** widget */
   @UiField
   HTML libDirField;

   /** widget */
   @UiField
   SimplePanel libTableContainer;

   /** Admin service reference */
   private final AdminServiceAsync adm;

   /** Alarm service reference */
   private final Alarm alarm;

   /** Modal dialogs */
   private final ModalDialogs dialogs;

   /**
    * Ctor.
    *
    * @param   binder
    *          GWT binder.
    * @param   adm
    *          Admin service reference.
    * @param   alarm
    *          Alarm service reference.
    * @param   dialogs
    *          Modal dialogs.
    */
   @Inject
   CustomLibrariesView(Binder binder,
                       AdminServiceAsync adm,
                       Alarm alarm,
                       ModalDialogs dialogs)
   {
      this.adm = adm;
      this.alarm = alarm;
      this.dialogs = dialogs;
      initWidget(binder.createAndBindUi(this));
      bindSlot(CustomLibrariesPresenter.SLOT_LIBS, libTableContainer);
      bServerHooks.addValueChangeHandler(this::hooksValueChanged);
      bGlobalHooks.addValueChangeHandler(this::hooksValueChanged);
   }

   /**
    * Called when the view is about to be revealed.
    */
   @Override
   public void onReveal()
   {
      updateView();
   }

   /**
    * Hooks value changed handler.
    *
    * @param    e
    *           The value changed event
    */
   protected void hooksValueChanged(ValueChangeEvent<Boolean> e)
   {
      if (bServerHooks.getValue())
      {
         dialogs.showMessage("Use Server-wide Hooks",
                             "Are you sure you want to use server-wide hooks instead of global hooks?",

                             MessageType.QUESTION,
                             new String[]
                             {
                             "Yes, copy all hooks from global scope to server-wide scope",
                             "Yes, use empty initial set of server-wide hooks",
                             "Cancel"
                             },
                             new ButtonType[]{ButtonType.PRIMARY,
                             ButtonType.PRIMARY,
                             ButtonType.DEFAULT},
                             b ->
                             {
                                if (b != 0 && b != 1)
                                {
                                   updateView();
                                   return;
                                }

                                changeJarHooksType(true, b == 0);
                             });
      }
      else if (bGlobalHooks.getValue())
      {
         dialogs.showMessage("Use Global Hooks",
                             "Are you sure you want to use global hooks instead of server-wide hooks? " +
                             "All server-wide hooks will be removed.",
                             MessageType.QUESTION,
                             new String[]
                             {
                             "Yes, move all server-wide hooks to global scope (overwriting global hooks)",
                             "Yes, just remove server-wide hooks",
                             "Cancel"
                             },
                             new ButtonType[] {ButtonType.PRIMARY,
                             ButtonType.PRIMARY,
                             ButtonType.DEFAULT},
                             b ->
                             {
                                if (b != 0 && b != 1)
                                {
                                   updateView();
                                   return;
                                }

                                changeJarHooksType(false, b == 0);
                             });
      }
   }

   /**
    * Updates the view with server data.
    */
   private void updateView()
   {
      MultiCallback mc = new MultiCallback();
      AdminCallback<Boolean> cbServerWHooks = mc.newCallback();
      AdminCallback<TaggedName> cbDirInfo = mc.newCallback();

      mc.onDone(() ->
      {
         boolean useServerWHooks = cbServerWHooks.getResult();

         bServerHooks.setValue(useServerWHooks);
         bGlobalHooks.setValue(!useServerWHooks);

         TaggedName taggedName = cbDirInfo.getResult();

         if (taggedName.getName() == null)
         {
            libDirInfo.setVisible(false);
            libDirDanger.setVisible(true);
         }
         else
         {
            libDirInfo.setVisible(true);
            libDirDanger.setVisible(false);

            String text = taggedName.getName();
            if (!"true".equals(taggedName.getTag()))
            {
               text += "<span style=\"color:red\"> (doesn't exist or inaccessible)</span>";
            }

            libDirField.setHTML("<strong>" + text + "</strong>");
         }
      });

      adm.isUsingServerWideHooks(cbServerWHooks);
      adm.getManagedLibsDirInformation(cbDirInfo);
   }

   /**
    * Change jar hooks type handler.
    *
    * @param   serverWide
    *          Server wide flag.
    * @param   move
    *          Move flag.
    */
   private void changeJarHooksType(boolean serverWide, boolean move)
   {
      adm.changeJarHooksType(serverWide, move,  new AdminCallback<JarOpErrorCode>(adm, alarm)
      {
         @Override
         public void onDone(JarOpErrorCode result)
         {
            updateView();
         }
      });
   }
}