2012-01-07 15 views
1

XPANDを使用して既存のモデルからコードを生成する作業を進めています。このモデルには、ネストされたパッケージが含まれています。XPAND(ネストされたパッケージ)を使用したJavaコードの生成

私が理解する限り、ループなど何もないので、たとえば、パッケージ宣言文字列を連結することができます。

私はこのような何かをしたいと思います:私はそれが彼らの親クラスのためのクラスを依頼する可能性を持っている必要があることを追加する必要があります

package kitchen.food; 
class tomatoe{} 

model: 
package kitchen 
--package electronics 
--package food 
----class tomatoe 

が出力を望んでいました。ネストされたパッケージのインポート文字列を生成するには?

+0

実際に質問です何:おそらくフラット化()メソッドを必要としない、よりクリーンな方法がありますか? – Jasonw

+0

質問は、ネストされたパッケージのインポート文字列を生成する方法でした – Asamandra

答えて

0

最も単純な方法は、親パッケージと子パッケージの間にbiderectionalな参照を定義することだと思います。だからあなたのメタモデルで、それが好きな自分自身へのパッケージのクラスのbiderectional参照次のようになります。XPANDで

+---------+ 
|Package | 
|   |<>--+ 
`---------+ | 0..* containedPackages 
     |  | 
     +------+ 0..1 parentPackage 

をあなたが(未テストを、しかし、アイデアを取得するのに十分でなければなりません)するだろう:

«DEFINE class FOR Class» 
    import «EXPAND packagename FOR this.package»; 
    class «this.name»{} 
«ENDDEFINE» 

«DEFINE packagename FOR Package» 
    «FOREACH this.packageHierarchy() as p SEPARATOR '.' -»«p»«ENDFOREACH» 
«ENDDEFINE» 

XTEND - 再帰的に親を見つけてリストに追加し、リストの順序を逆にする。

List[Package] packageHierarchy(Package p): 
    let list = {}: 
    p.parentPackage == null ? list.add(p) : list.add(packageHierarchy(p.parentPackage)) -> 
    list.flatten().reverse() 
; 

私は、コードスニペットがあまりにも壊れていない願っています:)

+0

thxのヘルプです。私はこれがより簡単な方法であることに同意します。私の状況はあらかじめ定義されているので、私はそれをする選択肢がありませんでしたが、私はこの解決策が他の人に役立つかもしれないと確信しています。 (私は今まで私の問題のための解決策を持っていないので誰かが不思議に思うように投稿することはできません) – Asamandra

関連する問題