(http://debasishg.blogspot.com/2008/04/external-dsls-made-easy-with-scala.html)は、Scalatra
(http://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や関数型言語を知らない人が新しいルーティングルールを書くことができるように、より保守性の高いフレームワークを作成することを望みますが、仕様はSpecs
(http://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サービスのルーティングに使用されている可能性があります。
クラスを生成する必要はありません。単純な関数が行います。 –
@ダニエルC. Sobral - 誰かが/ transcriptまたは/ education_costエンドポイントを作成したい場合、私は彼らが入ると、サーバーコードを再コンパイルする必要はありませんが、スクリプトを記述し、それを持っていない"魔法のように"扱った。では、単純な関数はどのようにしてエンドポイントのルーティング用のコードを記述しますか? ScalaとGroovyを混在させることでこれを行うことができると思うので、これはScala内でこれをどうやって行うのかという私の苦闘ですが、今はもっと複雑になります。 –
私はそれが単純な機能でできていると言っています。パーサーでは、DSLをASTに変換する関数を取得します。これを何らかの 'Plan'(Unfilteredから)に変換することができます。これはリクエストをレスポンスに変換する関数の単なるラッパーです。新しいクラスを定義する必要はありません。 –