仕様 / Specification

Turbine is made up of five different modules which serve a specific service within the Turbine framework. In order for the reader to understand the general flow of the Turbine framework, each of these modules is explained in detail below.
Turbine は Turbine フレームワークの中で固有のサービスを供給する5つの異なるモジュールで出来ています。 読者が Turbine フレームワークの一般的なフローを理解するために、各々のモジュールについて以下で詳細に説明しています。

アクション / Action

The Action module represents a chunk of code that performs task. For example, when a user submits an Html form, one of the hidden fields is which Action to execute in order to process the form information. The processing generally includes form validation as well as storing the form information into a database. The Page is responsible for executing the Action before the Screen is executed. That way, the Action can help determine which Screen is executed depending on the results of the Action.

アクションモジュールはタスクを実行する1かたまりのコードを表現します。 例えば、ユーザが HTML フォームを送信する際に hidden のフィールドの1つは、 フォーム情報を処理する目的で実行するかについてのアクションです。 この処理は通常、データベースへのフォーム情報の格納と同様にフォームの有効性を含みます。 Page は Screen が実行される前に Action を実行する役割をします。 この方法ではアクションはどのスクリーンが、アクションの結果によって実行したかを決定するのを助力することができます。

The process looks like this:

プロセスはこのように見えます :

HTTP Client - > Turbine Servlet - > を実行します Page - > を実行します Layout/Screen/Navigation - > を実行します ページコンテンツを返します
アクションが定義されているならば...
アクションを実行します

This model makes it really easy to separate the POST (GET works here as well) data processing into component modules that can be re-used. For instance, the Action "Logout" can be re-used from a number of different points in the system. It performs one single function and performs it well. The advantage of this type of behavior is that it prevents you from putting logic for handling form data into your servlets. This is great for those of you who want to integrate EJB's into Turbine because your Action's can simply make calls to your EJB's to process business logic.

このモデルは再利用可能なコンポーネントモジュールへの POST(GETも同様です)データ処理の分離をとても簡単にします。 例をあげれば、システムにおける数々の異なるポイントにおいて "ログアウト" のアクションは再利用されることが可能です。 1つの単一の機能を行い上手く実行します。 この挙動の形式の利点は Servlet へのフォームデータの操作ロジックを記述することから行わなくともよいことです。 Turbine に EJB を統合したい人には素晴らしいことです。なぜならアクションは簡潔にビジネスロジックを処理するために EJB を呼び出すことが出来るからです。

ページ / Page

The Page module is the first module in the chain of execution for the Page generation. It is considered to be the module which contains the rest of the modules (Action, Layout, Screen and Navigation). The Page module checks to see if there has been an Action defined in the request. If so, it attempts to execute that Action. After the Action has been executed, it asks the set Screen object for its Layout. Page then attempts to execute the Layout object which the Screen returned. Please note that the Action module can modify which Screen is executed. Also note that the Screen module has the option to override the Layout setting which defaults to "DefaultLayout." (Note: the DefaultLayout value is actually defined in the TurbineResources.properties file. This way, it is a simple property change instead of having to re-compile the Turbine code for your own purposes.

Page モジュールは Page 生成実行の一連(訳者注:chain - チェーン であるが、この訳でよいと思われる)における最初のモジュールです。 (この)モジュールは残りのモジュール群( Action、Layout、Screen、Navigation )を含んでいると考えられます。 この Page モジュールはリクエストにアクションが定義されているかチェックをします。 そして、もしそうであれば、アクションの実行を試みます。 アクションが既に実行済みであれば、 Layout にスクリーンオブジェクトをセットするかたずねます。 そして Page はスクリーンによって返却される Layout オブジェクトを実行することを試みます。 アクションモジュールはスクリーンが実行されることを変更出来ることに注意してください。 スクリーンモジュールにはオプションがあることを / デフォルトが "DefaultLayout" である Layout 設定をオーバーライドするオプションがあることにも注意してください。(注意:DefaultLayout の値は実際にはTurbineResources.properties ファイルにて定義されます。) この方法では目的に応じた Turbine のコードを再コンパイルすることの代わりに、簡潔にプロパティの変更をすることになります。

スクリーン / Screen

The Screen module is essentially considered the "body" of the webpage. The Layout module executes the Screen module. This is where the Html of the page is generated. It is entirely possible to call external code here. For example, you can call an EJB to provide you some business data which is then transformed using a tool such as Cocoon to render the business data into HTML which is then transfered to the client.

Screen モジュールは本質的には web ページの「BODY 部」と考えられます。 Layout モジュールは Screen モジュールを実行します。これはページの HTML が生成される箇所です。 ここで外部のコードを呼ぶことは完全に可能です。 例をあげれば/ Cocoonのようなツールを利用して、あるビジネスデータを供給するためにビジネスデータをクライアントに送信される HTML に描画するために EJB をコールすることが出来ます。

ナビゲーション / Navigation

A website generally has a top and bottom navigation scheme. This is generally defined as the header and footer of the website. The Navigation is executed by the Layout. There may be multiple Navigation modules that the Layout executes (ie: the side, top and bottom parts of the page). Since it is generally common for multiple webpages to contain the same navigation, it is most common to define different Layouts for screens with very different Navigations. Theadvantage of using a system like this is that you can have multiple Navigations that are conditionally included and excluded in the Layout. Like Screens, the Navigation modules can also call out to external code, such as EJB's to get the business logic that is responsible for rendering the Html that is sent to the browser.

一般に Web サイトにはいつもトップとボトムのナビゲーションスキーマがあります。 これは一般的に Web サイトのヘッダとフッタとして定義されます。 ナビゲーションは Layout によって実行されます。 Layout が実行する多様な Navigation モジュールがあるかもしれません (参照:ページのサイド、トップのそしてボトム部)。 多様な Web ページが同じ Navigation を含んでいることはいつも共通であるので、 非常に異なった Navigation を持つスクリーンのために異なった Layout を定義することは最も一般的です。 このようなシステムを使うことの利点は条件付きで多様な Navigation が埋め込められ、 Layout を排除するということです。 Like Screens, the Navigation modules can also call out to external code, such as EJB's to get the business logic that is responsible for rendering the Html that is sent to the browser. Screen のように、 Navigation モジュールは同様に、ブラウザに送信される HTML のレンダリングをするビジネスロジックを応答する役割をする EJB のような外部のコードを呼び出すことが出来ます。

レイアウト / Layout

The Layout module is called from the Page module. This modules defines the physical Layout of a webpage. It generally defines the location of the Navigation portion (ie: the top and bottom part of the webpage) as well as the location of where the body (or Screen) of the page is. The Layout module executes the Screen module to build the body of the webpage. It executes the Navigation modules to build the portions of the webpage which define the navigation for the website.

Layout モジュールは Page モジュールから呼び出されます。 このモジュールは Web ページの物理的な Layout を定義します。 一般的に Navigation の一部の位置と、 (参照:トップとボトムの箇所の Web ページ)同様にページのボディ部(もしくは Screen )の位置を定義します。 Layout モジュールは Web ページのボディ部を構築するために Screen モジュールを実行します。 それは Webサイトのために Navigation を定義する Web ページの部分を構築するために Navigation モジュールを実行します。

From a module object encapsulation point of view, the image above represents how each of the modules fits into one another.
For example, the Page module executes the Layout module, which then executes the Navigation and Screen modules. As one can see, this tends to appear how a templated Html page would look. This is no accident, the Turbine framework is essentially an object oriented representation of the components of an Html page.

モジュールオブジェクトカプセル化における観点から、上述の画像はモジュールの各々がお互いへと合致する表現をしています。
例えば、ページモジュールは Layout モジュールを実行し、その際に Navigation と Screen モジュールを実行します。 見ても分かるように、これはテンプレートによる HTML ページがどのように見えるかのような傾向があります。 これは決してアクシデントではなく、 Turbine フレームワークは本質的に HTML ページのコンポーネントのオブジェクト志向表現だということです。

ローダ / Loaders

The loaders are responsible for dynamicially loading each of the five modules. These loaders have an option to cache the module objects in memory for extremely fast loading times.

ローダは 5 つのモジュールの各々のダイナミックなロードに応答します。 これらのローダには、非常に高速なロード時間でメモリ上にモジュールオブジェクト群をキャッシュするオプションがあります。

The loaders use intelligent factories in that we have added a property to TurbineResources.properties that allows you to define the "Loader Classpath". In other words, it is possible to physicially keep all of your web applications modules in their own package classpath and the loaders will be responsible for finding the right file to execute.

ローダは「ローダの Classpath 」の定義を出来るようにする TurbineResources.properties にプロパティを加えた知的なファクトリを使用します。 In other words, it is possible to physicially keep all of your web applications modules in their own package classpath and the loaders will be responsible for finding the right file to execute. 他の表現では、すべての Web アプリケーションモジュールをそれら自身のパッケージ Classpath 内に物理的に保持することは可能であり、ローダは実行するに相応しいファイルを検出することの役割をします。

This feature is great because it allows you to upgrade the core Turbine framework without having to make any modifications to your existing code! It also allows you to simply distribute your web application as a standalone system and then have your users download the Turbine framework as a separate requirement. Then, multiple web applications can be combined to form a complete system.

この特徴は既存のコードを置き換えることなく Turbine フレームワークの中核をアップグレードすることを出来るようにするので、素晴らしいことです! 同様に簡潔に Web アプリケーションをスタンドアロンのシステムとして配置し、そしてユーザに分離した要求として Turbine フレームワークをダウンロードさせることが出来ます。 そして、多様な Webアプリケーションは完全なシステムを形成するために結合されることができます。

Note that each of the modules must be multithread safe since multiple threads may try to execute a single module at the exact same time. These rules apply to general servlet programming so they are not that difficult to understand. The basic rule is to not try to define any class global variables within each of the modules unless it has been wrapped in a syncronized statement.

多様なスレッドが完全に同時に一つのモジュールを実行することを試みることがあるので、それぞれのモジュールはマルチスレッド・セーフででなければならないことに注意してください。 これらの規則は一般的な servlet プログラミングに適用されることので、理解することは難しくありません。 基本的な規約はどのクラスでも synchronized ステートメントにラップされることなしに、各々のモジュールにグローバル変数を定義しないことです。

ファクトリ / Factories

Each of the loaders mentioned makes use of one or more factories to create the different modules. By default the only factory that is enabled is the Java factory that creates requested modules from java class files.

言及している各々のローダは異なるモジュールを作成するために1つ以上のファクトリの使用をします。 デフォルトで唯一使用可能になっているファクトリは Java クラスファイルから要求されたモジュールを作成する Java ファクトリです。

You can easily create your own factories by implementing a simple interface and registering them in the TurbineResource.properities. This allows you a lot of flexibility in the sense that you can load Turbine modules from any source that is able to provide you with a java object, for example an RMI server or scripting options like Rhino and JPython. Keep in mind that factories must be thread-save (the same applies to modules).

簡潔なインターフェースを実装し、TurbineResource.properties に登録することで 簡単に新しいファクトリ群を作成することが出来ます。 これで Java オブジェクトと共に提供できるどのようなソースからもTurbine モジュールをロード出来る観点において、柔軟性が得られます。Java オブジェクトの例には RMI サーバか Rhino と JPython などがあります。 ファクトリは必ずスレッド保持型でなければなりません(これはモジュールにも当てはまります)。

システムフロー / System Flow

When a new request comes in, the Turbine servlet first checks to make sure that a ServletAPI HttpSession object exists for the user making the request. If this HttpSession object does not exist, a Http redirect header is returned that redirects the browser to the "homepage" of the website (by default it is the "Login" screen and this can be configured via the TurbineResources.properties file). This redirect attempts to set a cookie that is unique for the visitor. If the cookie is not accepted, it will not be returned in the new request for the "homepage" and thus further session tracking will happen with modified URL's that contain the session information within them.

リクエストがやって来た際に、Turbine servlet はまず最初に ServletAPI の HttpSession オブジェクトがリクエストを作成したユーザのために存在していることを確かめます。 HttpSession オブジェクトが存在しなければ、ブラウザに Web サイトの "ホームページ" (デフォルトでは "Login" スクリーンであり、これは TurbineResources.properties で設定可能)にリダイレクトする HTTP リダイレクトヘッダが返却されます。 このリダイレクトは訪問者にユニークなクッキーをセットすることを試みます。 クッキーが受け付けられなければ、"ホームページ" の新たなリクエスト内で返却されず、よってセッション情報をそれらの中に持つ、修正された URL のさらなるセッショントラッキングが発生します。

Note: If you do not wish to require the user to login to the system with a username and password before executing the pages, then set the "Login" screen to be something else. This is done in the Turbine Servlet under the data.session.isNew() check. Until the user actually logs in, it is only possible to store temporary data for that users session. When the user logs in, it is possible to store permant information by simply putting data into a hashtable. The implementation of the User object (ie: TurbineUser) in the framework takes care of the issues involved with serializing that information to a resource such as a database or file on the hard disk.

(注意) : ページを実行する以前のユーザのユーザ名称とパスワードのシステムへのログインを要求しないのであれば、"Login" スクリーンを何かの代わりにセットしてください。 これは data.session.isNew() のチェック下での Turbine Servlet にて行われます。 ユーザが実際にログインするまでに可能なことは、ユーザセッションのためにテンポラリのデータをストアすることだけです。 ユーザがログインする際には、単純に Hashtable にデータを put するだけで永続的な情報をストアすることが可能です。 フレームワークにおけるユーザオブジェクト(参照:TurbineUser)の実装はデータベースやハードディスク上のファイルのようなリソースへの情報などのシリアライズと共に処理の難しい問題の処理をします。

After a session with the user has been established, Turbine caches a few frequently used pieces of data in the RunData object. This object is created for each and every request and is passed around the system in order to provide all of the modules with access to request specific information such as a database connection, GET/POST/PATH_INFO (GPP) data (via the ParametersParser object), the Action and Screen names (made available from the GPP data), and the Document object where you put your Html output. The RunData object should never be stored in a global context because it is not multithread safe and each of the modules is expected to be multithread safe. Also, the RunData object may or may not contain information that should be persistent across requests.

ユーザとのセッションが確立されてから、Turbine はいくつかのたびたび利用されるデータを RunData オブジェクト内にキャッシュします。 このオブジェクトは各々すべてのリクエストに生成され、すべてのモジュールを供給するためにリクエストに対するアクセスと共に、データベース接続、GET / POST / (パラメータパーサオブジェクト経由の) PATH_INFO (GPP)、(GPP データにより利用可能になる)Action と Screen 名称、HTML 出力をする場所のドキュメントオブジェクトなどの特定の情報をリクエストするためにシステム内に循環されます。 RunData オブジェクトはマルチスレッド-セーフではありませんが、各々のモジュールはマルチスレッドセーフであるとみなされているため、グローバルコンテキストにストアされてはなりません。 また、RunData オブジェクトはリクエスト間で永続的であるべき情報を持つべきであったりなかったりします。

The Turbine servlet then checks to see if a user is attempting to Login to the system by looking at the defined Action and checking to see if the value is "LoginUser." If so, it will execute the "LoginUser" action (again, the action to execute here can be defined in the TurbineResources.properties file). Within this action, it is the coders responsibility to define the procedure for authenticating the user with the validateUser() method. This will probably mean validating the username and password against a database. The abstraction of Action modules makes it easily possible to have multiple authentication methods.

そして Turbine servlet は定義された Action と "LoginUser" の値を参照して、ユーザがシステムに対するログインを試みているかどうかチェックします。 もしそうであれば、"LoginUser" アクションが実行されます(復唱しますが、ここで実行されるアクションはTurbineResources.properties ファイルにて定義することが出来ます)。 このアクション内での validateUser() メソッドでのユーザ認証は、コーディング担当者が処理を定義する責任があります。 データベースに対してユーザ名とパスワードを確認することになるでしょう。 Action モジュールの抽象性は、多様な認証メソッドを持つことを簡潔に可能にします。

Once the user has been validated (the RunData.save() method has been called) or not validated, then the SessionValidator action is executed from within the Turbine servlet. The SessionValidator action checks to see if a user has been logged in. If the user has not been logged in, then the Screen is set to be the "Login" screen. If not, then the users last access datestamp is updated. If you would like to allow the user to view multiple pages without the need to login first, you will need to implement your own version of SessionValidator that just returns nothing as a result. Then, for the pages that you will want to make secure, you should define a Layout that executes the SessionValidator action to make things secure. Then, your Screens should call that "secure" Layout.

一度ユーザが有効になると(RunData.save() メソッドがコールされると)、もしくは有効になっていないと、Turbine Servlet で SessionValidator アクションが実行されます。 SessionValidator アクションはユーザが既にログインしているかチェックします。 ユーザがログインしていなければ、Screen は "Login" スクリーンにセットされます。 もしログインしていないのであれば、そのユーザの datestamp が更新されます。もしユーザにまずしなければならないログインをせずに複数のページの閲覧を許可したいのであれば、 結果を何も返却することのない専用の SessionValidater を実装する必要があります。 そして、セキュアにしたいページについては、セキュアにするために SessionValidator アクションを実行する Layout を定義する必要があります。そして、Screen は "セキュアな" Layout をコールすることになります。

Next, the "DefaultPage" page is executed by the Turbine servlet. The "DefaultPage" starts a chain of events that eventually leads to a complete webpage development. First, the DefaultPage attempts to see if an Action has been defined. If so, then it attempts to execute that Action. See the definition of Action and Page above for more information. After the Action has been executed, the Screen is then asked for its Layout and the Layout is then executed.

次には、"DefalutPage" のページが Turbine servlet により実行されます。 "DefaultPage" は完全な Web ページ開発を導くイベントの一連をスタートします。 最初に、DefaultPage は Action が定義されているか確かめることを試みます。 定義されているのであれば、Action を実行することを試みます。 より多くの情報については Action と Page の定義を参照してください。 Action が実行された後 Screen は Layout を求め、そして Layout は実行されます。

It is the Layouts responsibility to then execute the Navigation and requested Screen. After the Layout has executed its parts, it is finished and control is returned to the Turbine servlet which then sends out the page information.

そして Navigation と リクエストされた Screen を実行することは Layout の役割です。 Layout の箇所を実行して完結し、そして control はページ情報を送信する Turbine servlet に返却されます。

アクセス制御リストとユーザのパーミッション / Access Control Lists and User Permissions

We have provided a beautiful system (because it is so simple and powerful) for controlling what a User is allowed to do and not allowed to do. It is based on the following concepts:

我々は User が何を許可されて何を許可されないかについての制御を行うための(とてもシンプルでパワフルである)美しいシステムを提供しました。 それは下記のようなコンセプトに基づいています:

One or more Roles are assigned to a User. A Role is a collection of one or more Permission's. The AccessControlList uses an AccessControlBuilder that allows you to determine whether or not a User has a Permission to do something or not.

User には1つ以上のロールが割り当てられます。 1つのロールは1つ以上のパーミッションのコレクションです。 AceessControlList は User に何かを行うパーミッションがあるか判断を出来るようにする AccessControlBuilder を使用します。

Thus, a User can have both the "Admin" and "Guest" Role. Within those Roles are the sets of Permissions that are allowed. In the "Admin" Role, one might have the Permission, "Edit Users". Then, it is simple to use the AccessControlList to check to see if the User has the permission "Edit Users" or if the User has the Role "Admin", in which case, it does not matter what the Permissions are.

このように、ユーザは "Admin" と "Guest" のロールを持つことが出来ます。それら以内ではロールは許可されるパーミッションのセットです。 "Admin" のロールでは、"Edit Users" の権限があるでしょう。 そのようなわけで、 AccessControlList を User が "Edit Users" もしくは "Admin" のパーミッションを持っているかチェックをするために使用することはシンプルなことです。そのような場合には、パーミッションが何であるかははあまり問題にはなりません。

You will then use this system within any of modules to determine whether or not to execute some code. This will provide you with both a Page level of security (does the User have access to this page) as well as a Content level of security (does the User have access to see the content on this page, ie: hide/show content based on what Role the User is).

あなたはそしてこのシステムをどのようなモジュールの中でもあるコードを実行すべきかそうではないか判断するために使用するでしょう。 これはPage レベルのセキュリティ(User がページにアクセスできる)と同様に Content レベルのセキュリティ(User がコンテンツを閲覧することが出来る)を供給し、 ie: shide/show content based on what Role the User is). (訳者注:上記 "shide" は "hide" の誤植であると思われる) 参照:User の Roler によりコンテンツを表示 / 非表示にする

例外処理 / Exception Handling

During execution, if at any time an exception is raised, the Turbine servlet catches that exception and attempts to execute the "DefaultPage" with the Screen set to be "Error". This is a simple debugging screen which displays a java stack trace as well as any CGI environment variables that have been set. It is possible to modify this Screen to display anything that you wish as well as define an alternative error screen within your web application via the TurbineResources.properties file. The idea is that all errors can be trapped in one location in order to make debugging as simple as possible as well as provide a consistent error interface to the users.

実行の間に、例外が発生したときには、Turbine servlet はその例外をキャッチし、Screen に "Error" がセットされた "DefaultPage" の実行を試みます。 これは Java のスタックトレースと同様に 設定されている CGI 環境変数を表示するシンプルなデバッギングスクリーンです。 この Screen を望むものならすべて表示できるように修正することは、TurbineResource.properties ファイル経由で Web アプリケーションで他のエラー画面を定義することも同様に可能です。 これはすべてのエラーが一つの箇所にてトラップされデバッギングを可能な限りシンプルにすることと同様にユーザに一貫したエラーインターフェースを提供するためのアイデアです。

ユーティリティコード / Utility Code

There is a number of utility classes included with Turbine.

Turbine で埋め込まれる多くのユーティリティクラスがあります。

The Database pooling classes are helpful for defining the methods for obtaining a connection to the database. This code is implemented as a singleton system so that all you need to do is get an instance of the database class, get a connection and go. There is no need to pass around a Connection object. Turbine comes with pool implementations for many of the most popular databases. Creating your own is quite simple as well, all you need to do is look at the existing code and create your own. If you need help or want someone to create one for your database, simply ask on the mailing list.

データベースプーリングクラスはデータベースへのコネクションを保持するためのメソッドを定義することの助けとなります。 このコードはシングルトンシステムとして実装されるので、必要なことはデータベースクラスのインスタンスを取得し、接続を確立して処理を行うことだけです。 接続オブジェクトを次々にまわす必要はありません。 Turbine には最も人気のある多くのデータベースのためのプールの実装があります。 自作することはとてもシンプルであり、必要なことは既存のコードを参照し自作のコードを作成するだけです。 助けが必要だったり自分のデータベースのためのコードを作成したいのであれば、メーリングリストでたずねてみてください。

The *Peer classes are a great idea on how to abstract the database accesses so that all you need to do is pass in a Criteria object and execute doInsert(), doSelect(), doUpdate() or doDelete(). While not necessarily part of the Turbine framework, because each implementation is different depending on your needs, it is a great model to work from. Take a look at the TurbineUserPeer.java file for a good example of this methodology in use.

*Peer クラスはデータベースアクセスを抽象化するにあたって偉大なアイデアであるので、必要なことは Criteria オブジェクトの中で doInsert(),doUpdate(),または doDelete() を実行することだけです。 各々の実装がニーズにより異なっているため Turbine フレームワークにおいて重要な箇所ではないながら、これは重要なモデルです。 使用のための良い方法論の例として TurbineUserPeer.java ファイルを参照してください。

The ParameterParser class takes all of the GET/POST/PATH_INFO data and parses it into a hashtable where it can be easily retrieved in a number of forms with the provided get* methods. This is how you can have access to form data that has been posted by a users web browser.

ParameterParser クラスはすべての GET / POST / PATH_INFO データをあつかい、提供される get* メソッドと共にとても多くのフォーム中で簡易に回収することの出来る Hashtable にパースします これは Web ブラウザの使用者により送信されるフォームデータにどのようにアクセスするかということです。

The DynamicURI class should be used whenever a URI is needed within the system. Each portion of a URI can be defined in order to produce a custom URI that also includes the session tracking information if it exists. It is highly recommended that you use this class for generating all of your URI's for your application because it will allow you to easily add global functionality to your system.

DynamicURI クラスはシステム内で URI が必要とされたときであればいつでも使用される必要があります。 それが存在すれば、 URI の各々の部分は同様に情報を追跡してセッションを埋め込むカスタム URI を生産するために定義されることができます。 簡潔にグローバルな機能をシステムに追加することを可能にするため、このクラスをアプリケーションのためのすべての URI を生成するために使用することはとても推奨されています。

The DateSelector class generates Html popup menus for month/day/year. The beauty of this class is that you can provide a date for it to start with and it will automaticially generate the Html popups with that date.

DateSelector クラスは 月 / 日 / 年 のために HTML ポップアップメニュー を生成します。 このクラスの美しさはあなたがはじめる日付を規定することが出来て、自動的に日付の HTML ポップアップを生成することです。

The Mail classes make it easy to send email via the JavaMail API's. These classes are just very simple classes and there is not a huge amount of functionality here. Essentially they allow you to get the job done and that is about it. Contributions to improve these classes are appreciated.

Mail クラスは JavaMail API 経由での電子メール送信を簡単にします。 これらのクラスはとてもシンプルなクラスで巨大な機能はここにはありません。 本来これは仕事を済ませることを出来るようにします、これがそのことです。 このクラスに対する貢献は高く評価されます。