/*
 * Copyright 2002 Sun Microsystems, Inc. All rights reserved.
 * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

/*
 * @(#)RuntimeInfo.java	1.3 02/01/12
 */
 
package com.sun.cts.implementation.sun;

import java.util.*;
import java.io.*;
import java.net.*;
import javasoft.sqe.javatest.*;
import com.sun.cts.util.*;
import com.sun.cts.porting.*;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class RuntimeInfo
{

    public String getRuntimeInfo(DeploymentInfo info) {
       StringBuffer result = new StringBuffer("*****************\n");
       result.append(describeRuntimeInfo(info));
       return(result.toString());
    }

    /**
     * Reads the given runtime xml files and describes the runtime information
     * that needs to be set in plain English.
     *
     * @param runtimeFiles An array of runtime files that need to be 
     *     processed.
     * @return The English description (may contain newlines)
     */
    private String describeRuntimeInfo( DeploymentInfo info ) {
        String runtimeInfo = 
	    "You must use the following information " +
	    "to deploy the application:\n\n";

	// Display web resource information:
	Vector webResources = info.getWebResources();
	if( webResources.size() > 0 ) {
	    runtimeInfo += "Web resource information:\n";
	    runtimeInfo += "-------------------------\n";
	    runtimeInfo += describeWebResources( webResources );
	    runtimeInfo += "\n";
	}

	// Display ejb resource information:
	Vector vEjbJars = info.getEjbJars();
	for(int ii = 0; ii < vEjbJars.size(); ii++)
	{
		DeploymentInfo.EJBJar ejbJar = (DeploymentInfo.EJBJar)vEjbJars.elementAt(ii);
		
		//display ejbjar information
		runtimeInfo += "Ejb jar information:\n";
		runtimeInfo += "-------------------------------------\n";
		runtimeInfo += "  name: \t" + ejbJar.name + "\n";
		runtimeInfo += "  moduleName: \t" + ejbJar.moduleName + "\n";
		runtimeInfo += "  uniqueID: \t" + ejbJar.uniqueID + "\n";
		runtimeInfo += "  cmpResJndiName: \t" + ejbJar.cmpResJndiName + "\n";
		runtimeInfo += "  cmpDefResName: \t" + ejbJar.cmpDefResName + "\n";
		runtimeInfo += "  cmpDefResPassword: \t" + ejbJar.cmpDefResPassword + "\n";
		
		runtimeInfo += "  finderTableBaseName: \t" + ejbJar.finderTableBaseName + "\n";
		
		runtimeInfo += "Join information:\n";
		runtimeInfo += "-------------------------\n";
			
	    for(int jj = 0; jj < ejbJar.joins.size(); jj++ ) {
		DeploymentInfo.JoinObject join = 
		    (DeploymentInfo.JoinObject)ejbJar.joins.elementAt( jj );
		runtimeInfo += join.toString() + "\n";
	    }
		    
		Vector ejbResources = ejbJar.getEjbResources();
		if( ejbResources.size() > 0 ) {
		    runtimeInfo += "Ejb resource information:\n";
		    runtimeInfo += "-------------------------\n";
		    runtimeInfo += describeEjbResources( ejbResources );
		    runtimeInfo += "\n";
		}
	}
		
	// Display app-client resource information:
	Vector appResources = info.getAppClientResources();
	if( appResources.size() > 0 ) {
	    runtimeInfo += "App-Client resource information:\n";
	    runtimeInfo += "-------------------------\n";
	    runtimeInfo += describeAppClientResources( appResources );
	    runtimeInfo += "\n";
	}

	return runtimeInfo;
    }

    /**
     * Describes all web resource information for this application
     */
    private String describeWebResources( Vector webResources ) {
	String info = "";
	int i, j;

	// Describe each web resource:
	for( i = 0; i < webResources.size(); i++ ) {
	    DeploymentInfo.WebResource webResource = 
		(DeploymentInfo.WebResource)webResources.elementAt( i );
	    info += "  * Web Resource: \t" + webResource.name + "\n";
	    info += "    + Context Root: \t" + webResource.contextRoot + "\n";

	    // Describe each servlet:
	    Vector servlets = webResource.servlets;
	    if( servlets.size() > 0 ) {
	        info += "    + Servlets:\n";
	        for( j = 0; j < servlets.size(); j++ ) {
		    DeploymentInfo.Servlet servlet = 
		        (DeploymentInfo.Servlet)
			servlets.elementAt( j );
		    info += describeServlet( servlet );
	        }
            }
			
		// Describe each resource reference:
	    Vector resources = webResource.resources;
	    if( resources.size() > 0 ) {
	        info += "    + Resource References:\n";
	        for( j = 0; j < resources.size(); j++ ) {
		    DeploymentInfo.ResourceReference ref = 
		        (DeploymentInfo.ResourceReference)
			resources.elementAt( j );
		    info += describeResourceReference( ref );
	        }
            }

	    // Describe each EJB reference:
	    Vector ejbrefs = webResource.ejbs;
	    if( ejbrefs.size() > 0 ) {
	        info += "    + EJB References:\n";
		for( j = 0; j < ejbrefs.size(); j++ ) {
		    DeploymentInfo.EjbReference ref = 
			(DeploymentInfo.EjbReference)ejbrefs.elementAt( j );
		    info += describeEjbReference( ref );
		}
	    }
	}

	return info;
    }

    /**
     * Describes a single ejb reference
     */
    private String describeEjbReference( 
	DeploymentInfo.EjbReference ref ) 
    {
	String info = "";

	info += "      - Ejb Reference Name: \t" + ref.name + "\n";
	info += "        . JNDI Name: \t" + ref.jndi + "\n";

	return info;
    }

	/**
     * Describes a single servlet
     */
    private String describeServlet( 
	DeploymentInfo.Servlet servlet ) 
    {
	String info = "";

	info += "      - Servlet Name: \t" + servlet.name + "\n";
	info += "        . Principal: \t" + servlet.principal + "\n";

	return info;
    }

    /**
     * Describes a single resource reference
     */
    private String describeResourceReference( 
	DeploymentInfo.ResourceReference ref ) 
    {
	String info = "";

	info += "      - Resource Reference Name: \t" + ref.name + "\n";
	info += "        . JNDI Name: \t" + ref.jndi + "\n";

	if( (ref.resourcePrincipalName != null) ||
	    (ref.resourcePrincipalPassword != null) ) 
	{
	    info += "        . Resource Principal Name: \t" + 
		ref.resourcePrincipalName + "\n";
	    info += "        . Resource Principal Password: \t" + 
		ref.resourcePrincipalPassword + "\n";
	}

	if( (ref.mailName != null) || (ref.mailFrom != null) || 
	    (ref.mailHost != null) ) 
	{
	    info += "        . Mail Name: \t" + ref.mailName + "\n";
	    info += "        . Mail From: \t" + ref.mailFrom + "\n";
	    info += "        . Mail Host: \t" + ref.mailHost + "\n";
	}

	return info;
    }

	
	/**
     * Describes all app-client resource information for this application
     */
    private String describeAppClientResources( Vector appResources ) {
	String info = "";
	int i, j;

	// Describe each ejb resource:
	for( i = 0; i < appResources.size(); i++ ) {
	    DeploymentInfo.AppClient appResource = 
		(DeploymentInfo.AppClient)appResources.elementAt( i );
	    info += "  * App-Client Resource: \t" + appResource.name + "\n";

	    // Describe each resource reference:
	    Vector resources = appResource.resources;
	    if( resources.size() > 0 ) {
	        info += "    + Resource References:\n";
		for( j = 0; j < resources.size(); j++ ) {
		    DeploymentInfo.ResourceReference ref = 
			(DeploymentInfo.ResourceReference)
			resources.elementAt( j );
		    info += describeResourceReference( ref );
		}
            }

		// Describe each env-reference:
	    Vector envRefs = appResource.envReferences;
	    if( envRefs.size() > 0 ) {
	        info += "    + Resource Env-References:\n";
		for( j = 0; j < envRefs.size(); j++ ) {
		    DeploymentInfo.ResourceEnvReference ref = 
			(DeploymentInfo.ResourceEnvReference)
			envRefs.elementAt( j );
		    info += "    + Name: \t" + ref.name + "\n";
			info += "    + JNDI Name: \t" + ref.jndiName + "\n";
		}
            }
			
	    // Describe each EJB reference:
	    Vector ejbrefs = appResource.ejbs;
	    if( ejbrefs.size() > 0 ) {
	        info += "    + EJB References:\n";
		for( j = 0; j < ejbrefs.size(); j++ ) {
		    DeploymentInfo.EjbReference ref = 
			(DeploymentInfo.EjbReference)ejbrefs.elementAt( j );
		    info += describeEjbReference( ref );
		}
            }
	}

	return info;
    }
	
    /**
     * Describes all ejb resource information for this application
     */
    private String describeEjbResources( Vector ejbResources ) {
	String info = "";
	int i, j;

	// Describe each ejb resource:
	for( i = 0; i < ejbResources.size(); i++ ) {
	    DeploymentInfo.Ejb ejbResource = 
		(DeploymentInfo.Ejb)ejbResources.elementAt( i );
	    info += "  * EJB Resource: \t" + ejbResource.name + "\n";
	    info += "    + JNDI Name: \t" + ejbResource.jndi + "\n";
		info += "    + Principal: \t" + ejbResource.principal + "\n";
		info += "    + JMS client ID: \t" + ejbResource.jmsClientID + "\n";
		info += "    + MDB Connection Factory: \t" + ejbResource.mdbConnectionFactory + "\n";
		info += "    + JMS Durable Subscription name: \t" + ejbResource.jmsDurableSubscriptionName + "\n";
		info += "    + Remote Implementation class: \t" + ejbResource.remoteImpl + "\n";
		info += "    + Remote Home Implementation class: \t" + ejbResource.remoteHomeImpl + "\n";
		info += "    + Local Implementation class: \t" + ejbResource.localImpl + "\n";
		info += "    + Local Home Implementation class: \t" + ejbResource.localHomeImpl + "\n";
		info += "    + State Implementation class: \t" + ejbResource.stateImpl + "\n";
	    // Describe each resource reference:
	    Vector resources = ejbResource.resources;
	    if( resources.size() > 0 ) {
	        info += "    + Resource References:\n";
		for( j = 0; j < resources.size(); j++ ) {
		    DeploymentInfo.ResourceReference ref = 
			(DeploymentInfo.ResourceReference)
			resources.elementAt( j );
		    info += describeResourceReference( ref );
		}
            }

		// Describe each env-reference:
	    Vector envRefs = ejbResource.envReferences;
	    if( envRefs.size() > 0 ) {
	        info += "    + Resource Env-References:\n";
		for( j = 0; j < envRefs.size(); j++ ) {
		    DeploymentInfo.ResourceEnvReference ref = 
			(DeploymentInfo.ResourceEnvReference)
			envRefs.elementAt( j );
		    info += "    + Name: \t" + ref.name + "\n";
			info += "    + JNDI Name: \t" + ref.jndiName + "\n";
		}
            }
			
	    // Describe each EJB reference:
	    Vector ejbrefs = ejbResource.ejbs;
	    if( ejbrefs.size() > 0 ) {
	        info += "    + EJB References:\n";
		for( j = 0; j < ejbrefs.size(); j++ ) {
		    DeploymentInfo.EjbReference ref = 
			(DeploymentInfo.EjbReference)ejbrefs.elementAt( j );
		    info += describeEjbReference( ref );
		}
            }

	    // Describe Container Managed Persistene (CMP) information:
	    if( ejbResource.cmp != null ) {
	        info += describeCmpInfo( ejbResource.cmp );
            }
		
		// Describe Container Managed Persistene (CMP 2.0) information:
	    if( ejbResource.cmp2 != null ) {
	        info += describeCmp20Info( ejbResource.cmp2 );
            }
		
		// Describe (IOR) information:
	    if( ejbResource.ior != null ) {
	        info += describeIORInfo( ejbResource.ior );
            }
	}

	return info;
    }

    /**
     * Describes IOR information
     */
    private String describeIORInfo( DeploymentInfo.IORInfo ior ) {
	String info = "";

	info += "    + Security (IOR) Information:\n";
	info += "      - TransportIntegrity: \t" + ior.transportConfig.transportIntegrity + "\n"; 
	info +=	"      - TransportConfidentiality: \t" + ior.transportConfig.transportConfidentiality + "\n";
	 
	info +=	"      - EstablishTrustInTarget: \t" + ior.transportConfig.establishTrustInTarget + "\n";
	 
	info +=	"      - EstablishTrustInClient: \t" + ior.transportConfig.establishTrustInClient + "\n"; 
	 
	info +=	"      - AsAuthMethod: \t" + ior.asContext.asAuthMethod + "\n"; 
	info +=	"      - AsRealmName: \t" + ior.asContext.asRealmName + "\n"; 
	info +=	"      - AsRequired: \t" + ior.asContext.asRequired + "\n"; 
	info +=	"      - SasCallerPropagation: \t" + ior.sasContext.sasCallerPropagation + "\n";


	return info;
    }
	
	/**
     * Describes container managed persistence (2.0) information
     */
    private String describeCmp20Info( DeploymentInfo.Cmp2Info cmp ) {
	String info = "";

	info += "    + Container Managed Persistence (CMP 2.0) Information:\n";
	info += "      - Create Table on Deployment? \t" + 
	    (cmp.createTableDeploy ? "Yes" : "No") + "\n";
	info += "      - Remove Table on Undeployment? \t" + 
	    (cmp.deleteTableUndeploy ? "Yes" : "No") + "\n";
        info += "      - Method SQL information:\n";

	for( int i = 0; i < cmp.sqlStatements.size(); i++ ) {
	    DeploymentInfo.MethodDescriptor descriptor = 
		(DeploymentInfo.MethodDescriptor)
		((DeploymentInfo.SQLStatement)cmp.sqlStatements.elementAt( i )).methodDescriptor;
	    String sql = (String)((DeploymentInfo.SQLStatement)cmp.sqlStatements.elementAt( i )).methodSql;
	    if(descriptor == null)
			info += "Operation: \t" + ((DeploymentInfo.SQLStatement)cmp.sqlStatements.elementAt( i )).operation + "\n";
		else
			info += describeDescriptor( descriptor );
			
		info += "          > Use SQL: \t" + sql + "\n";
	}

	return info;
    }

/**
     * Describes container managed persistence information
     */
    private String describeCmpInfo( DeploymentInfo.CmpInfo cmp ) {
	String info = "";

	info += "    + Container Managed Persistence (CMP) Information:\n";
	info += "      - JNDI Name: \t" + cmp.jndi + "\n";
	info += "      - DB Username: \t" + cmp.username + "\n";
	info += "      - DB Password: \t" + cmp.password + "\n";
	info += "      - Table Creation SQL: \t" + cmp.sqlTableCreate + "\n";
	info += "      - Table Removal SQL: \t" + cmp.sqlTableRemove + "\n";
	info += "      - Create Table on Deployment? \t" + 
	    (cmp.createTableDeploy ? "Yes" : "No") + "\n";
	info += "      - Remove Table on Undeployment? \t" + 
	    (cmp.deleteTableUndeploy ? "Yes" : "No") + "\n";
        info += "      - Method SQL information:\n";

	for( int i = 0; i < cmp.sqlStatements.size(); i++ ) {
	    DeploymentInfo.MethodDescriptor descriptor = 
		(DeploymentInfo.MethodDescriptor)
		((DeploymentInfo.SQLStatement)cmp.sqlStatements.elementAt( i )).methodDescriptor;
	    String sql = (String)((DeploymentInfo.SQLStatement)cmp.sqlStatements.elementAt( i )).methodSql;
	    if(descriptor == null)
			info += "Operation: \t" + ((DeploymentInfo.SQLStatement)cmp.sqlStatements.elementAt( i )).operation + "\n";
		else
			info += describeDescriptor( descriptor );
			
		info += "          > Use SQL: \t" + sql + "\n";
	}

	return info;
    }
	
    /**
     * Describes a single method descriptor
     */
    private String describeDescriptor( 
	DeploymentInfo.MethodDescriptor descriptor ) 
    {
	String info = "";

	info += "        . Method: \t" + descriptor.methodName + "\n";
	info += "          > Class Symbol: \t" + descriptor.ejbClassSymbol +
	    "\n";

	for( int i = 0; i < descriptor.parameterClassNames.length; i++ ) {
	    String parameter = descriptor.parameterClassNames[i];
	    info += "          > Parameter: \t" + parameter + "\n";
	}

	return info;
    }

}





