/**
* AnalyzerBeans
* Copyright (C) 2014 Neopost - Customer Information Management
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* 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 Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*/
package org.eobjects.analyzer.beans.transform;
import java.util.StringTokenizer;
import org.eobjects.analyzer.beans.api.Categorized;
import org.eobjects.analyzer.beans.api.Configured;
import org.eobjects.analyzer.beans.api.Description;
import org.eobjects.analyzer.beans.api.OutputColumns;
import org.eobjects.analyzer.beans.api.Transformer;
import org.eobjects.analyzer.beans.api.TransformerBean;
import org.eobjects.analyzer.beans.categories.StringManipulationCategory;
import org.eobjects.analyzer.data.InputColumn;
import org.eobjects.analyzer.data.InputRow;
import org.apache.metamodel.util.HasName;
@TransformerBean("Text case transformer")
@Description("Modifies the text case/capitalization of Strings.")
@Categorized({ StringManipulationCategory.class })
public class TextCaseTransformer implements Transformer<String> {
/**
* Enum depicting the modes of operation for the text case modifications.
*/
public static enum TransformationMode implements HasName {
LOWER_CASE("Lower case"),
UPPER_CASE("Upper case"),
CAPITALIZE_SENTENCES("Capitalize sentences"),
CAPITALIZE_WORDS("Capitalize every word");
private final String _name;
private TransformationMode(String name) {
_name = name;
}
@Override
public String getName() {
return _name;
}
}
@Configured("Value")
InputColumn<String> valueColumn;
@Configured
TransformationMode mode;
@Override
public OutputColumns getOutputColumns() {
return new OutputColumns(valueColumn.getName() + " (" + mode.getName() + ")");
}
@Override
public String[] transform(InputRow row) {
final String value = row.getValue(valueColumn);
final String[] result = new String[1];
result[0] = transform(value);
return result;
}
public String transform(String value) {
if (value == null) {
return null;
}
switch (mode) {
case UPPER_CASE:
return value.toUpperCase();
case LOWER_CASE:
return value.toLowerCase();
case CAPITALIZE_SENTENCES:
case CAPITALIZE_WORDS:
return capitalizeWords(value);
default:
throw new UnsupportedOperationException("Unsupported mode: " + mode);
}
}
private String capitalizeWords(String value) {
final StringBuilder sb = new StringBuilder();
final StringTokenizer tokenizer = new StringTokenizer(value, " \t\n\r\f", true);
boolean capitalizeNext = true;
while (tokenizer.hasMoreTokens()) {
final String nextToken = tokenizer.nextToken();
final String lowerCasedToken = nextToken.toLowerCase();
if (capitalizeNext) {
final String capitalizedToken = Character.toUpperCase(lowerCasedToken.charAt(0))
+ lowerCasedToken.substring(1);
sb.append(capitalizedToken);
} else {
sb.append(lowerCasedToken);
}
final char lastChar = lowerCasedToken.charAt(lowerCasedToken.length() - 1);
capitalizeNext = (mode == TransformationMode.CAPITALIZE_WORDS) || isCapitalizeTrigger(lastChar);
}
return sb.toString();
}
private boolean isCapitalizeTrigger(char c) {
return c == '.' || c == '!' || c == '?' || c == ':';
}
}