2011-06-18 11 views
1

http://debasishg.blogspot.com/2008/04/external-dsls-made-easy-with-scala.html)は、Scalatrahttp://tutorialbin.com/tutorials/80408/infoq-scalatra-a-sinatra-like-web-framework-for-scala)で実装されたRESTサービスのルーティングルールを処理する設計に役立つことを望んでいます。DSLがRESTサービスのルーティングと処理のビジネスルールを実装する

このRESTサービスは、外部アプリケーションがファイアウォール内のサービスにアクセスできるようにプロキシとして機能するため、各RESTサービスのビジネス要件に合わせてカスタマイズできるセキュリティ層が追加されています。

だから、ある人が自分のクラススケジュールにアクセスしたいのであれば、誰かの写しを見るよりも安全性が低くなります。

DSLで実際に情報を取得するための場所と、それを返す方法、およびセキュリティが必要なルールについて知りたいと思います。

しかし、最初の問題は、新しいルールを追加するために大量の再コンパイルを必要としないフレームワークを作成しようとしているので、DSLに基づいてRESTサービスのルーティングルールを動的に変更する方法です。適切なスクリプトを作成して処理させるだけです。

したがって、JAX-RS(http://download.oracle.com/javaee/6/tutorial/doc/giepu.html)がルーティングを動的に変更できるようにするScalaのCombinator Parserを使用してDSLを実装できますか?私はまだ言語を設計していない

が、これは私がしようとしているものです::

UPDATE

route /transcript using action GET to 
http://inside.com/transcript/{firstparam}/2011/{secondparam} 
return json encrypt with public key from /mnt/publickey.txt 

for /education_cost using action GET combine http://combine.com/SOAP/costeducate with 
http://combine.com/education_benefit/2010 with 
http://combine.com/education_benefit/2011 return html 

これら二つの可能なアイデアをどこの要求のためのルールトランスクリプトはファイアウォールなどの別のサイトに送信され、データは暗号化されて返されます。

SOAPと2つのREST要求の結果が結合され、これがどのように組み合わされるかについての追加のコマンドが必要になるという点で2番目の方が複雑ですが、すべてをファイルに入れることですその場で解析することができます。

Groovyを使用した場合、いくつかの新しいクラスがルーティング用に生成される可能性がありますが、いくつかのパフォーマンスヒットは削除されますが、パフォーマンスヒットしたとしてもScalaを使用するのが最善の策です。

OOPや関数型言語を知らない人が新しいルーティングルールを書くことができるように、より保守性の高いフレームワークを作成することを望みますが、仕様はSpecshttp://code.google.com/p/specs/)彼らの要求事項が定期的にテストされているかどうかは確かである。

UPDATE 2:私はデザインで作業を開始すると

私は直感的に理由を知っているいくつかのオプションを理解し、ないかもしれないが。今日私は、Groovyがこれに対してより良い解決策である理由は、メタプログラミング(http://www.justinspradlin.com/programming/groovy-metaprogramming-adding-behavior-dynamically/)を使用してルーティングのためのクラスを生成できることに気づいたので、ScalaまたはGroovyを使用して、生成される。 Scalaにクラスがまだ存在しない場合、そのクラスを生成させる方法はわかりません。

ここに示すように(http://langexplr.blogspot.com/2008/02/handling-call-to-missing-method-in.html)、Groovyでは、メソッドが見つからない場合は、メソッドを動的に生成することができます。このメソッドは今後存在するため、一度も欠落します。

ほとんどの場合、GroovyをJavaと混合してこの作業を行う必要がありますが、コードの一部がScalaに、JavaでRESTサービスのルーティングに使用されている可能性があります。

+0

クラスを生成する必要はありません。単純な関数が行います。 –

+0

@ダニエルC. Sobral - 誰かが/ transcriptまたは/ education_costエンドポイントを作成したい場合、私は彼らが入ると、サーバーコードを再コンパイルする必要はありませんが、スクリプトを記述し、それを持っていない"魔法のように"扱った。では、単純な関数はどのようにしてエンドポイントのルーティング用のコードを記述しますか? ScalaとGroovyを混在させることでこれを行うことができると思うので、これはScala内でこれをどうやって行うのかという私の苦闘ですが、今はもっと複雑になります。 –

+0

私はそれが単純な機能でできていると言っています。パーサーでは、DSLをASTに変換する関数を取得します。これを何らかの 'Plan'(Unfilteredから)に変換することができます。これはリクエストをレスポンスに変換する関数の単なるラッパーです。新しいクラスを定義する必要はありません。 –

答えて

3

二つの部分に疑問を分割:

は、DSLはCombinatorのパーサ

はいを​​用いて実現することができます。コンビネータパーサ、または他の種類のパーサを使用して実装できないものがあります。たとえば、Perl自体は解析できません(評価する必要があります)。また、コンビネーションパーサーは、複雑な言語(Scala - コンパイネーターパーサーに基づいていないコンパイラーなど)や、数十万行のコードをコンパイルするために使用されるコンパイラーなど、最高のパフォーマンスが必要な場合にはあまり効果的ではありません。

しかし、あなたがこのような極端に行くことを計画している場合は、パーサーを選択することがあなたの主な問題になることはありません。平均的な複雑さのDSLに対しては、うまくいくでしょう。 JAX-RSは、動的

まあのルーティングを変更していることを可能にする

、私はJAX-RSを知らないが、動的に変化ルーティングがそれを行うことができます場合は、パーサはなりコンビネータ必要な入力を提供することができます。

EDIT

あなたの例を見て、私はパーサコンビネータは確かに十分だと思います。その結果から、BlueEyesバインダーを動的に作成できると期待しています.BlueEyesを使用していないので、どのように動的であるかわかりません。

もう1つの選択肢はLiftです。リフトのバインダーは部分的な機能であり、普通の方法で組み合わせることができます - f1 orElse f2f1 andThen f2などです。セッションで最も頻繁に使用されるため、最初は提案しませんでしたが、RESTfulモデルと思うと、はステートレスです。

私はScalatraを知らないので、これに適応できるかどうかはわかりません。

+0

ありがとうございます。私はコンパイラを使ってDSLを書く方法を理解していますが、設計上、最初のパラメータに基づいて1つのRESTサービスと変更を行うことができますが、間違ったパスを辿ってしまうのではないかと思います。これは、例えばScalaよりもGroovyで実装する方が簡単な場合があります。 –

+0

@James [Unfiltered](http://unfiltered.databinder.net/Unfiltered.html)または[BlueEyes](https://github.com/jdegoes/blueeyes)を見ましたか?問題がRESTパスをデコードしているだけであれば、問題は非常にうまくいきます。 (PS:Unfilteredと上記のBlueEyesはリンクです) –

+0

エンドポイントを作成したくないので、問題はデコードだけではなく、制御スクリプト内の内容に基づいて動的に作成したいので、私が今日より詳細に説明したように、これらは面白く見えるので、ありがとう。 –

関連する問題