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}