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