/******************************************************************************* * Copyright © 2011, 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.compiler.core.IEGLConstants; import org.eclipse.edt.gen.java.Context; import org.eclipse.edt.gen.java.templates.JavaTemplate; import org.eclipse.edt.mof.codegen.api.TabbedWriter; import org.eclipse.edt.mof.egl.Annotation; import org.eclipse.edt.mof.egl.Field; import org.eclipse.edt.mof.egl.Function; import org.eclipse.edt.mof.egl.FunctionInvocation; import org.eclipse.edt.mof.egl.FunctionParameter; import org.eclipse.edt.mof.egl.FunctionStatement; import org.eclipse.edt.mof.egl.MemberName; import org.eclipse.edt.mof.egl.NullLiteral; import org.eclipse.edt.mof.egl.ParameterKind; import org.eclipse.edt.mof.egl.ReturnStatement; import org.eclipse.edt.mof.egl.Statement; import org.eclipse.edt.mof.egl.Type; import org.eclipse.edt.mof.serialization.Environment; import org.eclipse.edt.mof.utils.EList; public class FunctionTemplate extends JavaTemplate implements Constants, org.eclipse.edt.gen.java.jee.Constants{ private MemberName createMember(FunctionParameter parameter){ MemberName mn = factory.createMemberName(); mn.setId(parameter.getCaseSensitiveName()); mn.setMember(parameter); return mn; } public void genFunctionBody(Function function, Context ctx, TabbedWriter out) { Annotation ibmiProgram = function.getAnnotation(signature_IBMiProgram); //remove the connection parameter function.getParameters().remove(function.getParameters().size() - 1); out.println("boolean returnConnectionToPool = false;"); //convert parameters to AS400 objects out.print("if("); out.print(as400ConnectionName); out.println(" == null){"); if (function.getAnnotation(org.eclipse.edt.gen.Constants.signature_Resource) != null) { Annotation annot = function.getAnnotation(org.eclipse.edt.gen.Constants.signature_Resource); Field field = factory.createField(); field.setName(as400ConnectionName); try { field.setType((Type)Environment.getCurrentEnv().find(Type.EGL_KeyScheme + Type.KeySchemeDelimiter + Constants.signature_IBMiConnection)); } catch (Exception e) {} ctx.invoke(genAnnotation, annot.getEClass(), ctx, out, annot, field); ctx.invoke(genStatementNoBraces, field.getInitializerStatements(), ctx, out); } else{ out.print(as400ConnectionName); out.print(" = "); out.print("null;"); } out.println("returnConnectionToPool = true;"); out.println("}"); Boolean isServiceProgram = (Boolean)ibmiProgram.getValue(subKey_isServiceProgram); String libraryName = (String)ibmiProgram.getValue(subKey_libraryName); String programName = (String)ibmiProgram.getValue(subKey_programName); if(!programName.isEmpty()){ programName += (isServiceProgram ? ".SRVPGM" : ".PGM"); } if(function.getType() != null){ out.print("Integer eze$Return = "); } out.print("org.eclipse.edt.java.jtopen.IBMiProgramCall.ezeRunProgram("); if(libraryName == null){ out.print("null"); out.print(", \""); } else{ out.print("\""); out.print(libraryName); out.print("\", \""); } out.print(programName); // Set the procedure to call in the service program. if(isServiceProgram){ out.print("\", \""); Annotation externalName = function.getAnnotation(org.eclipse.edt.gen.Constants.signature_ExternalName); String functionName = (String)ctx.getAttribute(function, subKey_realFunctionName); if(externalName != null){ functionName = (String)externalName.getValue(); } out.print(functionName); out.print("\", true, "); if(function.getType() == null){ out.print("false, "); } else{ out.print("true, "); } } else{ out.print("\", null, false, false, "); } //new ParameterTypeKind[] {ParameterTypeKind.INOUT, ParameterTypeKind.INOUT, ParameterTypeKind.INOUT out.print("new org.eclipse.edt.java.jtopen.IBMiProgramCall.ParameterTypeKind[] {"); boolean addComma = false; for(FunctionParameter param : function.getParameters()){ if(addComma){ out.print(", org.eclipse.edt.java.jtopen.IBMiProgramCall.ParameterTypeKind."); } else{ out.print("org.eclipse.edt.java.jtopen.IBMiProgramCall.ParameterTypeKind."); } if(param.getParameterKind() == ParameterKind.PARM_IN){ out.print("IN"); } else if(param.getParameterKind() == ParameterKind.PARM_INOUT){ out.print("INOUT"); } else{ out.print("OUT"); } addComma = true; } // new Object[] {CUST, EOF, COUNT}, out.print("}, new Object[] {"); ctx.foreach(function.getParameters(), ',', genName, ctx, out); out.print("}, "); out.print("new com.ibm.as400.access.AS400DataType[]{"); int idx = 0; @SuppressWarnings("unchecked") EList<Annotation> parameterAnnotationList = (EList<Annotation>)ibmiProgram.getValue(subKey_parameterAnnotations); for(FunctionParameter parameter : function.getParameters()){ if(idx > 0){ out.print(", "); } if(parameterAnnotationList != null && idx < parameterAnnotationList.size()){ Object annot = parameterAnnotationList.get(idx); if(annot instanceof Annotation){ org.eclipse.edt.gen.CommonUtilities.addGeneratorAnnotation(parameter, (Annotation)annot, ctx); } } idx++; AS400GenType.INSTANCE.genAS400Type(parameter, parameter.getType(), ctx, out); } out.print("}, "); out.print(as400ConnectionName); out.print(", \""); ctx.invoke(genName, function, ctx, out); out.println("\", this);"); out.println("if(returnConnectionToPool){"); out.print("eglx.jtopen.JTOpenConnections.getAS400ConnectionPool().returnConnectionToPool("); out.print(as400ConnectionName); out.println(".getAS400());"); out.println("}"); ctx.invoke(genArrayResize, function, ctx, out); if(function.getType() != null){ out.println("return eze$Return;"); } } public void genDeclaration(Function function, Context ctx, TabbedWriter out) { // Make sure IBMi runtime container is added to the build path. ctx.requireRuntimeContainer(Constants.IBMI_RUNTIME_CONTAINER_ID); ctx.invokeSuper(this, genDeclaration, createFunction(function, ctx), ctx, out); Function proxyFunction = CommonUtilities.createProxyFunction(function); ctx.putAttribute(proxyFunction, subKey_realFunctionName, function.getCaseSensitiveName()); ctx.invokeSuper(this, genDeclaration, proxyFunction, ctx, out); ctx.remove(proxyFunction); for(FunctionParameter parameter : function.getParameters()){ AS400GenHelper.INSTANCE.genHelperClass(parameter.getType(), ctx, out); } } private Function createFunction(Function function, Context ctx) { Function newFunction = factory.createFunction(); if (function.getAnnotation(IEGLConstants.EGL_LOCATION) != null) newFunction.addAnnotation(function.getAnnotation(IEGLConstants.EGL_LOCATION)); newFunction.setName(function.getCaseSensitiveName()); for(FunctionParameter parameter : function.getParameters()){ FunctionParameter newParameter = (FunctionParameter)parameter.clone(); newParameter.setContainer(newFunction); newFunction.addParameter(newParameter); } newFunction.setType(function.getType()); Statement stmt = createFunctionInvocationBody(newFunction); if (function.getAnnotation(IEGLConstants.EGL_LOCATION) != null) stmt.addAnnotation(function.getAnnotation(IEGLConstants.EGL_LOCATION)); newFunction.setStatementBlock(factory.createStatementBlock()); newFunction.getStatementBlock().setContainer(newFunction); newFunction.addStatement(stmt); return newFunction; } private Statement createFunctionInvocationBody(Function function) { //create a function invocation to access the proxy FunctionInvocation invoc = factory.createFunctionInvocation(); if (function.getAnnotation(IEGLConstants.EGL_LOCATION) != null) invoc.addAnnotation(function.getAnnotation(IEGLConstants.EGL_LOCATION)); Function proxy = CommonUtilities.createProxyFunction(function); proxy.setContainer(function.getContainer()); invoc.setTarget(proxy); invoc.setId(CommonUtilities.createProxyFunctionName(function)); for(FunctionParameter parameter : function.getParameters()){ invoc.getArguments().add(createMember(parameter)); } NullLiteral nullLit = factory.createNullLiteral(); invoc.getArguments().add(nullLit); Statement functionStatement; if(function.getReturnType() == null){ functionStatement = factory.createFunctionStatement(); functionStatement.setContainer(function); ((FunctionStatement)functionStatement).setExpr(invoc); } else{ functionStatement = factory.createReturnStatement(); functionStatement.setContainer(function); ((ReturnStatement)functionStatement).setExpression(invoc); } return functionStatement; } public void genArrayResize(Function function, Context ctx, TabbedWriter out){ for(FunctionParameter parameter : function.getParameters()){ AS400GenArrayResize.INSTANCE.genArrayResizeParameter(parameter, ctx, out, function); } } }