/*******************************************************************************
 * Copyright (c) 2000, 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.datamodel.beanmodel;

import org.eclipse.jem.java.Field;
import org.eclipse.jem.java.JavaClass;
import org.eclipse.jem.java.JavaHelpers;
import org.eclipse.jem.java.JavaParameter;
import org.eclipse.jem.java.Method;
import org.eclipse.jst.ws.internal.consumption.sampleapp.common.SamplePropertyDescriptor;
import org.eclipse.wst.ws.internal.datamodel.Element;
import org.eclipse.wst.ws.internal.datamodel.Model;

/**
 * TypeFactory
 * Creation date: (4/10/2001 12:41:48 PM)
 * @author: Gilbert Andrews
 */
public class BeanModelElementsFactory 
{

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

  private BeanModelElementsFactory(){}

  public static Element getBeanModelElement(Object object)
  {
    return BeanModelElementsFactory.getBeanModelElement(object,null,null);
  }

  public static Element getBeanModelElement(Object object,Element parentElement)
  {
    return BeanModelElementsFactory.getBeanModelElement(object,parentElement,null);
  }
  
 /*
  * Take in an object and return an element depending on what 
  * type we are dealing with from the javamof
  **/
  public static Element getBeanModelElement(Object object,Element parentElement, Model model)
  {
    Element returnElement = null;

    if (object instanceof JavaClass){
      JavaClass javaClass = (JavaClass)object;
      String javaName = javaClass.getJavaName();
      if (!javaClass.isArray()){ 
	      if(parentElement == null && model ==null) returnElement = new BeanElement(javaName);
	      else if(parentElement == null && model !=null) returnElement = new BeanElement(javaName,model,false);
	      else{
	        if(parentElement instanceof ParameterElement){ 
	           ParameterElement tempElement = (ParameterElement)parentElement;
	           returnElement = new BeanElement(tempElement,javaName);
	        }
	        else if(parentElement instanceof AttributeElement){
	           AttributeElement tempElement = (AttributeElement)parentElement;
	           returnElement = new BeanElement(tempElement,javaName);
	        }
            else if(parentElement instanceof FieldElement){
               FieldElement tempElement = (FieldElement)parentElement;
	           returnElement = new BeanElement(tempElement,javaName);
            }
            else if(parentElement instanceof MethodElement){
               returnElement = new ParameterElement((MethodElement)parentElement,RETURN_PARAM_NAME,MethodElement.REL_RETURN_PARAMETERS,true);
            }	         
	      }
      } 
      else{
          if(parentElement == null && model ==null) returnElement = new ArrayElement(javaName);
	      else if(parentElement == null && model !=null) returnElement = new ArrayElement(javaName,model,false);
	      else{
	        if(parentElement instanceof ParameterElement){ 
	           ParameterElement tempElement = (ParameterElement)parentElement;
	           returnElement = new ArrayElement(tempElement,javaName);
	        }
	        else if(parentElement instanceof AttributeElement){
	           AttributeElement tempElement = (AttributeElement)parentElement;
	           returnElement = new ArrayElement(tempElement,javaName);
	        }
            else if(parentElement instanceof FieldElement){
               FieldElement tempElement = (FieldElement)parentElement;
	           returnElement = new ArrayElement(tempElement,javaName);
	        }
            else if(parentElement instanceof MethodElement){
               returnElement = new ParameterElement((MethodElement)parentElement,RETURN_PARAM_NAME,MethodElement.REL_RETURN_PARAMETERS,true);
            }

	      }
       }

    }
    else if(object instanceof SamplePropertyDescriptor){
      SamplePropertyDescriptor pd = (SamplePropertyDescriptor)object;
      returnElement = new AttributeElement((BeanElement)parentElement,pd.getName());  
    }
    else if(object instanceof Field){
      Field field = (Field)object;
      returnElement = new FieldElement((BeanElement)parentElement,field.getName());
    }
    else if (object instanceof Method){
      Method method = (Method)object;
      returnElement = new MethodElement((BeanElement)parentElement,method.getName(), method.getMethodElementSignature());
    }
    //non beaninfo
    else if (object instanceof String){
      String name = (String)object;  
      returnElement = new AttributeElement((BeanElement)parentElement,name);
    }
    else if (object instanceof JavaParameter){
      JavaParameter javaParameter = (JavaParameter)object;

      
      if (javaParameter.isReturn()) 
         returnElement = new ParameterElement((MethodElement)parentElement,RETURN_PARAM_NAME,MethodElement.REL_RETURN_PARAMETERS,true); 
      else{ 
         //a java parameter gives us the qualified name we dont want this
         String name = javaParameter.getQualifiedName();
         String shortName;
         int index = name.lastIndexOf(".");
         if (index != -1){
           index++;
           shortName = name.substring(index);
         }
      else shortName = name;

         returnElement = new ParameterElement((MethodElement)parentElement,shortName,MethodElement.REL_PARAMETERS,false); 

      }
     
    }
    else if (object instanceof JavaHelpers){
      JavaHelpers javaHelper = (JavaHelpers)object;
      String javaName; 
      if (javaHelper.isArray()) javaName = TypeFactory.ARRAY_NAME;
      else javaName = javaHelper.getJavaName();
      if (parentElement instanceof ParameterElement){
          returnElement = new SimpleElement((ParameterElement)parentElement,javaName,javaHelper.isPrimitive());
      }
      else if(parentElement instanceof AttributeElement){
          returnElement = new SimpleElement((AttributeElement)parentElement,javaName,javaHelper.isPrimitive());
      }
      else if(parentElement instanceof FieldElement){
          returnElement = new SimpleElement((FieldElement)parentElement,javaName,javaHelper.isPrimitive());
      }
      else if(parentElement instanceof MethodElement){
      	returnElement = new ParameterElement((MethodElement)parentElement,RETURN_PARAM_NAME,MethodElement.REL_RETURN_PARAMETERS,true);
      }
    }
    return returnElement;
  }
  
  
  


}

