[Jiemamy-notify] commit [2028] 単純なModelChangeListenerで運用するために、ChangeSupportImplの自動生成を修正。

Zurück zum Archiv-Index

svnno****@sourc***** svnno****@sourc*****
2008年 10月 24日 (金) 02:29:34 JST


Revision: 2028
          http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=jiemamy&view=rev&rev=2028
Author:   shin1
Date:     2008-10-24 02:29:34 +0900 (Fri, 24 Oct 2008)

Log Message:
-----------
単純なModelChangeListenerで運用するために、ChangeSupportImplの自動生成を修正。

Modified Paths:
--------------
    sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/JiemamyDocletMain.launch
    sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/java/org/jiemamy/core/eventcodegen/CollectionProperty.java
    sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/java/org/jiemamy/core/eventcodegen/JiemamyModelDoclet.java
    sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/resources/ChangeListener.vm
    sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/resources/ChangeSupport.vm
    sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/resources/ChangeSupportImpl.vm


-------------- next part --------------
Modified: sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/JiemamyDocletMain.launch
===================================================================
--- sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/JiemamyDocletMain.launch	2008-10-23 14:58:54 UTC (rev 2027)
+++ sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/JiemamyDocletMain.launch	2008-10-23 17:29:34 UTC (rev 2028)
@@ -11,6 +11,6 @@
 <listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
 </listAttribute>
 <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="com.sun.tools.javadoc.Main"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-doclet org.jiemamy.core.eventcodegen.JiemamyModelDoclet -sourcepath ../org.jiemamy.spec.core/src/main/java -subpackages org.jiemamy.spec.model -private"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-doclet org.jiemamy.core.eventcodegen.JiemamyModelDoclet -sourcepath ../org.jiemamy.core/src/main/java -subpackages org.jiemamy.core.model -private"/>
 <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.jiemamy.core.eventcodegen"/>
 </launchConfiguration>

Modified: sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/java/org/jiemamy/core/eventcodegen/CollectionProperty.java
===================================================================
--- sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/java/org/jiemamy/core/eventcodegen/CollectionProperty.java	2008-10-23 14:58:54 UTC (rev 2027)
+++ sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/java/org/jiemamy/core/eventcodegen/CollectionProperty.java	2008-10-23 17:29:34 UTC (rev 2028)
@@ -4,9 +4,9 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.jiemamy.spec.event.collectionimpl.ObservableList;
-import org.jiemamy.spec.event.collectionimpl.ObservableMap;
-import org.jiemamy.spec.event.collectionimpl.ObservableSet;
+import org.jiemamy.event.collectionimpl.ObservableList;
+import org.jiemamy.event.collectionimpl.ObservableMap;
+import org.jiemamy.event.collectionimpl.ObservableSet;
 
 public class CollectionProperty {
 	private String name;

Modified: sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/java/org/jiemamy/core/eventcodegen/JiemamyModelDoclet.java
===================================================================
--- sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/java/org/jiemamy/core/eventcodegen/JiemamyModelDoclet.java	2008-10-23 14:58:54 UTC (rev 2027)
+++ sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/java/org/jiemamy/core/eventcodegen/JiemamyModelDoclet.java	2008-10-23 17:29:34 UTC (rev 2028)
@@ -18,23 +18,41 @@
 import org.apache.velocity.exception.ResourceNotFoundException;
 import org.jiemamy.spec.model.JiemamyModel;
 
+import com.sun.javadoc.AnnotationDesc;
 import com.sun.javadoc.ClassDoc;
 import com.sun.javadoc.Doclet;
+import com.sun.javadoc.FieldDoc;
 import com.sun.javadoc.LanguageVersion;
-import com.sun.javadoc.MethodDoc;
 import com.sun.javadoc.RootDoc;
 import com.sun.javadoc.Type;
+import com.sun.javadoc.AnnotationDesc.ElementValuePair;
 
 /**
- * Event用のソースを自動生成する。 j-coreプロジェクト配下のソースを読み込み、{@link JiemamyModel}を発見した場合にその{@link JiemamyModel}用のChangeListenerとChangeSupportを自動生成する。
+ * Event用のソースを自動生成する。 j-coreプロジェクト配下のソースを読み込み、 {@link JiemamyModel}を発見した場合にその{@link JiemamyModel}用のChangeListenerとChangeSupportを自動生成する。
+ * <ul>
+ * <li>以下の「実行の構成」を作成する事で実行可能。
+ * <ul>
+ * <li>Main Class:com.sun.tools.javadoc.Main</li>
+ * <li>Program Argumenets: -doclet \
+ * org.jiemamy.core.eventcodegen.JiemamyModelDoclet -sourcepath \
+ * ../org.jiemamy.core/src/main/java -subpackages org.jiemamy.core.model
+ * -private</li>
+ * </ul>
+ * </li>
+ * <li>実行後、自動生成された以下の場所にあるフォルダに対して 「Source-Organize
+ * Imports」と「Source-Format」を行ってからCommitする事。
+ * <ul>
+ * <li>../org.jiemamy.event/src/main/java/org/event/model配下の全てのフォルダ</li>
+ * <li>../org.jiemamy.spec.event/src/main/java/org/event/model配下の全てのフォルダ</li>
+ * </ul>
+ * </li>
+ * </ul>
  * 
  * @author shin1ogawa
  */
 public class JiemamyModelDoclet extends Doclet {
 	public List<JiemamyModel> model;
 	public Map<Class<?>, CollectionProperty> collectionProperties = new HashMap<Class<?>, CollectionProperty>();
-//	public static final String OUTPUTDIR_SPECS = "src/main/java/";
-//	public static final String OUTPUTDIR_IMPLEMENTS = "src/main/java/";
 	public static final String OUTPUTDIR_IMPLEMENTS = "../org.jiemamy.event/src/main/java/";
 	public static final String OUTPUTDIR_SPECS = "../org.jiemamy.spec.event/src/main/java/";
 
@@ -119,35 +137,60 @@
 		addImportClasses(importClasses,
 				"org.jiemamy.spec.event.ObservableCollectionChangeEvent");
 		List<CollectionProperty> properties = new ArrayList<CollectionProperty>();
-		MethodDoc[] methods = classDoc.methods();
-		for (MethodDoc methodDoc : methods) {
-			if (methodDoc.name().startsWith("get") == false
-					|| methodDoc.parameters().length != 0) {
-				// getで始まらないか、引数を受けるメソッドは処理対象にしない。
+		FieldDoc[] fields = classDoc.fields();
+		for (FieldDoc fieldDoc : fields) {
+			// Bindingアノテーションで修飾されているかを調査する。
+			boolean hasBindingAnnotation = false;
+			AnnotationDesc[] annotations = fieldDoc.annotations();
+			String observableCollectionName = "";
+			for (AnnotationDesc annotation : annotations) {
+				String annotationType = annotation.annotationType()
+						.qualifiedName();
+				if (annotationType
+						.equals("org.seasar.framework.container.annotation.tiger.Binding")) {
+					ElementValuePair[] elementValues = annotation
+							.elementValues();
+					for (ElementValuePair elementValue : elementValues) {
+						String valueString = elementValue.value().toString().replaceAll("\"", "");
+						String elementString = elementValue.element()
+								.toString();
+						if (elementString
+								.equals("org.seasar.framework.container.annotation.tiger.Binding.value()")
+								&& (valueString.equals("set")
+										|| valueString.equals("list") || valueString
+										.equals("map"))) {
+							// Bindingアノテーションのその引数が"list" "map" "set"のいずれかであるものが対象。
+							hasBindingAnnotation = true;
+							observableCollectionName = valueString;
+							break;
+						}
+					}
+				}
+			}
+			if (hasBindingAnnotation == false) {
 				continue;
 			}
-			Type type = methodDoc.returnType();
+
+			Type type = fieldDoc.type();
 			String fieldTypeName = type.qualifiedTypeName();
 			Class<?> fieldType = Class.forName(fieldTypeName);
 			if (isSubClass(fieldType, List.class)
 					|| isSubClass(fieldType, List.class)) {
 				// ListまたはSetのサブクラス
-				String parameterClassName = getParameterClassName(methodDoc);
+				String parameterClassName = getParameterClassName(fieldDoc);
 				addImportClasses(importClasses, fieldTypeName);
 				addImportClasses(importClasses, parameterClassName);
-				properties
-						.add(new CollectionProperty(getFieldName(methodDoc),
-								type.qualifiedTypeName().toString(),
-								parameterClassName));
+				properties.add(new CollectionProperty(fieldDoc.name(), type
+						.qualifiedTypeName().toString(), parameterClassName));
 			} else if (isSubClass(fieldType, Map.class)) {
 				// Mapのサブクラス
-				String[] parameterClassNames = getParameterClassNames(methodDoc);
+				String[] parameterClassNames = getParameterClassNames(fieldDoc);
 				addImportClasses(importClasses, fieldTypeName);
 				addImportClasses(importClasses, parameterClassNames[0]);
 				addImportClasses(importClasses, parameterClassNames[1]);
 				try {
 					CollectionProperty collectionProperty = new CollectionProperty(
-							getFieldName(methodDoc), type.qualifiedTypeName()
+							fieldDoc.name(), type.qualifiedTypeName()
 									.toString(), parameterClassNames[1]);
 					collectionProperty
 							.setMapKeyClassName(parameterClassNames[0]);
@@ -161,7 +204,7 @@
 		// Templateからjavaファイルを生成する。
 		try {
 			String packageName = getPackageName(classDoc).replaceAll(
-					"org.jiemamy.spec", "org.jiemamy.spec.event");
+					"org.jiemamy.core", "org.jiemamy.spec.event");
 			File dirForSpec = new File(OUTPUTDIR_SPECS
 					+ packageName.replaceAll("\\.", "/"));
 			if (!dirForSpec.exists()) {
@@ -169,14 +212,16 @@
 			}
 			// 実装のパッケージ名には"spec"を含まない。
 			File dirForImpl = new File(OUTPUTDIR_IMPLEMENTS
-					+ packageName.replaceAll("\\.spec", "").replaceAll("\\.", "/"));
+					+ packageName.replaceAll("\\.spec", "").replaceAll("\\.",
+							"/"));
 			if (!dirForImpl.exists()) {
 				dirForImpl.mkdirs();
 			}
 			VelocityContext velocityContext = new VelocityContext();
 			velocityContext.put("package", packageName);
 			velocityContext.put("importClasses", importClasses);
-			velocityContext.put("modelClassName", classDoc.name().toString());
+			String modelClassName = classDoc.name().toString().replace("Impl", "");
+			velocityContext.put("modelClassName", modelClassName);
 			velocityContext.put("modelClassNameLower", classDoc.name()
 					.toString().substring(0, 1).toLowerCase()
 					+ classDoc.name().toString().substring(1));
@@ -186,7 +231,7 @@
 			Template listenerTemplate = Velocity
 					.getTemplate("ChangeListener.vm");
 			File file = new File(dirForSpec.getAbsolutePath() + "/"
-					+ classDoc.name().toString() + "ChangeListener.java");
+					+ modelClassName + "ChangeListener.java");
 			System.out.println(file.getAbsolutePath());
 			Writer writer = new FileWriter(file);
 			listenerTemplate.merge(velocityContext, writer);
@@ -209,7 +254,7 @@
 			Collections.sort(importClasses);
 			Template supportTemplate = Velocity.getTemplate("ChangeSupport.vm");
 			file = new File(dirForSpec.getAbsolutePath() + "/"
-					+ classDoc.name().toString() + "ChangeSupport.java");
+					+ modelClassName + "ChangeSupport.java");
 			System.out.println(file.getAbsolutePath());
 			writer = new FileWriter(file);
 			supportTemplate.merge(velocityContext, writer);
@@ -217,12 +262,21 @@
 			writer.close();
 
 			// ChangeSupportImplの生成
-			velocityContext.put("package", packageName.replaceAll("\\.spec", ""));
+			velocityContext.put("package", packageName
+					.replaceAll("\\.spec", ""));
 			addImportClasses(importClasses, "java.util.List");
 			addImportClasses(importClasses, "java.util.ArrayList");
 			addImportClasses(importClasses, "org.jiemamy.spec.event.Observable");
 			addImportClasses(importClasses,
 					"org.jiemamy.spec.event.ModelChangeEvent");
+			addImportClasses(importClasses,
+					"org.jiemamy.event.AbstractModelChangeSupport");
+			addImportClasses(importClasses,
+					"org.jiemamy.spec.event.ModelChangeSupport");
+			addImportClasses(importClasses,
+					"org.seasar.framework.beans.BeanDesc");
+			addImportClasses(importClasses,
+					"org.seasar.framework.beans.impl.BeanDescImpl");
 			if (properties.size() > 0) {
 				importClasses
 						.add("org.jiemamy.spec.event.ObservableCollectionChangeListener");
@@ -235,7 +289,7 @@
 			Template supportImplTemplate = Velocity
 					.getTemplate("ChangeSupportImpl.vm");
 			file = new File(dirForImpl.getAbsolutePath() + "/"
-					+ classDoc.name().toString() + "ChangeSupportImpl.java");
+					+ modelClassName + "ChangeSupportImpl.java");
 			System.out.println(file.getAbsolutePath());
 			writer = new FileWriter(file);
 			supportImplTemplate.merge(velocityContext, writer);
@@ -246,11 +300,6 @@
 		}
 	}
 
-	private static String getFieldName(MethodDoc methodDoc) {
-		String name = methodDoc.name().replaceFirst("get", "");
-		return name.substring(0, 1).toLowerCase() + name.substring(1);
-	}
-
 	/**
 	 * あるクラスがあるクラスのサブクラスかどうか。
 	 * 
@@ -281,11 +330,11 @@
 	/**
 	 * {@link List}や{@link Set}フィールドのGeneric情報を返す。
 	 * 
-	 * @param methodDoc
+	 * @param fieldDoc
 	 * @return
 	 */
-	private static String getParameterClassName(MethodDoc methodDoc) {
-		String parameterizedType = methodDoc.returnType().asParameterizedType()
+	private static String getParameterClassName(FieldDoc fieldDoc) {
+		String parameterizedType = fieldDoc.type().asParameterizedType()
 				.toString();
 		int index1 = parameterizedType.indexOf('<');
 		int index2 = parameterizedType.lastIndexOf('>');
@@ -295,11 +344,11 @@
 	/**
 	 * {@link Map}フィールドのGeneric情報を返す。
 	 * 
-	 * @param methodDoc
+	 * @param fieldDoc
 	 * @return
 	 */
-	private static String[] getParameterClassNames(MethodDoc methodDoc) {
-		String parameterizedType = methodDoc.returnType().asParameterizedType()
+	private static String[] getParameterClassNames(FieldDoc fieldDoc) {
+		String parameterizedType = fieldDoc.type().asParameterizedType()
 				.toString();
 		int index1 = parameterizedType.indexOf('<');
 		int index2 = parameterizedType.lastIndexOf('>');

Modified: sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/resources/ChangeListener.vm
===================================================================
--- sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/resources/ChangeListener.vm	2008-10-23 14:58:54 UTC (rev 2027)
+++ sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/resources/ChangeListener.vm	2008-10-23 17:29:34 UTC (rev 2028)
@@ -23,10 +23,11 @@
 #end
 
 /**
- * ${modelClassName}用のListener
- * 
+ * ${modelClassName}用のListener。
+ * 近々削除されます!
  * @author shin1ogawa
  */
+ @ Deprecated
 public interface ${modelClassName}ChangeListener extends ModelChangeListener {
 
 #foreach($property in $properties)

Modified: sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/resources/ChangeSupport.vm
===================================================================
--- sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/resources/ChangeSupport.vm	2008-10-23 14:58:54 UTC (rev 2027)
+++ sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/resources/ChangeSupport.vm	2008-10-23 17:29:34 UTC (rev 2028)
@@ -24,9 +24,10 @@
 
 /**
  * Event関連の処理をModel内に直接記述するとModelのSourceの可読性が低くなるため、${modelClassName}からそれらを引き受ける。
- * 
+ * 近々削除されます!
  * @author shin1ogawa
  */
+ @ Deprecated
 public interface ${modelClassName}ChangeSupport {
 	
 	/**

Modified: sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/resources/ChangeSupportImpl.vm
===================================================================
--- sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/resources/ChangeSupportImpl.vm	2008-10-23 14:58:54 UTC (rev 2027)
+++ sandbox/org.jiemamy.core.eventcodegen/trunk/org.jiemamy.core.eventcodegen/src/main/resources/ChangeSupportImpl.vm	2008-10-23 17:29:34 UTC (rev 2028)
@@ -27,11 +27,8 @@
  * 
  * @author shin1ogawa
  */
-public class ${modelClassName}ChangeSupportImpl implements ${modelClassName}ChangeSupport {
+public class ${modelClassName}ChangeSupportImpl extends AbstractModelChangeSupport implements ModelChangeSupport {
 	
-	/** ${modelClassName}自身のEventを監視するListenerのリスト */
-	private List<${modelClassName}ChangeListener> listeners = new ArrayList<${modelClassName}ChangeListener>();
-	
 #foreach($property in $properties)
 	
 	/** 
@@ -80,16 +77,6 @@
 #end
 	}
 	
-	/**
-	 * ${modelClassName}自身のEventを監視するListenerを追加する。
-	 * 
-	 * @param l {@link ${modelClassName}ChangeListener}
-	 * @see #remove${modelClassName}ChangeListener(${modelClassName}ChangeListener)
-	 */
-	public void add${modelClassName}ChangeListener(${modelClassName}ChangeListener l) {
-		listeners.add(l);
-	}
-	
 #foreach($property in $properties)
 	/**
 	 * ${property.name}のcollectionを監視するListenerに通知されたEventを${modelClassName}の監視Listenerへ通知する。
@@ -98,30 +85,9 @@
 	 */
 	public void fire${property.nameUpper}CollectionChangeEvent(
 			ObservableCollectionChangeEvent<${property.collectionClassSimpleName}<#if(${property.map} != false)${property.mapKeyClassSimpleName}, #end${property.elementClassSimpleName}>, ${property.elementClassSimpleName}> event) {
-		for (${modelClassName}ChangeListener l : listeners) {
-			l.${property.nameSingle}CollectionChange(event);
-		}
+		BeanDesc beanDesc = new BeanDescImpl(${modelClassName}Impl.class);
+		event.setField(beanDesc.getField("${property.name}"));
+		fireModelChange(event);
 	}
 #end
-	
-	/**
-	 * ${modelClassName}自身を監視するListenerに通知されたEventを${modelClassName}の監視Listenerへ通知する。
-	 * 
-	 * @param event {@link ModelChangeEvent}
-	 */
-	public void fireModelChange(ModelChangeEvent event) {
-		for (${modelClassName}ChangeListener l : listeners) {
-			l.modelChanged(event);
-		}
-	}
-	
-	/**
-	 * ${modelClassName}自身のEventを監視するListenerを削除する。
-	 * 
-	 * @param l {@link ${modelClassName}ChangeListener}
-	 * @see #add${modelClassName}ChangeListener(${modelClassName}ChangeListener)
-	 */
-	public void remove${modelClassName}ChangeListener(${modelClassName}ChangeListener l) {
-		listeners.remove(l);
-	}
 }


Jiemamy-notify メーリングリストの案内
Zurück zum Archiv-Index