[Jiemamy-notify] commit [2029] とりあえず、インタークラスにModelWriterを定義。あとで別ファイルにします。

Back to archive index

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;
-	}
 }


Jiemamy-notify メーリングリストの案内
Back to archive index