/* * Copyright 2014 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.dashbuilder.displayer; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.dashbuilder.dataset.DataSetLookupConstraints; import org.dashbuilder.dataset.ValidationError; /** * Every Displayer implementation use this class to specify what are the supported DisplayerSettings attributes * as well as the supported data sets in order to fit the displayer needs. */ public class DisplayerConstraints { protected DataSetLookupConstraints dataSetLookupConstraints; protected Set<DisplayerAttributeDef> supportedEditorAttributes; protected Set<String> supportedEditorAttrStrings; public DisplayerConstraints(DataSetLookupConstraints dataSetLookupConstraints) { this.dataSetLookupConstraints = dataSetLookupConstraints; supportedEditorAttributes = new HashSet<DisplayerAttributeDef>(); supportedEditorAttrStrings = new HashSet<String>(); } public DisplayerConstraints supportsAttribute( DisplayerAttributeDef attributeDef ) { // Support the attribute and all its ancestors. DisplayerAttributeDef _attr = attributeDef; while (_attr != null) { supportedEditorAttributes.add(_attr); supportedEditorAttrStrings.add(_attr.getFullId()); _attr = _attr.getParent(); } // ... and all its descendants as well. if (attributeDef instanceof DisplayerAttributeGroupDef) { for (DisplayerAttributeDef member : ((DisplayerAttributeGroupDef) attributeDef).getChildren()) { supportsAttribute(member); } } return this; } public Set<DisplayerAttributeDef> getSupportedAttributes() { return supportedEditorAttributes; } public DataSetLookupConstraints getDataSetLookupConstraints() { return dataSetLookupConstraints; } public DisplayerConstraints setDataSetLookupConstraints(DataSetLookupConstraints dataSetLookupConstraints) { this.dataSetLookupConstraints = dataSetLookupConstraints; return this; } public void removeUnsupportedAttributes(DisplayerSettings displayerSettings) { Map<String,String> settingsMap = displayerSettings.getSettingsFlatMap(); for (String setting : new HashSet<String>(settingsMap.keySet())) { if (!supportedEditorAttrStrings.contains(setting)) { displayerSettings.removeDisplayerSetting(setting); } } } public ValidationError check(DisplayerSettings settings) { if (dataSetLookupConstraints == null) { return createValidationError(ERROR_DATASET_LOOKUP_CONSTRAINTS_NOT_FOUND); } if (settings.getDataSet() != null) { ValidationError error = dataSetLookupConstraints.check(settings.getDataSet()); if (error != null) return error; } else if (settings.getDataSetLookup() != null) { ValidationError error = dataSetLookupConstraints.check(settings.getDataSetLookup()); if (error != null) return error; } return null; } public static final int ERROR_DATASET_LOOKUP_CONSTRAINTS_NOT_FOUND = 301; protected ValidationError createValidationError(int error) { switch (error) { case ERROR_DATASET_LOOKUP_CONSTRAINTS_NOT_FOUND: return new ValidationError(error, "Missing DataSetLookupContraints instance"); } return new ValidationError(error); } }