ラベル サンプルコード の投稿を表示しています。 すべての投稿を表示
ラベル サンプルコード の投稿を表示しています。 すべての投稿を表示

2011年11月22日火曜日

Google Translate API の有料版 - 開発者ガイド RESTの使用 その2

Google Translate APIは有料化され、
v1のJavaScriptによるアクセスはできなくなります。

有料版はAPIが変更され、
RESTによるアクセスを必要とします。

Googleのドキュメントでは、RESTによるアクセスを
HTTP GETメソッドによるものと、JavaScriptによるものを説明しています。

Developer's Guide (v2) Using REST
を翻訳してみます。

第1回はこちらです。

Identifying your application to Google - Googleへのアプリケーションの識別情報の送信
アプリケーションはGoogle Translate APIにリクエストを送る度ごと全てにおいて、リクエストにAPI Keyを含めることで、自己を確認する情報を送信する必要があります。

Acquiring and using an API key - API keyの取得と使用
API keyを取得するには、APIs Consoleにアクセスします。Serviceパネルの中の、Google Translate APIをアクティブ化します;Terms of Service(サービスの条件)が現れますので、読んだ上で承認してください。
次に、API Accessパネルに移ります。API keyがパネルの一番下の辺りの「Simple API Access」というセクションの中にあるはずです。
API keyを取得した後は、アプリケーション内で全てのリクエストのURLに「key=取得したAPI key」をクエリパラメータに追加します。
API keyは安全にURLに組み込むことができます;それ以外のコーディングは必要ありません。

Translate Text - テキストの翻訳
Working with results - 結果の取得
指定のURIに向けたHTTP GETリクエストを送ることで、テキストをある言語から他の言語へ翻訳することができます。リクエストのURIは以下の形式となります。
https://www.googleapis.com/language/translate/v2?parameters
それぞれの翻訳のリクエストには3つのパラメータが必要です。
・API key - keyクエリパラメータをアプリケーションの識別に使います。
・翻訳先言語 - targetクエリパラメータを、翻訳したい言語を指定するために使います。
・翻訳元テキスト文字列 - qクエリパラメータを、翻訳する文字列を指定するために使います。
全てのクエリパラメータは任意です。GETメソッドのURLは、パラメータを含め、2K文字未満でなければなりません。
Note:単一のリクエストでより多くのデータを送信したい場合、APIを呼び出すためにPOSTメソッドを使用することもできます。POSTメソッドのbody内の「q」パラメータは、5K文字未満出なければなりません。POSTメソッドを使用するには、X-HTTP-Method-Overrideヘッダを使って、リクエストをGETメソッドとして扱い(X-HTTP-Method-Override: GETを使用)、Translate APIに送信しなければなりません。
以下のコードは、翻訳元言語を指定する例で、sourceクエリパラメータを使用しています:
GET https://www.googleapis.com/language/translate/v2?key=INSERT-YOUR-KEY&source=en&target=de&q=Hello%20world
リクエストが成功すると、サーバーは200 OKのHTTPステータスコードとデータプロパティを返します。
JSON
200 OK

{
    "data": {
        "translations": [
            {
                "translatedText": "Hallo Welt"
            }
        ]
    }
}
以下のサンプルは、複数の翻訳元テキストを翻訳するために送信します:
GET https://www.googleapis.com/language/translate/v2?key=INSERT-YOUR-KEY&source=en&target=de&q=Hello%20world&q=My%20name%20is%20Jeff
リクエストが成功すると、サーバーは200 OKのHTTPステータスコードとデータプロパティを返します。
JSON
200 OK

{
    "data": {
        "translations": [
            {
                "translatedText": "Hallo Welt"
            },
            {
                "translatedText": "Mein Name ist Jeff"
            }
        ]
    }
}
以下のサンプルは、翻訳元言語を自動判別します:
GET https://www.googleapis.com/language/translate/v2?key=INSERT-YOUR-KEY&target=de&q=Hello%20world
リクエストが成功すると、サーバーは200 OKのHTTPステータスコードとデータプロパティを返します。
JSON
200 OK

{
    "data": {
        "translations": [
            {
                "translatedText": "Hallo Welt",
                "detectedSourceLanguage": "en"
            }
        ]
    }
}

インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年9月26日月曜日

Google App Engine for Java の非同期データストアAPIの呼び出し(その3)

Google App Engineのデータストアは、
非同期に呼び出して結果を取得することも出来ます。

英語版ドキュメントはこちら
その1はこちら,その2はこちら


Workind with Async Transactions 非同期トランザクションの使用

非同期データストアAPI呼び出しは、同期呼び出しと同じようにトランザクションに参加することができます。ここで挙げるのは、従業員の給料の額を調整し、Employeeと同じエンティティグループにSalaryAdjustmentエンティティを1つのトランザクション内で追加して書き込みます。

void giveRaise(AsyncDatastoreService datastore, Key employeeKey, long raiseAmount)
        throws Exception {
    Future txn = datastore.beginTransaction();

    // Async call to lookup the Employee entity
    Future employeeEntityFuture = datastore.get(employeeKey);

    // Create and put a SalaryAdjustment entity in parallel with the lookup
    Entity adjustmentEntity = new Entity("SalaryAdjustment", employeeKey);
    adjustmentEntity.setProperty("adjustment", raiseAmount);
    adjustmentEntity.setProperty("adjustmentDate", new Date());
    datastore.put(adjustmentEntity);

    // Fetch the result of our lookup to make the salary adjustment
    Entity employeeEntity = employeeEntityFuture.get();
    long salary = (Long) employeeEntity.getProperty("salary");
    employeeEntity.setProperty("salary", salary + raiseAmount);

    // Re-put the Employee entity with the adjusted salary.
    datastore.put(employeeEntity);
    txn.commit(); // could also call txn.commitAsync() here
}

このサンプルは、トランザクション無しの非同期呼び出しとトランザクション内での非同期呼び出しの違いを示しています。トランザクションを利用していない場合、独立した非同期呼び出しの官僚を確認する唯一の方法は、呼び出しが行われた時に戻されたFutureの値を取得するということになります。トランザクションを利用すると、Transaction.commit()の呼び出しが、トランザクション開始からコミットされる前までの全ての非同期呼び出しの結果をブロックします。

そのため、上記の例では、SalaryAdjustmentエンティティの挿入を行う非同期呼び出しがtxn.commit()を呼び出された時点では未解決の可能性があるにもかかわらず、挿入が完了するまでにコミットは起こりません。同様に、txn.commit()の代りにtxn.commitAsync()の呼び出しを選択すると、commitAsync()から返されたFutureのget()メソッド呼び出しが全ての未解決の非同期呼び出しが干渉するまでブロックします。

ノート:トランザクションは特定のスレッドに関連付けられますが、DatastoreServiceやAsyncDfatastoreServiceの特定のインスタンスには関連付けられません。これの意味するところは、あるDatastoreServiceからトランザクションを開始して、
あるAsyncDatastoreServiceから非同期呼び出しを行うと、非同期呼び出しはトランザクションに参加する、ということです。または、もっと簡潔に言えば、
DatastoreService.getCurrentTransaction()とAsyncDatastoreService.getCurrentTransaction()は常に同じトランザクションを返すということです。

インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年9月25日日曜日

Google App Engine for Java の非同期データストアAPIの呼び出し(その2)

Google App Engineのデータストアは、
非同期に呼び出して結果を取得することも出来ます。

英語版ドキュメントはこちら
その1はこちら

Working with the Async Datastore Service (非同期データストアサービスの使用)

非同期データストアAPIでは、AsyncDatastoreServiceインターフェイスのメソッドを使ってデータストア呼び出しを行います。このオブジェクトはDatastoreServiceFactoryクラスのgetAsyncDatastoreService()クラスメソッドを呼び出して
取得します。

import com.google.appengine.api.datastore.AsyncDatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;

// ...
AsyncDatastoreService datastore = DatastoreServiceFactory.getAsyncDatastoreService();

AsyncDatastoreServiceは、結果の取得を後の時点でブロックすることが出来るFutureを直ちに返すメソッドを除いて、DatastoreServiceと同じ操作をサポートしています。例として、DatastoreService.get()は1つのエンティティを返しますが、AsyncDataStoreService.get()はFuture<Entity>を返します。

// ...

Key key = KeyFactory.createKey("Employee", "Max");
// Async call returns immediately
Future<entity> entityFuture = datastore.get(key);

// Do other stuff while the get operation runs in the background...

// Blocks if the get operation has not finished, otherwise returns instantly
Entity entity = entityFuture.get();

ノート:get()メソッドを呼び出すまでは例外はスローされません。このメソッドの呼び出しは非同期操作の成功/不成功の検査に利用できます。

AsyncDatastoreServiceを取得しているけれども同期した操作の実行を必要とする場合、適切なAsyncDatastoreServiceのメソッドを呼び出してからすぐにresultのブロックをかけます。

// ...

Entity entity = new Employee("Employee", "Alfred");
// ... populate entity properties

// Make a sync call via the async interface
Key key = datastore.put(key).get();

インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年8月9日火曜日

Goole App Engine for Java のデータストアAPIを利用するクラスをテスト駆動開発する(その13)

それでは、ここで今までの内容を反映した
サンプルコードを掲載します。



import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.FetchOptions;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.PreparedQuery;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Query.FilterOperator;
import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;

/**
 * Google App Engine for Javaにおけるユニットテストのサンプルコード。
 */
public class LocalUnitTestSample {

	private static final String DATA_KIND = "sampleDataKind";

	private LocalServiceTestHelper helper = new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());

	private String propertyName = "propertyName";

	private String[] propertyValues = {"pValue1","pValue2","pValue3","pValue4","pValue5"};

	private DatastoreService ds;

	private List keyList;

	/**
	 * @throws java.lang.Exception
	 */
	@Before
	public void setUp() throws Exception {
		helper.setUp();

		//サンプルデータをデータストアに保存する
		putSampleData();
	}

	/**
	 * サンプルデータをデータストアに保存するメソッド。
	 */
	private void putSampleData() {
		keyList = new ArrayList();
		ds = DatastoreServiceFactory.getDatastoreService();
		for (int i = 0; i < propertyValues.length; i++) {
			Entity entity = new Entity(DATA_KIND);
			entity.setProperty(propertyName, propertyValues[i]);
			Key key = ds.put(entity);
			keyList.add(key);
		}
	}

	/**
	 * @throws java.lang.Exception
	 */
	@After
	public void tearDown() throws Exception {
		//サンプルデータをデータストアから削除する
		deleteSampleData();

		helper.tearDown();
	}

	/**
	 * サンプルデータをデータストアから削除するメソッド。
	 */
	private void deleteSampleData() {
		Iterator iter = keyList.iterator();
		while (iter.hasNext()){
			ds.delete(iter.next());
		}
	}

	@Test
	public void doTest(){
		//サンプルデータをデータストアから検索する
		for (int i = 0;i < propertyValues.length;i++){
			EntitySearch search = new EntitySearch(ds,DATA_KIND,propertyName);
			List entitiesList = search.getEntity(propertyValues[i]);
			assertEquals(1,entitiesList.size());
			Iterator iter = entitiesList.iterator();
			while (iter.hasNext()){
				Entity entity = iter.next();
				assertTrue(propertyValues[i].equals(entity.getProperty(propertyName)));
			}
		}
	}

	/**
	 * データストアから、設定された名前のプロパティが該当する
	 * エンティティを取得する機能を提供するクラス。
	 */
	public class EntitySearch {

		/**
		 * データストアサービス
		 */
		private DatastoreService ds;

		/**
		 * 探索するエンティティのカインド名を表す文字列フィールド
		 */
		private String kindName;

		/**
		 * 探索するプロパティの名前を表す文字列フィールド
		 */
		private String propertyName;

		/**
		 * データストアサービスと、探索するプロパティの名前を引数とするコンストラクタ。
		 * @param ds データストアサービスオブジェクト
		 * @param kindName 取得するエンティティのカインド名文字列
		 * @param propertyName 探索するプロパティ名を表す文字列
		 */
		public EntitySearch(DatastoreService ds, String kindName, String propertyName) {
			this.ds = ds;
			this.kindName = kindName;
			this.propertyName = propertyName;
		}

		/**
		 * データストアからエンティティを検索するメソッド。
		 * コンストラクタで設定したカインド、プロパティ名の値が
		 * 引数propertyValueと同一のエンティティを格納したリストを返します。
		 * @param propertyValue 検索条件となるプロパティの値オブジェクト
		 * @return コンストラクタで設定したプロパティが引数propertyValueと同一の値のエンティティのリスト
		 */
		public List getEntity(Object propertyValue) {
			Query query = new Query(kindName);
			query.addFilter(propertyName, FilterOperator.EQUAL, propertyValue);
			PreparedQuery prepare = ds.prepare(query);
			List entitiesList = prepare.asList(FetchOptions.Builder.withDefaults());
			return entitiesList;
		}

	}

} 

インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年8月7日日曜日

Google App Engine for Java のデータストアAPIを利用するクラスをテスト駆動開発する(その12)

前回に引き続き、EntitySearchクラスの修正を行います。


メソッドgetEntity()内で、
クエリを生成する部分に修正する点があります。

コンパイル時に警告が出るのですが、
フィールドkindNameが参照されていないのです。

getEntity()内では、
エンティティ探索のためにクエリを生成しています。
クエリを生成するためにはコンストラクタで
new Query(String kind)
とするのですが、
引数の部分が
DATA_KIND
となっていて、LocalUnitTestSampleクラスの定数を参照しています。
(もし、EntitySearchクラスを内部クラスとしていなければ、
コンパイルエラーになります)

そこで、探索するエンティティのカインド名を
DATA_KINDから、kindNameに変更します。
そうすることで、EntitySearchクラスの内部から
LocalUnitTestSampleクラスのメンバを直接参照することは
なくなります。

インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年8月4日木曜日

Google App Engine for Java のデータストアAPIを利用するクラスをテスト駆動開発する(その11)

前回の投稿で、テスト駆動開発の利点として、
回帰テストが容易に出来る、ということを挙げました。

その実践・・・というわけでもないですが、
サンプルコードを修正してみましょう。
修正、といいますが、つまり、忘れていた点があったんです。

作成したEntitySearchクラスのコンストラクタが
実装されていませんでした。
引数が何も使われないままになっていたんですね。

引数が使われないまま放置されていたのに、
テストを実行してみると成功します。
この理由は、
EntitySearchクラスがLocalUnitTestSampleクラスの
内部クラスであることが原因です。

もし、EntitySearchクラスを内部クラスではなく、
別の独立したクラスとすると
コンパイルエラーとなります。

メソッドgetEntity()の内部で、
変数ds,kindName,propertyNameを解決できないはずです。

そこで、コンストラクタで渡された引数を
フィールドとして保持することにします。
private DatastoreService ds;

private String kindName;

private String propertyName;

public EntitySearch(DatastoreService ds, String kindName, String propertyName) {
 this.ds = ds;
 this.kindName = kindName;
 this.propertyName = propertyName;
}
フィールドds,kindName,propertyNameを宣言して、
コンストラクタで引数の値を代入します。

これで、メソッドgetEntity()でのコンパイルエラーが解消されます。

インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年8月2日火曜日

テスト駆動開発の利点(その3)

前にも書きましたが、
このブログで掲載しているサンプルコードのテスト駆動開発の
やり方は、あくまで私のやり方です。
ここで書いている「テスト駆動開発の利点」も
私なりに行ううえでのものです。

テスト駆動開発の方法や効果を書いた書籍やウェブページは
沢山あります。
それらを網羅してまとめる、ということをしているわけではありません。

それでも、回帰テストが容易に出来る、というのは間違いない利点です。
開発中はもちろん、一度クラスの実装が出来上がってからも、
簡単にテストが行えますから、コードの改修を積極的に行えます。
「少なくとも、テストコードのカバーしている範囲では」、
コードの修正を行っても、きちんと動作することを確かめられます。


インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年7月25日月曜日

Google App Engine for Java のデータストアAPIを利用するクラスをテスト駆動開発してみる(その10)

先に進む前に、ソースコードを掲載します。

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.FetchOptions;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.PreparedQuery;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Query.FilterOperator;
import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;

/**
 * Google App Engine for Javaにおけるユニットテストのサンプルコード。
 */
public class LocalUnitTestSample {

 private static final String DATA_KIND = "sampleDataKind";

 private LocalServiceTestHelper helper = new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());

 //private String[] propertyNames = {"pName1","pName2","pName3","pName4","pName5"};
 private String propertyName = "propertyName";

 private String[] propertyValues = {"pValue1","pValue2","pValue3","pValue4","pValue5"};

 private DatastoreService ds;

 private List<key> keyList;

 /**
  * @throws java.lang.Exception
  */
 @Before
 public void setUp() throws Exception {
  helper.setUp();

  //サンプルデータをデータストアに保存する
  putSampleData();
 }

 /**
  * サンプルデータをデータストアに保存するメソッド。
  */
 private void putSampleData() {
  keyList = new ArrayList<key>();
  ds = DatastoreServiceFactory.getDatastoreService();
  for (int i = 0; i < propertyValues.length; i++) {
   Entity entity = new Entity(DATA_KIND);
   entity.setProperty(propertyName, propertyValues[i]);
   Key key = ds.put(entity);
   keyList.add(key);
  }
 }

 /**
  * @throws java.lang.Exception
  */
 @After
 public void tearDown() throws Exception {
  //サンプルデータをデータストアから削除する
  deleteSampleData();

  helper.tearDown();
 }

 /**
  * サンプルデータをデータストアから削除するメソッド。
  */
 private void deleteSampleData() {
  Iterator<key> iter = keyList.iterator();
  while (iter.hasNext()){
   ds.delete(iter.next());
  }
 }

 @Test
 public void doTest(){
  //サンプルデータをデータストアから検索する
  for (int i = 0;i < propertyValues.length;i++){
   EntitySearch search = new EntitySearch(ds,DATA_KIND,propertyName);
   List<entity> entitiesList = search.getEntity(propertyValues[i]);
   assertEquals(1,entitiesList.size());
   Iterator<entity> iter = entitiesList.iterator();
   while (iter.hasNext()){
    Entity entity = iter.next();
    assertTrue(propertyValues[i].equals(entity.getProperty(propertyName)));
   }
  }
 }

 /**
  * データストアから、設定された名前のプロパティが該当する
  * エンティティを取得する機能を提供するクラス。
  */
 public class EntitySearch {

  /**
   * データストアサービスと、探索するプロパティの名前を引数とするコンストラクタ。
   * @param ds データストアサービスオブジェクト
   * @param kindName 取得するエンティティのカインド名文字列
   * @param propertyName 探索するプロパティ名を表す文字列
   */
  public EntitySearch(DatastoreService ds, String kindName, String propertyName) {

  }

  /**
   * データストアからエンティティを検索するメソッド。
   * コンストラクタで設定したカインド、プロパティ名の値が
   * 引数propertyValueと同一のエンティティを格納したリストを返します。
   * @param propertyValue 検索条件となるプロパティの値オブジェクト
   * @return コンストラクタで設定したプロパティが引数propertyValueと同一の値のエンティティのリスト
   */
  public List<entity> getEntity(Object propertyValue) {
   Query query = new Query(DATA_KIND);
   query.addFilter(propertyName, FilterOperator.EQUAL, propertyValue);
   PreparedQuery prepare = ds.prepare(query);
   List<entity> entitiesList = prepare.asList(FetchOptions.Builder.withDefaults());
   return entitiesList;
  }

 }

}


インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年7月21日木曜日

Google App Engine for Java のデータストアAPIを利用するクラスをテスト駆動開発してみる(その8)

コンパイルエラーが解消されたところで、
テストを実行してみます。

結果は、
NullPointerException
が返ってきます。

EntitySearch.getEntity()メソッドのreturn文が、
return null;
となっているのだから、当然です。

せっかくgetEntity()メソッドにコメントアウトしていた
機能をコピーしてきたのですから、
その結果を返しましょう。

先ほどのreturn文を、
return entitiesList;
と変更します。




インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年7月16日土曜日

Google App Engine for Java のデータストアAPIを利用するクラスをテスト駆動開発してみる(その7)

EntitySearch.getEntity(Object)メソッドが
単純にnullを返すだけになっているために、
テストを実行するとdoTest()メソッド内で
NullPointerExceptionがスローされる、
という所まで、前回は進みました。

getEntity()メソッドの中身を実装するのは簡単、
と前回の終わりに述べました。
同時に、既に大体出来ている、とも述べました。

テスト駆動開発を始めるときに、
doTest()メソッド内でコメントアウトした部分がありました。
開発するクラスの動作部分、テストする対象を
コメントアウトしたのですが、
まさにこの部分がgetEntity()メソッドの行いたい事を
表しています。
コメントアウトした部分の代わりに
EntitySearchオブジェクトを使った部分を記述しました。

それでは、コメントアウトした部分を
getEntity()メソッドにコピーします。

public List<entity> getEntity(Object propertyValue) {
   Query query = new Query(DATA_KIND);
   query.addFilter(propertyName, FilterOperator.EQUAL, propertyValues[i]);
   PreparedQuery prepare = ds.prepare(query);
   List<entity> entitiesList = prepare.asList(FetchOptions.Builder.withDefaults());
   return null;
  }

またもや、コンパイルエラーが出ます。
ループカウンタを表していた
i
という変数が解決できないという内容です。
query.addFilter()メソッドの第3引数に与えるのは、
比較対象となるプロパティ値なので、
これはgetEntity()メソッドの引数propertyValueに変更します。
これで「i」という変数はメソッド内からなくなり、
コンパイルエラーは解消されます。




インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年7月10日日曜日

Google App Engine for Java のデータストアAPIを利用するクラスをテスト駆動開発してみる(その5)

前回、データストアの単一のプロパティを探索して、
値の該当するエンティティを取得する機能を提供する、
EntitySearchという名前の内部クラスを定義して、
コンストラクタを作成しました。

・・・が、訂正があります。
コンストラクタの引数が
・DatastoreService
・String (探索するプロパティ名)
の2つとなっていましたが、
もう1つ追加して
・String (取得するエンティティのカインド名)
の3つとします。
public EntitySearch(DatastoreService ds, String propertyName)
から、
public EntitySearch(DatastoreService ds, String kindName, String propertyName)
とします。
探索するエンティティの種類をkindNameで指定したカインドの
エンティティに絞るためです。

ここでコンパイルエラーがもう一つ残っているので、
そちらを片付けましょう。コンストラクタの実装は後回しです。

コンパイルエラーとなっている行は、
List entitiesList = search.getEntity(propertyValues[i]);
で、getEntity()メソッドが未定義、となっています。

クラスEntitySearchにメソッドgetEntity()を定義します。
public List<Entity> getEntity(String string) {
   return null;
  }
とします。
これでコンパイルエラーはなくなりました。





インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年7月8日金曜日

Google App Engine for Java のデータストアAPIを利用するクラスをテスト駆動開発してみる(その4)

前回は、getEntity()メソッドの呼び出しを記述したところ、
メソッドが宣言されていないというコンパイルエラーが出た、
という所まででした。

そこで、getEntity()メソッドを宣言すれば・・・という前に、
このテストクラスを作成する目的に立ち戻ってみます。

そもそも、条件に合致するエンティティを検索する機能を持つ
クラスを作成することが目的です。
getEntity()メソッドは、その目的どおりの機能を持つ(予定の)メソッドですが、
このままメソッドを宣言するのでは、
LocalUnitTestSampleクラスのメソッドとなってしまいます。

それでは、ここで目的の機能を持つクラスを定義しましょう。

LocalUnitTestSampleクラスとは別に.javaファイルを作成するのも
もちろん正しいのですが、
ここでは内部クラスを作成します。
クラスの実装ができてから、別のjavaファイルを作成して
内部クラスから独立させてもかまいません。

作成してみましょう。
まずはgetEntity()メソッド呼び出しの部分です。
List<entity> entitiesList = getEntity(propertyValues[i]);

から、
EntitySearch search = new EntitySearch(ds,propertyName);
List<entity> entitiesList = search.getEntity(propertyValues[i]);

と変更します。
変更後の2行でコンパイルエラーとなります。

まずは1行目です。
EntitySearchという型が解決できない
というメッセージなので、
クラスを宣言します。

public class EntitySearch {
}
そして、コンストラクタが未定義なので、
public EntitySearch(DatastoreService ds, String propertyName) {

  }

を定義します。




インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年7月4日月曜日

Google App Engine for Java のデータストアAPIを利用するクラスをテスト駆動開発してみる(その3)

前回は、
doTest()メソッドの中から、
別クラスとして実装する部分をコメントアウトしました。
コメントアウトした部分の行っていたことは、
データストアから条件に沿って取得したエンティティを格納した
java.util.Listオブジェクトを取得することでした。

ここでコンパイルエラーとなった部分は、
entitiesList
です。
ローカル変数entitiesListは宣言された部分が
コメントアウトされたのですから、当然です。

コンパイルエラーを解決するために、
変数entitiesListを宣言します。
コメントアウトの直後、
assertEquals(1,entitiesList.size());
の前に

List entitiesList;


を加えます。

すると、またもやエラーになります。
「変数entitiesListが初期化されていない可能性があります。」
というメッセージです。

変数entitiesListは、データストアから取得したエンティティを格納した
java.util.Listオブジェクトとしたいのですから、
目的の機能を持ったメソッドを宣言します。

List entitiesList = getEntity(propertyValues[i]);


とします。
すると、メソッドgetEntity(String)は未定義なので、
コンパイルエラーになります。


ここまでのコードは、以下の通りです。


@Test
public void doTest(){
//サンプルデータをデータストアから検索する
for (int i = 0;i < propertyValues.length;i++){ /*   Query query = new Query(DATA_KIND);    query.addFilter(propertyName, FilterOperator.EQUAL, propertyValues[i]);    PreparedQuery prepare = ds.prepare(query);    List entitiesList = prepare.asList(FetchOptions.Builder.withDefaults());
*/   List entitiesList = getEntity(propertyValues[i]);
assertEquals(1,entitiesList.size());
Iterator iter = entitiesList.iterator();
while (iter.hasNext()){
Entity entity = iter.next();
assertTrue(propertyValues[i].equals(entity.getProperty(propertyName)));
}
}
}


インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年7月3日日曜日

Google App Engine for Java のデータストアAPIを利用するクラスをテスト駆動開発してみる(その2)

前回、テストメソッドの中身を別クラスに移す
と書きました。

そのテストメソッドは以下の通りでした。


@Test
 public void doTest(){
  //サンプルデータをデータストアから検索する
  for (int i = 0;i < propertyValues.length;i++){
   Query query = new Query(DATA_KIND);
   query.addFilter(propertyName, FilterOperator.EQUAL, propertyValues[i]);
   PreparedQuery prepare = ds.prepare(query);
   List entitiesList = prepare.asList(FetchOptions.Builder.withDefaults());
   assertEquals(1,entitiesList.size());
   Iterator iter = entitiesList.iterator();
   while (iter.hasNext()){
    Entity entity = iter.next();
    assertTrue(propertyValues[i].equals(entity.getProperty(propertyName)));
   }
  }
 }
まず、別クラスに移す部分をコメントアウトしてしまいましょう。
コメントアウトする部分、つまり別クラスの機能とする部分は、
Queryを生成して、データストアからプロパティの値が該当するエンティティの
リストを取得する部分です。

@Test
 public void doTest(){
  //サンプルデータをデータストアから検索する
  for (int i = 0;i < propertyValues.length;i++){
/*   Query query = new Query(DATA_KIND);
   query.addFilter(propertyName, FilterOperator.EQUAL, propertyValues[i]);
   PreparedQuery prepare = ds.prepare(query);
   List entitiesList = prepare.asList(FetchOptions.Builder.withDefaults());
*/   assertEquals(1,entitiesList.size());
   Iterator iter = entitiesList.iterator();
   while (iter.hasNext()){
    Entity entity = iter.next();
    assertTrue(propertyValues[i].equals(entity.getProperty(propertyName)));
   }
  }
 }

すると、
assertEquals(1,entitiesList.size());
Iterator iter = entitiesList.iterator();
の行でコンパイルエラーとなります。




インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年7月1日金曜日

データストアAPIを利用するテスト駆動開発をおこなってみる

前回まで、サンプルコードの修正を行いました。
データストアに保存するサンプルデータを変更した後の
コードは前回掲載したとおりです。

今後は、修正後のサンプルコードを

サンプルコード2

と記述することにします。

サンプルコード2でJUnitテストを行うと、
きちんとテストは成功します(確認しました)。

しかし、サンプルコード2のテストは
テストコードではあるものの、具体的に何かのJavaクラスを
テストしたわけではありません。
単に、データストアにデータを保存して、
保存したデータを取り出してみた、というだけです。

一連の動作を行うだけならば、
わざわざJUnitテストクラスを作るのではなく、
普通のJavaクラスにmainメソッドを宣言して
実装すればいいことです。

JUnitテストで動作するコードを書いた理由は、
きちんと動作するということが視覚的に確認できる、
という意味があります。
要するに、バーが緑になる(テストが全て成功する)ということです。

それだけではありません。
成功するテストがあるならば、テストメソッドの内部で行っている処理を
別のクラスの機能として実装することができます。
新しく実装するクラスのテストが既にできていることになります。

次回から、
実際にテストメソッドの内部の処理を別クラスに移す、
ということを行ってみます。




インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年6月28日火曜日

Google App Engine for Java のデータストアAPIのテストを実装してみる(その16)

前回までに修正した、サンプルコードを掲載します。

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.FetchOptions;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.PreparedQuery;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Query.FilterOperator;
import com.google.appengine.tools.development.testing.LocalDatastoreServiceTestConfig;
import com.google.appengine.tools.development.testing.LocalServiceTestHelper;

/**
 * Google App Engine for Javaにおけるユニットテストのサンプルコード。
 */
public class LocalUnitTestSample {

 private static final String DATA_KIND = "sampleDataKind";

 private LocalServiceTestHelper helper = new LocalServiceTestHelper(new LocalDatastoreServiceTestConfig());

 //private String[] propertyNames = {"pName1","pName2","pName3","pName4","pName5"};
 private String propertyName = "propertyName";

 private String[] propertyValues = {"pValue1","pValue2","pValue3","pValue4","pValue5"};

 private DatastoreService ds;

 private List keyList;

 /**
  * @throws java.lang.Exception
  */
 @Before
 public void setUp() throws Exception {
  helper.setUp();

  //サンプルデータをデータストアに保存する
  putSampleData();
 }

 /**
  * サンプルデータをデータストアに保存するメソッド。
  */
 private void putSampleData() {
  keyList = new ArrayList();
  ds = DatastoreServiceFactory.getDatastoreService();
  for (int i = 0; i < propertyValues.length; i++) {
   Entity entity = new Entity(DATA_KIND);
   entity.setProperty(propertyName, propertyValues[i]);
   Key key = ds.put(entity);
   keyList.add(key);
  }
 }

 /**
  * @throws java.lang.Exception
  */
 @After
 public void tearDown() throws Exception {
  //サンプルデータをデータストアから削除する
  deleteSampleData();

  helper.tearDown();
 }

 /**
  * サンプルデータをデータストアから削除するメソッド。
  */
 private void deleteSampleData() {
  Iterator iter = keyList.iterator();
  while (iter.hasNext()){
   ds.delete(iter.next());
  }
 }

 @Test
 public void doTest(){
  //サンプルデータをデータストアから検索する
  for (int i = 0;i < propertyValues.length;i++){
   Query query = new Query(DATA_KIND);
   query.addFilter(propertyName, FilterOperator.EQUAL, propertyValues[i]);
   PreparedQuery prepare = ds.prepare(query);
   List entitiesList = prepare.asList(FetchOptions.Builder.withDefaults());
   assertEquals(1,entitiesList.size());
   Iterator iter = entitiesList.iterator();
   while (iter.hasNext()){
    Entity entity = iter.next();
    assertTrue(propertyValues[i].equals(entity.getProperty(propertyName)));
   }
  }
 }

}




インストール不要・無料のKaede翻訳ツール:
http://kaedetrans.appspot.com/

2011年6月27日月曜日

Google App Engine for Java のデータストアAPIのテストを実装してみる(その15)

サンプルコードの変更の続きです。


前回の変更で、
putSampleData()メソッドを修正しました。

今回は、
doTest()メソッドの修正です。

まず最初、for文です。
for (int i = 0;i < propertyNames.length;i++){
この行のpropertyNamesの部分がコンパイルエラーになりますので、
propertyValues


と変更します。
ループ条件を構成する配列を、propertyNamesからpropertyValuesにすることで、
プロパティの「値」の数だけ繰り返します。

その次は、
query.addFilter(propertyNames[i], FilterOperator.EQUAL, propertyValues[i]);
の行のうち、propertyNames[i]の部分がコンパイルエラーになるので、
ここに正しいプロパティ名にあたる文字列を入れます。
propertyName
です。
変更後のコードは、
query.addFilter(propertyName, FilterOperator.EQUAL, propertyValues[i])
です。

もう一つは、
whileループ内部のassertTrue()の引数です。
assertTrue(propertyValues[i].equals(entity.getProperty(propertyNames[i])));
この行のpropertyNames[i]を、propertyNameにします。
assertTrue(propertyValues[i].equals(entity.getProperty(propertyName)));
となります。



インストール不要・無料のKaede翻訳ツール
http://kaedetrans.appspot.com/

2011年6月23日木曜日

Google App Engine for Java のデータストアAPIのテストを実装してみる(その14)

サンプルコードの変更の続きです。

前回の変更で、
フィールドpropertyNamesを削除して、
新たにフィールドpropertyNameを作成しました。

すると、コンパイルエラーとなりますので、
エラー部分を修正します。

まず、
putSampleData()メソッドです。

for (int i = 0;i < propertyNames.length;i++){

の行を、
for (int i = 0;i < propertyValues.length;i++){

と変更します。
propertyNamesをpropertyValuesとするわけです。

次に、
entity.setProperty(propertyNames[i],propertyValues[i]);


の行を
entity.setProperty(propertyName,propertyValues[i]);

とします。
propertyNames[i]をpropertyNameに変更しています。

次回は、doTest()メソッドを変更します。


インストール不要・無料のKaede翻訳ツール
http://kaedetrans.appspot.com/

2011年6月21日火曜日

Google App Engine for Java のデータストアAPIのテストを実装してみる(その13)

サンプルコードの改造を進める前に、
テスト用のサンプルデータを変更します。

と言っても、プロパティ名を変更するだけです。

フィールドpropertyNamesはjava.lang.String配列になっていますが、
String型に変更します。

private String[] propertyNames = 
{"pName1","pName2","pName3","pName4","pName5"};
の行を、
private String propertyName = "propertyName";
と変更します。

次に、
メソッドputSampleData()の実装を変更します。


インストール不要・無料のKaede翻訳ツール
http://kaedetrans.appspot.com/

2011年6月18日土曜日

Google App Engine for Java のデータストアAPIのテストを実装してみる(その12)

今回は、サンプルコードの改変はお休みです。
その代わり、サンプルコード全体の流れを
書いてみます。


このサンプルコードは、
setUp()
putSampleData()
doTest()
tearDown()
deleteSampleData()
の5つのメソッドを実装しています。
この中で、putSampleData()、deleteSampleData()の2つは
それぞれsetUp()、tearDown()の内部で呼び出されるだけなので、
テストを実行する上で、メソッド呼び出しの流れとしては
serUp()
doTest()
tearDown()
という順になります。JUnit4で使用されるアノテーションが付いた
メソッドだけです。

・テストの前準備(サンプルデータの保存)
・テストの実行(サンプルデータの検索)
・テストの後処理(サンプルデータの削除)
単純な流れですね。



インストール不要・無料のKaede翻訳ツール
http://kaedetrans.appspot.com/