/*******************************************************************************
 * Copyright (c) 2000, 2006 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
 * yyyymmdd bug      Email and other contact information
 * -------- -------- -----------------------------------------------------------
 * 20060726   145676 gilberta@ca.ibm.com - Gilbert Andrews
 *******************************************************************************/

package org.eclipse.jst.ws.internal.consumption.datamodel.beanmodel;

import java.util.Hashtable;
import org.eclipse.jem.java.JavaHelpers;
/**
 * TypeFactory
 * Creation date: (4/10/2001 12:41:48 PM)
 * @author: Gilbert Andrews
 */
public class TypeFactory 
{

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


  public static final String URL_NAME                   = "java.net.URL";
  public static final String STRING_NAME               = "java.lang.String";
  public static final String BIG_DECIMAL_NAME          = "java.math.BigDecimal";
  public static final String BIG_INTEGER_NAME          = "java.math.BigInteger";
  public static final String DATE_NAME                 = "java.util.Date";
  public static final String GREGORIAN_CALENDAR_NAME = "java.util.GregorianCalendar";
  public static final String CALENDAR_NAME             = "java.util.Calendar";
  public static final String BOOLEAN_NAME              = "java.lang.Boolean";
  public static final String BYTE_NAME                  = "java.lang.Byte";
  public static final String DOUBLE_NAME               = "java.lang.Double";
  public static final String FLOAT_NAME                 = "java.lang.Float";
  public static final String INTEGER_NAME               = "java.lang.Integer";
  public static final String LONG_NAME                  = "java.lang.Long";
  public static final String SHORT_NAME                 = "java.lang.Short";
  public static final String CHARACTER_NAME            = "java.lang.Character";
  public static final String PRIM_BOOLEAN_NAME         = "boolean";
  public static final String PRIM_BYTE_NAME            = "byte";
  public static final String PRIM_DOUBLE_NAME          = "double";
  public static final String PRIM_FLOAT_NAME           = "float";
  public static final String PRIM_INTEGER_NAME         = "int";
  public static final String PRIM_LONG_NAME            = "long";
  public static final String PRIM_SHORT_NAME           = "short";
  public static final String PRIM_CHAR_NAME            = "char";
  public static final String VOID_NAME                  = "void";

  //some special complex
  public static final String DOM_ELEMENT_NAME   = "org.w3c.dom.Element";
  public static final String SOAP_ELEMENT_NAME = "javax.xml.soap.SOAPElement";
  public static final String STATELESS_BEAN = BeanElement.STATELESS_BEAN;



  public static Hashtable javaTypes = new Hashtable();
  
  public TypeFactory(){}

  static{
    javaTypes.put(BOOLEAN_NAME,new PrimitiveJavaTypes(BOOLEAN_NAME));
    javaTypes.put(BYTE_NAME,   new PrimitiveJavaTypes(BYTE_NAME));
    javaTypes.put(DOUBLE_NAME, new PrimitiveJavaTypes(DOUBLE_NAME));
    javaTypes.put(FLOAT_NAME,  new PrimitiveJavaTypes(FLOAT_NAME));
    javaTypes.put(INTEGER_NAME,new PrimitiveJavaTypes(INTEGER_NAME));
    javaTypes.put(LONG_NAME,   new PrimitiveJavaTypes(LONG_NAME));
    javaTypes.put(SHORT_NAME,  new PrimitiveJavaTypes(SHORT_NAME));
    javaTypes.put(CHARACTER_NAME,  new PrimitiveJavaTypes(CHARACTER_NAME));
  }


  /*
  * This function allows us to handle recognized beans 
  * in displaying and generating code for them instead of 
  * treating them as complex types
  */ 
  public static boolean recognizedBean(String type)
  {

    //     
    //current recognized beans (mostly java.lang)
    if (type.equals(BOOLEAN_NAME)             ||
        type.equals(BYTE_NAME)               ||
        type.equals(DOUBLE_NAME)             ||
        type.equals(FLOAT_NAME)               ||
        type.equals(INTEGER_NAME)             ||
        type.equals(LONG_NAME)               ||
        type.equals(SHORT_NAME)              ||      
        type.equals(CHARACTER_NAME)          ||      
        type.equals(DOM_ELEMENT_NAME)        ||      
	    type.equals(SOAP_ELEMENT_NAME)        ||
        type.equals(BIG_DECIMAL_NAME)         ||
        type.equals(BIG_INTEGER_NAME)         ||
        type.equals(DATE_NAME)                ||
        type.equals(GREGORIAN_CALENDAR_NAME) ||
        type.equals(CALENDAR_NAME)           || 
        type.equals(URL_NAME)                 ||    
        type.equals(STRING_NAME))  return true;      
     return false; 
  
  }

  /*
  * This function allows us to handle unsupported types 
  * if we dont want to support a type and we want to omitt this  
  * method from the samples
  * @param javaHelpers this is the type to be evaluated
  * @return boolean true if the type is not supported
  */ 
  public static boolean isUnSupportedType(JavaHelpers javaHelpers)
  {
    //we also dont support arrays
    if (javaHelpers.isArray()||
    		javaHelpers.getJavaName().equals(MAP_NAME)||
    		javaHelpers.getJavaName().equals(VECTOR_NAME)||
    		javaHelpers.getJavaName().equals(DATA_HANDLER)||
    		javaHelpers.getJavaName().equals("java.lang.class")	) return true;
    
    return false;
  }

  public static String HASHTABLE_NAME = "java.util.Hashtable";
  public static String MAP_NAME = "java.util.Map";
  public static String VECTOR_NAME = "java.util.Vector";
  public static String ARRAY_NAME = ArrayElement.ARRAY_NAME;
  public static String PRIMITIVE_ARRAY_NAME = "primitivearray";
  public static String DATA_HANDLER = "javax.activation.DataHandler";

  public static boolean isRecognizedReturnType(JavaHelpers javaHelpers)
  {
    //arrays 
    //Hashtable
    //Vectors
    if (javaHelpers.isArray()) return true;
    else if (javaHelpers.getJavaName().equals(HASHTABLE_NAME))return true;
    else if (javaHelpers.getJavaName().equals(VECTOR_NAME))return true;
    else if (javaHelpers.getJavaName().equals(MAP_NAME))return true;
    else return false;
  }

  public static boolean isRecognizedReturnType(String type)
  {
    //arrays 
    //Hashtable
    //Vectors
    if (type.startsWith(ARRAY_NAME)) return true;
    else if (type.equals(HASHTABLE_NAME))return true;
    else if (type.equals(VECTOR_NAME))return true;
    else if (type.equals(MAP_NAME))return true;
    else return false;
  }

  public static boolean isStateLessBean(String type)
  {
    if(type.startsWith(STATELESS_BEAN)) return true;
    return false;
  }


  /**
  * Creates a type based on the JavaHelper then sets this type in the element
  * @params JavaHelpers this holds the type
  * @param TypeElement The element which will hold the type created
  * @param String Uniquename to be used when naming temp variables
  */
 
  public static DataType createType(String type, String UniqueName)
  {
    //this guy might be both stateless and one of the below elements
    //we would like to be as specific as we can, stateless is the worst case 
    boolean stateless = false;  
    if(type.startsWith(STATELESS_BEAN)) {
      stateless = true;
      type = type.substring(29); 
    }
   
    DataType datatype = null;
    if      (type.equals(PRIM_BOOLEAN_NAME)) datatype = new PrimitiveBooleanType();
    else if (type.equals(PRIM_BYTE_NAME))     datatype = new PrimitiveByteType();
    else if (type.equals(PRIM_DOUBLE_NAME))  datatype = new PrimitiveDoubleType();
    else if (type.equals(PRIM_FLOAT_NAME))   datatype = new PrimitiveFloatType();
    else if (type.equals(PRIM_LONG_NAME))    datatype = new PrimitiveLongType();
    else if (type.equals(PRIM_INTEGER_NAME)) datatype = new PrimitiveIntType();
    else if (type.equals(PRIM_CHAR_NAME))    datatype = new PrimitiveCharType();
    else if (type.equals(PRIM_SHORT_NAME))   datatype = new PrimitiveShortType();
    

    //see if this critter is a javatype
    else if (type.equals(BOOLEAN_NAME)     ||
            type.equals(BYTE_NAME)        ||
            type.equals(DOUBLE_NAME)      ||
            type.equals(FLOAT_NAME)       ||
            type.equals(INTEGER_NAME)     ||
            type.equals(LONG_NAME)        ||
            type.equals(CHARACTER_NAME)  ||
            type.equals(SHORT_NAME))        datatype = (DataType)javaTypes.get(type);   

    //see if its a case we handle
    else if (type.equals(STRING_NAME))               datatype = new StringType(); 
    else if (type.equals(VOID_NAME))                 datatype = new VoidType();
    else if (type.equals(DOM_ELEMENT_NAME))          datatype = new DomElementType();
    else if (type.equals(SOAP_ELEMENT_NAME))         datatype = new SOAPElementType();  
    else if (type.equals(BIG_DECIMAL_NAME))          datatype = new BigDecimalType();
    else if (type.equals(BIG_INTEGER_NAME))          datatype = new BigIntegerType();
    else if (type.equals(DATE_NAME))                  datatype = new DateType();
    else if (type.equals(URL_NAME))                   datatype = new URLType(); 
    else if (type.equals(GREGORIAN_CALENDAR_NAME))  datatype = new GregorianCalendarType();
    else if (type.equals(CALENDAR_NAME))  datatype = new GregorianCalendarType();

    //it could be a return type we support
    else if (type.equals(HASHTABLE_NAME))            datatype = new HashtableType();
    else if (type.equals(VECTOR_NAME))               datatype = new VectorType();
    else if (type.equals(MAP_NAME))                  datatype = new MapType();

    // need to see if it is an object array
    //or a primitive
    else if (type.startsWith(ARRAY_NAME)){              
    	String name = type.substring(21); 
        if(name.startsWith(PRIM_BOOLEAN_NAME) ||
          name.startsWith(PRIM_BYTE_NAME)     ||
          name.startsWith(PRIM_DOUBLE_NAME)  ||
          name.startsWith(PRIM_FLOAT_NAME)    ||
          name.startsWith(PRIM_LONG_NAME)    ||
          name.startsWith(PRIM_INTEGER_NAME)  ||
          name.startsWith(PRIM_CHAR_NAME)    ||
          name.startsWith(PRIM_SHORT_NAME))
            datatype = new PrimitiveArrayType(name);  
        else
        	datatype = new ArrayType(name);

    }
    else if (stateless){
        datatype = new StateLessBeanType(type);

    }


    datatype.setUniqueName(UniqueName);
    return datatype;
     
  }
  
  


}
