サンプルプログラム2
1 import com.change_vision.jude.api.inf.exception.ProjectLockedException;
2 import com.change_vision.jude.api.inf.model.IAttribute;
3 import com.change_vision.jude.api.inf.model.IClass;
4 import com.change_vision.jude.api.inf.model.IModel;
5 import com.change_vision.jude.api.inf.model.INamedElement;
6 import com.change_vision.jude.api.inf.model.IOperation;
7 import com.change_vision.jude.api.inf.model.IPackage;
8 import com.change_vision.jude.api.inf.model.IParameter;
9 import com.change_vision.jude.api.inf.project.ProjectAccessor;
10 import com.change_vision.jude.api.inf.project.ProjectAccessorFactory;
11
12 /**
13 * APIでJUDEモデルのパッケージ情報およびクラス情報を取得するサンプルコード.
14 * パッケージ名やクラス名などをコンソールに出力する。
15 */
16 public class ReadingPackagesAndClasses {
17
18 public static void main(String[] args) {
19 try {
20 System.out.println("Opening project...");
21
22 ProjectAccessor prjAccessor = ProjectAccessorFactory.getProjectAccessor();
23
24 // プロジェクトを開く。
25 prjAccessor.open("../SampleModel.jude", true, false, true);
26
27 System.out.println("Printing the elements...");
28
29 // 起点となるモデルを取得する。
30 IModel project = prjAccessor.getProject();
31
32 // プロジェクトに含まれる全てのパッケージとクラスを取得する。
33 printPackageInfo(project);
34
35 // プロジェクトを閉じる
36 prjAccessor.close();
37
38 System.out.println("Finished");
39
40 } catch (ProjectLockedException e) {
41 e.printStackTrace();
42 } catch (Throwable e) {
43 e.printStackTrace();
44 }
45 }
46
47 private static void printPackageInfo(IPackage iPackage) {
48 // パッケージ名を表示
49 System.out.println("Package name: " + iPackage.getName());
50 // パッケージの定義を表示
51 System.out.println("Package definition: " + iPackage.getDefinition());
52
53 // パッケージの要素(クラスやパッケージ)を表示
54 INamedElement[] iNamedElements = iPackage.getOwnedElements();
55 for (int i = 0; i < iNamedElements.length; i++) {
56 if (iNamedElements[i] instanceof IPackage) {
57 IPackage subPackage = (IPackage) iNamedElements[i];
58 // パッケージを表示
59 printPackageInfo(subPackage);
60 } else if (iNamedElements[i] instanceof IClass) {
61 IClass iClass = (IClass) iNamedElements[i];
62 // クラスを表示
63 printClassInfo(iClass);
64 }
65 }
66 }
67
68 private static void printClassInfo(IClass iClass) {
69 // クラス名を表示
70 System.out.println("Class name: " + iClass.getName());
71 // クラスの定義を表示
72 System.out.println("Class definition: " + iClass.getDefinition());
73
74 // 全ての属性を表示
75 IAttribute[] iAttributes = iClass.getAttributes();
76 for (int i = 0; i < iAttributes.length; i++) {
77 printAttributeInfo(iAttributes[i]);
78 }
79
80 // 全ての操作を表示
81 IOperation[] iOperations = iClass.getOperations();
82 for (int i = 0; i < iOperations.length; i++) {
83 printOperationInfo(iOperations[i]);
84 }
85
86 // インナークラスの情報を表示
87 IClass[] iClasses = iClass.getNestedClasses();
88 for (int i = 0; i < iClasses.length; i++) {
89 printClassInfo(iClasses[i]);
90 }
91 }
92
93
94 // 属性名を表示
95 System.out.println("Attribute name: " + iAttribute.getName());
96 // 属性のタイプを表示
97 System.out.println("Attribute type: " + iAttribute.getTypeExpression());
98 // 属性の定義を表示
99 System.out.println("Attribute definition: " + iAttribute.getDefinition());
100 }
101
102 private static void printOperationInfo(IOperation iOperation) {
103 // 操作名を表示
104 System.out.println("Operation name: " + iOperation.getName());
105 // 操作の返り値のタイプを表示
106 System.out.println("Operation returnType: " + iOperation.getReturnTypeExpression());
107 // 操作の定義を表示
108 System.out.println("Operation definition: " + iOperation.getDefinition());
109
110 // 全てのパラメータを表示
111 IParameter[] iParams = iOperation.getParameters();
112 for (int i = 0; i < iParams.length; i++) {
113 printParameterInfo(iParams[i]);
114 }
115 }
116
117 private static void printParameterInfo(IParameter iParameter) {
118 // パラメータ名を表示
119 System.out.println("Parameter name: " + iParameter.getName());
120 // パラメータの型を表示
121 System.out.println("Parameter type: " + iParameter.getTypeExpression());
122
123 }

サンプルプログラム2の内容
サンプルプログラム2は、JUDEモデルを読み込んで、その中にあるパッケージ名やクラス名などをコンソールに出力します。
「出力例2」は、「入力となるJUDEモデルの例1」を入力として与えた場合の結果です。ちょっと見づらいですが、パッケージの定義やクラス、クラスの属性、操作の情報などが出力されています。
JUDE上のモデルとAPIの対応関係さえつかめてくると、理解は難しくないと思いますが、いかがでしょうか?
属性と関連端

クラスの属性取得についての補足です。
クラス(IClass)のgetAttributes()で属性(IAttribute)を取得する場合、関連端を含むすべての属性が取得されます。例えば、IClassのgetAttributes()でクラス0の属性を取得する場合、属性0、属性1、クラス1の関連端が取得されます。関連端にあたるものかどうかを判定するには、IAttributeのgetAssociation()で関連の有無を確認します。また、関連(IAssociation)のgetMemberEnds()で関連端だけを取得することもできます。
