stroom.pipeline.structure.client.presenter.NewPropertyPresenter.java Source code

Java tutorial

Introduction

Here is the source code for stroom.pipeline.structure.client.presenter.NewPropertyPresenter.java

Source

/*
 * Copyright 2017 Crown Copyright
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package stroom.pipeline.structure.client.presenter;

import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.google.inject.Inject;
import com.google.web.bindery.event.shared.EventBus;
import com.gwtplatform.mvp.client.MyPresenterWidget;
import com.gwtplatform.mvp.client.View;
import stroom.alert.client.event.AlertEvent;
import stroom.data.client.event.DataSelectionEvent;
import stroom.data.client.event.DataSelectionEvent.DataSelectionHandler;
import stroom.dispatch.client.AsyncCallbackAdaptor;
import stroom.dispatch.client.ClientDispatchAsync;
import stroom.entity.shared.EntityReferenceFindAction;
import stroom.entity.shared.ResultList;
import stroom.entity.shared.SharedDocRef;
import stroom.explorer.client.presenter.EntityDropDownPresenter;
import stroom.explorer.shared.ExplorerData;
import stroom.item.client.ItemListBox;
import stroom.item.client.StringListBox;
import stroom.pipeline.shared.data.PipelineProperty;
import stroom.pipeline.shared.data.PipelinePropertyType;
import stroom.pipeline.shared.data.PipelinePropertyValue;
import stroom.pipeline.structure.client.presenter.PropertyListPresenter.Source;
import stroom.query.api.DocRef;
import stroom.security.shared.DocumentPermissionNames;
import stroom.streamstore.shared.FindStreamTypeCriteria;
import stroom.streamstore.shared.StreamType.Purpose;
import stroom.util.shared.EqualsUtil;
import stroom.widget.valuespinner.client.SpinnerEvent;
import stroom.widget.valuespinner.client.ValueSpinner;

public class NewPropertyPresenter extends MyPresenterWidget<NewPropertyPresenter.NewPropertyView> {
    private final ClientDispatchAsync dispatcher;
    private final EntityDropDownPresenter entityDropDownPresenter;
    private boolean dirty;

    private PipelineProperty defaultProperty;
    private PipelineProperty inheritedProperty;
    private PipelineProperty localProperty;
    private Source source;

    private Boolean currentBoolean;
    private boolean booleanListInitialised;
    private ListBox listBox;

    private Long currentNumber;
    private boolean spinnerInitialised;
    private ValueSpinner valueSpinner;

    private String currentText;
    private boolean textBoxInitialised;
    private TextBox textBox;

    private String currentStreamType;
    private boolean streamTypePresenterInitialised;
    private StringListBox streamTypesWidget;
    private boolean entityPresenterInitialised;
    private DocRef currentEntity;

    @Inject
    public NewPropertyPresenter(final EventBus eventBus, final NewPropertyView view,
            final EntityDropDownPresenter entityDropDownPresenter, final ClientDispatchAsync dispatcher) {
        super(eventBus, view);
        this.entityDropDownPresenter = entityDropDownPresenter;
        this.dispatcher = dispatcher;

    }

    @Override
    protected void onBind() {
        registerHandler(
                getView().getSource().addSelectionHandler(new SelectionHandler<PropertyListPresenter.Source>() {
                    @Override
                    public void onSelection(final SelectionEvent<Source> event) {
                        final Source selected = event.getSelectedItem();
                        if (!source.equals(selected)) {
                            NewPropertyPresenter.this.source = selected;
                            setDirty(true, false);
                            startEdit(selected);
                        }
                    }
                }));

    }

    public void edit(final PipelineProperty defaultProperty, final PipelineProperty inheritedProperty,
            final PipelineProperty localProperty, final Source source) {
        this.defaultProperty = defaultProperty;
        this.inheritedProperty = inheritedProperty;
        this.localProperty = localProperty;
        this.source = source;

        getView().setElement(defaultProperty.getElement());
        getView().setName(defaultProperty.getName());
        getView().getSource().setSelectedItem(source);

        startEdit(source);
    }

    private void startEdit(final Source source) {
        switch (source) {
        case DEFAULT:
            startEdit(defaultProperty);
            break;
        case INHERIT:
            startEdit(inheritedProperty);
            break;
        case LOCAL:
            startEdit(localProperty);
            break;
        }
    }

    private void startEdit(final PipelineProperty property) {
        final PipelinePropertyType propertyType = property.getPropertyType();

        if ("streamType".equals(propertyType.getName())) {
            enterStreamTypeMode(property);
        } else if ("boolean".equals(propertyType.getType())) {
            enterBooleanMode(property);
        } else if ("int".equals(propertyType.getType())) {
            enterIntegerMode(property);
        } else if ("long".equals(propertyType.getType())) {
            enterLongMode(property);
        } else if ("String".equals(propertyType.getType())) {
            enterStringMode(property);
            //        } else if (StreamType.ENTITY_TYPE.equals(propertyType.getType())) {
            //            enterStreamTypeMode(property);
        } else {
            enterEntityMode(property);
        }
    }

    public Source getSource() {
        return getView().getSource().getSelectedItem();
    }

    public void write(final PipelineProperty property) {
        final PipelinePropertyType propertyType = property.getPropertyType();

        if ("streamType".equals(propertyType.getName())) {
            property.setValue(new PipelinePropertyValue(streamTypesWidget.getSelected()));
        } else if ("boolean".equals(propertyType.getType())) {
            final String value = listBox.getItemText(listBox.getSelectedIndex());
            property.setValue(new PipelinePropertyValue(Boolean.valueOf(value)));
        } else if ("int".equals(propertyType.getType())) {
            final Integer value = Integer.valueOf(valueSpinner.getValue());
            property.setValue(new PipelinePropertyValue(value));
        } else if ("long".equals(propertyType.getType())) {
            final Long value = Long.valueOf(valueSpinner.getValue());
            property.setValue(new PipelinePropertyValue(value));
        } else if ("String".equals(propertyType.getType())) {
            property.setValue(new PipelinePropertyValue(textBox.getText()));
            //        } else if (StreamType.ENTITY_TYPE.equals(propertyType.getType())) {
            //            property.setValue(new PipelinePropertyValue(streamTypesWidget.getSelectedItem()));
        } else {
            final DocRef namedEntity = entityDropDownPresenter.getSelectedEntityReference();
            PipelinePropertyValue value = null;
            if (namedEntity != null) {
                value = new PipelinePropertyValue(namedEntity);
            }
            property.setValue(value);
        }
    }

    private void enterBooleanMode(final PipelineProperty property) {
        if (!booleanListInitialised) {
            listBox = new ListBox();
            listBox.addItem("true");
            listBox.addItem("false");

            listBox.addChangeHandler(new ChangeHandler() {
                @Override
                public void onChange(final ChangeEvent event) {
                    final Boolean selected = getBoolean(listBox.getSelectedIndex());
                    if (!EqualsUtil.isEquals(selected, currentBoolean)) {
                        setDirty(true);
                    }
                }
            });

            listBox.getElement().getStyle().setWidth(100, Unit.PCT);
            listBox.getElement().getStyle().setMarginBottom(0, Unit.PX);
            getView().setValueWidget(listBox);

            booleanListInitialised = true;
        }

        currentBoolean = Boolean.FALSE;
        if (property.getValue() != null && property.getValue().isBoolean() != null) {
            currentBoolean = property.getValue().isBoolean();
        }

        setBoolean(currentBoolean);
    }

    private Boolean getBoolean(final int pos) {
        if (pos == 0) {
            return Boolean.TRUE;
        }

        return Boolean.FALSE;
    }

    private void setBoolean(final Boolean bool) {
        if (bool) {
            listBox.setSelectedIndex(0);
        } else {
            listBox.setSelectedIndex(1);
        }
    }

    private void enterIntegerMode(final PipelineProperty property) {
        Long number = 0L;
        if (property.getValue() != null && property.getValue().getInteger() != null) {
            number = Long.valueOf(property.getValue().getInteger());
        }

        enterNumberMode(property, number);
    }

    private void enterLongMode(final PipelineProperty property) {
        Long number = 0L;
        if (property.getValue() != null && property.getValue().getLong() != null) {
            number = property.getValue().getLong();
        }

        enterNumberMode(property, number);
    }

    private void enterNumberMode(final PipelineProperty property, final Long number) {
        if (!spinnerInitialised) {
            valueSpinner = new ValueSpinner();
            valueSpinner.setMin(0);
            valueSpinner.setMax(10000);

            registerHandler(valueSpinner.getTextBox().addKeyDownHandler(new KeyDownHandler() {
                @Override
                public void onKeyDown(final KeyDownEvent event) {
                    setDirty(true);
                }
            }));
            registerHandler(valueSpinner.getSpinner().addSpinnerHandler(new SpinnerEvent.Handler() {
                @Override
                public void onChange(final SpinnerEvent event) {
                    setDirty(true);
                }
            }));

            valueSpinner.getElement().getStyle().setWidth(100, Unit.PCT);
            valueSpinner.getElement().getStyle().setMarginBottom(0, Unit.PX);
            getView().setValueWidget(valueSpinner);

            spinnerInitialised = true;
        }

        currentNumber = number;
        valueSpinner.setValue(currentNumber);
    }

    private void enterStringMode(final PipelineProperty property) {
        if (!textBoxInitialised) {
            textBox = new TextBox();

            textBox.addKeyUpHandler(new KeyUpHandler() {
                @Override
                public void onKeyUp(final KeyUpEvent event) {
                    if (!EqualsUtil.isEquals(textBox.getText(), currentText)) {
                        setDirty(true);
                    }
                }
            });

            textBox.getElement().getStyle().setWidth(100, Unit.PCT);
            textBox.getElement().getStyle().setMarginBottom(0, Unit.PX);
            getView().setValueWidget(textBox);

            textBoxInitialised = true;
        }

        currentText = "";
        if (property.getValue() != null && property.getValue().getString() != null) {
            currentText = property.getValue().getString();
        }

        textBox.setText(currentText);
    }

    private void enterStreamTypeMode(final PipelineProperty property) {
        if (!streamTypePresenterInitialised) {
            streamTypesWidget = new StringListBox();

            // Load stream types.
            final FindStreamTypeCriteria findStreamTypeCriteria = new FindStreamTypeCriteria();
            findStreamTypeCriteria.obtainPurpose().add(Purpose.PROCESSED);
            dispatcher.execute(new EntityReferenceFindAction<>(findStreamTypeCriteria),
                    new AsyncCallbackAdaptor<ResultList<SharedDocRef>>() {
                        @Override
                        public void onSuccess(final ResultList<SharedDocRef> result) {
                            for (final SharedDocRef streamType : result) {
                                streamTypesWidget.addItem(streamType.getName());
                            }
                            streamTypesWidget.setSelected(currentStreamType);
                        }
                    });

            streamTypesWidget.addChangeHandler(new ChangeHandler() {
                @Override
                public void onChange(final ChangeEvent event) {
                    final String streamType = streamTypesWidget.getSelected();
                    if (!EqualsUtil.isEquals(currentStreamType, streamType)) {
                        setDirty(true);
                    }
                }
            });

            final Widget widget = streamTypesWidget;
            widget.getElement().getStyle().setWidth(100, Unit.PCT);
            widget.getElement().getStyle().setMarginBottom(0, Unit.PX);
            getView().setValueWidget(widget);

            streamTypePresenterInitialised = true;
        }

        currentStreamType = null;
        if (property.getValue() != null && property.getValue().getString() != null) {
            currentStreamType = property.getValue().toString();
        }

        streamTypesWidget.setSelected(currentStreamType);
    }

    private void enterEntityMode(final PipelineProperty property) {
        if (!entityPresenterInitialised) {
            entityDropDownPresenter.addDataSelectionHandler(new DataSelectionHandler<ExplorerData>() {
                @Override
                public void onSelection(final DataSelectionEvent<ExplorerData> event) {
                    final DocRef selection = entityDropDownPresenter.getSelectedEntityReference();
                    if (!EqualsUtil.isEquals(currentEntity, selection)) {
                        setDirty(true);
                    }
                }
            });

            final Widget widget = entityDropDownPresenter.getView().asWidget();
            widget.getElement().getStyle().setWidth(100, Unit.PCT);
            widget.getElement().getStyle().setMarginBottom(0, Unit.PX);
            getView().setValueWidget(widget);

            entityPresenterInitialised = true;
        }

        currentEntity = null;
        if (property.getValue() != null && property.getValue().getEntity() != null) {
            currentEntity = property.getValue().getEntity();
        }

        entityDropDownPresenter.setIncludedTypes(property.getPropertyType().getType());
        entityDropDownPresenter.setRequiredPermissions(DocumentPermissionNames.USE);
        try {
            entityDropDownPresenter.setSelectedEntityReference(currentEntity);
        } catch (final Exception e) {
            AlertEvent.fireError(this, e.getMessage(), null);
        }

    }

    private void setDirty(final boolean dirty, final boolean changeSource) {
        this.dirty = dirty;
        if (changeSource) {
            getView().getSource().setSelectedItem(Source.LOCAL);
        }
    }

    public boolean isDirty() {
        return dirty;
    }

    private void setDirty(final boolean dirty) {
        setDirty(dirty, true);
    }

    public interface NewPropertyView extends View {
        void setElement(String element);

        void setName(String name);

        ItemListBox<Source> getSource();

        void setValueWidget(Widget widget);
    }
}