package nl.ipo.cds.etl.operations.transform; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import nl.ipo.cds.attributemapping.operations.annotation.Execute; import nl.ipo.cds.attributemapping.operations.annotation.Input; import nl.ipo.cds.attributemapping.operations.annotation.MappingOperation; import nl.ipo.cds.etl.operations.transform.SplitStringTransform.Settings; @MappingOperation (propertiesClass = Settings.class) public class SplitStringTransform { @Execute public String[] execute (final @Input("string") String input, final Settings settings) { final String boundary = settings.getBoundary (); final boolean trimWhitespace = settings.isTrimWhitespace (); final boolean ignoreEmptyItems = settings.isIgnoreEmptyItems (); final String[] parts; // Split the string: try { parts = input.split (Pattern.quote (boundary)); } catch (PatternSyntaxException e) { throw new IllegalStateException (String.format ("Invalid split pattern: `%s`", boundary)); } // Process the parts (trim and ignore empty elements): final List<String> result = new ArrayList<String> (parts.length); for (String part: parts) { if (trimWhitespace) { part = part.trim (); } if (ignoreEmptyItems && part.isEmpty ()) { continue; } result.add (part); } return result.toArray (new String[result.size ()]); } public final static class Settings { private String boundary = ","; private boolean trimWhitespace = true; private boolean ignoreEmptyItems = false; public String getBoundary () { return boundary; } public void setBoundary (final String boundary) { if (boundary == null) { throw new NullPointerException (); } this.boundary = boundary; } public boolean isTrimWhitespace () { return trimWhitespace; } public void setTrimWhitespace (final boolean trimWhitespace) { this.trimWhitespace = trimWhitespace; } public boolean isIgnoreEmptyItems () { return ignoreEmptyItems; } public void setIgnoreEmptyItems (final boolean ignoreEmptyItems) { this.ignoreEmptyItems = ignoreEmptyItems; } } }