サンプルプログラム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()
で関連端だけを取得することもできます。