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;
}
}