/*
Name:
- ParapeterizedConfigurationPropertyHandler
Description:
-
Requires:
-
Provides:
-
Part of: ProcessPuzzle Framework, Domain and Business Model Ready Architecture. Provides content, workflow and social networking functionality.
http://www.processpuzzle.com
ProcessPuzzle - Content and Workflow Management Integration Business Platform
Author(s):
- Zsolt Zsuffa
Copyright: (C) 2011 This program is free software: you can redistribute it and/or modify it under the terms of the
GNU General Public License as published by the Free Software Foundation, either version 3 of the License,
or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.processpuzzle.application.configuration.domain;
import java.text.MessageFormat;
import java.util.List;
import org.apache.commons.configuration.HierarchicalConfiguration;
import org.apache.commons.lang.StringUtils;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
public class ParametrizedConfigurationPropertyHandler {
public static final String[] ANY_SELECTOR_SEGMENT_DELIMITER = { PropertyContext.SELECTOR_DELIMITER, "/", PropertyContext.ATTRIBUTE_BEGIN, PropertyContext.ATTRIBUTE_END };
public static final char[] COMPARISON_OPERATORS = {'=', '<', '>'};
private HierarchicalConfiguration configuration;
private String parametrizedSelector;
private String conditionSegment;
private String selectorBeforeCondition;
private String selectorAfterCondition;
private String conditionPropery;
private String conditionValue;
//Constructors
public ParametrizedConfigurationPropertyHandler( HierarchicalConfiguration configuration ) {
this.configuration = configuration;
}
//Public accessors and mutators
public HierarchicalConfiguration configurationAt( String parametrizedSelector, Object[] parameters ) {
determineParametrizedSelector( parametrizedSelector, parameters );
determineSelectorSegments();
String finalSelector = determineFinalSelector();
HierarchicalConfiguration subConfiguration = configuration.configurationAt( finalSelector );
return subConfiguration;
}
public String getProperty( String selector, Object[] parameters ) {
determineParametrizedSelector( selector, parameters );
determineSelectorSegments();
String finalSelector = determineFinalSelector();
String property = configuration.getString( finalSelector );
return property;
}
public List<String> getPropertyList(String selector, Object[] parameters) {
determineParametrizedSelector( selector, parameters );
determineSelectorSegments();
String finalSelector = determineFinalSelector();
List<String> searchedItems = Lists.newArrayList( Lists.transform( configuration.getList( finalSelector ), new Function<Object, String>(){
@Override public String apply( Object configurationElement ) {
if( configurationElement != null ) return configurationElement.toString();
else return "null";
}}));
return searchedItems;
}
private String determineFinalSelector() {
String currentSelector = selectorBeforeCondition + selectorAfterCondition;
List<String> parentItems = Lists.transform( configuration.getList( currentSelector ), new Function<Object, String>(){
@Override public String apply( Object configurationElement ) {
if( configurationElement != null ) return configurationElement.toString();
else return "null";
}});
Integer listIndex = determineParentNodeIdex( parentItems );
String finalSelector = selectorBeforeCondition + PropertyContext.PROPERTY_ARRAY_BEGIN + listIndex + PropertyContext.PROPERTY_ARRAY_END + selectorAfterCondition;
return finalSelector;
}
private Integer determineParentNodeIdex( List<String> parentItems ) {
Integer listIndex = 0;
for( ; listIndex < parentItems.size(); listIndex++ ){
String parentSelector = selectorBeforeCondition + PropertyContext.PROPERTY_ARRAY_BEGIN + listIndex + PropertyContext.PROPERTY_ARRAY_END;
HierarchicalConfiguration subConfiguration = null;
try{
subConfiguration = configuration.configurationAt( parentSelector );
}catch( IllegalArgumentException e ){
throw new InvalidPropertySelectorException( parametrizedSelector, e );
}
String currentPropertyValue = subConfiguration.getString( conditionPropery );
if( currentPropertyValue != null && currentPropertyValue.equals( conditionValue ))
break;
}
return listIndex;
}
private void determineParametrizedSelector( String selector, Object[] parameters ) {
parametrizedSelector = MessageFormat.format( selector, parameters );
}
private void determineSelectorSegments() {
int positionOfComparisonOperator = StringUtils.indexOfAny( parametrizedSelector , COMPARISON_OPERATORS );
int positionOfConditionBegin = StringUtils.lastIndexOfAny( StringUtils.substring( parametrizedSelector, 0, positionOfComparisonOperator ), ANY_SELECTOR_SEGMENT_DELIMITER );
int positionOfConditionEnd = StringUtils.indexOfAny( StringUtils.substring( parametrizedSelector, positionOfComparisonOperator +1 ), ANY_SELECTOR_SEGMENT_DELIMITER ) + positionOfComparisonOperator +1;
conditionSegment = StringUtils.substring( parametrizedSelector, positionOfConditionBegin +1, positionOfConditionEnd );
selectorBeforeCondition = StringUtils.substring( parametrizedSelector, 0, positionOfConditionBegin );
selectorAfterCondition = StringUtils.substring( parametrizedSelector, positionOfConditionEnd +1 );
conditionPropery = StringUtils.substring( conditionSegment, 0, positionOfComparisonOperator - positionOfConditionBegin -1);
if( conditionPropery.contains( PropertyContext.ATTRIBUTE_SIGNER ) )
conditionPropery = PropertyContext.ATTRIBUTE_BEGIN + conditionPropery + PropertyContext.ATTRIBUTE_END;
conditionValue = StringUtils.substring( conditionSegment, positionOfComparisonOperator - positionOfConditionBegin );
if( conditionValue.startsWith( "'" ) || conditionValue.startsWith( "\"" ) );
conditionValue = StringUtils.substring( conditionValue, 1, conditionValue.length() -1 );
}
}