MethodInfo.java

  1. package com.gh.mygreen.xlsmapper.xml.bind;

  2. import java.io.Serializable;
  3. import java.util.ArrayList;
  4. import java.util.List;

  5. import javax.xml.bind.annotation.XmlAttribute;
  6. import javax.xml.bind.annotation.XmlElement;

  7. import com.gh.mygreen.xlsmapper.util.ArgUtils;
  8. import com.gh.mygreen.xlsmapper.util.Utils;


  9. /**
  10.  * XMLのメソッド情報を保持するクラス。
  11.  * @version 1.4.1
  12.  * @since 1.0
  13.  * @author T.TSUCHIE
  14.  *
  15.  */
  16. public class MethodInfo implements Serializable {
  17.    
  18.     /** serialVersionUID */
  19.     private static final long serialVersionUID = 1L;
  20.    
  21.     private String methodName;
  22.    
  23.     private boolean override;
  24.    
  25.     private List<AnnotationInfo> annotationInfos = new ArrayList<>();
  26.    
  27.     /**
  28.      * ビルダクラスのインスタンスを取得する。
  29.      * @since 1.1
  30.      * @return
  31.      */
  32.     public static Builder builder() {
  33.         return new Builder();
  34.     }
  35.    
  36.     public MethodInfo() {
  37.        
  38.     }
  39.    
  40.     private MethodInfo(final Builder builder) {
  41.        
  42.         this.methodName = builder.methodName;
  43.         this.override = builder.override;
  44.         setAnnotationInfos(builder.annotationInfos);
  45.        
  46.     }
  47.    
  48.     @Override
  49.     public String toString() {
  50.         StringBuilder sb = new StringBuilder();
  51.         sb.append("MethodInfo")
  52.             .append(String.format(" [name=%s]", getMethodName()))
  53.             .append(String.format(" [override=%b]", isOverride()));
  54.        
  55.         for(AnnotationInfo anno : annotationInfos) {
  56.             sb.append("  ").append(anno.toString());
  57.         }
  58.        
  59.         return sb.toString();
  60.     }
  61.    
  62.     /**
  63.      * メソッド名を取得する
  64.      * @return メソッド名
  65.      */
  66.     public String getMethodName() {
  67.         return methodName;
  68.     }
  69.    
  70.     /**
  71.      * メソッド名を設定する
  72.      * @param methodName メソッド名
  73.      * @throws IllegalArgumentException methodName is empty.
  74.      */
  75.     @XmlAttribute(name="name", required=true)
  76.     public void setMethodName(final String methodName) {
  77.         ArgUtils.notEmpty(methodName, methodName);
  78.         this.methodName = methodName;
  79.     }
  80.    
  81.     /**
  82.      * 既存のメソッドの定義にあるアノテーションの設定をXMLの定義で上書きするかどうか。
  83.      * <p>ただし、XMLに定義していないアノテーションは、既存のメソッドに定義にあるものを使用する。</p>
  84.      * @since 1.0
  85.      * @return true:XMLの定義で上書きする。
  86.      */
  87.     public boolean isOverride() {
  88.         return override;
  89.     }
  90.    
  91.     /**
  92.      * 既存のメソッドの定義にあるアノテーションの設定をXMLの定義で上書きするかどうか設定する。
  93.      * <p>ただし、XMLに定義していないアノテーションは、既存のメソッドに定義にあるものを使用する。</p>
  94.      * @since 1.0
  95.      * @param override true:XMLの定義で上書きする。
  96.      */
  97.     @XmlAttribute(name="override", required=false)
  98.     public void setOverride(final boolean override) {
  99.         this.override = override;
  100.     }
  101.    
  102.     /**
  103.      * アノテーション情報を追加する。
  104.      * <p>ただし、既に同じアノテーションが存在する場合は、それと入れ替えされます。</p>
  105.      * @param annotationInfo アノテーション情報。
  106.      * @throws IllegalArgumentException annotationInfo is null.
  107.      */
  108.     public void addAnnotationInfo(final AnnotationInfo annotationInfo) {
  109.         ArgUtils.notNull(annotationInfo, "annotationInfo");
  110.        
  111.         removeAnnotationInfo(annotationInfo.getClassName());
  112.         this.annotationInfos.add(annotationInfo);
  113.     }
  114.    
  115.     /**
  116.      * アノテーションのクラス名を指定してアノテーション情報を取得する。
  117.      * @param annotationClassName アノテーションのクラス名(FQCN)。
  118.      * @return 指定したクラスが存在しない場合は、nullを返す。
  119.      */
  120.     public AnnotationInfo getAnnotationInfo(final String annotationClassName) {
  121.         for(AnnotationInfo item : annotationInfos) {
  122.             if(item.getClassName().equals(annotationClassName)) {
  123.                 return item;
  124.             }
  125.         }
  126.        
  127.         return null;
  128.     }
  129.    
  130.     /**
  131.      * 指定したアノテーション情報を含むかどうか。
  132.      * @since 1.1
  133.      * @param annotationClassName アノテーションのクラス名(FQCN)。
  134.      * @return true:指定したクラスが存在する場合。
  135.      */
  136.     public boolean containsAnnotationInfo(final String annotationClassName) {
  137.         return getAnnotationInfo(annotationClassName) != null;
  138.     }
  139.    
  140.     /**
  141.      * 指定したアノテーション情報を削除します。
  142.      * @since 1.4.1
  143.      * @param annotationClassName アノテーションのクラス名(FQCN)。
  144.      * @return true:指定したアノテーション名を含み、それが削除できた場合。
  145.      */
  146.     public boolean removeAnnotationInfo(final String annotationClassName) {
  147.        
  148.         final AnnotationInfo existInfo = getAnnotationInfo(annotationClassName);
  149.         if(existInfo != null) {
  150.             this.annotationInfos.remove(existInfo);
  151.             return true;
  152.         }
  153.        
  154.         return false;
  155.        
  156.     }
  157.    
  158.     /**
  159.      * JAXB用のアノテーション情報を設定するメソッド。
  160.      * <p>XMLの読み込み時に呼ばれます。
  161.      *  <br>ただし、Java8からはこのメソッドは呼ばれず、{@link #getAnnotationInfos()} で取得したインスタンスに対して要素が追加されます。
  162.      * </p>
  163.      * <p>既存の情報はクリアされます。</p>
  164.      * @since 1.1
  165.      * @param annotationInfos アノテーション情報。
  166.      */
  167.     @XmlElement(name="annotation")
  168.     public void setAnnotationInfos(final List<AnnotationInfo> annotationInfos) {
  169.         if(annotationInfos == this.annotationInfos) {
  170.             // Java7の場合、getterで取得したインスタンスをそのまま設定するため、スキップする。
  171.             return;
  172.         }
  173.        
  174.         this.annotationInfos.clear();
  175.         for(AnnotationInfo item : annotationInfos) {
  176.             addAnnotationInfo(item);
  177.         }
  178.     }
  179.    
  180.     /**
  181.      * JAXB用のアノテーション情報を全て取得するメソッド。
  182.      * <p>XMLの書き込み時に呼ばれます。
  183.      *  <br>Java8から読み込み時に呼ばれるようになり、取得したインスタンスに対して、読み込んだ要素が呼ばれます。
  184.      * </p>
  185.      * @since 1.1
  186.      * @return アノテーション情報。
  187.      */
  188.     public List<AnnotationInfo> getAnnotationInfos() {
  189.         return this.annotationInfos;
  190.     }
  191.    
  192.     /**
  193.      * {@link MethodInfo}を組み立てるためのクラス。
  194.      *
  195.      */
  196.     public static final class Builder {
  197.        
  198.         private String methodName;
  199.        
  200.         private boolean override;
  201.        
  202.         private List<AnnotationInfo> annotationInfos;
  203.        
  204.         private Builder() {
  205.             this.annotationInfos = new ArrayList<>();
  206.         }
  207.        
  208.         /**
  209.          * 組み立てた{@link MethodInfo}のインスタンスを取得する。
  210.          * @return
  211.          */
  212.         public MethodInfo buildMethod() {
  213.            
  214.             if(Utils.isEmpty(methodName)) {
  215.                 throw new IllegalStateException("method name is required.");
  216.             }
  217.            
  218.             return new MethodInfo(this);
  219.            
  220.         }
  221.        
  222.         /**
  223.          * メソッド名を設定する。
  224.          * @param methodName メソッド名
  225.          * @return
  226.          * @throws IllegalArgumentException methodName is empty.
  227.          */
  228.         public Builder name(final String methodName) {
  229.             ArgUtils.notEmpty(methodName, "methodName");
  230.             this.methodName = methodName;
  231.             return this;
  232.         }
  233.        
  234.         /**
  235.          * 既存のメソッドに定義にあるアノテーションの設定をXMLの定義で上書きするかどうか設定する。
  236.          * @param override true:XMLの定義で上書きする。
  237.          * @return
  238.          */
  239.         public Builder override(final boolean override) {
  240.             this.override = override;
  241.             return this;
  242.         }
  243.        
  244.         /**
  245.          * メソッドに対するアノテーション情報を追加する。
  246.          * @param annotationInfo
  247.          * @return
  248.          * @throws IllegalArgumentException annotationInfo is null.
  249.          */
  250.         public Builder annotation(final AnnotationInfo annotationInfo) {
  251.             ArgUtils.notNull(annotationInfo, "annotationInfo");
  252.             this.annotationInfos.add(annotationInfo);
  253.             return this;
  254.         }
  255.        
  256.     }
  257. }