1 package org.codehaus.xfire.aegis.type.collection; 2 3 import java.util.ArrayList; 4 import java.util.Collection; 5 import java.util.HashSet; 6 import java.util.Iterator; 7 import java.util.List; 8 import java.util.Set; 9 10 import org.codehaus.xfire.MessageContext; 11 import org.codehaus.xfire.XFireRuntimeException; 12 import org.codehaus.xfire.aegis.MessageReader; 13 import org.codehaus.xfire.aegis.MessageWriter; 14 import org.codehaus.xfire.aegis.type.Type; 15 import org.codehaus.xfire.aegis.type.basic.ArrayType; 16 import org.codehaus.xfire.fault.XFireFault; 17 18 public class CollectionType 19 extends ArrayType 20 { 21 private Class componentType; 22 23 public CollectionType(Class componentType) 24 { 25 super(); 26 27 this.componentType = componentType; 28 } 29 30 public Object readObject(MessageReader reader, MessageContext context) 31 throws XFireFault 32 { 33 try 34 { 35 Type compType = getComponentType(); 36 37 Collection values = createCollection(); 38 39 while (reader.hasMoreElementReaders()) 40 { 41 MessageReader childReader = reader.getNextElementReader(); 42 43 values.add(compType.readObject(childReader, context)); 44 } 45 46 return values; 47 } 48 catch (IllegalArgumentException e) 49 { 50 throw new XFireRuntimeException("Illegal argument.", e); 51 } 52 } 53 54 protected Collection createCollection() 55 { 56 Collection values = null; 57 58 if (getTypeClass().isAssignableFrom(List.class)) 59 { 60 values = new ArrayList(); 61 } 62 else if (getTypeClass().isAssignableFrom(Set.class)) 63 { 64 values = new HashSet(); 65 } 66 else 67 { 68 values = new ArrayList(); 69 } 70 71 return values; 72 } 73 74 public void writeObject(Object object, MessageWriter writer, MessageContext context) 75 throws XFireFault 76 { 77 if (object == null) 78 return; 79 80 try 81 { 82 Collection list = (Collection) object; 83 84 Type type = getComponentType(); 85 86 if (type == null) 87 throw new XFireRuntimeException("Couldn't find type for " + type.getTypeClass() + "."); 88 89 for (Iterator itr = list.iterator(); itr.hasNext();) 90 { 91 String ns = null; 92 if (type.isAbstract()) 93 ns = getSchemaType().getNamespaceURI(); 94 else 95 ns = type.getSchemaType().getNamespaceURI(); 96 97 MessageWriter cwriter = writer 98 .getElementWriter(type.getSchemaType().getLocalPart(), ns); 99 100 type.writeObject(itr.next(), writer, context); 101 cwriter.close(); 102 } 103 } 104 catch (IllegalArgumentException e) 105 { 106 throw new XFireRuntimeException("Illegal argument.", e); 107 } 108 } 109 110 public Type getComponentType() 111 { 112 Type type = getTypeMapping().getType(componentType); 113 114 if (type == null) 115 { 116 type = getTypeMapping().getTypeCreator().createType(componentType); 117 getTypeMapping().register(type); 118 } 119 120 return type; 121 } 122 }