/*
* Copyright 2017 Red Hat, Inc. and/or its affiliates.
*
* 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 org.drools.workbench.screens.guided.dtable.client.wizard.column.plugins;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import javax.enterprise.context.Dependent;
import javax.enterprise.event.Event;
import javax.inject.Inject;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.IsWidget;
import org.drools.workbench.models.datamodel.oracle.FieldAccessorsAndMutators;
import org.drools.workbench.models.datamodel.rule.BaseSingleFieldConstraint;
import org.drools.workbench.models.guided.dtable.shared.model.ActionCol52;
import org.drools.workbench.models.guided.dtable.shared.model.BRLRuleModel;
import org.drools.workbench.models.guided.dtable.shared.model.GuidedDecisionTable52;
import org.drools.workbench.models.guided.dtable.shared.model.Pattern52;
import org.drools.workbench.screens.guided.dtable.client.resources.i18n.GuidedDecisionTableErraiConstants;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.commons.HasAdditionalInfoPage;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.commons.HasFieldPage;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.commons.HasPatternPage;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.commons.HasValueOptionsPage;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.pages.AdditionalInfoPage;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.pages.FieldPage;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.pages.PatternPage;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.pages.ValueOptionsPage;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.plugins.commons.ActionInsertFactWrapper;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.plugins.commons.ActionSetFactWrapper;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.plugins.commons.ActionWrapper;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.plugins.commons.AdditionalInfoPageInitializer;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.plugins.commons.BaseDecisionTableColumnPlugin;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.plugins.commons.DefaultWidgetFactory;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.plugins.commons.LimitedWidgetFactory;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.plugins.commons.PatternWrapper;
import org.drools.workbench.screens.guided.dtable.client.wizard.column.plugins.commons.ValueOptionsPageInitializer;
import org.jboss.errai.ui.client.local.spi.TranslationService;
import org.kie.workbench.common.widgets.client.datamodel.AsyncPackageDataModelOracle;
import org.uberfire.ext.widgets.core.client.wizards.WizardPage;
import org.uberfire.ext.widgets.core.client.wizards.WizardPageStatusChangeEvent;
import static org.drools.workbench.screens.guided.dtable.client.wizard.column.pages.common.DecisionTableColumnViewUtils.nil;
@Dependent
public class ActionSetFactPlugin extends BaseDecisionTableColumnPlugin implements HasFieldPage,
HasPatternPage,
HasValueOptionsPage,
HasAdditionalInfoPage {
private PatternPage patternPage;
private FieldPage fieldPage;
private ValueOptionsPage<ActionSetFactPlugin> valueOptionsPage;
private AdditionalInfoPage<ActionSetFactPlugin> additionalInfoPage;
private Boolean valueOptionsPageCompleted = Boolean.FALSE;
private ActionWrapper editingWrapper;
private PatternWrapper patternWrapper;
private Pattern52 editingPattern = new Pattern52();
@Inject
public ActionSetFactPlugin(final PatternPage patternPage,
final FieldPage fieldPage,
final ValueOptionsPage<ActionSetFactPlugin> valueOptionsPage,
final AdditionalInfoPage<ActionSetFactPlugin> additionalInfoPage,
final Event<WizardPageStatusChangeEvent> changeEvent,
final TranslationService translationService) {
super(changeEvent,
translationService);
this.patternPage = patternPage;
this.fieldPage = fieldPage;
this.valueOptionsPage = valueOptionsPage;
this.additionalInfoPage = additionalInfoPage;
}
@Override
public String getTitle() {
return translate(GuidedDecisionTableErraiConstants.ActionInsertFactPlugin_SetTheValueOfAField);
}
@Override
public List<WizardPage> getPages() {
return new ArrayList<WizardPage>() {{
add(initializedPatternPage());
add(fieldPage);
add(initializedValueOptionsPage());
add(initializedAdditionalInfoPage());
}};
}
@Override
public Boolean generateColumn() {
final ActionWrapper actionWrapper = editingWrapper();
if (!isValid(actionWrapper)) {
return false;
}
presenter.appendColumn(actionWrapper.getActionCol52());
return true;
}
boolean isValid(final ActionWrapper editingWrapper) {
final ActionCol52 actionCol52 = editingWrapper.getActionCol52();
if (nil(getFactField())) {
Window.alert(translate(GuidedDecisionTableErraiConstants.ActionInsertFactPlugin_YouMustEnterAColumnPattern));
return false;
}
if (nil(getFactField())) {
Window.alert(translate(GuidedDecisionTableErraiConstants.ActionInsertFactPlugin_YouMustEnterAColumnField));
return false;
}
if (nil(actionCol52.getHeader())) {
Window.alert(translate(GuidedDecisionTableErraiConstants.ActionInsertFactPlugin_YouMustEnterAColumnHeaderValueDescription));
return false;
}
if (!unique(actionCol52.getHeader())) {
Window.alert(translate(GuidedDecisionTableErraiConstants.ActionInsertFactPlugin_ThatColumnNameIsAlreadyInUsePleasePickAnother));
return false;
}
return true;
}
@Override
public void setValueOptionsPageAsCompleted() {
if (!isValueOptionsPageCompleted()) {
setValueOptionsPageCompleted();
fireChangeEvent(valueOptionsPage);
}
}
void setValueOptionsPageCompleted() {
this.valueOptionsPageCompleted = Boolean.TRUE;
}
@Override
public Boolean isValueOptionsPageCompleted() {
return valueOptionsPageCompleted;
}
@Override
public PatternWrapper patternWrapper() {
return Optional.ofNullable(patternWrapper).orElse(new PatternWrapper());
}
@Override
public void setEditingPattern(final PatternWrapper patternWrapper) {
this.patternWrapper = patternWrapper;
resetField();
fireChangeEvent(patternPage);
fireChangeEvent(fieldPage);
fireChangeEvent(additionalInfoPage);
}
@Override
public String getEntryPointName() {
return "";
}
@Override
public void setEntryPointName(final String entryPointName) {
}
@Override
public List<PatternWrapper> getPatterns() {
final Set<PatternWrapper> patterns = new HashSet<>();
for (Pattern52 pattern52 : presenter.getModel().getPatterns()) {
patterns.add(new PatternWrapper(pattern52));
}
return new ArrayList<>(patterns);
}
@Override
public int constraintValue() {
return BaseSingleFieldConstraint.TYPE_UNDEFINED;
}
@Override
public String getFactType() {
return patternWrapper().getFactType();
}
@Override
public FieldAccessorsAndMutators getAccessor() {
return FieldAccessorsAndMutators.MUTATOR;
}
@Override
public boolean filterEnumFields() {
return false;
}
@Override
public String getFactField() {
return editingWrapper().getFactField();
}
@Override
public void setFactField(final String selectedValue) {
if (isNewFactPattern()) {
editingWrapper = newActionInsertFactWrapper();
} else {
editingWrapper = newActionSetFactWrapper();
}
editingWrapper.setFactField(selectedValue);
editingWrapper.setFactType(patternWrapper().getFactType());
editingWrapper.setBoundName(patternWrapper().getBoundName());
editingWrapper.setType(oracle().getFieldType(editingWrapper.getFactType(),
editingWrapper.getFactField()));
fireChangeEvent(fieldPage);
}
ActionSetFactWrapper newActionSetFactWrapper() {
return new ActionSetFactWrapper(this);
}
ActionInsertFactWrapper newActionInsertFactWrapper() {
return new ActionInsertFactWrapper(this);
}
@Override
public Pattern52 editingPattern() {
editingPattern.setFactType(patternWrapper().getFactType());
editingPattern.setBoundName(patternWrapper().getBoundName());
editingPattern.setNegated(patternWrapper().isNegated());
editingPattern.setEntryPointName(patternWrapper().getEntryPointName());
return editingPattern;
}
@Override
public ActionCol52 editingCol() {
return editingWrapper().getActionCol52();
}
@Override
public String getHeader() {
return editingWrapper().getHeader();
}
@Override
public void setHeader(final String header) {
editingWrapper().setHeader(header);
fireChangeEvent(additionalInfoPage);
}
@Override
public void setInsertLogical(final Boolean value) {
editingWrapper().setInsertLogical(value);
}
@Override
public void setUpdate(final Boolean value) {
editingWrapper().setUpdate(value);
}
@Override
public boolean showUpdateEngineWithChanges() {
return !isNewFactPattern();
}
@Override
public boolean showLogicallyInsert() {
return isNewFactPattern();
}
@Override
public String getValueList() {
return editingWrapper().getValueList();
}
@Override
public void setValueList(final String valueList) {
editingWrapper().setValueList(valueList);
}
@Override
public String getBinding() {
return patternWrapper().getBoundName();
}
@Override
public void setBinding(final String binding) {
editingWrapper().setBoundName(binding);
}
@Override
public GuidedDecisionTable52.TableFormat tableFormat() {
return presenter.getModel().getTableFormat();
}
@Override
public boolean doesOperatorNeedValue() {
return true;
}
@Override
public boolean doesOperatorAcceptValueList() {
return true;
}
@Override
public IsWidget defaultValueWidget() {
return new DefaultWidgetFactory<>(this).create();
}
@Override
public IsWidget limitedValueWidget() {
return new LimitedWidgetFactory<>(this).create();
}
private boolean unique(final String header) {
for (final ActionCol52 o : presenter.getModel().getActionCols()) {
if (o.getHeader().equals(header)) {
return false;
}
}
return true;
}
boolean isNewFactPattern() {
final BRLRuleModel validator = new BRLRuleModel(presenter.getModel());
return !validator.isVariableNameUsed(getBinding());
}
private AsyncPackageDataModelOracle oracle() {
return presenter.getDataModelOracle();
}
ActionWrapper editingWrapper() {
return Optional.ofNullable(editingWrapper).orElse(ActionWrapper.EMPTY_COLUMN);
}
PatternPage initializedPatternPage() {
patternPage.disableEntryPoint();
return patternPage;
}
AdditionalInfoPage<ActionSetFactPlugin> initializedAdditionalInfoPage() {
return AdditionalInfoPageInitializer.init(additionalInfoPage,
this);
}
ValueOptionsPage<ActionSetFactPlugin> initializedValueOptionsPage() {
return ValueOptionsPageInitializer.init(valueOptionsPage,
this);
}
@Override
public Type getType() {
return Type.BASIC;
}
private void resetField() {
editingWrapper().setFactField("");
editingWrapper().setFactType(patternWrapper().getFactType());
editingWrapper().setBoundName(patternWrapper().getBoundName());
editingWrapper().setType("");
}
}