C++ から UML への変換の拡張

C++ 要素から対応する UML 要素への変換の変換方法をカスタマイズするには、C++ から UML への変換およびそれに含まれる変換を拡張します。
始める前に
以下の手順では、プラグインの作成、テスト、配布方法を知っていて、Eclipse プラグイン開発環境 (PDE) に精通していることを前提とします。
このタスクについて
このトピックの例は、C++ から UML への変換を拡張して、C++ クラスの C++ 属性の UML 属性への変換をカスタマイズする方法について説明しています。他の C++ 要素を UML へ変換する変換についての詳細は、下の関連リファレンスのトピックを参照してください。

C++ から UML への変換を拡張するには、以下のようにします。

  1. 以下のようにして、Eclipse ワークスペースでプラグイン・プロジェクトを作成します。
    1. 「ファイル」 > 「新規」 > 「変換オーサリング」 > 「汎用変換プロジェクト」とクリックし、「次へ」をクリックします。
  2. 「プラグイン・プロジェクト」ページの「プロジェクト名」フィールドに、プロジェクト名を指定します。 この例の場合、com.ibm.xtools.cpp.uml2.attributetypeextn.transformation.Extension を指定します。
  3. 「次へ」をクリックします。
  4. 「プラグイン・コンテンツ」ページで、デフォルト値を受け入れ て「次へ」をクリックします。
  5. 「終了」をクリックします。プラグイン開発パースペクティブに切り換えるようにプロンプトが出された場合には、「はい」を選択します。
  6. ナビゲーション・ビューで、ステップ 1 で作成したプラグイン・プロジェクトの META-INF フォルダーにある「MANIFEST.MF」をダブルクリックします。
  7. 以下のようにして、プラグイン・マニフェスト・ファイルに TransformationExtension 要素を作成します。
    1. 「拡張」ページで、「追加」をクリックします。
    2. 「新規拡張」ウィザードの「拡張ポイントの選択」ページで、「拡張ウィザード」タブをクリックします。
    3. 「拡張ウィザード」ページで、「変換テンプレート」 > 「変換の拡張」をクリックして、「次へ」をクリックします。
  8. 「新規変換の拡張」ページで、以下のステップを実行します。
    • 「ID」フィールドで、 変換サービスに対する変換の拡張を識別する固有値を指定します。 このフィールドは、通常プロジェクト名および transformationExtension 接尾部を使用して定義済みです。この例の場合、このフィールドに値 「com.ibm.xtools.cpp.uml2.attributetypeextn.transformation.Extension.transformationExtension」が含まれていることを確認します。
    • 「名前」フィールドで、変換の拡張の名前を指定します。 この例の場合、My Transformation Attribute Extension を指定します。
    • 「ターゲットの変換 ID」フィールドで、com.ibm.xtools.transform.cpp.uml2.transformation を指定します。
    注: このページのその他のフィールドおよびウィザードの残りのページについて詳しくは、該当ページが製品で表示されているときに F1 を押して、コンテキスト依存ヘルプを参照してください。 Linux® プラットフォームを使用している場合、Shift+F1 を押してください。
  9. 「次へ」をクリックします。
  10. 「新規変換の拡張」ページで、以下のように、変換の拡張の規則を定義します。
    1. 「挿入」をクリックします。
    2. 「要素タイプ」列で、要素のリストから「Rule」を選択します。
    3. 「ID」および「名前」列に、com.ibm.xtools.cpp.uml2.attributetypeextn.attrtyperule を指定します。
    4. 「クラス」列に、attrtyperule を指定します。
    このアクションは、規則を宣言するだけであり、それは拡張する変換のいずれにも追加されません。
  11. 「次へ」をクリックします。
  12. 次の「新規変換の拡張」ページで、「拡張変換」表に、拡張する変換を指定します。次のリストの変換は、C++ 属性およびインターフェース属性を対応する UML 要素に変換します。これらの変換ごとに、「拡張変換」表の横で、「挿入」をクリックして、「ターゲットの変換 ID」列に変換名を指定します。
    • com.ibm.xtools.transform.cpp.uml2.CPPProjectMemberTransform.CPPFolderMemberTransform.CPPNamespaceMemberTransform.CPPClassStructUnionMemberTransform.CPPMemberVariableTransform
    • com.ibm.xtools.transform.cpp.uml2.CPPProjectMemberTransform.CPPSourceMemberTransform.CPPNamespaceMemberTransform.CPPClassStructUnionMemberTransform.CPPMemberVariableTransform
    • com.ibm.xtools.transform.cpp.uml2.CPPProjectMemberTransform.CPPSourceMemberTransform.CPPClassStructMemberTransform.CPPMemberVariableTransform
  13. 各拡張変換はステップ 10 で宣言した規則を実装する必要があることを指定します。「拡張変換」表で指定する変換ごとに、以下のステップを実行します。
    1. 「拡張変換」表で、「ターゲットの変換 ID」列のセルをクリックします。
    2. 「選択済み拡張変換への追加項目」表の横で、「挿入」をクリックします。
    3. 「要素タイプ」列で、リストから「Rule」を選択します。
    4. 「ID」列に、ステップ 10 で宣言した規則に含まれるクラスの ID を指定します。この例の場合、com.ibm.xtools.cpp.uml2.attributetypeextn.attrtyperule を指定します。
    「拡張変換」表の「ターゲットの変換 ID」列でセルをクリックするとき、「選択済み拡張変換への追加項目」表は、その変換に関連する要素を表示します。この例の場合、attrtyperule 規則が「拡張変換」表の各変換に関連します。
  14. 「次へ」をクリックしてから、「終了」をクリックします。プラグインに行った変更を保存するようプロンプトが出される場合、「はい」をクリックします。
  15. 変換ごとに、attrtyperule 規則がそれぞれの拡張変換における 2 番目の規則として実行されるように指定します。プラグインのマニフェスト・エディターの「拡張」ページの「すべての拡張」セクションで、ExtendTransform 要素ごとに、以下のステップを実行します。
    1. com.ibm.xtools.cpp.uml2.attributetypeextn.attrtyperule 規則に関連する AddRule 要素をクリックします。
    2. 「拡張要素詳細」領域の「索引」フィールドで、1 を入力します。索引付けは 0 から開始されます。
  16. 「ファイル」 > 「保存」をクリックします。
  17. プラグインがまだ存在していない場合、「依存関係」ページの「必須プラグイン」セクションで、以下のプラグインを追加します。
    • org.eclipse.uml2.uml
    • com.ibm.xtools.cpp.model
    • com.ibm.xtools.transform.core
    • com.ibm.xtools.transform.cpp.uml2
  18. 「ファイル」 > 「保存」をクリックします。
  19. 変換ソースで C++ 属性を検出するときに、C++ から UML への変換における変換が呼び出す attrtype 規則の Java™ 実装を定義します。この例では、実装クラスは変換の拡張とは異なるプロジェクトにあります。次のコード・フラグメントは、可能な実装を示しています。
    /*
     *+------------------------------------------------------------------------+
     *| Licensed Materials - Property of IBM                                   |
     *| (C) Copyright IBM Corp. 2004.  All Rights Reserved.                    |
     *|                                                                        |
     *| US Government Users Restricted Rights - Use, duplication or disclosure |
     *| restricted by GSA ADP Schedule Contract with IBM Corp.                 |
     *+------------------------------------------------------------------------+
     */
    package com.ibm.xtools.cpp.uml2.attributetypeextn;
    
    import org.eclipse.uml2.uml.Classifier;
    import org.eclipse.uml2.uml.NamedElement;
    import org.eclipse.uml2.uml.Package;
    import org.eclipse.uml2.uml.Property;
    import org.eclipse.uml2.uml.Type;
    
    import com.ibm.xtools.cpp.model.CPPOwnedAttribute;
    import com.ibm.xtools.transform.core.AbstractRule;
    import com.ibm.xtools.transform.core.ITransformContext;
    import com.ibm.xtools.transform.cpp.uml2.internal.CPPModelToUML.util.CPPModelToUMLUtil;
    
    /**
     * attrtyperule is registered in plugin.xml as a RuleDefinition.  
     */
    
    /*
     * (non-Javadoc)
     * 
     * @see com.ibm.xtools.transform.core.AbstractRule
     */
    public class attrtyperule extends AbstractRule {
    
    	/*
    	 * (non-Javadoc)
    	 * 
    	 * @see com.ibm.xtools.transform.core.AbstractRule#createTarget(com.ibm.xtools.transform.core.ITransformContext)
    	 */
    	public static final String UML_TYPE_STRING = "String"; 
    
    	
    	public Object createTarget(ITransformContext ruleContext) {
    
    		//TODO 自動生成されたメソッド・スタブ
    		Object source = ruleContext.getSource();
    		if (source instanceof CPPOwnedAttribute) {
    			CPPOwnedAttribute attribute = (CPPOwnedAttribute) source;
    			Classifier klass = (Classifier) ruleContext.getTargetContainer();
    			NamedElement umlElement = null;
    
    			if(klass instanceof org.eclipse.uml2.uml.Class){
    				umlElement = ((org.eclipse.uml2.uml.Class)klass).getOwnedMember(attribute.getName());
    			}
    			
    			Property umlProperty = (Property) umlElement;
    			if(attribute.getQualifierString().contains("*") &&(umlProperty.getType().getName().equalsIgnoreCase("char")) ){
    				setStringType(umlProperty);
    			}
    
    			return umlElement;
    
    		}	
    		return null;
    
    
    	}
    	public static Type setStringType( 	Property umlProperty ){
    		 Package rootElement = CPPModelToUMLUtil.getRootElement(umlProperty);
    		 Type umlString = (Type) rootElement.getImportedMember(UML_TYPE_STRING);
    		 umlProperty.setType(umlString);
    		return null;
    	}
    	
    	
    }
タスクの結果
次回 C++ から UML への変換を実行するときに、直前のコード・フラグメントで指定されたとおりに属性を変換します。

フィードバック