/*******************************************************************************
* Copyright (c) 2008 Hallvard Traetteberg.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Hallvard Traetteberg - initial API and implementation
******************************************************************************/
package org.eclipse.e4.tm.stringconverters;
import java.lang.reflect.Array;
import java.util.StringTokenizer;
import org.eclipse.e4.tm.stringconverter.AbstractStringConverter;
import org.eclipse.e4.tm.stringconverter.StringConverterContext;
/**
* Class ArrayStringConverter.
*
* @author hallvard
*/
public class ArrayStringConverter extends AbstractStringConverter {
private String delimiters = " \t\r\n";
public ArrayStringConverter() {
}
public ArrayStringConverter(String delimiters) {
this();
this.delimiters = delimiters;
}
private String parenthesis = "(,)[ ]{;}<|>";
public <T> T convert(String source, Class<T> klass, StringConverterContext stringConverter) {
Class<?> elementClass = klass.getComponentType();
String delimiters = this.delimiters;
if (source.length() > 1) {
char first = source.charAt(0), last = source.charAt(source.length() - 1);
for (int i = 0; i < parenthesis.length(); i += 3) {
if (first == parenthesis.charAt(i) && last == parenthesis.charAt(i + 2)) {
delimiters = parenthesis.substring(i + 1, i + 2);
source = source.substring(1, source.length() - 1);
break;
}
}
}
StringTokenizer stringTokenizer = new StringTokenizer(source, delimiters);
int tokens = stringTokenizer.countTokens();
T array = (T)Array.newInstance(elementClass, tokens);
for (int i = 0; i < tokens; i++) {
String token = stringTokenizer.nextToken();
if (delimiters == this.delimiters) {
token = token.trim();
}
try {
Object o = stringConverter.convert(token, elementClass);
Array.set(array, i, o);
} catch (Exception e) {
throw new RuntimeException("Couldn't create array of " + array.getClass(), e);
}
}
return array;
}
}