入門記2:動かしてみた際の補足。

前回のエントリに説明不足がちらほらと><


まず、Derbyですが最新のものをダウンロードするとpom.xmlに書いたものとのバージョンに差異があるから絶対動いてやんねーよ的なエラーが出てしまいます。なので、ダウンロードしてきたDerbyのlib/derby.jarをプロジェクト直下のlibフォルダにコピーして、これを使うようpom.xmlのdependenciesを以下のように書き換えます。

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.3.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.escafe.buri</groupId>
      <artifactId>buri-core</artifactId>
      <version>1.0.0</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.4</version>
    </dependency>
    <dependency>
        <groupId>geronimo-spec</groupId>
        <artifactId>geronimo-spec-jta</artifactId>
        <version>1.0-M1</version>
    </dependency>
<!--// ここを書き変えた //-->
    <dependency>
        <groupId>org.apache.derby</groupId>
        <artifactId>derby</artifactId>
        <version>10.4.2.0</version>
        <scope>system</scope>
        <systemPath>${basedir}/lib/derby.jar</systemPath>
    </dependency>
  </dependencies>

これで、DerbyのライブラリはMavenのセントラル・リポジトリではなくローカルのjarファイルを参照しますので、バージョンの差異によるDBアクセスのエラーは出なくなります。ちなみに、DBアクセスのエラーが出た場合の確認にBao用のテストを使うと結構時間を取ってしまうので、DocumentDaoのテストを作って確認するなどとしてました。


続いて、Buriが内部でどういったデータを残していくのか、というのを知る事でBuriのお仕事のアウトプットを理解しようと以下のように前回使ったBaoのテストコードを拡張してみました。

public class DocumentBaoTest2 extends S2TestCase {

	private static final String DICON_PATH = "app.dicon";

	private DocumentBao bao;

	private BuriBranchDao buriBranchDao;
	private BuriDataDao buriDataDao;
	private BuriDataPathHistoryDao buriDataPathHistoryDao;
	private BuriPathDao buriPathDao;
	private BuriStateDao buriStateDao;
	private BuriStateUndoLogDao buriStateUndoLogDao;
	private BuriStateUserDao buriStateUserDao;
	private BuriTransactionDao buriTransactionDao;
	private BuriUserDao buriUserDao;

	@Override
	protected void setUp() throws Exception {
		super.setUp();
		super.include(DICON_PATH);

		this.buriBranchDao = (BuriBranchDao) super.getComponent(BuriBranchDao.class);
		this.buriDataDao = (BuriDataDao) super.getComponent(BuriDataDao.class);
		this.buriDataPathHistoryDao = (BuriDataPathHistoryDao) super.getComponent(BuriDataPathHistoryDao.class);
		this.buriPathDao = (BuriPathDao) super.getComponent(BuriPathDao.class);
		this.buriStateDao = (BuriStateDao) super.getComponent(BuriStateDao.class);
		this.buriStateUndoLogDao = (BuriStateUndoLogDao) super.getComponent(BuriStateUndoLogDao.class);
		this.buriStateUserDao = (BuriStateUserDao) super.getComponent(BuriStateUserDao.class);
		this.buriTransactionDao = (BuriTransactionDao) super.getComponent(BuriTransactionDao.class);
		this.buriUserDao = (BuriUserDao) super.getComponent(BuriUserDao.class);
	}
	public void testTx() {
		DocumentDto doc1 = new DocumentDto("文書A", "文書Aです。");
		DocumentDto doc2 = new DocumentDto("文書B", "文書Bです。");
		DocumentDto doc3 = new DocumentDto("文書C", "文書Cです。");
		// 1st
		this.bao.register(doc1);
		System.out.println(this.bao.getPublishings().size());
		assertEquals(1, this.bao.getPublishings().size());
		// 2nd
		this.bao.register(doc2);
		this.bao.register(doc3);
		assertEquals(3, this.bao.getPublishings().size());
		// 3rd
		this.bao.finishPublishing(doc1);
		assertEquals(2, this.bao.getPublishings().size());
		// 4th
		this.bao.finishPublishing(doc2);
		this.bao.finishPublishing(doc3);
		assertEquals(0, this.bao.getPublishings().size());
		// 覗き
		this.checkData();
	}
	private void checkData() {
		this.output(this.buriBranchDao.getAllBuriBranch(), BuriBranchEntityDto.class.getName());
		this.output(this.buriDataDao.getAllBuriData(), BuriDataDao.class.getName());
		this.output(this.buriDataPathHistoryDao.getAllBuriDataPathHistory(), BuriDataPathHistoryEntityDto.class.getName());
		this.output(this.buriPathDao.getAllBuriPath(), BuriPathDao.class.getName());
		this.output(this.buriStateDao.getAllBuriState(), BuriStateEntityDto.class.getName());
		this.output(this.buriStateUndoLogDao.getAllBuriState(), BuriStateUndoLogEntityDto.class.getName());
		this.output(this.buriStateUserDao.getAllBuriBranch(), BuriStateUserEntityDto.class.getName());
		this.output(this.buriTransactionDao.getAllBuriBranch(), BuriTransactionEntityDto.class.getName());
		this.output(this.buriUserDao.getAllBuriBranch(), BuriUserEntityDto.class.getName());
		DocumentDao docDao = (DocumentDao) super.getComponent("DocumentDao");
		this.output(docDao.selectAll(), DocumentDto.class.getName());
	}
	private void output(List<?> list, String dtoName) {
		if (list.size() == 0) {
			System.out.println("\n***** " + dtoName + " *****");
			System.out.println("size=0");
			return;
		}
		System.out.println("\n***** " + dtoName + " *****");
		for (Object o: list) {
			System.out.println(o.toString());
		}
	}

}

ロジックだせー、という突っ込みがあれば甘んじて受けます><
Buri固有のテーブルそれぞれのDaoとDtoを使って中身を全部出力してやれ、という狙いですね。これを実行すると・・・

org.seasar.dao.MethodSetupFailureRuntimeException: [EDAO0019]org.escafe.buri.dao.BuriTransactionDaoのselectFromDtoメソッドの初期化時に例外が発生しました。理由はorg.seasar.extension.jdbc.ColumnNotFoundRuntimeException: [ESSR0068]テーブル(BuriTransaction)のカラム(dto)が見つかりません
at org.seasar.dao.impl.DaoMetaDataImpl.setupMethod(DaoMetaDataImpl.java:187)
at org.seasar.dao.impl.DaoMetaDataImpl.setupMethod(DaoMetaDataImpl.java:164)
at org.seasar.dao.impl.DaoMetaDataImpl.setupSqlCommand(DaoMetaDataImpl.java:158)
at org.seasar.dao.impl.DaoMetaDataImpl.initialize(DaoMetaDataImpl.java:144)
at org.seasar.dao.impl.DaoMetaDataFactoryImpl.createDaoMetaData(DaoMetaDataFactoryImpl.java:123)
at org.seasar.dao.impl.DaoMetaDataFactoryImpl.getDaoMetaData(DaoMetaDataFactoryImpl.java:105)
at org.seasar.dao.interceptors.S2DaoInterceptor.invoke(S2DaoInterceptor.java:51)
at org.seasar.dao.pager.PagerS2DaoInterceptorWrapper.invoke(PagerS2DaoInterceptorWrapper.java:65)
at org.seasar.framework.aop.impl.NestedMethodInvocation.proceed(NestedMethodInvocation.java:43)
at org.seasar.framework.aop.interceptors.TraceInterceptor.invoke(TraceInterceptor.java:59)
at org.seasar.framework.aop.impl.NestedMethodInvocation.proceed(NestedMethodInvocation.java:43)
at org.seasar.framework.aop.interceptors.InterceptorChain.invoke(InterceptorChain.java:42)
at org.escafe.buri.dao.BuriTransactionDao$$EnhancedByS2AOP$$ff9053$$MethodInvocation$$getAllBuriBranch0.proceed(MethodInvocationClassGenerator.java)
at org.escafe.buri.dao.BuriTransactionDao$$EnhancedByS2AOP$$ff9053.getAllBuriBranch(BuriTransactionDao$$EnhancedByS2AOP$$ff9053.java)
at tryapp.bao.DocumentBaoTest2.checkData(DocumentBaoTest2.java:87)
at tryapp.bao.DocumentBaoTest2.testTx(DocumentBaoTest2.java:77)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:168)
at org.seasar.framework.unit.S2FrameworkTestCase.doRunTest(S2FrameworkTestCase.java:305)
at org.seasar.extension.unit.S2TestCase.doRunTest(S2TestCase.java:92)
at org.seasar.framework.unit.S2FrameworkTestCase.runBare(S2FrameworkTestCase.java:190)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:232)
at junit.framework.TestSuite.run(TestSuite.java:227)
at org.junit.internal.runners.OldTestClassRunner.run(OldTestClassRunner.java:76)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: org.seasar.extension.jdbc.ColumnNotFoundRuntimeException: [ESSR0068]テーブル(BuriTransaction)のカラム(dto)が見つかりません
at org.seasar.dao.impl.BeanMetaDataImpl.convertFullColumnName(BeanMetaDataImpl.java:233)
at org.seasar.dao.impl.DaoMetaDataImpl.createAutoSelectSql(DaoMetaDataImpl.java:717)
at org.seasar.dao.impl.DaoMetaDataImpl.setupNonQuerySelectMethodByArgs(DaoMetaDataImpl.java:635)
at org.seasar.dao.impl.DaoMetaDataImpl.setupNonQuerySelectMethodByAuto(DaoMetaDataImpl.java:602)
at org.seasar.dao.impl.DaoMetaDataImpl.setupSelectMethodByAuto(DaoMetaDataImpl.java:575)
at org.seasar.dao.impl.DaoMetaDataImpl.setupMethodByAuto(DaoMetaDataImpl.java:295)
at org.seasar.dao.impl.DaoMetaDataImpl.setupMethod(DaoMetaDataImpl.java:184)
... 36 more

BuriTransactionDaoはBURITRANSACTIONテーブルがそのターゲットになるテーブルであるのですが、これがBuriの中にあるDaoである点を考慮して、この例外がほぼ間違いなく僕のせいだと思います。S2Daoは全然詳しくないので、早くも脇道にそれそうな予感がしますが、今日はなぜか恐ろしく眠いので続きはまた><