001: /*
002: * @(#) ArrayConverter.java
003: *
004: * Copyright 2002 - 2003 JIDE Software. All rights reserved.
005: */
006: package com.jidesoft.converter;
007:
008: import java.util.StringTokenizer;
009:
010: /**
011: * An abstract class that is extented by any converters that convert to/from an array-like format,
012: * such as 1, 2, 3. Examples are Point. Point(100, 200) can convert to/from "100, 200"
013: * <br>
014: * You have the choice of what the separator is; separator is the ", " in the Point example above.
015: */
016: abstract public class ArrayConverter implements ObjectConverter {
017:
018: private String _separator;
019:
020: private int _size;
021:
022: private Class<?> _elementClass;
023:
024: private Class<?>[] _elementClasses;
025:
026: /**
027: * Creates an ArrayConverter.
028: *
029: * @param separator separator to separate values. It should contain at least non-empty charactor.
030: * @param size size of the array
031: * @param elementClass class of the array element. Assume all elements have the same class type.
032: * If not, use the constructor which takes Class<?>[] as parameter.
033: */
034: public ArrayConverter(String separator, int size,
035: Class<?> elementClass) {
036: _separator = separator;
037: _size = size;
038: _elementClass = elementClass;
039: }
040:
041: /**
042: * Creates an ArrayConverter.
043: *
044: * @param separator separator to separate values. It should contain at least non-empty charactor.
045: * @param size size of the array
046: * @param elementClasses classes of the array element. The length must be the same as size.
047: * If not, IllegalArgumentException will be thrown.
048: */
049: public ArrayConverter(String separator, int size,
050: Class<?>[] elementClasses) {
051: if (separator == null || separator.trim().length() == 0) {
052: throw new IllegalArgumentException(
053: "separator cannot be empty.");
054: }
055: if (elementClasses == null) {
056: throw new IllegalArgumentException(
057: "elementClasses cannot be null.");
058: }
059: if (size != elementClasses.length) {
060: throw new IllegalArgumentException(
061: "size must be equal to the length of elementClasses.");
062: }
063: _separator = separator;
064: _size = size;
065: _elementClasses = elementClasses;
066: }
067:
068: /**
069: * Converts from array to string by concating them with separators.
070: *
071: * @param objects an array of objects
072: * @param context converter context
073: * @return string all objects concated with separators
074: */
075: public String arrayToString(Object[] objects,
076: ConverterContext context) {
077: StringBuffer buffer = new StringBuffer();
078: for (int i = 0; i < objects.length; i++) {
079: Object o = objects[i];
080: if (_elementClass != null) {
081: buffer.append(ObjectConverterManager.toString(o,
082: _elementClass, context));
083: } else {
084: buffer.append(ObjectConverterManager.toString(o,
085: _elementClasses[i], context));
086: }
087: if (i != objects.length - 1) {
088: buffer.append(_separator);
089: }
090: }
091: return new String(buffer);
092: }
093:
094: /**
095: * Converts from string to an array of objects, using separator to separate the string.
096: *
097: * @param string string to be converted
098: * @param context converter context
099: * @return the array
100: */
101: public Object[] arrayFromString(String string,
102: ConverterContext context) {
103: if (string == null || string.trim().length() == 0) {
104: return null;
105: }
106: StringTokenizer token = new StringTokenizer(string, _separator
107: .trim());
108: Object[] objects = new Object[_size != -1 ? _size : token
109: .countTokens()];
110: for (int i = 0; i < objects.length && token.hasMoreTokens(); i++) {
111: String s = token.nextToken().trim();
112: if (_elementClass != null) {
113: objects[i] = ObjectConverterManager.fromString(s,
114: _elementClass, context);
115: } else {
116: objects[i] = ObjectConverterManager.fromString(s,
117: _elementClasses[i], context);
118: }
119: }
120: return objects;
121: }
122:
123: /**
124: * Gets the element class for the array.
125: *
126: * @return the element class for the array.
127: */
128: public Class<?> getElementClass() {
129: return _elementClass;
130: }
131: }
|