/*******************************************************************************
 * Copyright (c) 2003, 2004 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/

package org.eclipse.jst.ws.internal.consumption.sampleapp.codegen;

import java.util.Enumeration;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jst.ws.internal.common.StringUtils;
import org.eclipse.jst.ws.internal.consumption.codegen.Generator;
import org.eclipse.jst.ws.internal.consumption.codegen.bean.ParameterVisitor;
import org.eclipse.jst.ws.internal.consumption.codegen.bean.ReturnParameterVisitor;
import org.eclipse.jst.ws.internal.consumption.datamodel.beanmodel.DataType;
import org.eclipse.jst.ws.internal.consumption.datamodel.beanmodel.MethodElement;
import org.eclipse.jst.ws.internal.consumption.datamodel.beanmodel.TypeFactory;
import org.eclipse.wst.ws.internal.datamodel.Element;


/**
* Objects of this class represent a ResultFilegenerator.
* */
public class ResultFileHelp1Generator extends ResultFileGenerator 
{

  // Copyright
  public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";

   
  public static final int INITIAL_STATE = 1;
  public static final int FINAL_STATE = 2;
  public static final String MTEMP = "mtemp";
  public static String BEAN = "Proxy";
  
  /**
  * Constructor.
  * @param buffer StringBuffer object that this code generator writes to 
  */
  public ResultFileHelp1Generator (StringBuffer buffer)
  {
      super(buffer);    
  }
  
  /**
  * Visit Method generates code for this Visitor
  * @param method method code will be generated for 
  */
  public IStatus visit (Object object)
  {
     Element methodElement = (Element)object;
  

     MethodElement method = (MethodElement)methodElement;
     if (method.getMethodOmmission()) return Status.OK_STATUS;

     fbuffer.append("case " + method.getNumberID()+ ":" + StringUtils.NEWLINE);
     visitHelper(method);
     
     fbuffer.append("break;" + StringUtils.NEWLINE); 
  
     return Status.OK_STATUS;
  }   
  /**
  * Helps out the visitor
  * @param method method code will be generated for 
  */
  public void visitHelper (Element methodElement)
  {

     fbuffer.append(Generator.DOUBLE_TAB + "gotMethod = true;" + StringUtils.NEWLINE);
     
     MethodElement method = (MethodElement)methodElement;
     // go to the next generator
     ResultFileHelp2Generator resultFileHelp2Generator = new ResultFileHelp2Generator(fbuffer); 
     resultFileHelp2Generator.setNumberFactory(getNumberFactory());
     ParameterVisitor parameterVisitor = new ParameterVisitor();
     parameterVisitor.run(methodElement,resultFileHelp2Generator);
     fbuffer = resultFileHelp2Generator.getStringBuffer();
     setNumberFactory(resultFileHelp2Generator.getNumberFactory());
     // we must now grab the state data from the resident vector
     setResidentVector(resultFileHelp2Generator.getResidentVector());

     
     //there is no return type if void occurs    
    
     
     if (method.getReturnParameterElement().getTypeElement().getName().equals("void"))
        fbuffer.append(Generator.DOUBLE_TAB + getSessionBeanId() + "." +method.getName() + "(");

     else{
        fbuffer.append(Generator.DOUBLE_TAB + method.getReturnParameterElement().getTypeElement().getName() + Generator.SPACE + method.getMUID() + MTEMP + Generator.SPACE);
        fbuffer.append("=" + Generator.SPACE + getSessionBeanId() + "." + method.getName() + "(");
     }

     Enumeration e = fResidentVector.elements();
     while (e.hasMoreElements()){
          fbuffer.append((String)e.nextElement());
          if (e.hasMoreElements())
              fbuffer.append(",");    
     }
     fbuffer.append(");" + StringUtils.NEWLINE);
     if (!method.getReturnParameterElement().getTypeElement().getName().equals("void") && !method.getReturnParameterElement().getTypeElement().isPrimitive()){
        //in case our result is null
        fbuffer.append("if(" + method.getMUID() + "mtemp == null){" + StringUtils.NEWLINE);
        fbuffer.append("%>" + StringUtils.NEWLINE);
        fbuffer.append("<%=" + method.getMUID() + "mtemp %>" + StringUtils.NEWLINE);
        fbuffer.append("<%" + StringUtils.NEWLINE);
        fbuffer.append("}else{" + StringUtils.NEWLINE);
     }
     
     //now lets display the return bean
     // if it is simple we dont need to use the generator
     
     if (!method.getReturnParameterElement().getTypeElement().getName().equals("void")){
        if (method.getReturnParameterElement().getTypeElement().isSimple() 
           || TypeFactory.recognizedBean(method.getReturnParameterElement().getTypeElement().getName())
           || TypeFactory.isStateLessBean(method.getReturnParameterElement().getTypeElement().getTypeName())
           || TypeFactory.isRecognizedReturnType(method.getReturnParameterElement().getTypeElement().getTypeName())){
           DataType dataType = TypeFactory.createType(method.getReturnParameterElement().getTypeElement().getTypeName(),method.getReturnParameterElement().getMUID());
           fbuffer.append(dataType.TypeConversion(method.getMUID() + MTEMP));
        }
        else{
           fbuffer.append("%>" + StringUtils.NEWLINE);
           InputFileHelp2Generator inputFileHelp2Generator = new InputFileHelp2Generator(fbuffer);
           inputFileHelp2Generator.setInstanceName(method.getMUID() + MTEMP);
           inputFileHelp2Generator.setReturnParam(true);
           ReturnParameterVisitor returnParameterVisitor = new ReturnParameterVisitor();
           returnParameterVisitor.run(method,inputFileHelp2Generator);
           fbuffer = inputFileHelp2Generator.getStringBuffer();
           fbuffer.append("<%" + StringUtils.NEWLINE);

        }
     }

    if (!method.getReturnParameterElement().getTypeElement().getName().equals("void")  && !method.getReturnParameterElement().getTypeElement().isPrimitive()) fbuffer.append("}" + StringUtils.NEWLINE);    
    
  }



}
