ラップする方法を見直す

今まで、org.apache.commons.net.ftp.FTPClient を使用する処理をラップして提供するものを書いていた。
しかしそうすると、FTPClient の操作を呼び出し側では固定の認識になってしまい、与えられたFTP操作しかできない。
そこで、メソッド名、引数の配置を自由にした任意のメソッドの中で
インジェクトされるFTPClientを使用する方法の方が良いとおもった。
つまり、

  // インジェクトされるFTPClient
   @FTPClientDefine private FTPClient ftpClient;

  // アノテーションメソッドの形式を任意の形式を保たせる
   @FtpMethod
   public void execFTP(String a,@FtpHost String host
                      ,@FtpUser tpUser String user, @FtpPasswd String passwd){
          :
      // this.ftpclient でFTP操作を実行→任意のコード
   }
このようなことを、Google guice + AOP で実現させる。

まずは、このインターセプタMatcher が必要であろう。

import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import com.google.inject.matcher.AbstractMatcher;
import com.google.inject.matcher.Matcher;
/**
 * FTP実行インターセプタMatcher.
 */
public final class FtpInterceptMatcher{
   private FtpInterceptMatcher(){}
   /**
    * Matcherを取得
    * @param annotationType FtpMethodを指定
    * @return FtpMethodアノテーションが付いていれば、true
    */
   public static Matcher<AnnotatedElement> annotatedWith(final Class<? extends Annotation> annotationType){
      return new AbstractMatcher<AnnotatedElement>(){
         public boolean matches(AnnotatedElement element) {
            Annotation annotation = element.getAnnotation(annotationType);
            if (annotation==null){
               return false;
            }
            return annotation.annotationType().equals(FtpMethod.class);
         }
         @Override
         public String toString() {
            return "annotatedWith("+annotationType.getSimpleName()+".class"+")";
         }
      };
   }
}
続きはこの次...