/*
 * 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.event;

/*
 * Class org.jboss.verifier.event.VerificationEvent
 * 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: VerificationEvent.java 81030 2008-11-14 12:59:42Z dimitris@jboss.org $
 */


// standard imports
import java.util.EventObject;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;


// non-standard class dependencies
import org.jboss.verifier.Section;


/**
 *
 * @author 	Juha Lindfors   (jplindfo@helsinki.fi)
 * @version $Revision: 81030 $
 * @since  	JDK 1.3
 */
public class VerificationEvent extends EventObject {

    public static final String WARNING  = "WARNING";
    public static final String OK       = "OK";

    private boolean isOk      = false;
    private boolean isWarning = false;

    /*
     * Contains a short, one line message for this event.
     */
    private String message  = "<undefined>";
    private String beanName = "<unnamed>";
    private Method method   = null;
    private String section  = null;
    private String info = null;

/*
 *************************************************************************
 *
 *      PUBLIC INSTANCE METHODS
 *
 *************************************************************************
 */

   /*
    * Constructor
    */
   public VerificationEvent( VerificationEventGenerator source )
   {
      super(source);
   }

   public VerificationEvent( VerificationEventGenerator source,
      String message)
   {
      this(source);
      setMessage(message);
   }

   public void setState(String state)
   {
      if( WARNING.equalsIgnoreCase(state) )
      {
         isWarning = true;
         isOk = false;
      }
      else if( OK.equalsIgnoreCase(state) )
      {
         isOk = true;
         isWarning = false;
      }
      else
      {
         throw new IllegalArgumentException( STATE_NOT_RECOGNIZED + ": "
            + state);
      }
   }

   public boolean isOk()
   {
      return isOk;
   }

   public boolean isWarning()
   {
      return isWarning;
   }

   public void setMessage( String msg )
   {
      this.message = msg;
   }

   public void setName( String name )
   {
      this.beanName = name;
   }

   public void setSection( Section section )
   {
      this.section = section.getSection();

      if( section.hasInfo() )
         this.info = section.getInfo();
   }

   public void setMethod(Method method)
   {
      if( method == null )
         return;

      this.method = method;
   }

   public String getMessage()
   {
      return beanName + ": " + message;
   }

   public String getVerbose()
   {
      StringBuffer buf = new StringBuffer(512);
      String linebreak = System.getProperty("line.separator");

      buf.append(linebreak + "Bean   : " + beanName + linebreak);

      if( method != null )
      {
         String returnType = getShortClassName( method.getReturnType() );

         Class[] arguments = method.getParameterTypes();
         String arglist = getCommaSeparatedList( getShortClassNames(
            arguments) );

         Class[] exceptions = method.getExceptionTypes();
         String  exclist = getCommaSeparatedList(getShortClassNames(
            exceptions) );

         buf.append( "Method : " + Modifier.toString(method.getModifiers()) +
            " " + returnType        + " " +
            method.getName()  + "(" +
            arglist           + ")");

         if ( exclist.length() > 0 )
            buf.append(" throws " + exclist.toString());

         buf.append(linebreak);
      }

      int offset = section.lastIndexOf(".");
      if ( !Character.isDigit(section.charAt(offset+1)) )
         buf.append("Section: " + section.substring(0, offset)  + linebreak);
      else
         buf.append("Section: " + section + linebreak);

      buf.append( "Warning: " );
      if( message != null )
      {
         buf.append( message + linebreak );
      }
      else
      {
         buf.append( "No warning message found, please file a Bug " +
            "report." );
      }

      if( info != null )
         buf.append("Info   : " + info + linebreak );

      return buf.toString();
   }

   public String getName()
   {
      return beanName;
   }

/*
 *************************************************************************
 *
 *      PRIVATE INSTANCE METHODS
 *
 *************************************************************************
 */
   private String[] getShortClassNames( Class[] c )
   {
      String[] names = new String[c.length];

      for (int i = 0; i < c.length; ++i)
         names[i] = getShortClassName( c[i] );

      return names;
   }

   /*
    * Returns class name without package path
    */
   private String getShortClassName( Class c )
   {
      String className = c.getName();
      int len = className.length();
      int offset = className.lastIndexOf( "." );

      String name = "";

      if (offset == -1)
         name = className;
      else
         name = className.substring(offset+1, len);

      return name;
   }

   /*
    * builds a comma separated string list of objects
    */
   private String getCommaSeparatedList( Object[] list )
   {
      if (list == null || list.length <= 0)
         return "";

      if (list.length == 1)
         return list[0].toString();

      StringBuffer buf = new StringBuffer( 256 );
      buf.append( list[0] );

      for (int i = 1; i < list.length; ++i)
      {
         buf.append( ", " );
         buf.append( list[i] );
      }

      return buf.toString();
   }

    /*
     * String constants
     */
   private final static String STATE_NOT_RECOGNIZED = "Unknown event state";
}
/*
vim:ts=3:sw=3:et
*/
