iBatis:自動生成のCriteriaで悲観的ロックを取得したい

public class AccountExampleExtension extends AccountExample {
    protected Criteria createCriteriaInternal() {
        return new CriteriaExtension();
    }

    public static class CriteriaExtension extends AccountExample.Criteria {
        /**
         * アカウントテーブルから悲観的ロック(更新ロック)を取得
         * (SELECT FOR UPDATE NOWAIT)<br>
         */
        public CriteriaExtension forUpdateNowait(String id) {
            StringBuffer sb = new StringBuffer();
            sb.append("id = '").append(id).append("'");
            sb.append(") for update nowait -- (");
            addCriterion(sb.toString());
            return this;
        }
        public CriteriaExtension forUpdate(String id) {
            StringBuffer sb = new StringBuffer();
            sb.append("id = '").append(id).append("'");
            sb.append(") for update -- (");
            addCriterion(sb.toString());
            return this;
        }
    }
}
    // 使い方
    AccountExampleExtension example = new AccountExampleExtension();
    AccountExampleExtension.CriteriaExtension criteria 
            = (AccountExampleExtension.CriteriaExtension) example.createCriteria();
    criteria.forUpdateNowait(id);
    List<Account> list = this.accountMapper.selectByExample(example);

WASでEJB。lookupではまる。

結局、別案となるが調べたのでメモ。

    /**
     * WAS EJBリモートアクセスの場合
     */
    public void loginServiceRemote() throws Exception {
        Hashtable<String, String> pdEnv = new Hashtable<String, String>();
        pdEnv.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");
        pdEnv.put(Context.PROVIDER_URL, "corbaloc:iiop:localhost:2809");
        Context initialContext = new javax.naming.InitialContext(pdEnv);
        java.lang.Object Obj = (java.lang.Object)initialContext.lookup(
              "ejb/hogeEAR/hogeEJB.jar/HogeServiceImpl#com.hoge.service.IHogeService");
        IHogeService service = (IHogeService)javax.rmi.PortableRemoteObject.narrow(Obj, HogeServiceImpl.class);
        service.exec("arg");
    }
    /**
     * WAS EJBローカルアクセスの場合
     */
    public void loginServiceLocal() throws Exception {
        Hashtable<String, String> pdEnv = new Hashtable<String, String>();
        pdEnv.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");
        pdEnv.put(Context.PROVIDER_URL, "iiop://localhost");
        Context initialContext = new javax.naming.InitialContext(pdEnv);
        java.lang.Object Obj = (java.lang.Object)initialContext.lookup(
                "ejblocal:hogeEAR/hogeEJB.jar/HogeServiceImpl#com.hoge.service.IHogeService");
        IHogeService service = (IHogeService)javax.rmi.PortableRemoteObject.narrow(Obj, HogeServiceImpl.class);
        service.exec("arg");
    }

プライベートメソッドに外部からアクセスする

private String Hoge#fuga(String arg) の場合

Hoge hogeClass = new Hoge();
Method fugaMethod =  hogeClass.getClass().getDeclaredMethod("fuga", new Class[] {String.class});
fugaMethod.setAccessible(true);
String ret = (String) fugaMethod.invoke(hogeClass, new Object[] {"abc"});

private String Hoge#fuga(int i, String arg) の場合

Hoge hogeClass = new Hoge();
Method fugaMethod =  hogeClass.getClass().getDeclaredMethod("fuga", new Class[] {int.class, String.class});
fugaMethod.setAccessible(true);
String ret = (String) fugaMethod.invoke(hogeClass, new Object[] {1, "abc"});

private boolean isPiyo;
private void Hoge#fuga(String[] args) の場合

Hoge hogeClass = new Hoge();
Method fugaMethod =  hogeClass.getClass().getDeclaredMethod("fuga", new Class[] {String[].class});
fugaMethod.setAccessible(true);
String ret = (String) fugaMethod.invoke(hogeClass, new Object[] { new String[] {"aaa", "bbb"} });

Field piyoField = batch.getClass().getDeclaredField("isPiyo");
piyoField.setAccessible(true);
System.out.println(piyoField.getBoolean(hogeClass));


private static void Hoge#fuga(String args) の場合

Class<Hoge> clazz = Hoge.class;
Method fugaMethod = clazz.getDeclaredMethod("fuga", String.class);
fugaMethod.setAccessible(true);
String ret = (String) fugaMethod.invoke(null, "123");

Antのタスクでsubversion

Antタスクでビルドのとき、SVNからリビジョン取得とエクスポートしたかった。
svnantとAntがあればOK。
http://subclipse.tigris.org/svnant.html

<!-- svnantの定義 -->
<path id="svnant.classpath">
    <fileset dir="{env.SVNANT_LIB_DIR}" includes="**/*.jar"/>
</path>  
<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="svnant.classpath" />
<svnSetting id="svn.setting" javahl="false" svnkit="true" username="{ユーザ名}" password="{パスワード}" />

<!-- revision取得 -->
<target name="revision">
    <svn refid="svn.setting" >
        <singleinfo property="svn.revision" target="{SVNのURL}" request="revision" />
    </svn>
    <echo message="SVN revision : ${svn.revision}" />
</target>

<!-- export -->
<target name="core_svn-export">
    <svn refid="svn.setting" >
        <export srcUrl="{SVNのURL}/{プロジェクト}/src/main" revision="HEAD" destPath="{出力先}" />
    </svn>
</target>

Antで文字列置換(filtering)

system.properties を実行環境ごとに作りたい。
雛形.properties と 差込.properties を用意して、Antで作成。

DEV.properties

HOST=localhost
ID=localuser

IT.properties

HOST=192.168.0.1
ID=ituser

template.properties

host=@HOST@
id=@ID@
tmp.dir=/tmp

build.xml

<copy file="template.properties" tofile="system.properties" filtering="yes" encoding="utf-8" overwrite="yes">
 <filterset>
  <filtersfile file="{DEV|IT}.properties"/>
 </filterset>
</copy>

Log4jで特定のレベルのみ出力させる方法

Log4j org.apache.log4j.varia.***filter 要素を Appender に追加する。
layout要素よりも後に記述する。
DenyAllFilter を組み合わせる。

  • LevelMatchFilter 特定のログレベル
  • LevelRangeFilter ログレベルの範囲
  • StringMatchFilter ログメッセージでフィルタリング
  • DenyAllFilter 指定外は無効にする合
    
        
        
        
        
            
        
        
            
            
        
        
    

こちらを参考にしました。
Log4j Q&A