
/**
 * StockQuoteServiceSkeleton.java
 *
 * This file was auto-generated from WSDL
 * by the Apache Axis2 version: 1.1 Nov 13, 2006 (07:31:44 LKT)
 */
package samples.quickstart.service.xmlbeans;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import samples.quickstart.service.xmlbeans.xsd.Address;
import samples.quickstart.service.xmlbeans.xsd.CSMGenericFaultDocument;
import samples.quickstart.service.xmlbeans.xsd.EUAddress;
import samples.quickstart.service.xmlbeans.xsd.GetAddressesResponseDocument;
import samples.quickstart.service.xmlbeans.xsd.USAddress;
import samples.quickstart.service.xmlbeans.xsd.USState;
import samples.quickstart.service.xmlbeans.xsd.CSMGenericFaultDocument.CSMGenericFault;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.math.BigInteger;

import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.ServiceContext;
import org.apache.axis2.context.SessionContext;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.engine.ServiceLifeCycle;
import org.apache.xerces.impl.xs.SubstitutionGroupHandler;
import org.apache.xmlbeans.XmlOptions;

/**
 *  StockQuoteServiceSkeleton java skeleton for the axisService
 */
public class StockQuoteServiceSkeleton implements StockQuoteServiceSkeletonInterface, ServiceLifeCycle{

	HashMap _cache = null;        
	/**
	 * Auto generated method signature

	 * @param param3

	 */
	String sessionKey = "cache";
	public  void updateAddresses(samples.quickstart.service.xmlbeans.xsd.UpdateAddressesDocument param3)
	{
		// Key is "Test", value is "_cache"
		MessageContext cxt = MessageContext.getCurrentMessageContext();
		SessionContext session = cxt.getSessionContext();
		_cache = (HashMap)session.getProperty(sessionKey);
		System.err.println(getCurrentTime()+"Session Cookie: "+session.getCookieID());
		
		
		//Todo fill this with the necessary business logic
		String symbol = param3.getUpdateAddresses().getSymbol();
		System.err.println(getCurrentTime()+"- Update Symbol:" + symbol);
		
		Address[] addrs = param3.getUpdateAddresses().getAddressesArray();
		for (int i = 0; i < addrs.length; i++) {
			Address addr = addrs[i];
			if(addr instanceof USAddress) System.err.println("USAddress instance");
        	if(addr instanceof Address) System.err.println("Address instance");
			System.err.println(addr.getClass().getName()+":"+addr);
		}
		
		if(_cache != null ){
			System.err.println("Got cache from last call!!!" + _cache);
			_cache.put(symbol,addrs);
			
		}
		else {
			_cache = new HashMap();
			_cache.put(symbol,addrs);
			session.setProperty(sessionKey, _cache);
			System.err.println("No cache, rebuild. New cache is: " + _cache);


		}
	}


	private String getCurrentTime() {
	    DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
	        Date date = new Date();
	        return dateFormat.format(date);
	    
	}


	/**
	 * Auto generated method signature

	 * @param param4

	 */
	public  samples.quickstart.service.xmlbeans.xsd.GetAddressesResponseDocument getAddresses
	(
			samples.quickstart.service.xmlbeans.xsd.GetAddressesDocument param4
	)

	throws CSMSpecificFaultMessageException,CSMGenericFaultMessageException{
		MessageContext cxt = MessageContext.getCurrentMessageContext();
		SessionContext session = cxt.getSessionContext();
		_cache = (HashMap)session.getProperty(sessionKey);
		System.err.println(getCurrentTime()+"Session Cookie in getAddress(): "+session.getCookieID());
		if(_cache == null ) System.err.println(getCurrentTime()+" cache is empty");
		else System.err.println(getCurrentTime()+" cache is there!!!");
		
		String symbol = param4.getGetAddresses().getSymbol();
		//Todo fill this with the necessary business logic
		System.err.println(getCurrentTime()+"- In getAddress for symbol: " + symbol);
		
		//samples.quickstart.service.xmlbeans.xsd.Address[] addrs = new samples.quickstart.service.xmlbeans.xsd.Address[2];
		GetAddressesResponseDocument resDoc = 
			GetAddressesResponseDocument.Factory.newInstance();
		
			
		
		if(symbol!=null && symbol.equalsIgnoreCase("JNPR")){
			System.err.println(getCurrentTime()+"- In getAddress throw exception for symbol: " + symbol);
			CSMGenericFaultMessageException excp =  new CSMGenericFaultMessageException("Throw one CSMGenericFaultMessageException and see...");

			CSMGenericFaultDocument faultDoc = CSMGenericFaultDocument.Factory.newInstance();
			System.err.println("FaultDoc: "+faultDoc);
			CSMGenericFaultDocument.CSMGenericFault fault = faultDoc.addNewCSMGenericFault();
			System.err.println("Fault: "+fault);
			fault.setMsg("CSM Generic Exception Message");
			fault.setDetails("CSM Generic Exception Details");
			
			excp.setFaultMessage(faultDoc);//Don't forget this
			throw excp;
			//System.err.println("After throw exception, shold not be here.");
		}
		else if(symbol!=null && symbol.equalsIgnoreCase("COMS")){
			System.err.println(getCurrentTime()+"- In getAddress throw exception for symbol: " + symbol);
			String oops = null;
			try{
				oops.length();
			}catch(Throwable th){
			
				CSMGenericFaultDocument faultDoc = CSMGenericFaultDocument.Factory.newInstance();
				
				CSMGenericFaultDocument.CSMGenericFault fault = faultDoc.addNewCSMGenericFault();
				
				fault.setMsg(th.getClass().toString()+":"+(th.getLocalizedMessage()!=null?th.getLocalizedMessage():""));
				/*
				StringBuffer buf = new StringBuffer();
				for (int i = 0; i < th.getStackTrace().length; i++) {
					buf.append(th.getStackTrace()[i]).append("\n");
				}*/
				ByteArrayOutputStream buf = new ByteArrayOutputStream();
				PrintWriter pr = new PrintWriter(buf);
				th.printStackTrace(pr);
				pr.flush();
				fault.setDetails(buf.toString());
				
				System.err.println("Fault: "+fault);
				System.err.println("FaultDoc: "+faultDoc);
				CSMGenericFaultMessageException excp =  new CSMGenericFaultMessageException("CSMGenericFaultMessageException", th);
				System.err.println("excp is :" +excp);
				excp.setFaultMessage(faultDoc);//Don't forget this
				
				throw excp;
			}
		}
				
		try{
			if(_cache==null){
				populateAddress(resDoc);
			}

			//addrs = (Address[])_cache.get(symbol);
			//res.setAddressesArray(addrs);
			
			
			

		}catch(Exception e){
			StackTraceElement[] eles = e.getStackTrace();
			System.out.println(getCurrentTime()+e.getMessage());
			for (int i = 0; i < eles.length; i++) {
				StackTraceElement ele = eles[i];
				System.out.println(ele.toString());

			}
		} 
		return resDoc;
	}
	
	
	public void shutDown(ConfigurationContext configctx, AxisService service) {
		// TODO Auto-generated method stub
		System.err.println("\n"+getCurrentTime()+" Shutting down...");
	}


	public void startUp(ConfigurationContext configctx, AxisService service) {
		// TODO Auto-generated method stub
		System.err.println("\n\n\n"+getCurrentTime()+" Initializing...");
	}
	
	public static void main( String args[]){
		GetAddressesResponseDocument resDoc = 
			GetAddressesResponseDocument.Factory.newInstance();
		
		populateAddress(resDoc);
	}


	private static void populateAddress(GetAddressesResponseDocument resDoc) {
		// TODO Auto-generated method stub
		GetAddressesResponseDocument.GetAddressesResponse res = 
			resDoc.addNewGetAddressesResponse();
		samples.quickstart.service.xmlbeans.xsd.Address[] addArray = new samples.quickstart.service.xmlbeans.xsd.Address[2]; 
		samples.quickstart.service.xmlbeans.xsd.USAddress addr = samples.quickstart.service.xmlbeans.xsd.USAddress.Factory.newInstance();
		
		//samples.quickstart.service.xmlbeans.xsd.USAddress addr = samples.quickstart.service.xmlbeans.xsd.USAddress.Factory.newInstance();
		addr.setName("XYZ");
		addr.setCity("Sunnyvale");
		addr.setState(USState.CA);
		addr.setZip(new BigInteger("94087"));
		

		//samples.quickstart.service.xmlbeans.xsd.EUAddress addr1 = (EUAddress) res.addNewAddresses().changeType(EUAddress.type);
		samples.quickstart.service.xmlbeans.xsd.EUAddress addr1 = samples.quickstart.service.xmlbeans.xsd.EUAddress.Factory.newInstance();
		addr1.setName("XYZ");
		addr1.setCity("Hongkong");
		addr1.setExportCode(new BigInteger("66553322"));
		addr1.setPostcode("2300331 E.C");
		
		addArray[0] = addr;
		addArray[1] = addr1;
		
		res.setAddressesArray(addArray);
		
		XmlOptions ops = new XmlOptions();
		ops.setSavePrettyPrint();
		ops.setSavePrettyPrintIndent(4);
		//String xmlStr = res.xmlText(ops);
		//System.out.println("Response Element String: \n" + xmlStr);
		String xmlStr1 = resDoc.xmlText(ops);
		System.out.println("Response Document String: \n" + xmlStr1);
	}
}
    