package org.jboss.verifier;
import org.jboss.logging.Logger;
import org.jboss.metadata.ApplicationMetaData;
import org.jboss.metadata.BeanMetaData;
import org.jboss.metadata.EntityMetaData;
import org.jboss.metadata.MessageDrivenMetaData;
import org.jboss.metadata.SessionMetaData;
import org.jboss.verifier.event.VerificationEvent;
import org.jboss.verifier.event.VerificationEventGeneratorSupport;
import org.jboss.verifier.event.VerificationListener;
import org.jboss.verifier.strategy.EJBVerifier11;
import org.jboss.verifier.strategy.EJBVerifier20;
import org.jboss.verifier.strategy.EJBVerifier21;
import org.jboss.verifier.strategy.VerificationContext;
import org.jboss.verifier.strategy.VerificationStrategy;
import java.net.URL;
import java.util.Iterator;
public class BeanVerifier implements VerificationContext
{
private ApplicationMetaData ejbMetaData;
private ClassLoader ejbClassLoader;
private URL ejbURL;
private VerificationStrategy verifier;
private boolean success = true;
private static Logger log = Logger.getLogger(BeanVerifier.class);
private VerificationEventGeneratorSupport events =
new VerificationEventGeneratorSupport();
public BeanVerifier()
{
}
public void verify(URL url, ApplicationMetaData metaData)
{
verify(url, metaData, null);
}
public void verify(URL url, ApplicationMetaData metaData, ClassLoader cl)
{
ejbURL = url;
ejbMetaData = metaData;
ejbClassLoader = cl;
if (metaData.isEJB1x())
{
setVerifier(VERSION_1_1);
}
else if (metaData.isEJB21())
{
setVerifier(VERSION_2_1);
}
else
{
setVerifier(VERSION_2_0);
}
Iterator beans = ejbMetaData.getEnterpriseBeans();
while (beans.hasNext())
{
BeanMetaData bean = (BeanMetaData)beans.next();
if (bean.isEntity())
{
EntityMetaData entityBean = (EntityMetaData)bean;
if (metaData.isEJB2x() && entityBean.isCMP1x())
{
boolean storedSuccess = success;
verifier.checkEntity(entityBean);
if (success != storedSuccess)
{
log.warn("The CMP 1.x EJB '" + entityBean.getEjbName() +
"' generated some verification warnings. The Deployer " +
"will ignore these warnings but you should check " +
"your EJB to be on the safe side of things.");
}
success = storedSuccess;
}
else
{
verifier.checkEntity(entityBean);
}
}
else if (bean.isSession())
{
verifier.checkSession((SessionMetaData)bean);
}
else
{
verifier.checkMessageBean((MessageDrivenMetaData)bean);
}
}
}
public boolean getSuccess()
{
return success;
}
public void addVerificationListener(VerificationListener listener)
{
events.addVerificationListener(listener);
}
public void removeVerificationListener(VerificationListener listener)
{
events.removeVerificationListener(listener);
}
public void fireBeanChecked(VerificationEvent event)
{
events.fireBeanChecked(event);
}
public void fireSpecViolation(VerificationEvent event)
{
success = false;
events.fireSpecViolation(event);
}
public ApplicationMetaData getApplicationMetaData()
{
return ejbMetaData;
}
public URL getJarLocation()
{
return ejbURL;
}
public ClassLoader getClassLoader()
{
return ejbClassLoader;
}
public String getEJBVersion()
{
return VERSION_1_1;
}
protected void setVerifier(String version)
{
if (VERSION_1_1.equals(version))
{
verifier = new EJBVerifier11(this);
}
else if (VERSION_2_0.equals(version))
{
verifier = new EJBVerifier20(this);
}
else if (VERSION_2_1.equals(version))
{
verifier = new EJBVerifier21(this);
}
else
{
throw new IllegalArgumentException(UNRECOGNIZED_VERSION +
": " + version);
}
}
protected VerificationStrategy getVerifier()
{
return verifier;
}
private final static String UNRECOGNIZED_VERSION =
"Unknown version string";
}