svnno****@sourc*****
svnno****@sourc*****
2008年 10月 25日 (土) 00:02:23 JST
Revision: 2029 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=jiemamy&view=rev&rev=2029 Author: j5ik2o Date: 2008-10-25 00:02:23 +0900 (Sat, 25 Oct 2008) Log Message: ----------- とりあえず、インタークラスにModelWriterを定義。あとで別ファイルにします。 Modified Paths: -------------- artemis/trunk/org.jiemamy.serializer/src/main/java/org/jiemamy/serializer/ModelInputStream.java -------------- next part -------------- Modified: artemis/trunk/org.jiemamy.serializer/src/main/java/org/jiemamy/serializer/ModelInputStream.java =================================================================== --- artemis/trunk/org.jiemamy.serializer/src/main/java/org/jiemamy/serializer/ModelInputStream.java 2008-10-23 17:29:34 UTC (rev 2028) +++ artemis/trunk/org.jiemamy.serializer/src/main/java/org/jiemamy/serializer/ModelInputStream.java 2008-10-24 15:02:23 UTC (rev 2029) @@ -26,9 +26,12 @@ import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Queue; import java.util.Stack; +import java.util.UUID; import java.util.concurrent.LinkedBlockingQueue; import com.megginson.sax.DataWriter; @@ -44,141 +47,210 @@ */ public class ModelInputStream extends InputStream { + private class ModelWriter { + + private Queue<Byte> resourceQueues; + + private DataWriter dataWriter; + + private StringWriter stringWriter; + + private Map<UUID, JiemamyModel> nextWriteModelMaps = new HashMap<UUID, JiemamyModel>(); + + + /** + * コンストラクタ。 + * @param resourceQueues + * @category instance creation + */ + public ModelWriter(Queue<Byte> resourceQueues) { + this.resourceQueues = resourceQueues; + createModelWriter(); + } + + private void createModelWriter() { + stringWriter = (new StringWriter()); + dataWriter = (new DataWriter(stringWriter)); + dataWriter.setIndentStep(2); + } + + /** + * 破棄処理 + */ + public void dispose() { + try { + dataWriter.endDocument(); + } catch (SAXException e) { + e.printStackTrace(); + } + } + + /** + * 初期化処理 + */ + public void init() { + try { + dataWriter.startDocument(); + } catch (SAXException e) { + e.printStackTrace(); + } + } + + /** + * TODO ここはリフレクションではなく、直接クラスを指定して書き込むようにすること + * @param jiemamyModel + * @return 書き込まなかったモデルのリスト + */ + public List<JiemamyModel> write(JiemamyModel jiemamyModel) { + List<JiemamyModel> nextWriteModelList = new ArrayList<JiemamyModel>(); + Class<? extends Object> clazz = jiemamyModel.getClass(); + String className = clazz.getName(); + try { + dataWriter.startElement(className); + dataWriter.dataElement("id", jiemamyModel.getId().toString()); + while (clazz != Object.class) { + Method[] methods = clazz.getMethods(); + for (Method method : methods) { + if ((method.getParameterTypes().length > 0) || (!method.getName().startsWith("get")) + || (method.getModifiers() == Modifier.STATIC)) { + continue; + } + Object value = method.invoke(jiemamyModel, new Object[0]); + if (value != null) { + if (value instanceof String) { + dataWriter.startElement(method.getName()); + dataWriter.dataElement(value.getClass().getName(), (String) value); + dataWriter.endElement(method.getName()); + } else if (value instanceof Integer) { + dataWriter.startElement(method.getName()); + dataWriter.dataElement(value.getClass().getName(), ((Integer) value).toString()); + dataWriter.endElement(method.getName()); + } else if (value instanceof Long) { + dataWriter.startElement(method.getName()); + dataWriter.dataElement(value.getClass().getName(), ((Long) value).toString()); + dataWriter.endElement(method.getName()); + } else if (value instanceof Float) { + dataWriter.startElement(method.getName()); + dataWriter.dataElement(value.getClass().getName(), ((Float) value).toString()); + dataWriter.endElement(method.getName()); + } else if (value instanceof JiemamyModel) { + String refClassName = ((JiemamyModel) value).getClass().getName(); + System.out.println(refClassName); + dataWriter.startElement(method.getName()); + dataWriter.startElement(refClassName); + dataWriter.dataElement("refid", ((JiemamyModel) value).getId().toString()); + dataWriter.endElement(refClassName); + dataWriter.endElement(method.getName()); + if (!nextWriteModelMaps.containsKey(((JiemamyModel) value).getId())) { + nextWriteModelMaps.put(((JiemamyModel) value).getId(), ((JiemamyModel) value)); + nextWriteModelList.add(((JiemamyModel) value)); + } + } else if (value instanceof Collection) { + if (((Collection<?>) value).size() > 0) { + String refCollectionClassName = ((Collection<?>) value).getClass().getName(); + dataWriter.startElement(method.getName()); + dataWriter.startElement(refCollectionClassName); + for (Object e : ((Collection<?>) value)) { + if (e instanceof JiemamyModel) { + String refClassName = ((JiemamyModel) e).getClass().getName(); + dataWriter.startElement(refClassName); + dataWriter.dataElement("refid", ((JiemamyModel) e).getId().toString()); + dataWriter.endElement(refClassName); + if (!nextWriteModelMaps.containsKey(((JiemamyModel) e).getId())) { + nextWriteModelMaps.put(((JiemamyModel) e).getId(), ((JiemamyModel) e)); + nextWriteModelList.add(((JiemamyModel) e)); + } + } + } + dataWriter.endElement(refCollectionClassName); + dataWriter.endElement(method.getName()); + } + } + } + } + clazz = clazz.getSuperclass(); + } + dataWriter.endElement(className); + } catch (SAXException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } catch (IllegalArgumentException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IllegalAccessException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (InvocationTargetException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + for (byte b : stringWriter.toString().getBytes()) { + resourceQueues.add(b); + } + createModelWriter(); + return nextWriteModelList; + } + + } + + + private boolean initialized; + private Queue<Byte> resourceQueues = new LinkedBlockingQueue<Byte>(); - private DataWriter dataWriter; + private ModelWriter modelWriter = new ModelWriter(resourceQueues); - private StringWriter stringWriter; - private Stack<JiemamyModel> nextWriteModelStacks = new Stack<JiemamyModel>(); /** * コンストラクタ。 * @param rootModel - * @category instance creation + * @category instance creation */ public ModelInputStream(RootModel rootModel) { - stringWriter = (new StringWriter()); - dataWriter = (new DataWriter(stringWriter)); nextWriteModelStacks.push(rootModel); } /** + * {@inheritDoc} + */ + @Override + public void close() throws IOException { + modelWriter.dispose(); + super.close(); + } + + /** * 要求された1モデルだけを読み込み,Byteのキューに追加していく - * @return 読み込むデータがない場合false, ある場合true - * @throws InvocationTargetException - * @throws IllegalAccessException - * @throws IllegalArgumentException + * @return 読み込むデータがない場合false, ある場合true + * @throws IllegalArgumentException */ - private boolean loadFromModel() throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { - try { - if (nextWriteModelStacks.empty()) { - return false; - } - dataWriter.setIndentStep(2); - dataWriter.startDocument(); - List<JiemamyModel> nextObjects = writeModel(nextWriteModelStacks.pop()); - for (JiemamyModel next : nextObjects) { - nextWriteModelStacks.push(next); - } - dataWriter.endDocument(); - for (byte b : stringWriter.toString().getBytes()) { - resourceQueues.add(b); - } - dataWriter = (new DataWriter(stringWriter)); - } catch (SAXException e) { - e.printStackTrace(); + private boolean loadFromModel() { + if (nextWriteModelStacks.empty()) { + return false; } + List<JiemamyModel> nextObjects = modelWriter.write(nextWriteModelStacks.pop()); + for (JiemamyModel next : nextObjects) { + nextWriteModelStacks.push(next); + } return resourceQueues.size() > 0 || !nextWriteModelStacks.empty(); } - /** + /*/** * {@inheritDoc} */ @Override public int read() throws IOException { + if (!initialized) { + modelWriter.init(); + initialized = true; + } if (resourceQueues.size() == 0) { - try { - if (!loadFromModel()) { - return -1; - } - } catch (IllegalArgumentException e) { - throw new IOException(); - } catch (IllegalAccessException e) { - throw new IOException(); - } catch (InvocationTargetException e) { - throw new IOException(); + if (!loadFromModel()) { + return -1; } } return resourceQueues.poll().intValue(); } - - /** - * モデルをDataWriterに書きこむ. - * @param jiemamyModel - * @return 次にwriteしないといけないモデルのリスト - * @throws SAXException - * @throws InvocationTargetException - * @throws IllegalAccessException - * @throws IllegalArgumentException - */ - private List<JiemamyModel> writeModel(JiemamyModel jiemamyModel) throws SAXException, IllegalArgumentException, - IllegalAccessException, InvocationTargetException { - List<JiemamyModel> nextWriteModelList = new ArrayList<JiemamyModel>(); - Class<? extends Object> clazz = jiemamyModel.getClass(); - - String className = clazz.getName(); - dataWriter.startElement(className); - dataWriter.dataElement("id", jiemamyModel.getId().toString()); - while (clazz != Object.class) { - Method[] methods = clazz.getMethods(); - for (Method method : methods) { - if ((method.getParameterTypes().length > 0) || (!method.getName().startsWith("get")) - || (method.getModifiers() == Modifier.STATIC) || (!method.getName().startsWith("get")) || (method.getModifiers() == Modifier.STATIC)) { - continue; - } - Object value = method.invoke(jiemamyModel, new Object[0]); - if (value != null) { - if (value instanceof String) { - dataWriter.startElement(method.getName()); - dataWriter.dataElement(value.getClass().getName(), (String) value); - dataWriter.endElement(method.getName()); - } else if (value instanceof Integer) { - dataWriter.startElement(method.getName()); - dataWriter.dataElement(value.getClass().getName(), ((Integer) value).toString()); - dataWriter.endElement(method.getName()); - } else if (value instanceof Long) { - dataWriter.startElement(method.getName()); - dataWriter.dataElement(value.getClass().getName(), ((Long) value).toString()); - dataWriter.endElement(method.getName()); - } else if (value instanceof Float) { - dataWriter.startElement(method.getName()); - dataWriter.dataElement(value.getClass().getName(), ((Float) value).toString()); - dataWriter.endElement(method.getName()); - } else if (value instanceof JiemamyModel) { - String refClassName = ((JiemamyModel) value).getClass().getName(); - dataWriter.startElement(refClassName); - dataWriter.dataElement("refid", ((JiemamyModel) value).getId().toString()); - dataWriter.endElement(refClassName); - nextWriteModelList.add(((JiemamyModel) value)); - } else if (value instanceof Collection) { - for (Object e : ((Collection<?>) value)) { - if (e instanceof JiemamyModel) { - String refClassName = ((JiemamyModel) e).getClass().getName(); - dataWriter.startElement(refClassName); - dataWriter.dataElement("refid", ((JiemamyModel) e).getId().toString()); - dataWriter.endElement(refClassName); - nextWriteModelList.add((JiemamyModel) e); - } - } - } - } - } - clazz = clazz.getSuperclass(); - } - dataWriter.endElement(className); - - return nextWriteModelList; - } }