001: /*
002: * Created by IntelliJ IDEA.
003: * User: sg426575
004: * Date: May 20, 2006
005: * Time: 3:38:29 AM
006: */
007: package com.technoetic.xplanner.domain.io;
008:
009: import java.lang.reflect.InvocationTargetException;
010: import java.lang.reflect.Method;
011: import java.lang.reflect.Field;
012: import java.util.Date;
013: import java.util.Iterator;
014: import java.util.Map;
015: import java.util.ArrayList;
016: import java.util.List;
017: import java.util.Map.Entry;
018:
019: import com.thoughtworks.xstream.XStream;
020: import com.thoughtworks.xstream.converters.basic.AbstractBasicConverter;
021:
022: import com.technoetic.xplanner.domain.CharacterEnum;
023: import com.technoetic.xplanner.domain.DomainClass;
024: import com.technoetic.xplanner.domain.DomainMetaDataRepository;
025: import com.technoetic.xplanner.domain.DomainObject;
026: import com.technoetic.xplanner.domain.IterationStatus;
027: import com.technoetic.xplanner.domain.IterationStatusPersistent;
028: import com.technoetic.xplanner.domain.StoryDisposition;
029: import com.technoetic.xplanner.domain.StoryStatus;
030: import com.technoetic.xplanner.domain.TaskDisposition;
031: import com.technoetic.xplanner.domain.Person;
032: import com.technoetic.xplanner.util.ClassUtil;
033:
034: public class IOStream {
035:
036: public class Document {
037: public DomainObject domainObject;
038: public Person[] persons;
039: }
040:
041: public String toXML(Object object) {
042: XStream stream = newXStream();
043: return stream.toXML(object);
044: }
045:
046: public Object fromXML(String xml) {
047: XStream stream = newXStream();
048: return stream.fromXML(xml);
049: }
050:
051: private XStream newXStream() {
052: XStream stream = new XStream();
053: stream.setMode(XStream.ID_REFERENCES);
054: Map metadataByTypeName = DomainMetaDataRepository.getInstance()
055: .getMetadataByTypeName();
056: Iterator iterator = metadataByTypeName.entrySet().iterator();
057: while (iterator.hasNext()) {
058: Entry e = (Entry) iterator.next();
059: DomainClass domainClass = (DomainClass) e.getValue();
060: stream.alias((String) e.getKey(), domainClass
061: .getJavaClass());
062: }
063: stream.registerConverter(new IterationStatusConverter());
064: stream.registerConverter(new CharacterEnumConverter(
065: StoryStatus.class));
066: stream.registerConverter(new CharacterEnumConverter(
067: TaskDisposition.class));
068: stream.registerConverter(new CharacterEnumConverter(
069: StoryDisposition.class));
070: stream.alias("status", IterationStatus.class,
071: IterationStatusPersistent.class);
072: stream.addImmutableType(IterationStatusPersistent.class);
073: stream.addImmutableType(StoryStatus.class);
074: stream.addImmutableType(TaskDisposition.class);
075: stream.addImmutableType(StoryDisposition.class);
076: stream.addImmutableType(Date.class);
077: return stream;
078: }
079:
080: class IterationStatusConverter extends AbstractBasicConverter {
081:
082: protected Object fromString(String str) {
083: return IterationStatus.fromKey(str);
084: }
085:
086: protected String toString(Object obj) {
087: return ((IterationStatus) obj).getKey();
088: }
089:
090: public boolean canConvert(Class type) {
091: return IterationStatus.class.isAssignableFrom(type);
092: }
093:
094: }
095:
096: class CharacterEnumConverter extends AbstractBasicConverter {
097: Class enumClass;
098: Method fromName;
099:
100: protected CharacterEnumConverter(Class enumClass) {
101: this .enumClass = enumClass;
102: try {
103: fromName = enumClass.getMethod("fromName",
104: new Class[] { String.class });
105: } catch (NoSuchMethodException e) {
106: throw new IllegalArgumentException(enumClass.getName()
107: + " does not have a method fromName()");
108: }
109: }
110:
111: protected String toString(Object obj) {
112: return ((CharacterEnum) obj).getName();
113: }
114:
115: protected Object fromString(String str) {
116: try {
117: return fromName.invoke(null, new Object[] { str });
118: } catch (IllegalAccessException e) {
119: throw new RuntimeException(e);
120: } catch (InvocationTargetException e) {
121: throw new RuntimeException(e.getCause());
122: }
123: }
124:
125: public boolean canConvert(Class type) {
126: return enumClass.isAssignableFrom(type);
127: }
128:
129: }
130:
131: class ReferencedPersonList extends ArrayList {
132: public ReferencedPersonList(DomainObject object) {
133: init(object);
134: }
135:
136: private void init(DomainObject object) {
137: try {
138: List fields = ClassUtil.getAllFields(object);
139: for (int i = 0; i < fields.size(); i++) {
140: Field field = (Field) fields.get(i);
141: if (Person.class.isAssignableFrom(field.getType())) {
142: add(field.get(object));
143: }
144:
145: }
146: } catch (Exception e) {
147: throw new RuntimeException(e);
148: }
149: }
150: }
151:
152: }
|