/*
* JBoss, Home of Professional Open Source.
* Copyright 2008, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.verifier;
/*
* Class org.jboss.verifier.BeanVerifier
* Copyright (C) 2000 Juha Lindfors
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* This package and its source code is available at www.jboss.org
* $Id: BeanVerifier.java 81030 2008-11-14 12:59:42Z dimitris@jboss.org $
*/
// standard imports
import java.util.Iterator;
import java.net.URL;
// non-standard class dependencies
import org.jboss.verifier.strategy.EJBVerifier21;
import org.jboss.verifier.strategy.VerificationContext;
import org.jboss.verifier.strategy.VerificationStrategy;
import org.jboss.verifier.strategy.EJBVerifier11;
import org.jboss.verifier.strategy.EJBVerifier20;
import org.jboss.verifier.event.VerificationEvent;
import org.jboss.verifier.event.VerificationListener;
import org.jboss.verifier.event.VerificationEventGeneratorSupport;
import org.jboss.metadata.ApplicationMetaData;
import org.jboss.metadata.BeanMetaData;
import org.jboss.metadata.EntityMetaData;
import org.jboss.metadata.SessionMetaData;
import org.jboss.metadata.MessageDrivenMetaData;
import org.jboss.logging.Logger;
/**
* Attempts to verify the spec compliance of the beans in a given
* EJB-JAR file. Works against EJB spec 1.1 and 2.0. Built for use in
* JBoss project.
*
* @see org.jboss.verifier.strategy.VerificationStrategy
* @see org.jboss.verifier.factory.VerificationEventFactory
*
* @author <a href="mailto:juha.lindfors@jboss.org">Juha Lindfors</a>
* @version $Revision: 81030 $
* @since JDK 1.3
*/
public class BeanVerifier
implements VerificationContext
{
private ApplicationMetaData ejbMetaData = null;
private URL ejbURL = null;
private ClassLoader ejbClassLoader = null;
private VerificationStrategy verifier = null;
private boolean success = true;
private static Logger log = Logger.getLogger( BeanVerifier.class );
/*
* Support class which handles the event notification logic.
*/
private VerificationEventGeneratorSupport events =
new VerificationEventGeneratorSupport();
/**
* Default constructor.
*/
public BeanVerifier()
{}
/**
* Checks the Enterprise Java Beans found in this Jar for EJB spec
* compliance (EJB Spec. 1.1). Ensures that the given interfaces
* and implementation classes implement required methods and follow
* the contract given in the spec.
*
* @param url URL to the bean jar file
*/
public void verify(URL url, ApplicationMetaData metaData)
{
verify(url, metaData, null);
}
/**
* Checks the Enterprise Java Beans found in this Jar for EJB spec
* compliance (EJB Spec. 1.1). Ensures that the given interfaces
* and implementation classes implement required methods and follow
* the contract given in the spec.
*
* @param url URL to the bean jar file
* @param cl The ClassLoader to use
*/
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() )
{
// Hook for verifying CMP 1.x Beans in a 2.x JAR: store
// current state and restore this state after verification
// of the EJB completes.
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 );
}
}
}
/**
* Check if the Verifier was successful
*
* @return <code>true</code> if all Beans have been verified,
* <code>false</code> otherwise.
*/
public boolean getSuccess()
{
return success;
}
/*
*************************************************************************
*
* IMPLEMENTS VERIFICATION EVENT GENERATOR INTERFACE
*
*************************************************************************
*/
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 )
{
// A Spec Violation has been found. Mark as unsuccessful.
success = false;
events.fireSpecViolation(event);
}
/*
**************************************************************************
*
* IMPLEMENTS VERIFICATION CONTEXT INTERFACE
*
**************************************************************************
*/
public ApplicationMetaData getApplicationMetaData()
{
return ejbMetaData;
}
public URL getJarLocation()
{
return ejbURL;
}
public ClassLoader getClassLoader()
{
return ejbClassLoader;
}
public String getEJBVersion()
{
return VERSION_1_1;
// [TODO] fix this to return a correct version
}
/*
* Will set the correct strategy implementation according to the supplied
* version information. Might widen the scope to public, but protected
* will do for now.
*/
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);
}
}
/*
* accessor for reference to the verification strategy in use
*/
protected VerificationStrategy getVerifier()
{
return verifier;
}
/*
* String constants
*/
private final static String UNRECOGNIZED_VERSION =
"Unknown version string";
}
/*
vim:ts=3:sw=3:et
*/