/** * */ package com.cognifide.slice.cq.taglib.include; /*- * #%L * Slice - CQ Taglib * $Id:$ * $HeadURL:$ * %% * Copyright (C) 2012 Cognifide Limited * %% * 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. * #L% */ import java.util.ArrayList; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.sling.api.resource.ValueMap; import org.slf4j.Logger; import com.cognifide.slice.cq.taglib.include.IncludeTag.DecorationMode; import com.day.cq.wcm.api.components.Component; /** * Represents tag specific's configuration stored in a component node. Has both default values and read logic. */ class ComponentConfiguration { /** name of the component's property for disabling WCM.= */ private static final String DISABLE_WCM_PROPERTY = "cog:disableWcm"; /** name of the component's property for decoration modes */ private static final String DECORATION_MODES_PROPERTY = "cog:enableDecorationInModes"; private static final String ADDITIONAL_CSS_CLASS_NAMES = "cog:additionalCssClassNames"; private boolean disableWcm; private DecorationMode[] decorationModes; private String[] additionalCssClassNames; private final Logger logger; // used for logging purposes private String path; public ComponentConfiguration(Logger logger) { disableWcm = IncludeTag.DEFAULT_DISABLE_WCM; decorationModes = new DecorationMode[] { IncludeTag.DEFAULT_DECORATION_MODE }; additionalCssClassNames = new String[0]; this.logger = logger; } public void readFromComponent(Component component) { ValueMap valueMap = component.getProperties(); // isEmpty -> optimisation fix to leverage JcrPropertyMap caching if (valueMap == null || valueMap.isEmpty()) { logger.warn("Resource '{}' adapts to null or empty value map, skipping", component.getPath()); } else { readDisableWcm(valueMap.get(DISABLE_WCM_PROPERTY)); readDecorationModes(valueMap.get(DECORATION_MODES_PROPERTY)); readAdditionalCssClassNames(valueMap.get(ADDITIONAL_CSS_CLASS_NAMES)); } } private void readDisableWcm(Object disableWcmProperty) { if (disableWcmProperty == null) { disableWcm = IncludeTag.DEFAULT_DISABLE_WCM; } else { // reading as String - while not the best performance-wise, it is the safest option disableWcm = "true".equalsIgnoreCase(disableWcmProperty.toString()); } } private void readDecorationModes(Object decorationModeProperty) { if (decorationModeProperty != null) { if (decorationModeProperty instanceof Object[]) { readMultiValueDecorationModes(decorationModeProperty); } else { readSingleDecorationMode(decorationModeProperty); } } } private void readSingleDecorationMode(Object decorationModeProperty) { String decorationModeString = decorationModeProperty.toString(); DecorationMode decorationMode = DecorationMode.fromString(decorationModeString); if (decorationMode == null) { String msg = "Unknown value of simple property: {}@{}='{}', default used"; logger.warn(msg, new Object[] { path, DECORATION_MODES_PROPERTY, decorationModeProperty }); } else { decorationModes = new DecorationMode[] { decorationMode }; } } private void readMultiValueDecorationModes(Object decorationModeProperty) { Object[] decorationModeProperties = (Object[]) decorationModeProperty; List<DecorationMode> decorationModesList = new ArrayList<DecorationMode>(); for (int i = 0; i < decorationModeProperties.length; i++) { Object property = decorationModeProperties[i]; DecorationMode decorationMode = DecorationMode.fromObject(property); if (decorationMode == null) { String msg = "Unknown value #{} of multi-valued property, skipping: {}@{}[{}]='{}'"; logger.warn(msg, new Object[] { i, path, DECORATION_MODES_PROPERTY, i, property }); } else { decorationModesList.add(decorationMode); } } if (decorationModesList.isEmpty()) { String msg = "Empty multi-valued property, default used: {}@{}='{}'"; logger.warn(msg, new Object[] { path, DECORATION_MODES_PROPERTY, decorationModeProperty }); } else { decorationModes = decorationModesList.toArray(decorationModes); } } private void readAdditionalCssClassNames(Object additionalCssClassNamesProperty) { if (additionalCssClassNamesProperty != null) { if (additionalCssClassNamesProperty instanceof Object[]) { readMultiValueAdditionalCssClassNames(additionalCssClassNamesProperty); } else { readSingleAdditionalCssClassName(additionalCssClassNamesProperty); } } } private void readSingleAdditionalCssClassName(Object additionalCssClassNamesProperty) { String additionalCssClassNameString = additionalCssClassNamesProperty.toString(); if (StringUtils.isBlank(additionalCssClassNameString)) { String msg = "Null value of simple property: {}@{}='{}', default used"; logger.warn(msg, new Object[] { path, ADDITIONAL_CSS_CLASS_NAMES, additionalCssClassNamesProperty }); } else { additionalCssClassNames = new String[] { additionalCssClassNameString }; } } private void readMultiValueAdditionalCssClassNames(Object additionalCssClassNamesProperty) { Object[] additionalCssClassNameProperties = (Object[]) additionalCssClassNamesProperty; List<String> additionalCssClassList = new ArrayList<String>(); for (int i = 0; i < additionalCssClassNameProperties.length; i++) { Object property = additionalCssClassNameProperties[i]; String additionalCssClassNameString = property.toString(); if (StringUtils.isBlank(additionalCssClassNameString)) { String msg = "Unknown value #{} of multi-valued property, skipping: {}@{}[{}]='{}'"; logger.warn(msg, new Object[] { i, path, ADDITIONAL_CSS_CLASS_NAMES, i, property }); } else { additionalCssClassList.add(additionalCssClassNameString); } } if (additionalCssClassList.isEmpty()) { String msg = "Empty multi-valued property, default used: {}@{}='{}'"; logger.warn(msg, new Object[] { path, ADDITIONAL_CSS_CLASS_NAMES, additionalCssClassNamesProperty }); } else { additionalCssClassNames = additionalCssClassList.toArray(additionalCssClassNames); } } /** @return the disableWcm */ public boolean isDisableWcm() { return disableWcm; } /** @return the decorationModes */ public DecorationMode[] getDecorationModes() { return decorationModes; } public String[] getAdditionalCssClassNames() { return additionalCssClassNames; } }