Hatena::Groupseasarproject

きむきむのSeasar日記 このページをアンテナに追加 RSSフィード

seasar.org
<< 2018/11 >>
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

2004年06月29日

[][]昨日の続きのテスト 昨日の続きのテスト - きむきむのSeasar日記 を含むブックマーク はてなブックマーク - 昨日の続きのテスト - きむきむのSeasar日記 昨日の続きのテスト - きむきむのSeasar日記 のブックマークコメント


更新系の処理は、全件取得を作っておくと、比較が楽♪

package jp.gr.java_conf.kimura.seasar2.example.dao;

import java.util.List;

import org.seasar.extension.dataset.DataSet;

import org.seasar.extension.dataset.DataTable;

import org.seasar.extension.dataset.impl.DataTableImpl;

import org.seasar.extension.unit.S2TestCase;

public class TestTableDaoTest extends S2TestCase {

 private TestTableDao dao;

 public TestTableDaoTest(String name) {

  super(name);

 }

 protected void setUp() {

  include("TestDao.dicon");

 }

 public void testGetAllDataTx() {

  readXlsReplaceDb("PreDatas.xls");

  DataSet dataSet = readXls("PreDatas.xls");

  DataTable expectTable = dataSet.getTable(TestData.TABLE);

  int expect = expectTable.getRowSize();

  

  List allData = dao.getAllData();

  int result = allData.size();

  assertEquals(expect, result);

  

  DataTable resultTable = new DataTableImpl(TestData.TABLE);

  resultTable.setupColumns(TestData.class);

  resultTable.copyFrom(allData);

  assertEquals(expectTable, resultTable);

 }

 public void testInsertTx() {

  readXlsReplaceDb("PreDatas.xls");

  dao.insert(new TestData(100,"c"));

  assertTableDataEquals("Insert.xls");

 }

 public void testUpdateTx() {

  readXlsReplaceDb("PreDatas.xls");

  dao.update(new TestData(25,"q"));

  dao.update(new TestData(100,"q"));

  assertTableDataEquals("Update.xls");

 }

 public void testDeleteTx() {

  readXlsReplaceDb("PreDatas.xls");

  dao.delete(new TestData(24,"c"));

  dao.delete(new TestData(100,"c"));

  assertTableDataEquals("Delete.xls");

 }

 

 private void assertTableDataEquals(String expectXls){

  DataSet dataSet = readXls(expectXls);

  DataTable expectTable = dataSet.getTable(TestData.TABLE);

  List allData = dao.getAllData();

  DataTable resultTable = new DataTableImpl(TestData.TABLE);

  resultTable.setupColumns(TestData.class);

  resultTable.copyFrom(allData);

  assertEquals(expectTable, resultTable);

 }

}

トラックバック - http://seasarproject.g.hatena.ne.jp/skimura/20040629

2004年06月28日

[][]S2Dao入門 S2Dao入門 - きむきむのSeasar日記 を含むブックマーク はてなブックマーク - S2Dao入門 - きむきむのSeasar日記 S2Dao入門 - きむきむのSeasar日記 のブックマークコメント

とりあえず、SELECT, INSERT, UPATE, DELETEを使ったサンプル。

ぶっちゃけ、やっつけ仕事です。。。(^^;


CREATE TABLE文

CREATE TABLE test_table ( pk INTEGER, testChar VARCHAR(20), PRIMARY KEY (pk));


TestTableDao.java

package jp.gr.java_conf.kimura.seasar2.example.dao;

import java.util.List;

public interface TestTableDao {

 public Class BEAN = TestData.class;

 public List getAllData();

 public int insert(TestData testData);

 public int update(TestData testData);

 public int delete(TestData testData);

}


TestData.java

package jp.gr.java_conf.kimura.seasar2.example.dao;

import java.io.Serializable;

public class TestData implements Serializable {

 public static final String TABLE = "TEST_TABLE";

 private int pk;

 private String testChar;

 public int getPk() {

  return pk;

 }

 public void setPk(int pk) {

  this.pk = pk;

 }

 public String getTestChar() {

  return testChar;

 }

 public void setTestChar(String testChar) {

  this.testChar = testChar;

 }

 public String toString() {

  return "pk = " + pk + " : testChar = " + testChar;

 }

}


Main.java

package jp.gr.java_conf.kimura.seasar2.example.dao;

import java.util.List;

import org.seasar.framework.container.S2Container;

import org.seasar.framework.container.factory.S2ContainerFactory;

public class Main {

 private static final String PATH = "jp/gr/java_conf/kimura/seasar2/example/dao/TestDao.dicon";

 public static void main(String[] args) {

  S2Container container = S2ContainerFactory.create(PATH);

  container.init();

  try {

   TestTableDao dao = (TestTableDao) container.getComponent(TestTableDao.class);

   showAllData(dao);

   insertData(dao, 0, "oreju");

   showAllData(dao);

   insertData(dao, 1, "ayaya");

   showAllData(dao);

   insertData(dao, 2, "Aya Ueto");

   showAllData(dao);

   updateData(dao, 2, "Yuri Ebihara");

   showAllData(dao);

   deleteData(dao, 2);

   showAllData(dao);

  } finally {

   container.destroy();

  }

 }

 private static void showAllData(TestTableDao dao) {

  List datas = dao.getAllData();

  if (datas.size() == 0) {

   System.out.println("Data was not found...");

   return;

  }

  for (int i = 0; i < datas.size(); ++i) {

   System.out.println(datas.get(i));

  }

 }

 private static void insertData(TestTableDao dao, int pk, String testChar) {

  TestData testData = new TestData();

  testData.setPk(pk);

  testData.setTestChar(testChar);

  dao.insert(testData);

 }

 private static void updateData(TestTableDao dao, int pk, String testChar) {

  TestData testData = new TestData();

  testData.setPk(pk);

  testData.setTestChar(testChar);

  dao.update(testData);

 }

 private static void deleteData(TestTableDao dao, int pk) {

  TestData testData = new TestData();

  testData.setPk(pk);

  dao.delete(testData);

 }

}


TestDao.dicon

<??xml version="1.0" encoding="Shift_JIS"?>

<?!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"

"http://www.seasar.org/dtd/components.dtd">

<components>

<include path="jp/gr/java_conf/kimura/seasar2/example/dao/j2ee.dicon"/>

<component class="jp.gr.java_conf.kimura.seasar2.example.dao.TestTableDao">

<aspect>

<component class="org.seasar.dao.interceptors.S2DaoInterceptor"/>

</aspect>

</component>

</components>

(j2ee.diconは、サンプルそのままのパクリ。これもパクリだけど。。。)


TestTableDao_getAllData.sql

SELECT * FROM test_table


TestTableDao_insert.sql

INSERT INTO test_table (pk, testChar) VALUES(/*testdata.pk*/10 , /*testdata.testChar*/'TEST')

(「10,」ってして、,もトークンの対象にされてたのに、10秒くらいハマッタ。スペースが必要!)


TestTableDao_update.sql

UPDATE test_table SET testChar = /*testdata.testChar*/'TEST2' WHERE pk = /*testdata.pk*/10


TestTableDao_delete.sql

DELETE FROM test_table WHERE pk = /*testdata.pk*/10


実行結果

DEBUG 2004-06-28 16:09:23,423 [main] SELECT * FROM test_table

DEBUG 2004-06-28 16:09:23,653 [main] 物理的なコネクションを取得しました

DEBUG 2004-06-28 16:09:23,653 [main] 論理的なコネクションを取得しました

DEBUG 2004-06-28 16:09:24,064 [main] 論理的なコネクションを閉じました

Data was not found...

DEBUG 2004-06-28 16:09:24,104 [main] INSERT INTO test_table (pk, testChar) VALUES(0 , 'oreju')

DEBUG 2004-06-28 16:09:24,104 [main] 論理的なコネクションを取得しました

DEBUG 2004-06-28 16:09:24,334 [main] 論理的なコネクションを閉じました

DEBUG 2004-06-28 16:09:24,344 [main] SELECT * FROM test_table

DEBUG 2004-06-28 16:09:24,344 [main] 論理的なコネクションを取得しました

DEBUG 2004-06-28 16:09:24,364 [main] 論理的なコネクションを閉じました

pk = 0 : testChar = oreju

DEBUG 2004-06-28 16:09:24,364 [main] INSERT INTO test_table (pk, testChar) VALUES(1 , 'ayaya')

DEBUG 2004-06-28 16:09:24,364 [main] 論理的なコネクションを取得しました

DEBUG 2004-06-28 16:09:24,374 [main] 論理的なコネクションを閉じました

DEBUG 2004-06-28 16:09:24,374 [main] SELECT * FROM test_table

DEBUG 2004-06-28 16:09:24,374 [main] 論理的なコネクションを取得しました

DEBUG 2004-06-28 16:09:24,374 [main] 論理的なコネクションを閉じました

pk = 0 : testChar = oreju

pk = 1 : testChar = ayaya

DEBUG 2004-06-28 16:09:24,384 [main] INSERT INTO test_table (pk, testChar) VALUES(2 , 'Aya Ueto')

DEBUG 2004-06-28 16:09:24,384 [main] 論理的なコネクションを取得しました

DEBUG 2004-06-28 16:09:24,384 [main] 論理的なコネクションを閉じました

DEBUG 2004-06-28 16:09:24,384 [main] SELECT * FROM test_table

DEBUG 2004-06-28 16:09:24,404 [main] 論理的なコネクションを取得しました

DEBUG 2004-06-28 16:09:24,414 [main] 論理的なコネクションを閉じました

pk = 0 : testChar = oreju

pk = 1 : testChar = ayaya

pk = 2 : testChar = Aya Ueto

DEBUG 2004-06-28 16:09:24,425 [main] UPDATE test_table SET testChar = 'Yuri Ebihara'

WHERE pk = 2

DEBUG 2004-06-28 16:09:24,425 [main] 論理的なコネクションを取得しました

DEBUG 2004-06-28 16:09:24,425 [main] 論理的なコネクションを閉じました

DEBUG 2004-06-28 16:09:24,435 [main] SELECT * FROM test_table

DEBUG 2004-06-28 16:09:24,435 [main] 論理的なコネクションを取得しました

DEBUG 2004-06-28 16:09:24,435 [main] 論理的なコネクションを閉じました

pk = 0 : testChar = oreju

pk = 1 : testChar = ayaya

pk = 2 : testChar = Yuri Ebihara

DEBUG 2004-06-28 16:09:24,445 [main] DELETE FROM test_table WHERE pk = 2

DEBUG 2004-06-28 16:09:24,445 [main] 論理的なコネクションを取得しました

DEBUG 2004-06-28 16:09:24,445 [main] 論理的なコネクションを閉じました

DEBUG 2004-06-28 16:09:24,445 [main] SELECT * FROM test_table

DEBUG 2004-06-28 16:09:24,445 [main] 論理的なコネクションを取得しました

DEBUG 2004-06-28 16:09:24,465 [main] 論理的なコネクションを閉じました

pk = 0 : testChar = oreju

pk = 1 : testChar = ayaya

DEBUG 2004-06-28 16:09:24,465 [main] 物理的なコネクションを閉じました

orejuと、ayayaだけの世界になりました。(w

(testCharとかは、気にしていけない!)


[][]初めてのDBテスト 初めてのDBテスト - きむきむのSeasar日記 を含むブックマーク はてなブックマーク - 初めてのDBテスト - きむきむのSeasar日記 初めてのDBテスト - きむきむのSeasar日記 のブックマークコメント

TestTableDaoTest.java

package jp.gr.java_conf.kimura.seasar2.example.dao;

import org.seasar.extension.dataset.DataSet;

import org.seasar.extension.unit.S2TestCase;

public class TestTableDaoTest extends S2TestCase {

 private TestTableDao dao;

 public TestTableDaoTest(String name) {

  super(name);

 }

 protected void setUp() throws Exception {

  include("TestDao.dicon");

  readXlsReplaceDb("Prepare.xls");

 }

 public void testGetAllData() {

  DataSet dataSet = readXls("Prepare.xls");

  int expect = dataSet.getTable("test_table").getRowSize();

  int result = dao.getAllData().size();

  assertEquals(expect, result);

 }

 public void testInsert() {

 }

 public void testUpdate() {

 }

 public void testDelete() {

 }

}

ってしたら、うごかない・・・(;_;)


org.seasar.framework.exception.EmptyRuntimeException: [ESSR0007]dataSourceはnullあるいは空であってはいけません

 at org.seasar.extension.unit.S2TestCase.getDataSource(S2TestCase.java:109)

 at org.seasar.extension.unit.S2TestCase.deleteDb(S2TestCase.java:170)

 at org.seasar.extension.unit.S2TestCase.readXlsReplaceDb(S2TestCase.java:157)

 at jp.gr.java_conf.kimura.seasar2.example.dao.TestTableDaoTest.setUp(TestTableDaoTest.java:15)


TestDao.diconの中で、j2ee.diconをインクルードしてるのが悪いのかな?と思って、別に分けて、setUpで2回includeをしてみたけど、同じ結果だった・・・


なんでだ?


>とりあえず、解決しました。(30分くらいはまった)

readXlsReplaceDb("Prepare.xls");

をsetUpからはずして、テストメソッドの中に入れたら動いた。

なんか、変なの・・・


追記:マニュアル読んでみました。

テストメソッド名の最後にTxをつけるとテストメソッドを開始する直前にトランザクションを開始し、テストメソッドが終了した直後にトランザクションがロールバックされます。

10へぇ

自動で、ロールバックされると思ってたら、コミットされてたよ・・・

テストなんだから、Txつけなくても必ず、ロールバックする方がいいと思う。何か意図があるのかな~。


readXlsWriteDb()、readXlsAllReplaceDb()はテスト後にロールバックしてデータが元に戻るようにtestXxxTx()の最初に実行してください。

おー!書いてあった!

マニュアル読んでなかったのがバレバレ・・・(^^;


あとは、明日までに、DataRowと、Beanの比較を簡単に出来る仕組みを考えておこう。

>コメント欄参照

トラックバック - http://seasarproject.g.hatena.ne.jp/skimura/20040628

2004年05月18日

[]AOP AOP - きむきむのSeasar日記 を含むブックマーク はてなブックマーク - AOP - きむきむのSeasar日記 AOP - きむきむのSeasar日記 のブックマークコメント

こんな簡単なのでいいかな?


とりあえず、Kisser.javaにゲッターメソッドだけ追加

(getKissableは使ってないけど)

 String getName();

 Kissable getKissable();


Girl.javaにも以下のコードを追加

 public String getName() {

  return name_;

 }

 public Kissable getKissable() {

  return kissable_;

 }


MethodInterceptorを実装したクラスを作成

WordsOfKisser.java

package jp.gr.java_conf.kimura.seasar2.example.aop;

import jp.gr.java_conf.kimura.seasar2.example1.Kisser;

import org.aopalliance.intercept.MethodInterceptor;

import org.aopalliance.intercept.MethodInvocation;

public class WordsOfKisser implements MethodInterceptor {

 public Object invoke(MethodInvocation invocation) throws Throwable {

  String kisserName = ( (Kisser) invocation.getThis() ).getName();

  System.out.println(kisserName + " said \"Close your eyes.... \"\n");

  Object ret = invocation.proceed();

  System.out.println("\nAnd, " + kisserName + " said \"I love you.\"");

  return ret;

 }

}


Mainは、いつもと同じ

Main.java

package jp.gr.java_conf.kimura.seasar2.example.aop;

import jp.gr.java_conf.kimura.seasar2.example1.Kisser;

import org.seasar.framework.container.S2Container;

import org.seasar.framework.container.factory.S2ContainerFactory;

public class Main {

 public static void main(String[] args) {

  S2Container container = S2ContainerFactory.create("jp/gr/java_conf/kimura/seasar2/example/aop/config.dicon");

  Kisser kisser = (Kisser) container.getComponent(Kisser.class);

  kisser.kiss();

 }

}

いつも一緒だから、ここにAOP適用した方がいいかも。。。(なんか変な事、考えてた。卵が先か、鶏が先か、みたいな。。。)


config.dicon

<?xml version="1.0" encoding="UTF-8"?>

<components>

 <component name="wordsOfKisser" class="jp.gr.java_conf.kimura.seasar2.example.aop.WordsOfKisser"/>

 <component name="oreju" class="jp.gr.java_conf.kimura.seasar2.example1.Boy">

  <arg>'Oreju'</arg>

  </component>

 <component class="jp.gr.java_conf.kimura.seasar2.example1.Girl">

  <arg>'Aya Matsuura'</arg>

  <arg>oreju</arg>

  <aspect pointcut="kiss">wordsOfKisser</aspect>

 </component>

</components>

kissメソッドにポイントカットを設定



で、実行結果は、

Aya Matsuura said "Close your eyes.... "


Oreju was kissed by Aya Matsuura !!


And, Aya Matsuura said "I love you."

トラックバック - http://seasarproject.g.hatena.ne.jp/skimura/20040518

2004年05月17日

[]自動初期化 自動初期化 - きむきむのSeasar日記 を含むブックマーク はてなブックマーク - 自動初期化 - きむきむのSeasar日記 自動初期化 - きむきむのSeasar日記 のブックマークコメント

自動初期化には、条件があります。

  1. プロパティの型がインターフェイスである
  2. その実装クラスがコンテナ上に取得可能なコンポーネントとして登録されている
  3. <component>エレメントのautoBinding属性が記述されていないか、"auto"もしくは"property"

インターフェースを用意

BoyAttribute.java

package jp.gr.java_conf.kimura.seasar2.example4;

public interface BoyAttribute {

 void setName(String name);

 String getName();

}


実装クラスを用意

BoyAttributeImpl.java

package jp.gr.java_conf.kimura.seasar2.example4;

import jp.gr.java_conf.kimura.seasar2.example3.GirlAttribute;

public class BoyAttributeImpl extends GirlAttribute implements BoyAttribute {

}

継承関係が逆だけど気にしない。(爆 (サンプルなので、流用出来る物は、流用しちゃいます。ダメコードだ・・・)


Boy.javaに以下のコードを追加

 public void setAttribute(BoyAttribute attribute) {

  name_ = attribute.getName();

 }


MainAutoInit.java

package jp.gr.java_conf.kimura.seasar2.example4;

import jp.gr.java_conf.kimura.seasar2.example1.Kisser;

import org.seasar.framework.container.S2Container;

import org.seasar.framework.container.factory.S2ContainerFactory;

public class MainAutoInit {

 public static void main(String[] args) {

  S2Container container = S2ContainerFactory.create("jp/gr/java_conf/kimura/seasar2/example4/config.dicon");

  Kisser kisser = (Kisser) container.getComponent(Kisser.class);

  kisser.kiss();

 }

}


config.dicon(2.0.8からは、拡張子が、xmlではなく、dicon!)

<?xml version="1.0" encoding="UTF-8"?>

<components>

 <component name="attribute" class="jp.gr.java_conf.kimura.seasar2.example4.BoyAttributeImpl">

  <property name="name">'Oreju'</property>

 </component>

 <component name="oreju" class="jp.gr.java_conf.kimura.seasar2.example1.Boy"/>

 <component class="jp.gr.java_conf.kimura.seasar2.example1.Girl">

  <property name="name">'Aya Matsuura'</property>

  <property name="kissable">oreju</property>

 </component>

</components>

設定ファイル上、Boyクラスには、何も値がセットされていない。


けど、実行結果は、

Oreju was kissed by Aya Matsuura !!

自動で値がセットされました!


・コンストラクタでも同様の事が出来ます。

 ただし、引数の一番多いコンストラクタが使用されます。

 かつ、インターフェースのみを引数に持つコンストラクタ。

トラックバック - http://seasarproject.g.hatena.ne.jp/skimura/20040517

2004年05月14日

[]案 案 - きむきむのSeasar日記 を含むブックマーク はてなブックマーク - 案 - きむきむのSeasar日記 案 - きむきむのSeasar日記 のブックマークコメント

とりあえず、実装が隠蔽された事と、明示的なインスタンスの初期化まで出来たから、

次は、自動初期化と、インスタンスの保持あたり(シングルトンとか)をやってみようと思ってます。(その次は、AOPかな?)

とりあえず、順を追ってやって行こうと思いますが、

やってほしい事あれば、コメントに書いてくれれば、やってみます。

トラックバック - http://seasarproject.g.hatena.ne.jp/skimura/20040514
日記内検索(ヘッダまで戻らなくていいから、便利?)

このコンテンツは、投げ銭を受けつています。
@payの後払い