/**
 * JHOVE2 - Next-generation architecture for format-aware characterization
 *
 * Copyright (c) 2009 by The Regents of the University of California,
 * Ithaka Harbors, Inc., and The Board of Trustees of the Leland Stanford
 * Junior University.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * o Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 *
 * o Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer in the documentation
 *   and/or other materials provided with the distribution.
 *
 * o Neither the name of the University of California/California Digital
 *   Library, Ithaka Harbors/Portico, or Stanford University, nor the names of
 *   its contributors may be used to endorse or promote products derived from
 *   this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

package org.jhove2.app;

import java.util.List;
import java.util.Set;

import org.jhove2.core.Reportable;
import org.jhove2.core.info.ReportableInfo;
import org.jhove2.core.info.ReportablePropertyInfo;
import org.jhove2.core.info.ReportableSourceInfo;

/**
 * JHOVE2 {@link org.jhove2.core.Reportable} documentation utility. The
 * properties of the reportable (name, identifier, properties, messages) are
 * determined by reflection of the class.
 * 
 * @author mstrong, slabrams
 */
public class JHOVE2Doc {
	/**
	 * Main entry for JHOVE2 reportable documentation utility.
	 * 
	 * @param args
	 *            Command line arguments: package-qualified reportable class names
	 */
	public static void main(String[] args) {
		if (args.length < 1) {
			System.out.println("usage: " + JHOVE2Doc.class.getName()
					+ " reportable ...");
			System.exit(1);
		}

		try {
			int n = 0;
			for (String arg : args) {
				Class<? extends Reportable> cl =
					(Class<? extends Reportable>) Class.forName(arg);
				
				ReportableInfo info = new ReportableInfo(cl.newInstance());

				if (n > 0) {
					System.out.println();
				}
				System.out.println("Reportable: Name: " + info.getName());
				System.out.println("            Identifier: "
						+ info.getIdentifier());
				System.out.println("            Package: " + info.getPackage());

				List<ReportableSourceInfo> prop2 = info.getProperties();
				for (ReportableSourceInfo source : prop2) {
					System.out.println(" From: " + source.getSource() + " "
							+ source.getName());
					Set<ReportablePropertyInfo> props = source.getProperties();
					for (ReportablePropertyInfo prop : props) {
						String name = prop.getMethod().getName();
						int in = name.indexOf("get");
						if (in == 0) {
							name = name.substring(3);
						}

						String collection = null;
						String type = prop.getGenericType().toString();
						in = type.lastIndexOf('<');
						if (in > 0) {
							collection = type.substring(0, in);
							type = type.substring(in + 1, type.indexOf('>'));
							in = collection.lastIndexOf('.');
							if (in > 0) {
								collection = collection.substring(in + 1);
							}
						}
						in = type.lastIndexOf('.');
						if (in > 0) {
							type = type.substring(in + 1);
						}

						String description = prop.getDescription();
						String reference = prop.getReference();

						String label = "Property";
						if (type.equals("Message")) {
							label = " Message";
						}
						System.out.println("  " + label + ": Name: " + name);
						System.out.println("            Identifier: "
								+ prop.getIdentifier());
						if (collection == null) {
							System.out.println("            Type: " + type);
						} else {
							System.out.println("            Type: "
									+ collection + "<" + type + ">");
						}
						if (description != null) {
							System.out.println("            Description: "
									+ description);
						}
						if (reference != null) {
							System.out.println("            Reference: "
									+ reference);
						}
					}
				}
				n++;
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		  catch (IllegalAccessException e){
			e.printStackTrace();
		}
		  catch (InstantiationException e){
			e.printStackTrace();
		}
	}
}

@@ -2002,25 +2002,108 @@
 e2.core.
-Reportabl
+JHOVE2Exception;%0D%0Aimport org.jhove2.core.Reportable;%0D%0Aimport org.jhove2.core.config.Configur
 e;%0D%0Aimpo
@@ -2840,16 +2840,24 @@
 portable
+BeanName
  ...%22);%0D
@@ -2857,16 +2857,16 @@
 ...%22);%0D%0A
-
 %09%09%09Syste
@@ -2934,24 +2934,26 @@
  : args) %7B%0D%0A
+//
 %09%09%09%09Class%3C? 
@@ -2978,16 +2978,18 @@
 %3E cl =%0D%0A
+//
 %09%09%09%09%09(Cl
@@ -3040,16 +3040,94 @@
 );%0D%0A%09%09%09%09
+Reportable reportable = Configure.getReportable(Reportable.class,%0D%0A%09%09%09%09%09%09arg);
 %0D%0A%09%09%09%09Re
@@ -3169,24 +3169,18 @@
 nfo(
-cl.newInstance()
+reportable
 );%0D%0A
@@ -5255,167 +5255,25 @@
 %09%09%7D 
-catch (ClassNotFoundException e) %7B%0D%0A%09%09%09e.printStackTrace();%0D%0A%09%09%7D%0D%0A%09%09  catch (IllegalAccessException e)%7B%0D%0A%09%09%09e.printStackTrace();%0D%0A%09%09%7D%0D%0A%09%09  catch (Instantiation
+%0D%0A%09%09catch (JHOVE2
 Exce

modify to accept bean name instead of class name for reportable