001 // Copyright 2006-2007 Daniel Gredler 002 // 003 // Licensed under the Apache License, Version 2.0 (the "License"); 004 // you may not use this file except in compliance with the License. 005 // You may obtain a copy of the License at 006 // 007 // http://www.apache.org/licenses/LICENSE-2.0 008 // 009 // Unless required by applicable law or agreed to in writing, software 010 // distributed under the License is distributed on an "AS IS" BASIS, 011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 012 // See the License for the specific language governing permissions and 013 // limitations under the License. 014 015 package net.sf.beanform.integration; 016 017 import java.util.ArrayList; 018 import java.util.Collections; 019 import java.util.HashMap; 020 import java.util.Iterator; 021 import java.util.List; 022 import java.util.Map; 023 024 import org.apache.commons.logging.Log; 025 import org.apache.commons.logging.LogFactory; 026 027 import net.sf.beanform.prop.BeanProperty; 028 029 /** 030 * Represents a chain of integration elements, the makeup of which will vary according to 031 * the execution environment. 032 * 033 * Note: If <a href="http://jcp.org/en/jsr/detail?id=303">JSR 303: Bean Validation</a> ever 034 * gets added to Java SE, add it to the integration chain. 035 * 036 * @author Daniel Gredler 037 */ 038 public final class IntegratorChain { 039 040 private final static Log LOG = LogFactory.getLog( IntegratorChain.class ); 041 private final static List<Integrator> INTEGRATORS; 042 043 static { 044 // Important note: The methods below are coded such that in the case of 045 // conflicting contributions, the last of the contributions is used. 046 List<Integrator> list = new ArrayList<Integrator>(); 047 if( isSupported( "Hibernate", "org.hibernate.validator.Max" ) ) { 048 list.add( new HibernateIntegrator() ); 049 } 050 if( isSupported( "EJB3", "javax.persistence.Column" ) ) { 051 list.add( new Ejb3Integrator() ); 052 } 053 INTEGRATORS = Collections.unmodifiableList( list ); 054 } 055 056 static boolean isSupported( String featureName, String className ) { 057 Class c; 058 try { 059 c = Class.forName( className ); 060 } 061 catch( ClassNotFoundException e ) { 062 c = null; 063 } 064 catch( NoClassDefFoundError e ) { 065 c = null; 066 } 067 boolean supported = ( c != null ); 068 if( supported ) LOG.debug( featureName + " support detected." ); 069 return supported; 070 } 071 072 IntegratorChain() { 073 // Empty. 074 } 075 076 public static String getValidation( BeanProperty prop ) { 077 Map<String, String> validations = new HashMap<String, String>(); 078 for( Integrator integrator : INTEGRATORS ) { 079 Map<String, String> temp = integrator.getValidation( prop ); 080 validations.putAll( temp ); 081 } 082 StringBuilder sb = new StringBuilder(); 083 for( Iterator<String> i = validations.values().iterator(); i.hasNext(); ) { 084 sb.append( i.next() ); 085 if( i.hasNext() ) sb.append( "," ); 086 } 087 if( sb.length() == 0 ) return null; 088 else return sb.toString(); 089 } 090 091 public static Integer getMaxLength( BeanProperty prop ) { 092 Integer maxLength = null; 093 for( Integrator integrator : INTEGRATORS ) { 094 Integer temp = integrator.getMaxLength( prop ); 095 if( temp != null ) maxLength = temp; 096 } 097 return maxLength; 098 } 099 100 public static boolean isNullable( BeanProperty prop ) { 101 boolean nullable = true; 102 for( Integrator integrator : INTEGRATORS ) { 103 boolean temp = integrator.isNullable( prop ); 104 nullable = nullable && temp; 105 } 106 return nullable; 107 } 108 109 }