/******************************************************************************* * Copyright © 2012, 2013 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.edt.gen.java.templates.eglx.jtopen; import org.eclipse.edt.gen.java.Context; import org.eclipse.edt.gen.java.templates.JavaTemplate; import org.eclipse.edt.gen.java.templates.JavaTemplate.TypeNameKind; import org.eclipse.edt.gen.java.templates.eglx.lang.TimestampTypeTemplate; import org.eclipse.edt.mof.codegen.api.TabbedWriter; import org.eclipse.edt.mof.egl.Annotation; import org.eclipse.edt.mof.egl.ArrayType; import org.eclipse.edt.mof.egl.Expression; import org.eclipse.edt.mof.egl.FixedPrecisionType; import org.eclipse.edt.mof.egl.Handler; import org.eclipse.edt.mof.egl.LogicAndDataPart; import org.eclipse.edt.mof.egl.Member; import org.eclipse.edt.mof.egl.Record; import org.eclipse.edt.mof.egl.SequenceType; import org.eclipse.edt.mof.egl.TimestampType; import org.eclipse.edt.mof.egl.Type; import org.eclipse.edt.mof.egl.utils.TypeUtils; public class AS400GenType { static AS400GenType INSTANCE = new AS400GenType(); public void genAS400Type(Member member, Type type, Context ctx, TabbedWriter out){ out.print("new "); Annotation annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructBin1, ctx); if((annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructBin1, ctx)) != null){ out.print("org.eclipse.edt.java.jtopen.access.AS400Bin1()"); } else if((annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructBin2, ctx)) != null){ genAS400Bin2(out); } else if((annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructBin4, ctx)) != null){ genAS400Bin4(out); } else if((annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructBin8, ctx)) != null){ genAS400Bin8(out); } else if((annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructUnsignedBin1, ctx)) != null){ out.print("com.ibm.as400.access.AS400UnsignedBin1()"); } else if((annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructUnsignedBin2, ctx)) != null){ out.print("com.ibm.as400.access.AS400UnsignedBin2()"); } else if((annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructUnsignedBin4, ctx)) != null){ out.print("com.ibm.as400.access.AS400UnsignedBin4()"); } else if((annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructUnsignedBin8, ctx)) != null){ out.print("org.eclipse.edt.java.jtopen.access.AS400UnsignedBin8()"); } else if((annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructZonedDecimal, ctx)) != null){ out.print("com.ibm.as400.access.AS400ZonedDecimal("); genLength(type, out, annot); out.print(", "); genDecimals(type, out, annot); out.print(")"); } else if((annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructDecFloat, ctx)) != null){ out.print("com.ibm.as400.access.AS400DecFloat("); if(annot.getValue(Constants.subKey_length) != null){ out.print(((Integer)annot.getValue(Constants.subKey_length)).toString()); } else{ out.print("unknown"); } out.print(")"); } else if((annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructPackedDecimal, ctx)) != null){ genAS400PackedDecimal(type, ctx, out, annot); } else if((annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructFloat4, ctx)) != null){ genAS400Float4(out); } else if((annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructFloat8, ctx)) != null){ genAS400Float8(out); } else if((annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructDate, ctx)) != null){ genAS400Date(member, type, annot, ctx, out); } else if((annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructText, ctx)) != null){ genAS400Text(member, type, annot, ctx, out); } else if((annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructTimestamp, ctx)) != null){ genAS400Timestamp(type, ctx, out, annot); } else if((annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructTime, ctx)) != null){ genAS400Time(member, type, annot, ctx, out); } else if((annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructByteArray, ctx)) != null){ genAS400ByteArray(member, type, annot, ctx, out); } else if(type instanceof ArrayType && (annot = org.eclipse.edt.gen.CommonUtilities.getAnnotation(member, Constants.signature_StructArray, ctx)) != null){ out.print("org.eclipse.edt.java.jtopen.access.AS400Array("); if(annot != null){ org.eclipse.edt.gen.CommonUtilities.addGeneratorAnnotation(member, (Annotation)annot.getValue(Constants.subKey_elementTypeAnnotation), ctx); } genAS400Type(member, ((ArrayType)type).getElementType(), ctx, out); out.print(", "); ctx.invoke(JavaTemplate.genRuntimeTypeName, ((ArrayType)type).getElementType(), ctx, out, TypeNameKind.EGLImplementation); out.print(".class, "); Integer elementCount = null; if(annot != null){ elementCount = (Integer)annot.getValue(Constants.subKey_elementCount); } if(elementCount != null){ out.print(elementCount.toString()); } else{ out.print("unknown"); } out.print(")"); } else if (type.getClassifier().equals(TypeUtils.Type_BIGINT)){ genAS400Bin8(out); } else if (type.getClassifier().equals(TypeUtils.Type_DATE)){ genAS400Date(member, type, null, ctx, out); } else if (type.getClassifier().equals(TypeUtils.Type_DECIMAL)){ genAS400PackedDecimal(type, ctx, out, annot); } else if (type.getClassifier().equals(TypeUtils.Type_FLOAT)){ genAS400Float8(out); } else if (type.getClassifier().equals(TypeUtils.Type_INT)){ genAS400Bin4(out); } else if (type.getClassifier().equals(TypeUtils.Type_SMALLFLOAT)){ genAS400Float4(out); } else if (type.getClassifier().equals(TypeUtils.Type_SMALLINT)){ genAS400Bin2(out); } else if (type.getClassifier().equals(TypeUtils.Type_STRING)){ genAS400Text(member, type, null, ctx, out); } else if (type.getClassifier().equals(TypeUtils.Type_TIMESTAMP)){ genAS400Timestamp(type, ctx, out, annot); } else if (type.getClassifier().equals(TypeUtils.Type_TIME)){ genAS400Time(member, type, null, ctx, out); } else if (type.getClassifier().equals(TypeUtils.Type_BYTES)){ genAS400ByteArray(member, type, null, ctx, out); } else if (type instanceof Record){ genAS400Structure((LogicAndDataPart)type, out); } else if (type instanceof Handler){ genAS400Structure((LogicAndDataPart)type, out); } else{ out.print("unknown"); } } private void genAS400ByteArray(Member member, Type type, Annotation annot, Context ctx, TabbedWriter out) { out.print("com.ibm.as400.access.AS400ByteArray("); genLength(type, out, annot); out.print(")"); } private void genAS400Time(Member member, Type type, Annotation annot, Context ctx, TabbedWriter out) { out.print("org.eclipse.edt.java.jtopen.access.AS400Time("); genAS400AnnotationIBMiFormat(annot, ctx, out); genAS400AnnotationIBMiSeparatorChar(annot, ctx, out); genTimezone(out, annot); out.print(", "); out.print(Constants.as400ConnectionName); out.print(")"); } private void genAS400Date(Member member, Type type, Annotation annot, Context ctx, TabbedWriter out) { out.print("org.eclipse.edt.java.jtopen.access.AS400Date("); genAS400AnnotationIBMiFormat(annot, ctx, out); genAS400AnnotationIBMiSeparatorChar(annot, ctx, out); genTimezone(out, annot); out.print(", "); out.print(Constants.as400ConnectionName); out.print(")"); } private void genAS400AnnotationIBMiSeparatorChar(Annotation annot, Context ctx, TabbedWriter out){ String ibmiSeperator = annot == null ? "" : (String)annot.getValue(Constants.subKey_ibmiSeparatorChar); if(ibmiSeperator != null){ out.print(", \""); out.print(ibmiSeperator); out.print("\""); } else{ out.print(", null"); } } private void genAS400AnnotationIBMiFormat(Annotation annot, Context ctx, TabbedWriter out){ Expression ibmiFormat = annot == null ? null : (Expression)annot.getValue(Constants.subKey_ibmiFormat); if(ibmiFormat != null){ ctx.invoke(org.eclipse.edt.gen.java.templates.JavaTemplate.genExpression, ibmiFormat, ctx, out); } else{ out.print("null"); } } private void genAS400Timestamp(Type type, Context ctx, TabbedWriter out, Annotation annot) { out.print("org.eclipse.edt.java.jtopen.access.AS400Timestamp(null,"); genTimestampPattern(type, ctx, out, annot); genTimezone(out, annot); out.print(", "); out.print(Constants.as400ConnectionName); out.print(")"); } private void genTimezone(TabbedWriter out, Annotation annot) { String timeZone = annot == null ? null : (String)annot.getValue(Constants.subKey_timeZoneID); if(timeZone != null && !timeZone.isEmpty()){ out.print(", \""); out.print(timeZone); out.print("\""); } else{ out.print(", null"); } } private void genAS400Text(Member member, Type type, Annotation annot, Context ctx, TabbedWriter out) { out.print("org.eclipse.edt.java.jtopen.access.AS400Text("); genLength(type, out, annot); out.print(", "); String encoding = annot == null ? null : (String)annot.getValue(Constants.subKey_encoding); if(encoding != null && !encoding.isEmpty()){ out.print("\""); out.print(encoding); out.print("\""); } else{ out.print(Constants.as400ConnectionName); } out.print(", "); Boolean preserveTrailingSpaces = annot == null ? null :(Boolean)annot.getValue(Constants.subKey_preserveTrailingSpaces); if(preserveTrailingSpaces != null){ out.print(preserveTrailingSpaces.toString()); } else{ out.print("false"); } out.print(")"); } private void genAS400Float8(TabbedWriter out) { out.print("com.ibm.as400.access.AS400Float8()"); } private void genAS400Float4(TabbedWriter out) { out.print("com.ibm.as400.access.AS400Float4()"); } private void genAS400PackedDecimal(Type type, Context ctx, TabbedWriter out, Annotation annot) { out.print("com.ibm.as400.access.AS400PackedDecimal("); genLength(type, out, annot); out.print(", "); genDecimals(type, out, annot); out.print(")"); } private void genAS400Bin2(TabbedWriter out) { out.print("com.ibm.as400.access.AS400Bin2()"); } private void genAS400Bin4(TabbedWriter out) { out.print("com.ibm.as400.access.AS400Bin4()"); } private void genAS400Bin8(TabbedWriter out) { out.print("com.ibm.as400.access.AS400Bin8()"); } public void genAS400Structure(LogicAndDataPart type, TabbedWriter out){ AS400GenHelper.genHelperClassName(type, out); out.print("().getAS400Structure("); out.print(Constants.as400ConnectionName); out.print(")"); } private void genDecimals(Type type, TabbedWriter out, Annotation typeAnnot) { if(type instanceof FixedPrecisionType){ out.print(((FixedPrecisionType)type).getDecimals()); } else if(typeAnnot != null && typeAnnot.getValue(Constants.subKey_decimals) != null){ out.print(((Integer)typeAnnot.getValue(Constants.subKey_decimals)).toString()); } else { out.print("unknown"); } } private void genLength(Type type, TabbedWriter out, Annotation typeAnnot) { if(type instanceof FixedPrecisionType){ out.print(((FixedPrecisionType)type).getLength()); } else if(type instanceof SequenceType){ out.print(((SequenceType)type).getLength()); } else if(type instanceof SequenceType){ out.print(((SequenceType)type).getLength()); } else if(typeAnnot != null && typeAnnot.getValue(Constants.subKey_length) != null){ out.print(((Integer)typeAnnot.getValue(Constants.subKey_length)).toString()); } else { out.print("unknown"); } } private void genTimestampPattern(Type type, Context ctx, TabbedWriter out, Annotation typeAnnot){ String eglPattern = typeAnnot == null ? null : (String)typeAnnot.getValue(Constants.subKey_eglPattern); if(type instanceof TimestampType){ new TimestampTypeTemplate().generateOptions((TimestampType)type, ctx, out); } else if(eglPattern != null && !eglPattern.isEmpty()){ new TimestampTypeTemplate().generateOptions(type, ctx, out, eglPattern); } else { out.print("unknown, unknown"); } } }