Skip to content

Commit 8ff6661

Browse files
authored
Queue API Implementation (AWS SQS) (#582)
* Initial implementation QueueAPI * Refactoring * Add more unittest * Add SDTs models. * Refacroting. More UnitTest. GeneXus API Implementation. * Missing Methods implementation * Add Queue Azure Maven Project * Project restructure * DynamicExecute * Minor refactoring * Remove ununsed file * Reformat code * Move folders to root * Added log and required http client impl * Remvoe AWS dependency from Azure Project * Bump AWS SDK Version * Refactoring Pom version * Use same AWS version as DynamoDB project * Maven dependencies * DeleteMessage Signature modification * Remove redundant isLevelEnabled when is not neccesrry * Remove not needed dependency * Fix Issues after Gradle Build System
1 parent 78fe760 commit 8ff6661

File tree

32 files changed

+1924
-81
lines changed

32 files changed

+1924
-81
lines changed

common/src/main/java/com/genexus/ModelContext.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ public static ModelContext getModelContext()
4343
ModelContext context = (ModelContext)threadModelContext.get();
4444
if(context == null)
4545
{
46-
logger.error(new Date() + " - Cannot find ModelContext for thread " + Thread.currentThread() );
46+
if (logger.isDebugEnabled()) {
47+
logger.debug(new Date() + " - Cannot find ModelContext for thread " + Thread.currentThread());
48+
}
4749
}
4850
return context;
4951
}

common/src/main/java/com/genexus/db/DynamicExecute.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -438,9 +438,7 @@ public static boolean dynamicExecute(ModelContext context, int handle, Class cal
438438
}
439439
catch (java.lang.reflect.InvocationTargetException e)
440440
{
441-
//Application.printWarning("java.lang.reflect.InvocationTargetException Can't execute dynamic call " + className + " - " + e.getTargetException().getMessage(), e);
442-
//return false;
443-
throw new RuntimeException("java.lang.reflect.InvocationTargetException Can't execute dynamic call " + className + " - " + e.getTargetException().getMessage());
441+
throw new RuntimeException("java.lang.reflect.InvocationTargetException Can't execute dynamic call " + className + " - " + e.getTargetException().getMessage(), e);
444442
}
445443
catch (InstantiationException e)
446444
{
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.genexus.services;
2+
3+
public class ServiceConfigurationException extends Throwable {
4+
public ServiceConfigurationException(String errorMessage) {
5+
super(errorMessage);
6+
}
7+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
package com.genexus.services;
2+
3+
import com.genexus.diagnostics.core.ILogger;
4+
import com.genexus.diagnostics.core.LogManager;
5+
6+
import com.genexus.util.Encryption;
7+
import com.genexus.util.GXService;
8+
9+
10+
public class ServiceSettingsReader {
11+
private static ILogger logger = LogManager.getLogger(ServiceSettingsReader.class);
12+
13+
private GXService service;
14+
private String name;
15+
private String serviceTypeName;
16+
17+
public ServiceSettingsReader(String serviceType, String instanceName, GXService service) {
18+
service = service;
19+
name = instanceName;
20+
serviceTypeName = serviceType;
21+
}
22+
23+
public String getEncryptedPropertyValue(String propertyName, String alternativePropertyName) throws ServiceConfigurationException {
24+
String value = getEncryptedPropertyValue(propertyName, alternativePropertyName, null);
25+
if (value == null) {
26+
String errorMessage = String.format("Service configuration error - Property name %s must be defined", resolvePropertyName(propertyName));
27+
logger.fatal(errorMessage);
28+
throw new ServiceConfigurationException(errorMessage);
29+
}
30+
return value;
31+
}
32+
33+
public String getEncryptedPropertyValue(String propertyName, String alternativePropertyName, String defaultValue) {
34+
String encryptedOrUnEncryptedValue = getPropertyValue(propertyName, alternativePropertyName, defaultValue);
35+
String decryptedValue = encryptedOrUnEncryptedValue;
36+
if (encryptedOrUnEncryptedValue != null && encryptedOrUnEncryptedValue.length() > 0) {
37+
try {
38+
String decryptedTemp = Encryption.tryDecrypt64(encryptedOrUnEncryptedValue);
39+
decryptedValue = (decryptedTemp != null) ? decryptedTemp : encryptedOrUnEncryptedValue;
40+
} catch (Exception e) {
41+
logger.warn("Could not decrypt property name: " + resolvePropertyName(propertyName));
42+
}
43+
}
44+
return decryptedValue;
45+
}
46+
47+
public String getPropertyValue(String propertyName, String alternativePropertyName) throws ServiceConfigurationException {
48+
String value = getPropertyValue(propertyName, alternativePropertyName, null);
49+
if (value == null) {
50+
String errorMessage = String.format("Service configuration error - Property name %s must be defined", resolvePropertyName(propertyName));
51+
logger.fatal(errorMessage);
52+
throw new ServiceConfigurationException(errorMessage);
53+
}
54+
return value;
55+
}
56+
57+
public String getPropertyValue(String propertyName, String alternativePropertyName, String defaultValue) {
58+
String value = readFromEnvVars(propertyName, alternativePropertyName);
59+
if (value != null) {
60+
return value;
61+
}
62+
String resolvedPtyName = resolvePropertyName(propertyName);
63+
if (service != null) {
64+
value = this.service.getProperties().get(resolvedPtyName);
65+
if (value == null || value.length() == 0) {
66+
value = this.service.getProperties().get(alternativePropertyName);
67+
}
68+
}
69+
return value != null ? value : defaultValue;
70+
}
71+
72+
private String readFromEnvVars(String propertyName, String alternativePropertyName) {
73+
if (service != null && !service.getAllowOverrideWithEnvVarSettings()) {
74+
return null;
75+
}
76+
77+
String value = System.getenv(resolvePropertyName(propertyName));
78+
if (value == null) {
79+
value = System.getenv(alternativePropertyName);
80+
}
81+
return value;
82+
}
83+
84+
private String resolvePropertyName(String propertyName) {
85+
return String.format("%s_%s_%s", serviceTypeName, name, propertyName);
86+
}
87+
88+
public String getName() {
89+
return this.name;
90+
}
91+
}

common/src/main/java/com/genexus/xml/GXXMLSerializable.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
import java.io.Serializable;
1111
import java.util.Iterator;
12-
import java.util.Hashtable;
1312
import java.lang.reflect.Method;
1413
import java.util.concurrent.ConcurrentHashMap;
1514

gxqueue/pom.xml

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<artifactId>parent</artifactId>
7+
<groupId>com.genexus</groupId>
8+
<version>${revision}${changelist}</version>
9+
</parent>
10+
<modelVersion>4.0.0</modelVersion>
11+
12+
<artifactId>gxqueue</artifactId>
13+
<dependencies>
14+
<dependency>
15+
<groupId>${project.groupId}</groupId>
16+
<artifactId>gxclassR</artifactId>
17+
<version>${project.version}</version>
18+
</dependency>
19+
<dependency>
20+
<groupId>${project.groupId}</groupId>
21+
<artifactId>gxcommon</artifactId>
22+
<version>${project.version}</version>
23+
<scope>compile</scope>
24+
</dependency>
25+
</dependencies>
26+
27+
<build>
28+
<finalName>gxqueue</finalName>
29+
<plugins>
30+
<plugin>
31+
<groupId>org.apache.maven.plugins</groupId>
32+
<artifactId>maven-jar-plugin</artifactId>
33+
<version>3.1.1</version>
34+
<configuration>
35+
<archive>
36+
<manifest>
37+
<addClasspath>false</addClasspath>
38+
</manifest>
39+
<manifestEntries>
40+
<Build-Time>${maven.build.timestamp}</Build-Time>
41+
<Build-User>GeneXus</Build-User>
42+
<Build-Java>${java.version}</Build-Java>
43+
<Build-OS>${os.name}</Build-OS>
44+
<Build-Label>${project.version}</Build-Label>
45+
<Build-Path>${basedir}</Build-Path>
46+
</manifestEntries>
47+
</archive>
48+
<excludes>
49+
<exclude>**/com/genexusmessaging/**</exclude>
50+
</excludes>
51+
</configuration>
52+
</plugin>
53+
</plugins>
54+
</build>
55+
56+
</project>
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package com.genexus.messaging.queue;
2+
3+
import com.genexus.GXBaseCollection;
4+
5+
import com.genexus.messaging.queue.model.DeleteMessageResult;
6+
import com.genexus.messaging.queue.model.MessageQueueOptions;
7+
import com.genexus.messaging.queue.model.SendMessageResult;
8+
import com.genexus.messaging.queue.model.SimpleQueueMessage;
9+
import com.genexus.util.GXProperties;
10+
import com.genexus.util.GXProperty;
11+
import com.genexusmessaging.genexusmessagingqueue.simplequeue.SdtMessage;
12+
import com.genexusmessaging.genexusmessagingqueue.simplequeue.SdtMessageOptions;
13+
import com.genexusmessaging.genexusmessagingqueue.simplequeue.SdtMessageProperty;
14+
import com.genexusmessaging.genexusmessagingqueue.simplequeue.SdtMessageResult;
15+
16+
import java.util.List;
17+
18+
public class Convert {
19+
20+
protected static SimpleQueueMessage toSimpleQueueMessage(SdtMessage msg) {
21+
return new SimpleQueueMessage() {{
22+
String id = msg.getgxTv_SdtMessage_Messageid();
23+
setMessageId((id.isEmpty())? java.util.UUID.randomUUID().toString() :id);
24+
setMessageBody(msg.getgxTv_SdtMessage_Messagebody());
25+
setMessageHandleId(msg.getgxTv_SdtMessage_Messagehandleid());
26+
if (msg.getgxTv_SdtMessage_Messageattributes() != null) {
27+
setMessageAttributes(toGXProperties(msg.getgxTv_SdtMessage_Messageattributes()));
28+
}
29+
}};
30+
}
31+
32+
protected static MessageQueueOptions toMessageQueueOptions(SdtMessageOptions receiveOptions) {
33+
MessageQueueOptions mqOptions = new MessageQueueOptions() {{
34+
setMaxNumberOfMessages(receiveOptions.getgxTv_SdtMessageOptions_Maxnumberofmessages());
35+
setWaitTimeout(receiveOptions.getgxTv_SdtMessageOptions_Waittimeout());
36+
setTimetoLive(receiveOptions.getgxTv_SdtMessageOptions_Timetolive());
37+
setDelaySeconds(receiveOptions.getgxTv_SdtMessageOptions_Delayseconds());
38+
setVisibilityTimeout(receiveOptions.getgxTv_SdtMessageOptions_Visibilitytimeout());
39+
}};
40+
return mqOptions;
41+
}
42+
43+
44+
protected static SdtMessageResult toSdtMessageResult(SendMessageResult mResult) {
45+
SdtMessageResult r = new SdtMessageResult();
46+
r.setgxTv_SdtMessageResult_Messageid(mResult.getMessageId());
47+
r.setgxTv_SdtMessageResult_Servermessageid(mResult.getMessageServerId());
48+
r.setgxTv_SdtMessageResult_Messagestatus(mResult.getMessageSentStatus());
49+
return r;
50+
}
51+
52+
protected static GXBaseCollection<SdtMessageProperty> toSdtMessagePropertyCollection(GXProperties msgProps) {
53+
GXBaseCollection<SdtMessageProperty> props = new GXBaseCollection<SdtMessageProperty>();
54+
for (int i = 0; i < msgProps.count(); i++) {
55+
GXProperty propertyItem = msgProps.item(i);
56+
SdtMessageProperty msgProperty = new SdtMessageProperty();
57+
msgProperty.setgxTv_SdtMessageProperty_Propertykey(propertyItem.getKey());
58+
msgProperty.setgxTv_SdtMessageProperty_Propertyvalue(propertyItem.getValue());
59+
props.add(msgProperty);
60+
}
61+
return props;
62+
}
63+
64+
protected static GXProperties toGXProperties(GXBaseCollection<SdtMessageProperty> msgProps) {
65+
GXProperties props = new GXProperties();
66+
for (SdtMessageProperty prop : msgProps) {
67+
props.add(prop.getgxTv_SdtMessageProperty_Propertykey(), prop.getgxTv_SdtMessageProperty_Propertyvalue());
68+
}
69+
return props;
70+
}
71+
72+
public static SdtMessage toSdtMessage(SimpleQueueMessage simpleQueueMessage) {
73+
SdtMessage msg = new SdtMessage();
74+
msg.setgxTv_SdtMessage_Messageattributes(toSdtMessagePropertyCollection(simpleQueueMessage.getMessageAttributes()));
75+
msg.setgxTv_SdtMessage_Messagehandleid(simpleQueueMessage.getMessageHandleId());
76+
msg.setgxTv_SdtMessage_Messageid(simpleQueueMessage.getMessageId());
77+
msg.setgxTv_SdtMessage_Messagebody(simpleQueueMessage.getMessageBody());
78+
return msg;
79+
}
80+
81+
public static GXBaseCollection<SdtMessageResult> toDeleteExternalMessageResultList(List<DeleteMessageResult> deletedMessages) {
82+
GXBaseCollection<SdtMessageResult> externalList = new GXBaseCollection<>();
83+
for (DeleteMessageResult deletedMessage : deletedMessages) {
84+
SdtMessageResult sdtMessageResult = new SdtMessageResult();
85+
sdtMessageResult.setgxTv_SdtMessageResult_Messageid(deletedMessage.getMessageId());
86+
sdtMessageResult.setgxTv_SdtMessageResult_Servermessageid(deletedMessage.getMessageServerId());
87+
sdtMessageResult.setgxTv_SdtMessageResult_Messagestatus(deletedMessage.getMessageDeleteStatus());
88+
externalList.add(sdtMessageResult);
89+
}
90+
return externalList;
91+
}
92+
93+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.genexus.messaging.queue;
2+
3+
import com.genexus.messaging.queue.model.DeleteMessageResult;
4+
import com.genexus.messaging.queue.model.MessageQueueOptions;
5+
import com.genexus.messaging.queue.model.SendMessageResult;
6+
import com.genexus.messaging.queue.model.SimpleQueueMessage;
7+
8+
import java.util.List;
9+
10+
public interface IQueue {
11+
Integer getQueueLength();
12+
SendMessageResult sendMessage(SimpleQueueMessage simpleQueueMessage);
13+
SendMessageResult sendMessage(SimpleQueueMessage simpleQueueMessage, MessageQueueOptions messageQueueOptions);
14+
List<SendMessageResult> sendMessages(List<SimpleQueueMessage> simpleQueueMessages, MessageQueueOptions messageQueueOptions);
15+
List<SimpleQueueMessage> getMessages(MessageQueueOptions messageQueueOptions);
16+
DeleteMessageResult deleteMessage(String messageHandleId);
17+
18+
List<DeleteMessageResult> deleteMessages(List<String> messageHandleId);
19+
boolean purge();
20+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package com.genexus.messaging.queue;
2+
3+
public class QueueBase {
4+
}

0 commit comments

Comments
 (0)