001package io.ebean.enhance.querybean;
002
003import java.util.Arrays;
004
005/**
006 * Detects if a class is a query bean.
007 * <p>
008 * Used by enhancement to detect when GETFIELD access on query beans should be replaced by
009 * appropriate method calls.
010 * </p>
011 */
012public class DetectQueryBean {
013
014  private final String[] entityPackages;
015
016  DetectQueryBean(String[] entityPackages) {
017    this.entityPackages = entityPackages;
018  }
019
020  public String toString() {
021    return Arrays.toString(entityPackages);
022  }
023
024  /**
025   * Return true if there are no known packages.
026   */
027  public boolean isEmpty() {
028    return entityPackages.length == 0;
029  }
030
031  /**
032   * Return the packages that entity beans are expected.
033   * Query beans are expected to be in a query sub-package.
034   */
035  String[] getEntityPackages() {
036    return entityPackages;
037  }
038
039  /**
040   * Return true if this class is a query bean using naming conventions for query beans.
041   */
042  public boolean isQueryBean(String owner) {
043
044    int subPackagePos = owner.lastIndexOf("/query/");
045    if (subPackagePos > -1) {
046      String suffix = owner.substring(subPackagePos);
047      if (isQueryBeanSuffix(suffix)) {
048        String domainPackage = owner.substring(0, subPackagePos + 1);
049        return isQueryBeanPackage(domainPackage);
050      }
051    }
052    return false;
053  }
054
055  /**
056   * Check that the class is in an expected package (sub package of a package containing entity beans).
057   */
058  private boolean isQueryBeanPackage(String domainPackage) {
059    for (String aPackage : entityPackages) {
060      if (domainPackage.startsWith(aPackage)) {
061        return true;
062      }
063    }
064    return false;
065  }
066
067  /**
068   * Check that the class follows query bean naming convention.
069   */
070  private boolean isQueryBeanSuffix(String suffix) {
071    return (suffix.startsWith("/query/Q") || suffix.startsWith("/query/assoc/Q"));
072  }
073}