2012年12月2日日曜日

findbugsプラグインを作ってみる

findbugsプラグインを作ってみました。
とりあえず、簡単なチェックなら簡単にできそうだということがわかっりました。

作り方は、下記のページを参考にしました。
・FingBugsのプラグインのTutorial http://code.google.com/p/findbugs/wiki/DetectorPluginTutorial

・DM_DEFAULT_ENCODINGを検出するfindbugsのソースコード http://code.google.com/p/findbugs/source/browse/trunk/findbugs/src/java/edu/umd/cs/findbugs/detect/DefaultEncodingDetector.java?r=14166

とりあえず、ある関数を呼び出しているというのを検出するものを書いてみました。

そして、BigDecimal.divide(java.math.BigDecimal)を呼んでいる箇所を 検出する場合には、下記のように書けばいい感じになりました。

あとは、Tutorialに書いているようにmessages.xmlとfindbugs.xmlと必要であればmessages_ja.xmlを 書いてあげてjarファイルにでもしてあげて、Findbugsのpluginフォルダに入れて 実行してあげれば、チェックを追加してあげることができます。

import edu.umd.cs.findbugs.BugInstance;
import edu.umd.cs.findbugs.BugReporter;
import edu.umd.cs.findbugs.MethodAnnotation;
import edu.umd.cs.findbugs.ba.XFactory;
import edu.umd.cs.findbugs.ba.XMethod;
import edu.umd.cs.findbugs.bcel.OpcodeStackDetector;

public class BigDecimalDevide9Detector extends OpcodeStackDetector{
 private final BugReporter bugReporter;
 public BigDecimalDevide9Detector(BugReporter bugReporter) {
        this.bugReporter = bugReporter;
    } 
 @Override
 public void sawOpcode(int seen) {
        switch (seen) {
        case INVOKEVIRTUAL:
        case INVOKESPECIAL:
        case INVOKESTATIC:
            XMethod callSeen = XFactory.createXMethod(MethodAnnotation.fromCalledMethod(this));
            XMethod badMethod = XFactory.createXMethod("java.math.BigDecimal", "divide","(Ljava/math/BigDecimal;)Ljava/math/BigDecimal;", false);
            if (badMethod.equals(callSeen)) {
                bugReporter.reportBug(new BugInstance(this, "TUTORIAL_BUG", HIGH_PRIORITY).addClassAndMethod(this)
                  .addClassAndMethod(this).addSourceLine(this));
            }
        }
 }
}

本当は、もっと細かいロジックも書いてみたいのだけど、今後、いろいろとFindBugsのソースを 見ながらちょっとずつ見ていこうかなと思っています。

2012年10月13日土曜日

SVNKitでShowLogするサンプル

SVNKit(http://svnkit.com/)を利用してSVNのログ表示を実行してみた。 こんな感じで書けばいけるようである。
import java.io.File;

import org.tmatesoft.svn.core.ISVNLogEntryHandler;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNLogEntry;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
import org.tmatesoft.svn.core.wc.SVNLogClient;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNWCUtil;


public class SVNLogSample {
 private static class LogEntryHandler implements ISVNLogEntryHandler{

  @Override
  public void handleLogEntry(SVNLogEntry arg0) throws SVNException {
   System.out.print(arg0.getDate());
//   System.out.print(arg0.getChangedPaths());
   System.out.print(arg0.getAuthor());
   System.out.println(arg0.getMessage());
  }
  
 }
 private static final String SVN_USER="svnuser";
 private static final String SVN_PASS="svnuserpass";
 public static void main(String[] args) throws SVNException {
  new SVNLogSample().execute();
 }

 private void execute() throws SVNException {
  System.out.println("start");
  init();
  ISVNAuthenticationManager auth = SVNWCUtil.createDefaultAuthenticationManager(new File("tmp"),SVN_USER,SVN_PASS,false);
  SVNLogClient lc = new SVNLogClient(auth,null);
  SVNURL targetUrl=SVNURL.parseURIEncoded("svn://xxxxxxx");
  ISVNLogEntryHandler handler = new LogEntryHandler();
  String[] path = new String[]{"/path1","/path1"};
  lc.doLog(targetUrl,path,SVNRevision.HEAD, SVNRevision.HEAD, SVNRevision.create(0), true, true, 50, handler);
 }

 private void init() {
  DAVRepositoryFactory.setup();
  SVNRepositoryFactoryImpl.setup();
  FSRepositoryFactory.setup(); 
 }
}

SVNKitでSvnDiffのサンプルコード

SVNKit(http://svnkit.com/)を利用してSVNDiffを実行してみた。
こんな感じで書けば実行できるようである。
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.UnsupportedEncodingException;
import org.tmatesoft.svn.core.ISVNLogEntryHandler;
import org.tmatesoft.svn.core.SVNException;
import org.tmatesoft.svn.core.SVNLogEntry;
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.fs.FSRepositoryFactory;
import org.tmatesoft.svn.core.internal.io.svn.SVNRepositoryFactoryImpl;
import org.tmatesoft.svn.core.wc.ISVNDiffStatusHandler;
import org.tmatesoft.svn.core.wc.SVNDiffClient;
import org.tmatesoft.svn.core.wc.SVNDiffStatus;
import org.tmatesoft.svn.core.wc.SVNLogClient;
import org.tmatesoft.svn.core.wc.SVNRevision;
import org.tmatesoft.svn.core.wc.SVNWCUtil;
public class SVNDiffSample {
 private static class DiffStatusHandler implements ISVNDiffStatusHandler{
 @Override
 public void handleDiffStatus(SVNDiffStatus arg0) throws SVNException {
  System.out.print(arg0.getPath());
  System.out.print(":");
  System.out.println(arg0.getModificationType());
 }
}
 private static final String SVN_USER="svn_user";
 private static final String SVN_PASS="svn_pass";
 public static void main(String[] args) throws SVNException, UnsupportedEncodingException {
  new SVNDiffSample().execute();
 }
 private void execute() throws SVNException, UnsupportedEncodingException {
  System.out.println("start");
  init();
  ISVNAuthenticationManager auth = SVNWCUtil.createDefaultAuthenticationManager(new        File("tmp"),SVN_USER,SVN_PASS,false);
  SVNDiffClient lc = new SVNDiffClient(auth,null);
  SVNURL targetUrl=SVNURL.parseURIEncoded("svn://urlstring");
  ISVNDiffStatusHandler handler = new DiffStatusHandler();
  //lc.doDiffStatus(targetUrl, SVNRevision.create(revNo), targetUrl,SVNRevision.create(revNo),   true, true, handler);
  ByteArrayOutputStream bao = new ByteArrayOutputStream();
  lc.doDiff(targetUrl, SVNRevision.create(revNo), targetUrl,SVNRevision.create(revNo),       SVNDepth.INFINITY, true, bao);
  System.out.println("SIZE:"+bao.size());
  System.out.println(bao.toString("MS932"));
 }
 private void init() {
  DAVRepositoryFactory.setup();
  SVNRepositoryFactoryImpl.setup();
  FSRepositoryFactory.setup();
 }
}

GWTでCookieを扱う

GWTでCookieを扱ってみた。

クライアント側のコード
import com.google.gwt.user.client.Cookies; 

略
  Cookies.setCookie("COOKIE_NAME", edUserName.getText());

サーバ側でこれらを取得する場合
Cookie[] cookies = getThreadLocalRequest().getCookies();
 if (cookies != null) {
  for (Cookie cookie : cookies) {
 System.out.println(cookie.getName()+cookie.getValue());
 } 
}

2012年8月26日日曜日

AutoItを利用して定期的に処理を実行する

あるbatファイルの処理を10分に一回実行させたいなと思ったのですが、
標準のDOSコマンドではそれらしきものがなかったのでAutoItを利用してやってみた


下記がサンプルです。 10分に1回exec.batを起動するというのを100回繰り返す というサンプルです。 SW_HIDEを指定しているのは、画面を出したくないためです。

For $i = 1 to 100 Step 1
RunWait('exec.bat','.',@SW_HIDE)
sleep(1000*60*10)
Next
MsgBox(0, "情報","ループ終了")

2012年7月22日日曜日

GWTのCellTableで行選択をする

GWTのCellTableで行選択をする方法。 SelectionModelをCellTableに割り当てるという方法をとる
final SelectionModel gsm=new SingleSelectionModel();
celtable.setSelectionModel(gsm);
もしも複数選択可能なタイプならばSingleSelectionModelではなく MultiSelectionModelを利用する。
final SelectionModel gsm=new MultiSelectionModel();
celtable.setSelectionModel(gsm);
その後、プログラム内で選択行にするには下記のような感じになる。
//giはCellTableに表示されたオブジェクトをさします。
gsm.setSelected(gi, true);

GWTで終了時にメッセージを出す

GWTで終了時(またはページ移動時)にメッセージを出す方法のサンプル たとえば、変更を保存する前に終了させてしまった場合にメッセージを出すような場合に 下記のように書く。
 Window.ClosingHandler  closingHandler = new Window.ClosingHandler(){
   @Override
   public void onWindowClosing(ClosingEvent event) {
     if (isModified()){
       event.setMessage("変更した内容が保存されていません。");
     }else{
       event.setMessage(null);
     }
           
   };
 };
Window.addWindowClosingHandler(closingHandler);

GWT Cell Tableで値を直接編集するときの扱い

GWT Cell Tableを用いたときEditTextCellを用いると
Cell上で直接編集できるようになる。
ここで編集した値をオブジェクトに更新を書けるためには、FieldUpdaterという仕組みを用いる必要がある。

サンプルとしては下記のように記述することになる


//CellTableにカラムを追加する。
Column col = new Column(new EditTextCell()) {
        @Override
        public String getValue(GridInfo object) {
                return object.getColValue();
        }
};
dataGrid.addColumn(col, "カラム");
//追加したカラムにFieldUpdaterを設定する。
col.setFieldUpdater(new FieldUpdater() {
        @Override
        public void update(int index, GridInfo object, String value) {
           object.setColValue(value);
        }
});
これでCellTableに対応するオブジェクトのGridInfoに値をセットすることができる。