/* * Copyright 2016 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.kie.workbench.common.forms.processing.engine.handling.impl; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.enterprise.context.Dependent; import org.jboss.errai.common.client.api.Assert; import org.kie.workbench.common.forms.processing.engine.handling.FieldChangeHandler; import org.kie.workbench.common.forms.processing.engine.handling.FieldChangeHandlerManager; import org.kie.workbench.common.forms.processing.engine.handling.FormValidator; @Dependent public class FieldChangeHandlerManagerImpl implements FieldChangeHandlerManager { private FormValidator validator; private Map<String, FieldChangeProcessor> fieldExecutors = new HashMap<>(); private List<FieldChangeHandler> defaultChangeHandlers = new ArrayList<>(); @Override public void setValidator(FormValidator validator) { this.validator = validator; } @Override public void registerField(String fieldName) { registerField(fieldName, false); } @Override public void registerField(String fieldName, boolean validateOnChange) { fieldExecutors.put(fieldName, new FieldChangeProcessor(fieldName, validateOnChange)); } @Override public void addFieldChangeHandler(FieldChangeHandler changeHandler) { defaultChangeHandlers.add(changeHandler); } @Override public void addFieldChangeHandler(String fieldName, FieldChangeHandler changeHandler) { Assert.notNull("FieldName cannot be null", fieldName); Assert.notNull("FieldChangeHandler cannot be null", changeHandler); FieldChangeProcessor executor = fieldExecutors.get(fieldName); if (executor != null) { executor.addFieldChangeHandler(changeHandler); } } @Override public void processFieldChange(String fieldName, Object newValue, Object model) { assert fieldName != null; String realFieldName = fieldName; if (realFieldName.indexOf(".") != -1) { realFieldName = realFieldName.substring(0, realFieldName.indexOf(".")); } FieldChangeProcessor executor = fieldExecutors.get(realFieldName); if (executor != null) { if (executor.isRequiresValidation()) { if (validator != null && !validator.validate(realFieldName, model)) { return; } } doProcess(executor.getChangeHandlers(), fieldName, newValue); doProcess(defaultChangeHandlers, fieldName, newValue); } } protected void doProcess(Collection<FieldChangeHandler> handlers, String fieldName, Object newValue) { for (FieldChangeHandler handler : handlers) { handler.onFieldChange(fieldName, newValue); } } @Override public void clear() { fieldExecutors.clear(); defaultChangeHandlers.clear(); } }