# astah* API 利用ガイド

## 【プロジェクトの言語情報】

astah*のJava,C#,C++等の言語情報は、各モデルのステレオタイプ、タグ付き値、モデルの属性で表現します。

#### プロジェクトの言語情報一覧

プロジェクトモデル(IModel)は言語情報を持つかどうかのタグ付き値を保持します。

言語 | 項目 | タグ付き値 | ステレオタイプ | モデルの属性 | 付加されるモデル
Java | Javaプロジェクト | [キー]jude.profile.java[値]true/false | - | - | プロジェクトモデル(IModel)
C# | C#プロジェクト | [キー]jude.profile.c_sharp[値]true/false | - | - | プロジェクトモデル(IModel)
C++ | C++プロジェクト | [キー]jude.profile.c_plus[値]true/false | - | - | プロジェクトモデル(IModel)

#### Java、C#の判定(クラス、属性、操作)

astah*のクラス、属性、操作のプロパティビューの言語タブにJava、C#のチェックボックスがあります。
例えば、クラスのプロパティビューの言語タブでjavaのチェックボックスがONの場合、クラスに"Java Class" のステレオタイプが設定されます。(ただし、ダイアグラムエディタやプロパティビューのステレオタイプには表示されません。)

言語 | モデル | ステレオタイプ
Java | クラス(IClass) | Java Class
Java | 属性(IAttribute) | Java Attribute
Java | 操作(IOperation) | Java Method
C# | クラス(IClass) | C# Class
C# | 属性(IAttribute) | C# Attribute
C# | 操作(IOperation) | C# Method
C++ | クラス(IClass) | C++ Class
C++ | 属性(IAttribute) | C++ Attribute
C++ | 操作(IOperation) | C++ Method

#### クラス、属性、操作の言語情報一覧

astah*のクラス、属性、操作のプロパティビューの言語タブに表示される設定項目は、各モデルのタグ付き値、ステレオタイプ、モデルの属性のいずれかに設定されます。
対象となるモデル: クラス(IClass)、属性(IAttribute)、操作(IOperation)

言語 | 項目 | ステレオタイプ | タグ付き値 | モデルの属性 | 付加されるモデル
Java | <<enum>> | <<enum>> | - | - | クラス(IClass)
Java | annotations | - | [キー]jude.java.annotations[値]任意 | - | クラス(IClass)、属性(IAttribute)、操作(IOperation)
Java | @interface | - | [キー]jude.java.atmark_interface[値]true/false | - | クラス(IClass)
Java | strictfp | - | [キー]jude.java.strictfp[値]true/false | - | クラス(IClass)、操作(IOperation)
Java | [クラス]final | - | - | IClass.isLeaf() | クラス(IClass)
Java | <<enum constant>> | <<enum constant>> | - | - | 属性(IAttribute)
Java | transient | - | [キー]jude.java.transient[値]true/false | - | 属性(IAttribute)
Java | volatile | - | [キー]jude.java.volatile[値]true/false | - | 属性(IAttribute)
Java | [属性]final | - | - | IAttribute.isChangeable() | 属性(IAttribute)
Java | synchronized | - | [キー]jude.java.synchronized[値]true/false | - | 操作(IOperation)
Java | native | - | [キー]jude.java.native[値]true/false | - | 操作(IOperation)
Java | [操作]final | - | - | IClass.isLeaf() | 操作(IOperation)
C# | <<delegate>> | <<delegate>> | - | - | クラス(IClass)
C# | <<struct>> | <<struct>> | - | - | クラス(IClass)
C# | <<enum>> | <<enum>> | - | - | クラス(IClass)
C# | attributes | - | [キー]jude.c_sharp.attributes[値]任意 | - | クラス(IClass)、属性(IAttribute)、操作(IOperation)
C# | sealed | - | [キー]jude.c_sharp.sealed[値]true/false | - | クラス(IClass)
C# | static | - | [キー]jude.c_sharp.static[値]true/false | - | クラス(IClass)
C# | internal | - | [キー]jude.c_sharp.internal[値]true/false | - | クラス(IClass)、属性(IAttribute)、操作(IOperation)
C# | <<property>> | <<property>> | - | - | 属性(IAttribute)
C# | <<property>> get | - | [キー]jude.c_sharp.property_get[値]true/false | - | 属性(IAttribute)
C# | <<property>> set | - | [キー]jude.c_sharp.property_set[値]true/false | - | 属性(IAttribute)
C# | <<enum constant>> | <<enum constant>> | - | - | 属性(IAttribute)
C# | const | - | [キー]jude.c_sharp.const[値]true/false | - | 属性(IAttribute)
C# | volatile | - | [キー]jude.c_sharp.volatile[値]true/false | - | 属性(IAttribute)
C# | [属性]readonly | - | - | IAttribute.getChangeable() | 属性(IAttribute)
C# | <<event>> | <<event>> | - | - | 操作(IOperation)
C# | <<event>> add | - | [キー]jude.c_sharp.event_add[値]true/false | - | 操作(IOperation)
C# | <<event>> remove | - | [キー]jude.c_sharp.event_remove[値]true/false | - | 操作(IOperation)
C# | <<indexer>> | <<indexer>> | - | - | 操作(IOperation)
C# | <<indexer>> get | - | [キー]jude.c_sharp.indexer_get[値]true/false | - | 操作(IOperation)
C# | <<indexer>> set | - | [キー]jude.c_sharp.indexer_set[値]true/false | - | 操作(IOperation)
C# | extern | - | [キー]jude.c_sharp.extern[値]true/false | - | 操作(IOperation)
C# | override | - | [キー]jude.c_sharp.override[値]true/false | - | 操作(IOperation)
C# | sealed | - | [キー]jude.c_sharp.sealed[値]true/false | - | 操作(IOperation)
C# | unsafe | - | [キー]jude.c_sharp.unsafe[値]true/false | - | 操作(IOperation)
C# | virtual | - | [キー]jude.c_sharp.virtual[値]true/false | - | 操作(IOperation)
C# | extension method | - | [キー]jude.c_sharp.extension_method[値]true/false | - | 操作(IOperation)
C++ | 型修飾子 | - | [キー]type_modifier[値]文字列 | IElement.getTypeModifier(),ITemplateBinding.getActualParameterTypeModifier() | -
C++ | <<enum>> | <<enum>> | - | - | クラス(IClass)
C++ | <<struct>> | <<struct>> | - | - | クラス(IClass)
C++ | <<union>> | <<union>> | - | - | クラス(IClass)
C++ | <<enum constant>> | <<enum constant>> | - | - | 属性(IAttribute)
C++ | const | - | [キー]jude.c_plus.const[値]true/false | - | 属性(IAttribute)、操作(IOperation)
C++ | mutable | - | [キー]jude.c_plus.mutable[値]true/false | - | 属性(IAttribute)
C++ | volatile | - | [キー]jude.c_plus.volatile[値]true/false | - | 属性(IAttribute)
C++ | friend | - | [キー]jude.c_plus.friend[値]true/false | - | 操作(IOperation)
C++ | explicit | - | [キー]jude.c_plus.explicit[値]true/false | - | 操作(IOperation)
C++ | inline | - | [キー]jude.c_plus.inline[値]true/false | - | 操作(IOperation)
C++ | virtual | - | [キー]jude.c_plus.virtual[値]true/false | - | 操作(IOperation)

#### 【プロジェクトの言語情報の取得】

プロジェクトの言語情報を取得

        public void getLanguageInfomataion() {
            BasicModelEditor bme = ModelEditorFactory.getBasicModelEditor();
            IModel project = AstahAPI.getAstahAPI().getProjectAccessor().getProject();
            try {
                if (isJavaProject(project)) {
                    System.out.println("Java Language");
                }
                if (isCSharpProject(project)) {
                    System.out.println("C# Language");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        private boolean isJavaProject(IModel project) {
            ITaggedValue[] tags = project.getTaggedValues();
            for (int i = 0; i < tags.length; i++) {
                ITaggedValue tag = tags[i];
                String key = tag.getKey();
                if ("jude.profile.java".eqauls(key) {
                    if ("true".equals(tag.getValue()) {
                        return true;
                    }
                }
            }
            return false;
        }

        private boolean isCSharpProject(IModel project) {
            ITaggedValue[] tags = project.getTaggedValues();
            for (int i = 0; i < tags.length; i++) {
                ITaggedValue tag = tags[i];
                String key = tag.getKey();
                if ("jude.profile.c_sharp".eqauls(key) {
                    if ("true".equals(tag.getValue()) {
                        return true;
                    }
                }
            }
            return false;
        }

#### 【プロジェクトの言語情報の設定】

プロジェクトの言語情報を設定

        public void testSetLanguageCSharp() throws ClassNotFoundException,
        InvalidEditingException, ProjectNotFoundException {
            BasicModelEditor bme = ModelEditorFactory.getBasicModelEditor();
            IModel project = AstahAPI.getAstahAPI().getProjectAccessor().getProject();
            try {
                TransactionManager.beginTransaction();

                //Java:OFF
                bme.setLanguageJava(project, false);
                //C#:OFF
                bme.setLanguageCSharp(project, false);
                //Java:ON
                bme.setLanguageJava(project, true);
                //C#:ON
                bme.setLanguageCSharp(project, true);

                TransactionManager.endTransaction();
            } catch (InvalidEditingException e) {
                TransactionManager.abortTransaction();
                e.printStackTrace();
                fail();
            }
        }

#### 【クラスがJavaの言語情報を持つか、また、strictfpかどうかを取得する】

        public void testGetJavaClassStrictfp() {
            BasicModelEditor bme = ModelEditorFactory.getBasicModelEditor();
            IModel project = AstahAPI.getAstahAPI().getProjectAccessor().getProject();
            try {
                IElement element = getElement(project.getOwnedElements(), "Class0");
                if (isJavaClass(element)) {
                    System.out.println("Class0 has \"Java Class\" stereotype");
                    if (isJavaClassStrictfp(element)) {
                        System.out.println("Class0 has \"jude.java.strictfp\" TaggedValue");
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                fail();
            }
        }

        protected INamedElement getElement(INamedElement[] elements, String elementName) {
            for (int i = 0; i < elements.length; i++) {
                if (elements[i].getName().equals(elementName)) {
                    return elements[i];
                }
            }
            return null;
        }

        private boolean isJavaClass(IElement element) {
            String[] sterotyopes = element.getStereotypes();
            for (int i =0 ; i < sterotyopes.length; i++) {
                if ("Java Class".equals(sterotyopes[i])) {
                    return true;
                }
            }
            return false;
        }

        private boolean isJavaClassStrictfp(IElement element) {
            ITaggedValue[] tags = element.getTaggedValues();
            for (int i =0 ; i < tags.length; i++) {
                ITaggedValue tag = tags[i];
                if ("jude.java.strictfp".equals(tag.getKey())) {
                    if ("true".equals(tag.getValue())) {
                        return true;
                    }
                }
            }
            return false;
        }

#### 【プロジェクト、クラスにJavaの言語情報を設定し、クラスにstrictfpを設定する】

プロジェクトの言語情報を設定

        public void testJavaAttributeStereotypeInClass() throws InvalidEditingException, ClassNotFoundException {
            BasicModelEditor bme = ModelEditorFactory.getBasicModelEditor();
            try {
                TransactionManager.beginTransaction();

                bme.setLanguageJava(project, true);
                IElement element = getElement(project.getOwnedElements(), "Class0");
                element.addStereotype("Java Class");
                bme.createTaggedValue(element, "jude.java.strictfp", "true");

                TransactionManager.endTransaction();

            } catch (InvalidEditingException e) {
                TransactionManager.abortTransaction();
                fail();
            }
        }

HOME