1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.jetspeed.util.ojb;
18
19 import java.io.IOException;
20 import java.io.StreamTokenizer;
21 import java.io.StringReader;
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.Iterator;
25
26 import org.apache.commons.logging.Log;
27 import org.apache.commons.logging.LogFactory;
28 import org.apache.ojb.broker.accesslayer.conversions.ConversionException;
29 import org.apache.ojb.broker.accesslayer.conversions.FieldConversion;
30
31 /***
32 * <p style="font-weight: bold">
33 * ObjectRelationalBridge field conversion.
34 * </p>
35 * Converts from a comma-delimited field to a <code>java.util.collection</code>
36 *
37 * @author <a href="mailto:weaver@apache.org">Scott T. Weaver</a>
38 */
39 public class CSVtoCollectionFieldConversion implements FieldConversion
40 {
41 private static final String DELIM = ",";
42 private static final String QUOTE = "\"";
43
44 private static final Log log = LogFactory.getLog(CSVtoCollectionFieldConversion.class);
45
46 /***
47 * @see org.apache.ojb.broker.accesslayer.conversions.FieldConversion#javaToSql(java.lang.Object)
48 * @task Fix JDK 1.3 complient problem described in the FIXME
49 */
50 public Object javaToSql(Object arg0) throws ConversionException
51 {
52 if (arg0 instanceof Collection)
53 {
54 Collection col = ((Collection) arg0);
55 if (col.size() == 0)
56 {
57 return "";
58 }
59
60 Iterator itr = col.iterator();
61
62 StringBuffer buffer = new StringBuffer((col.size() * 5));
63 while (itr.hasNext())
64 {
65 buffer.append(QUOTE);
66 String value = getNext(itr);
67
68
69
70
71
72
73 if(value != null && value.toString().indexOf("\"") >= 0)
74 {
75
76
77 log.warn("In CSVtoCollectionFieldConversion() - The string '" + value +
78 "' contains embeded '\"'. It will not be converted to a CSV correctly.");
79 }
80 buffer.append(value);
81
82 buffer.append(QUOTE);
83
84 if (itr.hasNext())
85 {
86 buffer.append(DELIM);
87 }
88 }
89
90 return buffer.toString();
91 }
92 return arg0;
93 }
94
95 /***
96 * @see org.apache.ojb.broker.accesslayer.conversions.FieldConversion#sqlToJava(java.lang.Object)
97 */
98 public Object sqlToJava(Object arg0) throws ConversionException
99 {
100
101 if (arg0 instanceof String)
102 {
103 StringReader sr = new StringReader((String) arg0);
104 StreamTokenizer st = new StreamTokenizer(sr);
105 st.resetSyntax();
106 st.whitespaceChars(',', ',');
107 st.quoteChar('"');
108 st.eolIsSignificant(false);
109
110
111 ArrayList list = new ArrayList();
112 try
113 {
114 while (st.nextToken() != StreamTokenizer.TT_EOF)
115 {
116 list.add(createObject(st.sval));
117 }
118 }
119 catch (IOException e)
120 {
121 String message = "CSV parsing failed during field conversion.";
122 log.error(message, e);
123 throw new ConversionException("CSV parsing failed during field conversion.", e);
124 }
125
126 return list;
127 }
128
129 return arg0;
130 }
131
132 /***
133 * Makes creation of objects created via csv fields extensible
134 * By default simply return the string value.
135 *
136 * @param name The string value
137 * @return The string value
138 */
139 protected Object createObject(String name)
140 {
141 return name;
142 }
143
144 /***
145 * Makes getting objects via csv fields extensible
146 * By default simply return the string value.
147 *
148 * @param name The string value
149 * @return The string value
150 */
151 protected String getNext(Iterator iterator)
152 {
153 return (String) iterator.next();
154 }
155
156 }