diff --git a/gxdynamiccall/client.cfg b/gxdynamiccall/client.cfg new file mode 100644 index 000000000..728e2a37d --- /dev/null +++ b/gxdynamiccall/client.cfg @@ -0,0 +1,127 @@ +[Client] +MODEL_NUM= 2 +GENERATOR_NUM= 12 +LOGIN_AS_USERID=0 +SMTP_HOST= +NAME_SPACE= com.genexus.gxdynamiccall.test +NAME_HOST= +CORBA_SERVER_NAME= +DCOM_GUID= +CONN_TIMEOUT=300 +HELP_MODE=WINHTML +HELP_BASEURL= +PREFERRED_UI=BEST +JFC_LF=NATIVE +CALENDAR=1 +CALC=1 +WP_RESIZE=1 +SHOW_STATUS=1 +FIELD_EXIT=Tab +ESCAPE_FUNCTION=Exit_form +KEY_REFRESH=5 +KEY_PROMPT=4 +MDI_FORMS=1 +REMOTE_CALLS=NEVER +IMAGE_SUBST=0 +CS_CONNECT=First +CS_REORG=1 +CS_REORGJAVA=1 +SUBFILE_ORDER=Y +FC_READONLY=GRAYED +PACKAGE=com.genexus.gxdynamiccall.test +DECIMAL_POINT=. +DATE_FMT= MDY +CTOD_DATE_FMT= L +BLANK_EMPTY_DATE=0 +TIME_FMT=12 +YEAR_LIMIT=40 +COMPRESS_HTML=1 +DocumentType=HTML5 +IE_COMPATIBILITY_VIEW=EmulateIE7 +EXPOSE_METADATA= 0 +WEB_IMAGE_DIR=/static +HTTP_BACKEND_URL= +WEB_STATIC_DIR= +ORQ_CLIENT_URL= +ORQ_SERVER_DIR= +TMPMEDIA_DIR=PrivateTempStorage +PRINT_LAYOUT_METADATA_DIR=LayoutMetadata +HTTP_PROTOCOL=Unsecure +SAMESITE_COOKIE=Lax +StorageTimeZone= 1 +GX_BUILD_NUMBER=1302769 +ODBC_CALLS=0 +NameSpace1= com.genexus.gxdynamiccall.test +LANGUAGE=eng +LANG_NAME=English +Theme=Carmine +CS_BLOB_PATH=PublicTempStorage +SUBMIT_POOL_SIZE=5 +CACHE_TTL_0=-1 +CACHE_TTL_1=60 +CACHE_TTL_2=600 +CACHE_TTL_3=0 +CACHE_STORAGE_SIZE=0 +CACHING=0 +SMART_CACHING=0 +CACHE_INVALIDATION_TOKEN=20224512174246 +EVENT_BEFORE_COMMIT= +EVENT_AFTER_COMMIT= +EVENT_BEFORE_ROLLBACK= +EVENT_AFTER_ROLLBACK= +EVENT_BEFORE_CONNECT= +EVENT_AFTER_CONNECT= +ENABLE_MANAGEMENT=0 +EnableIntegratedSecurity=0 +IntegratedSecurityLoginWeb= +IntegratedSecurityNotAuthorizedWeb= +HTTPCLIENT_MAX_SIZE=1000 +HTTPCLIENT_MAX_PER_ROUTE=1000 +VER_STAMP= +[language|English] +code= eng +time_fmt= 12 +decimal_point= . +thousand_sep= , +date_fmt= MDY +culture= en-US +[com.genexus.gxdynamiccall.test] +GXDB_LOCATION= +JTA=0 +DataSource1=DEFAULT +JDBC_LOG= +JDBCLogEnabled=0 +JDBCUniqueName=0 +JDBCLogPath= +JDBCLogLevel=0 +JDBCLogBuffer=0 +JDBCLogDetail=0 +[com.genexus.gxdynamiccall.test|DEFAULT] +CS_DBNAME=KbPrueba +INFORMIX_DB=ANSI +CS_LIBL400= +CS_PACKAGE400= +DB2400_DATE_DATATYPE= +CS_SCHEMA= +USER_ID=Elj20MqY44RPdvT8FEpDD0== +USER_PASSWORD=tjRYpiaJ+HYQ0GpWgRGwfo8w59nKWO7H1rRFYPoZo/w= +CS_CONNECT=First +WAIT_RECORD=0 +LOCK_RETRY=10 +LoginInServer=1 +JDBC_DRIVER=net.sourceforge.jtds.jdbc.Driver +DB_URL=jdbc:jtds:sqlserver://GXN1088:1433/KbPrueba +USE_JDBC_DATASOURCE=0 +JDBC_DATASOURCE= +MAX_CURSOR=100 +INITIALIZE_NEW=1 +ISOLATION_LEVEL=CR +XBASE_TINT=1 +DBMS=sqlserver +UnlimitedRWPool=1 +PoolRWEnabled=1 +RecycleRW=1 +RecycleRWType=1 +RecycleRWMin=30 +POOLSIZE_RW=10 +POOL_STARTUP=0 diff --git a/gxdynamiccall/pom.xml b/gxdynamiccall/pom.xml new file mode 100644 index 000000000..39e0493b6 --- /dev/null +++ b/gxdynamiccall/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + + + com.genexus + parent + ${revision}${changelist} + + + gxdynamiccall + GeneXus DynamicCall external object + + + + ${project.groupId} + gxcommon + ${project.version} + + + ${project.groupId} + gxclassR + ${project.version} + + + diff --git a/gxdynamiccall/server.cfg b/gxdynamiccall/server.cfg new file mode 100644 index 000000000..362cf5617 --- /dev/null +++ b/gxdynamiccall/server.cfg @@ -0,0 +1,127 @@ +[Client] +MODEL_NUM= 2 +GENERATOR_NUM= 12 +LOGIN_AS_USERID=0 +SMTP_HOST= +NAME_SPACE= com.genexus.gxdynamiccall.test +NAME_HOST= +CORBA_SERVER_NAME= +DCOM_GUID= +CONN_TIMEOUT=300 +HELP_MODE=WINHTML +HELP_BASEURL= +PREFERRED_UI=BEST +JFC_LF=NATIVE +CALENDAR=1 +CALC=1 +WP_RESIZE=1 +SHOW_STATUS=1 +FIELD_EXIT=Tab +ESCAPE_FUNCTION=Exit_form +KEY_REFRESH=5 +KEY_PROMPT=4 +MDI_FORMS=1 +REMOTE_CALLS=NEVER +IMAGE_SUBST=0 +CS_CONNECT=First +CS_REORG=1 +CS_REORGJAVA=1 +SUBFILE_ORDER=Y +FC_READONLY=GRAYED +PACKAGE=com.genexus.gxdynamiccall.test +DECIMAL_POINT=. +DATE_FMT= MDY +CTOD_DATE_FMT= L +BLANK_EMPTY_DATE=0 +TIME_FMT=12 +YEAR_LIMIT=40 +COMPRESS_HTML=1 +DocumentType=HTML5 +IE_COMPATIBILITY_VIEW=EmulateIE7 +EXPOSE_METADATA= 0 +WEB_IMAGE_DIR=/static +HTTP_BACKEND_URL= +WEB_STATIC_DIR= +ORQ_CLIENT_URL= +ORQ_SERVER_DIR= +TMPMEDIA_DIR=PrivateTempStorage +PRINT_LAYOUT_METADATA_DIR=LayoutMetadata +HTTP_PROTOCOL=Unsecure +SAMESITE_COOKIE=Lax +StorageTimeZone= 1 +GX_BUILD_NUMBER=1302769 +ODBC_CALLS=0 +NameSpace1= com.genexus.gxdynamiccall.test +LANGUAGE=eng +LANG_NAME=English +Theme=Carmine +CS_BLOB_PATH=PublicTempStorage +SUBMIT_POOL_SIZE=5 +CACHE_TTL_0=-1 +CACHE_TTL_1=60 +CACHE_TTL_2=600 +CACHE_TTL_3=0 +CACHE_STORAGE_SIZE=0 +CACHING=0 +SMART_CACHING=0 +CACHE_INVALIDATION_TOKEN=20224512174246 +EVENT_BEFORE_COMMIT= +EVENT_AFTER_COMMIT= +EVENT_BEFORE_ROLLBACK= +EVENT_AFTER_ROLLBACK= +EVENT_BEFORE_CONNECT= +EVENT_AFTER_CONNECT= +ENABLE_MANAGEMENT=0 +EnableIntegratedSecurity=0 +IntegratedSecurityLoginWeb= +IntegratedSecurityNotAuthorizedWeb= +HTTPCLIENT_MAX_SIZE=1000 +HTTPCLIENT_MAX_PER_ROUTE=1000 +VER_STAMP= +[language|English] +code= eng +time_fmt= 12 +decimal_point= . +thousand_sep= , +date_fmt= MDY +culture= en-US +[com.genexus.gxdynamiccall.test] +GXDB_LOCATION= +JTA=0 +DataSource1=DEFAULT +JDBC_LOG= +JDBCLogEnabled=0 +JDBCUniqueName=0 +JDBCLogPath= +JDBCLogLevel=0 +JDBCLogBuffer=0 +JDBCLogDetail=0 +[com.genexus.gxdynamiccall.test|DEFAULT] +CS_DBNAME=KbPrueba +INFORMIX_DB=ANSI +CS_LIBL400= +CS_PACKAGE400= +DB2400_DATE_DATATYPE= +CS_SCHEMA= +USER_ID=Elj20MqY44RPdvT8FEpDD0== +USER_PASSWORD=tjRYpiaJ+HYQ0GpWgRGwfo8w59nKWO7H1rRFYPoZo/w= +CS_CONNECT=First +WAIT_RECORD=0 +LOCK_RETRY=10 +LoginInServer=1 +JDBC_DRIVER=net.sourceforge.jtds.jdbc.Driver +DB_URL=jdbc:jtds:sqlserver://GXN1088:1433/KbPrueba +USE_JDBC_DATASOURCE=0 +JDBC_DATASOURCE= +MAX_CURSOR=100 +INITIALIZE_NEW=1 +ISOLATION_LEVEL=CR +XBASE_TINT=1 +DBMS=sqlserver +UnlimitedRWPool=1 +PoolRWEnabled=1 +RecycleRW=1 +RecycleRWType=1 +RecycleRWMin=30 +POOLSIZE_RW=10 +POOL_STARTUP=0 diff --git a/gxdynamiccall/src/main/java/com/genexus/gxdynamiccall/GXDynCallMethodConf.java b/gxdynamiccall/src/main/java/com/genexus/gxdynamiccall/GXDynCallMethodConf.java new file mode 100644 index 000000000..b2678d320 --- /dev/null +++ b/gxdynamiccall/src/main/java/com/genexus/gxdynamiccall/GXDynCallMethodConf.java @@ -0,0 +1,27 @@ +package com.genexus.gxdynamiccall; + +public class GXDynCallMethodConf { + private boolean isStatic; + private String methodName; + + public GXDynCallMethodConf(){ + isStatic=false; + methodName="execute"; + } + + public void setIsStatic(boolean is){ + isStatic=is; + } + public boolean getIsStatic(){ + return isStatic; + } + + public void setMethodName(String mn){ + methodName=mn; + } + + public String getMethodName(){ + return methodName; + } + +} diff --git a/gxdynamiccall/src/main/java/com/genexus/gxdynamiccall/GXDynCallProperties.java b/gxdynamiccall/src/main/java/com/genexus/gxdynamiccall/GXDynCallProperties.java new file mode 100644 index 000000000..3e168defa --- /dev/null +++ b/gxdynamiccall/src/main/java/com/genexus/gxdynamiccall/GXDynCallProperties.java @@ -0,0 +1,23 @@ +package com.genexus.gxdynamiccall; + +public class GXDynCallProperties { + private String externalName; + private String packageName; + + public String getExternalName() { + return externalName; + } + public void setExternalName(String name) { + externalName = name; + } + public String getPackageName() { + return packageName; + } + public void setPackageName(String packageN) { + packageName = packageN; + } + + + + +} diff --git a/gxdynamiccall/src/main/java/com/genexus/gxdynamiccall/GXDynamicCall.java b/gxdynamiccall/src/main/java/com/genexus/gxdynamiccall/GXDynamicCall.java new file mode 100644 index 000000000..d514b8daa --- /dev/null +++ b/gxdynamiccall/src/main/java/com/genexus/gxdynamiccall/GXDynamicCall.java @@ -0,0 +1,267 @@ +package com.genexus.gxdynamiccall; + +import java.lang.reflect.Array; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.Vector; + +import com.genexus.CommonUtil; +import com.genexus.GXBaseCollection; +import com.genexus.SdtMessages_Message; +import com.genexus.common.interfaces.SpecificImplementation; + +public class GXDynamicCall { + + private GXDynCallProperties properties; + private Object instanceObject; + private String objectName; + + public GXDynamicCall(){ + properties = new GXDynCallProperties(); + properties.setPackageName(SpecificImplementation.Application.getPACKAGE()); + } + + public GXDynCallProperties getProperties() { + return properties; + } + + public void setProperties(GXDynCallProperties properties) { + this.properties = properties; + } + + public String getObjectName(){ + return objectName; + + } + + public void setObjectName(String name){ + objectName=name; + properties.setExternalName(name); + } + + public void execute(Vector parameters, Vector errorsArray) { + //Create the instance with default constructor + create(null, errorsArray); + //Create methodconfiguration + if(errorsArray.size()==0){ + GXDynCallMethodConf method = new GXDynCallMethodConf(); + //Execute with default method configuration + execute(parameters, method, errorsArray); + } + } + + public Object execute(Vector parameters, GXDynCallMethodConf methodConfiguration, Vector errorsArray) { + + GXBaseCollection errors =new GXBaseCollection(); + Object result=null; + Object objectToInvoke; + if (!methodConfiguration.getIsStatic()) + { + if (instanceObject != null) + { + objectToInvoke = instanceObject; + } + else + { + objectToInvoke=null; + CommonUtil.ErrorToMessages("NullInstance Error", "You must invoke create method before execute a non static one", errors); + errorsArray.addAll(errors.getStruct()); + return null; + } + } + else + { + Class auxClass=null; + try { + auxClass = loadClass(properties.getExternalName(),properties.getPackageName()); + } catch (ClassNotFoundException e) { + CommonUtil.ErrorToMessages("Load class Error", e.getMessage(), errors); + errorsArray.addAll(errors.getStruct()); + return null; + } + objectToInvoke=auxClass; + } + result = executeMethod(objectToInvoke,methodConfiguration.getMethodName(), parameters, errors, methodConfiguration.getIsStatic()); + errorsArray.addAll(errors.getStruct()); + return result; + } + + public void create(Vector constructParameters, Vector errors) { + GXBaseCollection error =new GXBaseCollection(); + String objectNameToInvoke; + Constructor constructor=null; + objectNameToInvoke = constructParameters==null?objectName:properties.getExternalName(); + if (!objectNameToInvoke.isEmpty()) { + try { + Class objClass = loadClass(objectNameToInvoke, properties.getPackageName()); + Object[] auxConstParameters; + Class[] auxConstructorTypes; + if (constructParameters != null && constructParameters.size() > 0) { + auxConstructorTypes = new Class[constructParameters.size()]; + auxConstParameters = constructParameters.toArray(); + int i = 0; + for (Object obj : constructParameters) { + auxConstructorTypes[i] = obj.getClass(); + i++; + } + } else { + auxConstParameters = new Object[] {Integer.valueOf(-1)}; + auxConstructorTypes = new Class[] {int.class}; + } + try{ + constructor = objClass.getConstructor(auxConstructorTypes); + }catch(Exception e1){ + Constructor [] constructors = objClass.getConstructors(); + for (Constructor acutualCons : constructors) { + if(acutualCons.getParameterCount() == Array.getLength(auxConstParameters)){ + constructor=acutualCons; + + } + } + } + if(constructor != null){ + instanceObject=constructor.newInstance(auxConstParameters); + } + else{ + CommonUtil.ErrorToMessages("CreateInstance Error", "None constructor found", error); + errors.addAll(error.getStruct()); + return; + } + } catch (Exception e) { + CommonUtil.ErrorToMessages("CreateInstance Error", e.getMessage(), error); + e.printStackTrace(); + errors.addAll(error.getStruct()); + return; + } + } + else{ + CommonUtil.ErrorToMessages("CreateInstance Error", "Object name not set", error); + errors.addAll(error.getStruct()); + return; + } + + } + + private Object executeMethod(Object objectToInvoke, String method, Vector params, GXBaseCollection errors, boolean isStatic) { + + Object returnObject = null; + Method[] methods; + Method methodToExecute = null; + Class[] paramsType=new Class[params.size()]; + Object[] callingParams = new Object[params.size()]; // Array to pass to method.invoke + try{ + for (int i=0; i < params.size(); i++) { + paramsType[i]=params.get(i).getClass(); + } + if(isStatic){ + methodToExecute = ((Class)objectToInvoke).getDeclaredMethod(method,paramsType); + }else{ + methodToExecute = objectToInvoke.getClass().getMethod(method,paramsType); + } + } + catch(NoSuchMethodException e){ + + if(isStatic){ + methods = ((Class)objectToInvoke).getDeclaredMethods(); + }else{ + methods = objectToInvoke.getClass().getMethods(); + } + for (int i = 0; i < methods.length; i++) { + if (methods[i].getName().equalsIgnoreCase(method) && methods[i].getParameterCount() == params.size()) { + methodToExecute = methods[i]; + } + } + if (methodToExecute != null) { + // Create the parameters with the expected type in the method signe + Class[] destParmTypes = methodToExecute.getParameterTypes(); + Class destClass; + int i = 0; + for (Class parmType : destParmTypes) { + boolean destIsArray = parmType.isArray(); + Object parm = params.elementAt(i); + + try { + if (destIsArray) { + destClass = parmType.getComponentType(); + Object[] array = (Object[]) Array.newInstance(destClass, 1); + if (parm.getClass() != destClass) { + if (parm.getClass() != String.class) { // To avoid convert from string + array[0] = CommonUtil.convertObjectTo(parm, destClass); + } else { + CommonUtil.ErrorToMessages("CallMethod Error", "IllegalArgumentException - Type does not match", errors); + return null; + } + } else { + array[0] = parm; + } + callingParams[i] = array; + } else { + if (parm.getClass() != parmType) { + if (parm.getClass() != String.class) { // To avoid convert from string + callingParams[i] = CommonUtil.convertObjectTo(parm,parmType); + } else { + CommonUtil.ErrorToMessages("CallMethod Error", "IllegalArgumentException - Type does not match", errors); + return null; + } + } else { + callingParams[i] = parm; + } + } + i++; + } catch (Exception ex) { + CommonUtil.ErrorToMessages("CallMethod Error", ex.getMessage(), errors); + return null; + } + } + } + else{ + CommonUtil.ErrorToMessages("CallMethod Error","NoSuchMethodException - Cant finde method: " + method + "with " + params.size() + " parameters", errors); + return null; + } + } + + try { + // Execute the method + returnObject = methodToExecute.invoke(isStatic?null:objectToInvoke, callingParams); + updateParams(params, callingParams); + } catch (Exception e) { + CommonUtil.ErrorToMessages("CallMethod Error", e.getMessage(), errors); + return null; + } + + return returnObject; + } + + private static void updateParams(Vector originalParameter, Object[] callingParams) + throws Exception { + + for (int i = 0; i < callingParams.length; i++) { + Object parm = originalParameter.get(i); + Object objectToUpdate; + if (callingParams[i].getClass().isArray()) { + Object[] auxArg = (Object[]) callingParams[i]; + if (auxArg[0].getClass() != parm.getClass()) { + objectToUpdate = CommonUtil.convertObjectTo(auxArg[0], parm.getClass()); + } else { + objectToUpdate = auxArg[0]; + } + } else { + if (callingParams[i].getClass() != parm.getClass()) { + objectToUpdate = CommonUtil.convertObjectTo(callingParams[i], parm.getClass()); + } else { + objectToUpdate = callingParams[i]; + } + } + originalParameter.set(i, objectToUpdate); + } + } + + private Class loadClass(String className, String sPackage) throws ClassNotFoundException { + String classPackage=""; + if(sPackage != null) + classPackage+= sPackage + "."; + classPackage+= className; + Class c = Class.forName(classPackage);; + return c; + } +} \ No newline at end of file diff --git a/gxdynamiccall/src/test/java/com/genexus/gxdynamiccall/test/DynamicCallExternalTestProcedure.java b/gxdynamiccall/src/test/java/com/genexus/gxdynamiccall/test/DynamicCallExternalTestProcedure.java new file mode 100644 index 000000000..b3172693a --- /dev/null +++ b/gxdynamiccall/src/test/java/com/genexus/gxdynamiccall/test/DynamicCallExternalTestProcedure.java @@ -0,0 +1,17 @@ +package com.genexus.gxdynamiccall.test; + +public class DynamicCallExternalTestProcedure { + private int multiplier = 1; + public DynamicCallExternalTestProcedure(int multiplier){ + this.multiplier=multiplier; + } + + public String calculateAsString(int a, int b) { + return String.valueOf((a + b )* multiplier); + } + + public static String sumAsString(int a, int b){ + return String.valueOf((a + b )); + } + +} diff --git a/gxdynamiccall/src/test/java/com/genexus/gxdynamiccall/test/DynamicCallTestProcedure.java b/gxdynamiccall/src/test/java/com/genexus/gxdynamiccall/test/DynamicCallTestProcedure.java new file mode 100644 index 000000000..d14e388ea --- /dev/null +++ b/gxdynamiccall/src/test/java/com/genexus/gxdynamiccall/test/DynamicCallTestProcedure.java @@ -0,0 +1,78 @@ +package com.genexus.gxdynamiccall.test; +import com.genexus.*; + +public final class DynamicCallTestProcedure extends GXProcedure +{ + public DynamicCallTestProcedure( int remoteHandle ) + { + super( remoteHandle , new ModelContext( DynamicCallTestProcedure.class ), "" ); + } + + public DynamicCallTestProcedure( int remoteHandle , + ModelContext context ) + { + super( remoteHandle , context, "" ); + } + + @SuppressWarnings("unchecked") + public String executeUdp( short aP0 , + short aP1 ) + { + DynamicCallTestProcedure.this.aP2 = new String[] {""}; + execute_int(aP0, aP1, aP2); + return aP2[0]; + } + + public void execute( short aP0 , + short aP1 , + String[] aP2 ) + { + execute_int(aP0, aP1, aP2); + } + + private void execute_int( short aP0 , + short aP1 , + String[] aP2 ) + { + DynamicCallTestProcedure.this.AV8varchar1 = aP0; + DynamicCallTestProcedure.this.AV9varchar2 = aP1; + DynamicCallTestProcedure.this.aP2 = aP2; + initialize(); + /* GeneXus formulas */ + /* Output device settings */ + privateExecute(); + } + + private void privateExecute( ) + { + AV11numAux = (short)(AV8varchar1+AV9varchar2) ; + AV10varchar3 = GXutil.str( AV11numAux, 4, 0) ; + cleanup(); + } + + protected void cleanup( ) + { + this.aP2[0] = DynamicCallTestProcedure.this.AV10varchar3; + CloseOpenCursors(); + exitApp(); + } + + protected void CloseOpenCursors( ) + { + } + + /* Aggregate/select formulas */ + public void initialize( ) + { + AV10varchar3 = "" ; + /* GeneXus formulas. */ + Gx_err = (short)(0) ; + } + + private short AV8varchar1 ; + private short AV9varchar2 ; + private short AV11numAux ; + private short Gx_err ; + private String AV10varchar3 ; + private String[] aP2 ; +} diff --git a/gxdynamiccall/src/test/java/com/genexus/gxdynamiccall/test/GXcfg.java b/gxdynamiccall/src/test/java/com/genexus/gxdynamiccall/test/GXcfg.java new file mode 100644 index 000000000..ee785eef2 --- /dev/null +++ b/gxdynamiccall/src/test/java/com/genexus/gxdynamiccall/test/GXcfg.java @@ -0,0 +1,12 @@ +package com.genexus.gxdynamiccall.test; +import com.genexus.*; + +public final class GXcfg +{ + public static int strcmp( String Left , + String Right ) + { + return GXutil.rtrim(Left).compareTo(GXutil.rtrim(Right)); + } + +} \ No newline at end of file diff --git a/gxdynamiccall/src/test/java/com/genexus/gxdynamiccall/test/GxDynamicCallTest.java b/gxdynamiccall/src/test/java/com/genexus/gxdynamiccall/test/GxDynamicCallTest.java new file mode 100644 index 000000000..d36e15677 --- /dev/null +++ b/gxdynamiccall/src/test/java/com/genexus/gxdynamiccall/test/GxDynamicCallTest.java @@ -0,0 +1,84 @@ +package com.genexus.gxdynamiccall.test; +import com.genexus.Application; +import com.genexus.GXBaseCollection; +import com.genexus.GXSimpleCollection; +import com.genexus.SdtMessages_Message; +import com.genexus.gxdynamiccall.GXDynCallMethodConf; +import com.genexus.gxdynamiccall.GXDynCallProperties; +import com.genexus.gxdynamiccall.GXDynamicCall; +import com.genexus.specific.java.Connect; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Vector; + +public class GxDynamicCallTest { + + @Test + public void callGxNativeObject(){ + Application.init(com.genexus.gxdynamiccall.test.GXcfg.class); + GXDynamicCall call = new GXDynamicCall(); + call.setObjectName("DynamicCallTestProcedure"); + Vector paramArray = new Vector<>(); + paramArray.add(Double.parseDouble("3")); + paramArray.add((short)4); + paramArray.add(new String()); + Vector errorsArray= new Vector<>(); + call.execute(paramArray, errorsArray); + Assert.assertTrue(errorsArray.size()==0); + String parm = ((String)paramArray.get(2)).trim(); + Assert.assertTrue(parm.equals("7")); + } + + @Test + public void callExternalClass(){ + Application.init(com.genexus.gxdynamiccall.test.GXcfg.class); + GXDynamicCall call = new GXDynamicCall(); + Vector errorsArray= new Vector<>(); + call.getProperties().setExternalName("DynamicCallExternalTestProcedure"); + call.getProperties().setPackageName("com.genexus.gxdynamiccall.test"); + //Constructor + Vector constructParamArray = new Vector<>(); + constructParamArray.add((int)3); + call.create(constructParamArray, errorsArray); + //Parameters + Vector paramArray = new Vector<>(); + paramArray.add((short)3); + paramArray.add((short)4); + //MethodConfiguration + GXDynCallMethodConf method = new GXDynCallMethodConf(); + method.setIsStatic(false); + method.setMethodName("calculateAsString"); + String result = (String)call.execute(paramArray, method, errorsArray); + Assert.assertTrue(errorsArray.size()==0); + Assert.assertTrue(result.trim().equals("21")); + paramArray.clear(); + paramArray.add((short)4); + paramArray.add((short)4); + result = (String)call.execute(paramArray, method, errorsArray); + Assert.assertTrue(errorsArray.size()==0); + Assert.assertTrue(result.trim().equals("24")); + } + + @Test + public void callExternalClassWithStaticMethod(){ + Application.init(com.genexus.gxdynamiccall.test.GXcfg.class); + GXDynamicCall call = new GXDynamicCall(); + call.getProperties().setExternalName("DynamicCallExternalTestProcedure"); + call.getProperties().setPackageName("com.genexus.gxdynamiccall.test"); + Vector errorsArray= new Vector<>(); + //Parameters + Vector paramArray = new Vector<>(); + paramArray.add((short)3); + paramArray.add((short)4); + //MethodConfiguration + GXDynCallMethodConf method = new GXDynCallMethodConf(); + method.setIsStatic(true); + method.setMethodName("sumAsString"); + String result = (String)call.execute(paramArray, method, errorsArray); + Assert.assertTrue(errorsArray.size()==0); + Assert.assertTrue(result.trim().equals("7")); + } + +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 15617140d..86b99183c 100644 --- a/pom.xml +++ b/pom.xml @@ -84,6 +84,7 @@ java gxandroidpublisher gxcryptocommon + gxdynamiccall gxmail gxmaps gxoffice