# 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();
             }
          });
       }
    }