package org.mobicents.slee.container.component.validator; import java.lang.reflect.Constructor; import java.util.Collections; import java.util.HashSet; import java.util.Set; import javassist.Modifier; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.mobicents.slee.container.component.ComponentRepository; import org.mobicents.slee.container.component.ResourceAdaptorComponent; import org.mobicents.slee.container.component.deployment.jaxb.descriptors.ra.MConfigProperty; public class ResourceAdaptorValidator implements Validator { private ComponentRepository repository = null; private ResourceAdaptorComponent component = null; private Logger logger = Logger.getLogger(ResourceAdaptorValidator.class); private static final Set<String> _VALID_CONF_PROPERTIES; static { Set<String> tmp = new HashSet<String>(); // java.lang.Integer, java.lang.Long, // java.lang.Double, java.lang.Float, java.lang.Short, // java.lang.Byte, java.lang.Character, java.lang.Boolean, and // java.lang.String. tmp.add(java.lang.Integer.class.getName()); tmp.add(java.lang.Long.class.getName()); tmp.add(java.lang.Double.class.getName()); tmp.add(java.lang.Float.class.getName()); tmp.add(java.lang.Short.class.getName()); tmp.add(java.lang.Byte.class.getName()); tmp.add(java.lang.Character.class.getName()); tmp.add(java.lang.Boolean.class.getName()); tmp.add(java.lang.String.class.getName()); _VALID_CONF_PROPERTIES = Collections.unmodifiableSet(tmp); } public void setComponentRepository(ComponentRepository repository) { this.repository = repository; } public void setComponent(ResourceAdaptorComponent component) { this.component = component; } public boolean validate() { boolean valid = true; // Uf here we go try { if (!validateDescriptor()) { valid = false; return valid; } if (!validateResourceAdaptorClass()) { valid = false; } if (!validateUsageInterface()) { valid = false; } } catch (Exception e) { e.printStackTrace(); valid = false; } return valid; } boolean validateUsageInterface() { boolean passed = true; // String errorBuffer = new String(""); if (!this.component.isSlee11()) { return passed; } try { if (this.component.getDescriptor() .getResourceAdaptorUsageParametersInterface() != null) { return UsageInterfaceValidator .validateResourceAdaptorUsageParameterInterface(this.component); } } finally { // if (!passed) { // System.err.println(errorBuffer); // logger.error(errorBuffer); // } } return passed; } boolean validateDescriptor() { boolean passed = true; //String errorBuffer = new String(""); try { if(!validateConfigProperties()) { passed = false; } } finally { // if (!passed) { // System.err.println(errorBuffer); // logger.error(errorBuffer); // } } return passed; } boolean validateConfigProperties() { boolean passed = true; String errorBuffer = new String(""); if (!this.component.isSlee11()) return passed; try { Set<String> declaredConfigProperty = new HashSet<String>(); // Map<String, String> nameToType = new HashMap<String, String>(); for (MConfigProperty prop : this.component.getDescriptor() .getConfigProperties()) { if (prop.getConfigPropertyName() == null || prop.getConfigPropertyName().compareTo("") == 0) { passed = false; errorBuffer = appendToBuffer( "Resource adaptor descriptor declares config property with empty name.", "15.4.1", errorBuffer); continue; } else if (prop.getConfigPropertyType() == null || prop.getConfigPropertyType().compareTo("") == 0) { passed = false; errorBuffer = appendToBuffer( "Resource adaptor descriptor declares config property with empty type.", "15.4.1", errorBuffer); continue; } else if (declaredConfigProperty.contains(prop .getConfigPropertyName())) { passed = false; errorBuffer = appendToBuffer( "Resource adaptor descriptor declares config property more than once, name: " + prop.getConfigPropertyName(), "15.4.1", errorBuffer); } else { declaredConfigProperty.add(prop.getConfigPropertyName()); if(!_VALID_CONF_PROPERTIES.contains(prop.getConfigPropertyType())) { passed = false; errorBuffer = appendToBuffer( "Resource adaptor descriptor declares config property of wrong type, type: "+prop.getConfigPropertyType(), "15.4.1",errorBuffer); } } // confirm config properties can be built try { component.getDefaultConfigPropertiesInstance(); } catch (Throwable e) { passed = false; errorBuffer = appendToBuffer( "Resource adaptor descriptor config property validation passed but creation of ConfigProperties object failed:\n"+e.getStackTrace()+"\n", "15.4.1",errorBuffer); } } } finally { if (!passed) { if(logger.isEnabledFor(Level.ERROR)) logger.error(errorBuffer); } } return passed; } boolean validateResourceAdaptorClass() { boolean passed = true; String errorBuffer = new String(""); try { Class resourceAdaptorClass = this.component .getResourceAdaptorClass(); if(this.component.isSlee11() && resourceAdaptorClass.getPackage()==null) { passed = false; errorBuffer = appendToBuffer( "Resouce adaptor class must defined in package.", "15.6", errorBuffer); } // must implement javax.slee.resource.ResourceAdaptor if (ClassUtils.checkInterfaces(resourceAdaptorClass, "javax.slee.resource.ResourceAdaptor") == null) { passed = false; errorBuffer = appendToBuffer( "Resouce adaptor class must implement javax.slee.ResourceAdaptor.", "15.6", errorBuffer); } int modifiers = resourceAdaptorClass.getModifiers(); if (!Modifier.isPublic(modifiers)) { passed = false; errorBuffer = appendToBuffer( "Resouce adaptor class must be public.", "15.6", errorBuffer); } if (Modifier.isAbstract(modifiers)) { passed = false; errorBuffer = appendToBuffer( "Resouce adaptor class must not be abstract.", "15.6", errorBuffer); } if (Modifier.isFinal(modifiers)) { passed = false; errorBuffer = appendToBuffer( "Resouce adaptor class must not be final.", "15.6", errorBuffer); } try { Constructor c = resourceAdaptorClass.getConstructor(null); } catch (Exception e) { // e.printStackTrace(); passed = false; errorBuffer = appendToBuffer( "Resouce adaptor class must decalre public no arg constructor.", "15.6", errorBuffer); } } finally { if (!passed) { if(logger.isEnabledFor(Level.ERROR)) logger.error(errorBuffer); } } return passed; } // FIXME: add check for access? protected String appendToBuffer(String message, String section, String buffer) { buffer += (this.component.getDescriptor().getResourceAdaptorID() + " : violates section " + section + " of jSLEE 1.1 specification : " + message + "\n"); return buffer; } }