/* * Copyright 2015 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.widgets.client.datamodel; import java.util.ArrayList; import java.util.Map; import org.drools.workbench.models.datamodel.oracle.DropDownData; import static org.kie.workbench.common.widgets.client.datamodel.DataModelHelper.*; class EnumDropDownDataFactory { private FilteredEnumLists filteredEnumLists; private CurrentValues currentValues; EnumDropDownDataFactory(FilteredEnumLists filteredEnumLists, Map<String, String> currentValueMap) { this.filteredEnumLists = filteredEnumLists; this.currentValues = new CurrentValues(currentValueMap); } public DropDownData getEnums(final String type, final String field) { // Check for data dependent enums if (!currentValues.isEmpty()) { DropDownData dropDownData = getDependentEnumDropDown(type, field); if (dropDownData != null) { return dropDownData; } } return DropDownData.create(filteredEnumLists.getEnumValues(type, field)); } private DropDownData getDependentEnumDropDown(final String type, final String field) { final Object _typeFields = filteredEnumLists.getTypeFields(type, field); if (_typeFields instanceof String) { final DropDownData data = DropDownData.create(filteredEnumLists.get(buildKey(type, field, (String) _typeFields))); if (data != null) { return data; } } else if (_typeFields != null) { // these enums are calculated on demand, server side... final String[] fieldsNeeded = (String[]) _typeFields; // collect all the values of the fields needed, then return it as a string... final String[] valuePairs = collectValuePairs(fieldsNeeded); if (isNotEmpty(valuePairs)) { return DropDownData.create(getQueryString(type, field, fieldsNeeded, filteredEnumLists), valuePairs); } } return null; } private boolean isNotEmpty(String[] valuePairs) { return valuePairs.length > 0 && valuePairs[0] != null; } private String[] collectValuePairs(String[] fieldsNeeded) { final String[] valuePairs = new String[fieldsNeeded.length]; for (int i = 0; i < fieldsNeeded.length; i++) { for (CurrentValueEntry currentValueEntry : currentValues) { if (currentValueEntry.getFieldName().equals(fieldsNeeded[i])) { valuePairs[i] = fieldsNeeded[i] + "=" + currentValueEntry.getFieldValue(); } } } return valuePairs; } private String buildKey(String type, String field, String _typeFields) { final String typeFields = _typeFields; final StringBuilder dataEnumListsKeyBuilder = new StringBuilder(type).append("#").append(field); boolean addOpeninColumn = true; final String[] splitTypeFields = typeFields.split(","); for (int j = 0; j < splitTypeFields.length; j++) { final String typeField = splitTypeFields[j]; for (CurrentValueEntry currentValueEntry : currentValues) { if (currentValueEntry.getFieldName().trim().equals(typeField.trim())) { if (addOpeninColumn) { dataEnumListsKeyBuilder.append("["); addOpeninColumn = false; } dataEnumListsKeyBuilder.append(typeField).append("=").append(currentValueEntry.getFieldValue()); if (j != (splitTypeFields.length - 1)) { dataEnumListsKeyBuilder.append(","); } } } } if (!addOpeninColumn) { dataEnumListsKeyBuilder.append("]"); } return dataEnumListsKeyBuilder.toString(); } private class CurrentValues extends ArrayList<CurrentValueEntry> { private CurrentValues() { } public CurrentValues(Map<String, String> currentValueMap) { for (Map.Entry<String, String> entry : currentValueMap.entrySet()) { add(new CurrentValueEntry(entry.getKey(), entry.getValue())); } } } private class CurrentValueEntry { private final String fieldName; private final String fieldValue; public CurrentValueEntry(String fieldName, String fieldValue) { this.fieldName = fieldName; this.fieldValue = fieldValue; } public String getFieldName() { return fieldName; } public String getFieldValue() { return fieldValue; } } }