blob: af2d94e63362bf01fbd9bdf655023b629a071835 [file] [log] [blame]
/*******************************************************************************
* 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
* yyyymmdd bug Email and other contact information
* -------- -------- -----------------------------------------------------------
* 20060612 145433 gilberta@ca.ibm.com - Gilbert Andrews
*******************************************************************************/
package org.eclipse.jst.ws.internal.consumption.sampleapp.codegen;
import java.util.Vector;
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.bean.AttributeVisitor;
import org.eclipse.jst.ws.internal.consumption.codegen.bean.FieldVisitor;
import org.eclipse.jst.ws.internal.consumption.datamodel.beanmodel.AttributeElementType;
import org.eclipse.jst.ws.internal.consumption.datamodel.beanmodel.BeanElement;
import org.eclipse.jst.ws.internal.consumption.datamodel.beanmodel.DataType;
import org.eclipse.jst.ws.internal.consumption.datamodel.beanmodel.SimpleElement;
import org.eclipse.jst.ws.internal.consumption.datamodel.beanmodel.TypeElement;
import org.eclipse.jst.ws.internal.consumption.datamodel.beanmodel.TypeFactory;
/**
* Objects of this class represent a InputFileTypeGenerator.
* */
public class InputFileTypeGenerator extends InputFileHelp2Generator
{
// Copyright
public static final String copyright = "(c) Copyright IBM Corporation 2000, 2002.";
protected String fParentGetters;
protected int fLevelsDeep;
protected int fColspan;
protected int fCurrentLevel;
private boolean fIsSimple;
private boolean fStateLessBean;
private Vector fGetters;
private Vector fTypes;
private boolean fWrite = true;
/**
* Constructor.
*
*/
public InputFileTypeGenerator (StringBuffer buffer, int currentLevel)
{
super(buffer);
fCurrentLevel = currentLevel;
fLevelsDeep = -1;
fParentGetters = "";
}
/**
* Constructor.
*
*/
public InputFileTypeGenerator (StringBuffer buffer, int currentLevel,int levelsDeep)
{
super(buffer);
fCurrentLevel = currentLevel;
fLevelsDeep = levelsDeep;
fParentGetters = "";
}
public void setParentGetters(Vector getter,Vector type)
{
if(fGetters != null){
fGetters.clear();
fTypes.clear();
}
addParentGetter(getter,type);
}
/**
* This function holds some state data that is important in getting the
* Strings for display of resultant beans
* @param String getter this is the getter of an attribute
* The idea is that by the time we get to the simple type
* we have getAddress().getStreet()....
*/
public void addParentGetter(String getter, String type)
{
if(fGetters == null) fGetters = new Vector();
if(fTypes == null) fTypes = new Vector();
fGetters.addElement(getter);
fTypes.addElement(type);
}
/*
* this will be used when passing between two visitors
*
*/
public void addParentGetter(Vector getters, Vector types)
{
if(fGetters == null) fGetters = new Vector();
if(fTypes == null) fTypes = new Vector();
int size = getters.size();
for(int i = 0; i<size; i++){
fGetters.addElement(getters.get(i));
fTypes.addElement(types.get(i));
}
}
protected String returnParentGetter(int count)
{
if (fGetters == null || count > fGetters.size()) return null;
return (String)fGetters.get(count);
}
protected String returnParentGetterType(int count)
{
if (fTypes == null || count > fTypes.size()) return null;
return (String)fTypes.get(count);
}
protected Vector returnParentGetter()
{
if (fGetters == null ) return new Vector();
return fGetters;
}
protected Vector returnParentGetterType()
{
if (fTypes == null ) return new Vector();
return fTypes;
}
protected int getterCount()
{
if(fGetters == null) return 0;
return fGetters.size();
}
/**
* This function returns some state data that is important in getting the
* Strings for display of resultant beans
* @return String the string of getters to this point
* The idea is that by the time we get to the simple type
* we have getAddress().getStreet()....
*/
public String getParentGetters()
{
return fParentGetters;
}
/*
* Takes in an object to be acted upon by this visitor action
* @param Object The object to be acted upon
*/
public IStatus visit (Object object)
{
TypeElement element = (TypeElement)object;
if (element instanceof SimpleElement) fIsSimple = true;
else fIsSimple = false;
//this could be a statelessbean need to know
if (element instanceof BeanElement ){
BeanElement bean = (BeanElement)element;
if (bean.isStateLess()) fStateLessBean = true;
if (bean.getAttrib() == BeanElement.READONLY) fWrite = false;
}
//Complex type support
//first I need to find out how many levels deep
if(fLevelsDeep == -1){
AttributeVisitor attributeVisitor = new AttributeVisitor();
LevelsDeepVisitorAction ldva = new LevelsDeepVisitorAction();
attributeVisitor.run(element,ldva);
fLevelsDeep = ldva.getLevelsDeep();
//check out the fields
FieldVisitor fieldVisitor = new FieldVisitor();
LevelsDeepVisitorAction ldva2 = new LevelsDeepVisitorAction();
fieldVisitor.run(element,ldva2);
if(fLevelsDeep < ldva2.getLevelsDeep())fLevelsDeep = ldva2.getLevelsDeep();
fLevelsDeep++;
}
fColspan = fLevelsDeep - fCurrentLevel;
//if we have a return param with no getter make sure we are on the
//attribute and not the parameter then return
if(getReturnParam() && element.getOwningElement() instanceof AttributeElementType &&(((AttributeElementType)element.getOwningElement()).getGetterMethod() == null) ) return Status.OK_STATUS;
//Code gen for all elements
if(fWrite){
fbuffer.append("<TR>" + StringUtils.NEWLINE);
for (int i = 0; i < fCurrentLevel;i++){
fbuffer.append("<TD WIDTH=\"5%\"></TD>" + StringUtils.NEWLINE);
}
fbuffer.append("<TD COLSPAN=\"" + fColspan + "\" ALIGN=\"LEFT\">" + element.getOwningElement().getName() + ":</TD>" + StringUtils.NEWLINE);
}
if(fIsSimple || TypeFactory.recognizedBean(element.getName())
|| (getReturnParam() && fStateLessBean)
|| (getReturnParam() && TypeFactory.isRecognizedReturnType(element.getTypeName()))){
if(getInstanceName().equals("")){
if(fWrite){
DataType dataType = TypeFactory.createType(element.getName(),element.getOwningElement().getMUID());
fbuffer.append(dataType.inputForm(element.getOwningElement().getMUID()));
}
}
else{
if(getReturnParam() && (TypeFactory.isRecognizedReturnType(element.getTypeName()) || fStateLessBean)){
DataType dataType = TypeFactory.createType(element.getTypeName(),element.getOwningElement().getMUID());
String uniqueName = "type" + dataType.getUniqueName();
fbuffer.append("<TD>" + StringUtils.NEWLINE);
fbuffer.append("<%" + StringUtils.NEWLINE);
fbuffer.append("if(" + getInstanceName() + " != null){" + StringUtils.NEWLINE);
String afterString = getInstanceName();
String tmpString = "tebece";
String prevString = getInstanceName();
String newTmpString = "";
for(int i=0;i<getterCount();i++){
newTmpString = tmpString + i;
fbuffer.append(returnParentGetterType(i) + " " + newTmpString + "=" + prevString + "." + returnParentGetter(i) + ";" + StringUtils.NEWLINE);
prevString = newTmpString;
fbuffer.append("if(" + newTmpString + " != null){" + StringUtils.NEWLINE);
afterString = newTmpString;
}
fbuffer.append(element.getName() + " " + uniqueName + " = " + afterString + "." + ((AttributeElementType)element.getOwningElement()).getGetterMethod()+ ";" + StringUtils.NEWLINE);
fbuffer.append(dataType.TypeConversion(uniqueName));
for(int i=0;i<getterCount();i++){
fbuffer.append("}");
}
fbuffer.append("}%>" + StringUtils.NEWLINE);
fbuffer.append("</TD>" + StringUtils.NEWLINE);
}
else{
fbuffer.append("<TD>" + StringUtils.NEWLINE);
fbuffer.append("<%" + StringUtils.NEWLINE);
fbuffer.append("if(" + getInstanceName() + " != null){" + StringUtils.NEWLINE);
String afterString = getInstanceName();
String tmpString = "tebece";
String prevString = getInstanceName();
String newTmpString = "";
for(int i=0;i<getterCount();i++){
newTmpString = tmpString + i;
fbuffer.append(returnParentGetterType(i) + " " + newTmpString + "=" + prevString + "." + returnParentGetter(i) + ";" + StringUtils.NEWLINE);
prevString = newTmpString;
fbuffer.append("if(" + newTmpString + " != null){" + StringUtils.NEWLINE);
afterString = newTmpString;
}
fbuffer.append("%>" + StringUtils.NEWLINE);
fbuffer.append("<%=");
fbuffer.append(afterString + "." + ((AttributeElementType)element.getOwningElement()).getGetterMethod()+ StringUtils.NEWLINE);
fbuffer.append("%>");
fbuffer.append("<%");
for(int i=0;i<getterCount();i++){
fbuffer.append("}");
}
fbuffer.append("}%>" + StringUtils.NEWLINE);
fbuffer.append("</TD>" + StringUtils.NEWLINE);
}
}
}
//Now carry on down the rest of the bean
else {
AttributeVisitor attributeVisitor = new AttributeVisitor();
attributeVisitor.setResidentVector1(returnParentGetter());
attributeVisitor.setResidentVector2(returnParentGetterType());
InputFileAttributeGenerator inputFileAttributeGenerator = new InputFileAttributeGenerator(fbuffer,(fCurrentLevel + 1),fLevelsDeep);
inputFileAttributeGenerator.setReturnParam(getReturnParam());
inputFileAttributeGenerator.setInstanceName(fInstanceName);
attributeVisitor.run(element,inputFileAttributeGenerator);
fbuffer = inputFileAttributeGenerator.getStringBuffer();
//now do fields very similar
FieldVisitor fieldVisitor = new FieldVisitor();
fieldVisitor.setResidentVector1(returnParentGetter());
fieldVisitor.setResidentVector2(returnParentGetterType());
InputFileAttributeGenerator inputFileAttributeGenerator2 = new InputFileAttributeGenerator(fbuffer,(fCurrentLevel + 1),fLevelsDeep);
inputFileAttributeGenerator2.setReturnParam(getReturnParam());
inputFileAttributeGenerator2.setInstanceName(fInstanceName);
fieldVisitor.run(element,inputFileAttributeGenerator2);
fbuffer = inputFileAttributeGenerator2.getStringBuffer();
}
return Status.OK_STATUS;
}
}