/* * 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.pages; import java.util.List; import java.util.function.Consumer; import java.util.stream.Collectors; import java.util.stream.Stream; import javax.enterprise.context.Dependent; import javax.inject.Inject; import org.drools.workbench.models.datamodel.oracle.FieldAccessorsAndMutators; import org.drools.workbench.models.datamodel.oracle.ModelField; import org.drools.workbench.models.datamodel.rule.BaseSingleFieldConstraint; import org.drools.workbench.screens.guided.dtable.client.resources.i18n.GuidedDecisionTableErraiConstants; import org.drools.workbench.screens.guided.dtable.client.wizard.column.commons.HasFieldPage; import org.drools.workbench.screens.guided.dtable.client.wizard.column.pages.common.BaseDecisionTableColumnPage; import org.drools.workbench.screens.guided.dtable.client.wizard.column.pages.modals.HasList; import org.drools.workbench.screens.guided.dtable.client.wizard.column.plugins.commons.DecisionTableColumnPlugin; import org.jboss.errai.ui.client.local.spi.TranslationService; import org.kie.workbench.common.widgets.client.datamodel.AsyncPackageDataModelOracle; import org.uberfire.client.callbacks.Callback; import org.uberfire.client.mvp.UberElement; import static org.drools.workbench.screens.guided.dtable.client.wizard.column.pages.common.DecisionTableColumnViewUtils.nil; @Dependent public class FieldPage<T extends HasFieldPage & DecisionTableColumnPlugin> extends BaseDecisionTableColumnPage<T> { private View view; @Inject public FieldPage(final View view, final TranslationService translationService) { super(translationService); this.view = view; } @Override protected UberElement<?> getView() { return view; } @Override public String getTitle() { return translate(GuidedDecisionTableErraiConstants.FieldPage_Field); } @Override public void isComplete(final Callback<Boolean> callback) { callback.callback(!nil(plugin().getFactField()) || isConstraintValuePredicate()); } @Override public void prepareView() { view.init(this); setupWarningMessages(); setupField(); } void setupField() { view.setupFieldList(); forEachFactField((field) -> view.addItem(field, field)); view.selectField(getFactField()); } private void setupWarningMessages() { if (isConstraintValuePredicate()) { view.showPredicateWarning(); } else { view.showPatternWarningWhenItIsNotDefined(hasEditingPattern()); } } void setEditingCol(final String selectedValue) { plugin().setFactField(selectedValue); } void forEachFactField(Consumer<String> consumer) { if (hasEditingPattern()) { final AsyncPackageDataModelOracle oracle = presenter.getDataModelOracle(); oracle.getFieldCompletions(factType(), getAccessor(), fieldsCallback(consumer)); } } public FieldAccessorsAndMutators getAccessor() { return plugin().getAccessor(); } Callback<ModelField[]> fieldsCallback(Consumer<String> consumer) { final AsyncPackageDataModelOracle oracle = presenter.getDataModelOracle(); return modelFields -> { final List<String> fieldNames = collectNames(modelFields); if (filterEnumFields()) { fieldNames .stream() .filter(fieldName -> !oracle.hasEnums(factType(), fieldName)) .forEach(consumer); } else { fieldNames .forEach(consumer); } }; } boolean isConstraintValuePredicate() { return plugin().constraintValue() == BaseSingleFieldConstraint.TYPE_PREDICATE; } boolean filterEnumFields() { return plugin().filterEnumFields(); } boolean hasEditingPattern() { return !nil(factType()); } private String factType() { return plugin().patternWrapper().getFactType(); } private List<String> collectNames(final ModelField[] modelFields) { return Stream .of(modelFields) .map(ModelField::getName) .collect(Collectors.toList()); } public String getFactField() { return plugin().getFactField(); } public interface View extends HasList, UberElement<FieldPage> { void showPredicateWarning(); void showPatternWarningWhenItIsNotDefined(final boolean hasEditingPattern); void setupFieldList(); void selectField(final String factField); } }