diff --git a/build.gradle b/build.gradle
index d036bcb..69f0cac 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,9 +1,73 @@
apply plugin: 'war'
+apply plugin: "maven-publish"
+apply plugin: "signing"
repositories {
mavenCentral()
}
+java {
+ toolchain {
+ languageVersion = JavaLanguageVersion.of(8)
+ }
+}
+
+project.version "2.0.0-SNAPSHOT"
+group "net.brutex.xservices"
+
+publishing {
+ publications {
+ maven(MavenPublication) {
+ from components.java
+ }
+ }
+ repositories {
+
+ maven {
+ name = 'LocalRemote'
+ def releasesRepoUrl = 'https://archiva.brutex.net/repository/internal/'
+ def snapshotsRepoUrl = 'https://archiva.brutex.net/repository/snapshots/'
+ url = project.version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
+ allowInsecureProtocol = false
+ credentials {
+ username = mavenuser
+ password = mavenpass
+ }
+ }
+
+ maven {
+ name = 'OSSRH'
+ def releasesRepoUrl = 'https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/'
+ def snapshotsRepoUrl = 'https://s01.oss.sonatype.org/content/repositories/snapshots/'
+ url = project.version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
+ credentials {
+ username = ossrhUsername
+ password = ossrhPassword
+ }
+ }
+
+ maven {
+ name = 'brutexGitea'
+ def releasesRepoUrl = 'https://source.brutex.net/api/packages/brutex/maven'
+ def snapshotsRepoUrl = 'https://source.brutex.net/api/packages/brutex/maven'
+ url = project.version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
+ allowInsecureProtocol = false
+ credentials {
+ username = mavenuser
+ password = mavenpass
+ }
+ }
+ }
+}
+
+tasks.register('createDist', Zip) {Zip t ->
+ archiveBaseName = project.name
+ archiveVersion = version
+ archiveExtension = "zip"
+ destinationDirectory = new File(project.buildDir, "/distribution/")
+ from war.outputs.files
+}
+
dependencies {
compileOnly "javax.servlet:javax.servlet-api:4.0.1"
compileOnly "javax.ws.rs:javax.ws.rs-api:2.1.1"
@@ -13,6 +77,7 @@ dependencies {
implementation "commons-net:commons-net:3.9.0"
implementation "commons-beanutils:commons-beanutils:1.9.4"
implementation "org.apache.httpcomponents:httpclient:4.5.14"
+ implementation "org.apache.httpcomponents:fluent-hc:4.5.14"
implementation "commons-io:commons-io:2.11.0"
implementation "org.apache.ant:ant:1.10.13"
@@ -41,7 +106,7 @@ dependencies {
implementation "org.apache.shiro:shiro-root:1.12.0"
implementation "org.apache.shiro:shiro-web:1.12.0"
- implementation "org.apache.cxf:cxf:3.2.14"
+ implementation "org.apache.cxf:cxf:3.4.10"
implementation "org.apache.cxf:cxf-rt-databinding-aegis:3.2.14"
runtimeOnly "org.apache.cxf:cxf-rt-transports-http:3.2.14"
diff --git a/src/main/java/net/brutex/xservices/types/alfevent/ALFEventBase_1.xsd b/src/main/java/net/brutex/xservices/types/alfevent/ALFEventBase_1.xsd
new file mode 100644
index 0000000..e7f1107
--- /dev/null
+++ b/src/main/java/net/brutex/xservices/types/alfevent/ALFEventBase_1.xsd
@@ -0,0 +1,339 @@
+
+
+
+
+ WARNING: PRELIMINARY VERSION SUBJECT TO CHANGE
+
+
+
+
+ Copyright Notice The material in this document is Copyright
+ (c) Serena Software, Inc. and others, 2005, 2006 Terms and
+ Conditions: The Eclipse Foundation makes available all
+ content in this document ("Content"). Unless otherwise
+ indicated below, the Content is provided to you under the
+ terms and conditions of the Eclipse Public License Version
+ 1.0 ("EPL"). A copy of the EPL is available at
+ http://www.eclipse.org/legal/epl-v10.html. For purposes of
+ the EPL, "Program" will mean the Content. If you did not
+ receive this Content directly from the Eclipse Foundation,
+ the Content is being redistributed by another party
+ ("Redistributor") and different terms and conditions may
+ apply to your use of any object code in the Content. Check
+ the Redistributor's license that was provided with the
+ Content. If you did not receive any such license, contact
+ the Redistributor. Unless otherwise indicated below, the
+ terms and conditions of the EPL still apply to the Content.
+
+
+
+
+
+
+ EventBaseType is a container for that portion of an ALF
+ Event that is generally set by the Tool that raises the
+ event.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ EventControlType is a container for that portion of an
+ ALF Event that is generally set by the ALF EventManager.
+ In some cases, ALF compliant tools may set some fields,
+ in particular when the event is a result of an ALF
+ service call to that tool from a ServiceFlow.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ A UUID that uniquely identifies the Event instance.
+
+
+
+
+
+
+
+
+
+ A UUID that uniquely identifies the ServiceFlow
+ instance.
+
+
+
+
+
+
+
+
+
+ The date and timestamp when the EventManager received
+ the Event. This element may be left empty by the event
+ emitter, in which case, the Event Manager will supply a
+ value.
+
+
+
+
+
+
+
+ A string indicating the type of event. EventType
+ designates the verb. That is what action happened to the
+ Objects that triggered the event.
+
+
+
+
+
+
+
+
+ An ObjectId identifies the entity or relationship that
+ changed within a tool. The identifier must be unique for
+ a particular instance of the source tool. The format of
+ this element will not be standardized by ALF. The
+ primary purpose is to allow subsequent ServiceFlows to
+ uniquely identify (and perhaps access) the object that
+ triggered the event.
+
+
+
+
+
+
+
+ The type of entity involved. Note that the word entity
+ is taken in its broadest sense, referring to whatever
+ artifact a tool was operating on. For example, for a
+ data modeling tool, an E-R relationship is a type of
+ entity (i.e., and ObjectType) to ALF.
+
+
+
+
+
+
+
+
+ A Source element is a container type that describes the
+ source of the event. ProductCallbackURI is optional for
+ tools that don't provide a listener to accept the
+ callback from a tool or serviceflow at a later time.
+
+
+
+
+
+
+
+
+
+
+
+
+ A descriptive name for the tool (i.e., program) that
+ emitted the Event. Note that this is a datatype for a
+ Product element.
+
+
+
+
+
+
+
+ The web service endpoint for tools that support
+ callbacks from ServiceFlows for additional information.
+ The element content is optional for transient tools that
+ may not be running at a later time, and so cannot accept
+ a callback. Constantly running (server) tools that
+ support callbacks should supply a URI.
+
+
+
+
+
+
+
+ A unique string identifying the instance of the tool.
+ This is useful when there may be multiple instances of a
+ product working within an instance of ALF.
+
+
+
+
+
+
+
+ The release version of the product, such as 5.06
+
+
+
+
+
+
+
+
+ A structure to hold security authentication-relevant data.
+ If present the data within may be encrypted.
+
+
+
+
+
+
+
+
+
+
+ The name of the ALF application to which this event
+ belongs. Depending on the emitting tool, events may or
+ may not be associated with an ALF application. If the
+ emitting tool has the information available then it can
+ provide the ALF ApplicationName as an additional
+ information to distinguish the event.
+
+
+
+
+
+
+
+ The name of the event match within the ALF Application
+ that matches this event. This fields is set by the Event Manager
+ when it dispatches the event.
+
+
+
+
+
+
+
+ The name of the service flow withing the event match that
+ matches this event. This field is set by the Event Manager
+ when it dispatches the event.
+
+
+
+
+
+
+
+ The name of the environment in which this event is being
+ raised. This element will be set by the ALF Event
+ manager from its installation configuration.
+
+
+
+
+
+
+
+
+
+
+
+
+ Place holder type for future extensions of
+ BaseExtensionType
+
+
+
+
+
+
+
+
+
+
+ Place holder type for future extensions of EmBaseType
+
+
+
+
+
+
+
+
+
+
+ Place holder type for vocabulary based Event payload "details"
+
+
+
+
+
+
+
+
+
+
+ Place holder type for custom Event payload "extensions"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/net/brutex/xservices/types/alfevent/ALFEventManagerSOAP.xsd b/src/main/java/net/brutex/xservices/types/alfevent/ALFEventManagerSOAP.xsd
new file mode 100644
index 0000000..8fef7b0
--- /dev/null
+++ b/src/main/java/net/brutex/xservices/types/alfevent/ALFEventManagerSOAP.xsd
@@ -0,0 +1,135 @@
+
+
+
+
+ WARNING: PRELIMINARY VERSION SUBJECT TO CHANGE
+
+ Copyright Notice
+ The material in this document is Copyright (c) Serena Software, Inc. and others, 2005, 2006
+ Terms and Conditions:
+ The Eclipse Foundation makes available all content in this document ("Content").
+ Unless otherwise indicated below, the Content is provided to you under the terms
+ and conditions of the Eclipse Public License Version 1.0 ("EPL").
+ A copy of the EPL is available at http://www.eclipse.org/legal/epl-v10.html.
+ For purposes of the EPL, "Program" will mean the Content.
+ If you did not receive this Content directly from the Eclipse Foundation, the
+ Content is being redistributed by another party ("Redistributor") and different
+ terms and conditions may apply to your use of any object code in the Content.
+ Check the Redistributor's license that was provided with the Content.
+ If you did not receive any such license, contact the Redistributor.
+ Unless otherwise indicated below, the terms and conditions of the EPL still apply to the Content.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/net/brutex/xservices/types/alfevent/ALFEventResponseType.java b/src/main/java/net/brutex/xservices/types/alfevent/ALFEventResponseType.java
new file mode 100644
index 0000000..0e67c41
--- /dev/null
+++ b/src/main/java/net/brutex/xservices/types/alfevent/ALFEventResponseType.java
@@ -0,0 +1,62 @@
+
+package net.brutex.xservices.types.alfevent;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ *
Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist.
+ *
+ *
Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist.
+ *
+ *
any;
+ @XmlAttribute(name = "version")
+ protected String version;
+
+ /**
+ * Ruft den Wert der base-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link EventBaseType }
+ *
+ */
+ public EventBaseType getBase() {
+ return base;
+ }
+
+ /**
+ * Legt den Wert der base-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link EventBaseType }
+ *
+ */
+ public void setBase(EventBaseType value) {
+ this.base = value;
+ }
+
+ /**
+ * Ruft den Wert der detail-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link DetailExtensionType }
+ *
+ */
+ public DetailExtensionType getDetail() {
+ return detail;
+ }
+
+ /**
+ * Legt den Wert der detail-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link DetailExtensionType }
+ *
+ */
+ public void setDetail(DetailExtensionType value) {
+ this.detail = value;
+ }
+
+ /**
+ * Ruft den Wert der extension-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link CustomExtensionType }
+ *
+ */
+ public CustomExtensionType getExtension() {
+ return extension;
+ }
+
+ /**
+ * Legt den Wert der extension-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link CustomExtensionType }
+ *
+ */
+ public void setExtension(CustomExtensionType value) {
+ this.extension = value;
+ }
+
+ /**
+ * Gets the value of the any property.
+ *
+ *
+ * This accessor method returns a reference to the live list,
+ * not a snapshot. Therefore any modification you make to the
+ * returned list will be present inside the JAXB object.
+ * This is why there is not a set
method for the any property.
+ *
+ *
+ * For example, to add a new item, do as follows:
+ *
+ * getAny().add(newItem);
+ *
+ *
+ *
+ *
+ * Objects of the following type(s) are allowed in the list
+ * {@link Object }
+ * {@link Element }
+ *
+ *
+ */
+ public List getAny() {
+ if (any == null) {
+ any = new ArrayList();
+ }
+ return this.any;
+ }
+
+ /**
+ * Ruft den Wert der version-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getVersion() {
+ if (version == null) {
+ return "1.0";
+ } else {
+ return version;
+ }
+ }
+
+ /**
+ * Legt den Wert der version-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setVersion(String value) {
+ this.version = value;
+ }
+
+}
diff --git a/src/main/java/net/brutex/xservices/types/alfevent/ALFEventWithReplyResponseType.java b/src/main/java/net/brutex/xservices/types/alfevent/ALFEventWithReplyResponseType.java
new file mode 100644
index 0000000..0548f17
--- /dev/null
+++ b/src/main/java/net/brutex/xservices/types/alfevent/ALFEventWithReplyResponseType.java
@@ -0,0 +1,62 @@
+
+package net.brutex.xservices.types.alfevent;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ * Java-Klasse für ALFEventWithReplyResponseType complex type.
+ *
+ *
Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist.
+ *
+ *
+ * <complexType name="ALFEventWithReplyResponseType">
+ * <complexContent>
+ * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ * <sequence>
+ * <any minOccurs="0"/>
+ * </sequence>
+ * </restriction>
+ * </complexContent>
+ * </complexType>
+ *
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "ALFEventWithReplyResponseType", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", propOrder = {
+ "any"
+})
+public class ALFEventWithReplyResponseType {
+
+ @XmlAnyElement(lax = true)
+ protected Object any;
+
+ /**
+ * Ruft den Wert der any-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link Object }
+ *
+ */
+ public Object getAny() {
+ return any;
+ }
+
+ /**
+ * Legt den Wert der any-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link Object }
+ *
+ */
+ public void setAny(Object value) {
+ this.any = value;
+ }
+
+}
diff --git a/src/main/java/net/brutex/xservices/types/alfevent/BaseExtensionType.java b/src/main/java/net/brutex/xservices/types/alfevent/BaseExtensionType.java
new file mode 100644
index 0000000..37c3945
--- /dev/null
+++ b/src/main/java/net/brutex/xservices/types/alfevent/BaseExtensionType.java
@@ -0,0 +1,99 @@
+
+package net.brutex.xservices.types.alfevent;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.namespace.QName;
+
+
+/**
+ *
+ * Place holder type for future extensions of
+ * BaseExtensionType
+ *
+ *
+ * Java-Klasse für BaseExtensionType complex type.
+ *
+ *
Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist.
+ *
+ *
+ * <complexType name="BaseExtensionType">
+ * <complexContent>
+ * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ * <sequence>
+ * <any namespace='targetnamespace' maxOccurs="unbounded"/>
+ * </sequence>
+ * <anyAttribute/>
+ * </restriction>
+ * </complexContent>
+ * </complexType>
+ *
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "BaseExtensionType", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", propOrder = {
+ "any"
+})
+public class BaseExtensionType {
+
+ @XmlAnyElement(lax = true)
+ protected List any;
+ @XmlAnyAttribute
+ private Map otherAttributes = new HashMap();
+
+ /**
+ * Gets the value of the any property.
+ *
+ *
+ * This accessor method returns a reference to the live list,
+ * not a snapshot. Therefore any modification you make to the
+ * returned list will be present inside the JAXB object.
+ * This is why there is not a set
method for the any property.
+ *
+ *
+ * For example, to add a new item, do as follows:
+ *
+ * getAny().add(newItem);
+ *
+ *
+ *
+ *
+ * Objects of the following type(s) are allowed in the list
+ * {@link Object }
+ *
+ *
+ */
+ public List getAny() {
+ if (any == null) {
+ any = new ArrayList();
+ }
+ return this.any;
+ }
+
+ /**
+ * Gets a map that contains attributes that aren't bound to any typed property on this class.
+ *
+ *
+ * the map is keyed by the name of the attribute and
+ * the value is the string value of the attribute.
+ *
+ * the map returned by this method is live, and you can add new attribute
+ * by updating the map directly. Because of this design, there's no setter.
+ *
+ *
+ * @return
+ * always non-null
+ */
+ public Map getOtherAttributes() {
+ return otherAttributes;
+ }
+
+}
diff --git a/src/main/java/net/brutex/xservices/types/alfevent/CredentialsType.java b/src/main/java/net/brutex/xservices/types/alfevent/CredentialsType.java
new file mode 100644
index 0000000..d9fac1b
--- /dev/null
+++ b/src/main/java/net/brutex/xservices/types/alfevent/CredentialsType.java
@@ -0,0 +1,101 @@
+
+package net.brutex.xservices.types.alfevent;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.namespace.QName;
+import org.w3c.dom.Element;
+
+
+/**
+ *
+ * A structure to hold security authentication-relevant data.
+ * If present the data within may be encrypted.
+ *
+ *
+ * Java-Klasse für CredentialsType complex type.
+ *
+ *
Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist.
+ *
+ *
+ * <complexType name="CredentialsType">
+ * <complexContent>
+ * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ * <sequence>
+ * <any processContents='lax' maxOccurs="unbounded" minOccurs="0"/>
+ * </sequence>
+ * <anyAttribute/>
+ * </restriction>
+ * </complexContent>
+ * </complexType>
+ *
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "CredentialsType", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", propOrder = {
+ "any"
+})
+public class CredentialsType {
+
+ @XmlAnyElement(lax = true)
+ protected List any;
+ @XmlAnyAttribute
+ private Map otherAttributes = new HashMap();
+
+ /**
+ * Gets the value of the any property.
+ *
+ *
+ * This accessor method returns a reference to the live list,
+ * not a snapshot. Therefore any modification you make to the
+ * returned list will be present inside the JAXB object.
+ * This is why there is not a set
method for the any property.
+ *
+ *
+ * For example, to add a new item, do as follows:
+ *
+ * getAny().add(newItem);
+ *
+ *
+ *
+ *
+ * Objects of the following type(s) are allowed in the list
+ * {@link Object }
+ * {@link Element }
+ *
+ *
+ */
+ public List getAny() {
+ if (any == null) {
+ any = new ArrayList();
+ }
+ return this.any;
+ }
+
+ /**
+ * Gets a map that contains attributes that aren't bound to any typed property on this class.
+ *
+ *
+ * the map is keyed by the name of the attribute and
+ * the value is the string value of the attribute.
+ *
+ * the map returned by this method is live, and you can add new attribute
+ * by updating the map directly. Because of this design, there's no setter.
+ *
+ *
+ * @return
+ * always non-null
+ */
+ public Map getOtherAttributes() {
+ return otherAttributes;
+ }
+
+}
diff --git a/src/main/java/net/brutex/xservices/types/alfevent/CustomExtensionType.java b/src/main/java/net/brutex/xservices/types/alfevent/CustomExtensionType.java
new file mode 100644
index 0000000..fa8e332
--- /dev/null
+++ b/src/main/java/net/brutex/xservices/types/alfevent/CustomExtensionType.java
@@ -0,0 +1,100 @@
+
+package net.brutex.xservices.types.alfevent;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.namespace.QName;
+import org.w3c.dom.Element;
+
+
+/**
+ *
+ * Place holder type for custom Event payload "extensions"
+ *
+ *
+ * Java-Klasse für CustomExtensionType complex type.
+ *
+ *
Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist.
+ *
+ *
+ * <complexType name="CustomExtensionType">
+ * <complexContent>
+ * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ * <sequence>
+ * <any processContents='lax' namespace='##other' maxOccurs="unbounded"/>
+ * </sequence>
+ * <anyAttribute/>
+ * </restriction>
+ * </complexContent>
+ * </complexType>
+ *
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "CustomExtensionType", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", propOrder = {
+ "any"
+})
+public class CustomExtensionType {
+
+ @XmlAnyElement(lax = true)
+ protected List any;
+ @XmlAnyAttribute
+ private Map otherAttributes = new HashMap();
+
+ /**
+ * Gets the value of the any property.
+ *
+ *
+ * This accessor method returns a reference to the live list,
+ * not a snapshot. Therefore any modification you make to the
+ * returned list will be present inside the JAXB object.
+ * This is why there is not a set
method for the any property.
+ *
+ *
+ * For example, to add a new item, do as follows:
+ *
+ * getAny().add(newItem);
+ *
+ *
+ *
+ *
+ * Objects of the following type(s) are allowed in the list
+ * {@link Object }
+ * {@link Element }
+ *
+ *
+ */
+ public List getAny() {
+ if (any == null) {
+ any = new ArrayList();
+ }
+ return this.any;
+ }
+
+ /**
+ * Gets a map that contains attributes that aren't bound to any typed property on this class.
+ *
+ *
+ * the map is keyed by the name of the attribute and
+ * the value is the string value of the attribute.
+ *
+ * the map returned by this method is live, and you can add new attribute
+ * by updating the map directly. Because of this design, there's no setter.
+ *
+ *
+ * @return
+ * always non-null
+ */
+ public Map getOtherAttributes() {
+ return otherAttributes;
+ }
+
+}
diff --git a/src/main/java/net/brutex/xservices/types/alfevent/DetailExtensionType.java b/src/main/java/net/brutex/xservices/types/alfevent/DetailExtensionType.java
new file mode 100644
index 0000000..ebf8e04
--- /dev/null
+++ b/src/main/java/net/brutex/xservices/types/alfevent/DetailExtensionType.java
@@ -0,0 +1,100 @@
+
+package net.brutex.xservices.types.alfevent;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.namespace.QName;
+import org.w3c.dom.Element;
+
+
+/**
+ *
+ * Place holder type for vocabulary based Event payload "details"
+ *
+ *
+ * Java-Klasse für DetailExtensionType complex type.
+ *
+ *
Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist.
+ *
+ *
+ * <complexType name="DetailExtensionType">
+ * <complexContent>
+ * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ * <sequence>
+ * <any processContents='lax' namespace='##other' maxOccurs="unbounded"/>
+ * </sequence>
+ * <anyAttribute/>
+ * </restriction>
+ * </complexContent>
+ * </complexType>
+ *
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "DetailExtensionType", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", propOrder = {
+ "any"
+})
+public class DetailExtensionType {
+
+ @XmlAnyElement(lax = true)
+ protected List any;
+ @XmlAnyAttribute
+ private Map otherAttributes = new HashMap();
+
+ /**
+ * Gets the value of the any property.
+ *
+ *
+ * This accessor method returns a reference to the live list,
+ * not a snapshot. Therefore any modification you make to the
+ * returned list will be present inside the JAXB object.
+ * This is why there is not a set
method for the any property.
+ *
+ *
+ * For example, to add a new item, do as follows:
+ *
+ * getAny().add(newItem);
+ *
+ *
+ *
+ *
+ * Objects of the following type(s) are allowed in the list
+ * {@link Object }
+ * {@link Element }
+ *
+ *
+ */
+ public List getAny() {
+ if (any == null) {
+ any = new ArrayList();
+ }
+ return this.any;
+ }
+
+ /**
+ * Gets a map that contains attributes that aren't bound to any typed property on this class.
+ *
+ *
+ * the map is keyed by the name of the attribute and
+ * the value is the string value of the attribute.
+ *
+ * the map returned by this method is live, and you can add new attribute
+ * by updating the map directly. Because of this design, there's no setter.
+ *
+ *
+ * @return
+ * always non-null
+ */
+ public Map getOtherAttributes() {
+ return otherAttributes;
+ }
+
+}
diff --git a/src/main/java/net/brutex/xservices/types/alfevent/EmBaseType.java b/src/main/java/net/brutex/xservices/types/alfevent/EmBaseType.java
new file mode 100644
index 0000000..19d09dc
--- /dev/null
+++ b/src/main/java/net/brutex/xservices/types/alfevent/EmBaseType.java
@@ -0,0 +1,370 @@
+
+package net.brutex.xservices.types.alfevent;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.datatype.XMLGregorianCalendar;
+import javax.xml.namespace.QName;
+
+
+/**
+ *
+ * EventControlType is a container for that portion of an
+ * ALF Event that is generally set by the ALF EventManager.
+ * In some cases, ALF compliant tools may set some fields,
+ * in particular when the event is a result of an ALF
+ * service call to that tool from a ServiceFlow.
+ *
+ *
+ * Java-Klasse für EmBaseType complex type.
+ *
+ *
Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist.
+ *
+ *
+ * <complexType name="EmBaseType">
+ * <complexContent>
+ * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ * <sequence>
+ * <element name="EmEventId" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ * <element name="EmTimestamp" type="{http://www.eclipse.org/alf/schema/EventBase/1}TimestampType"/>
+ * <element name="PrecedingEmEventId" type="{http://www.eclipse.org/alf/schema/EventBase/1}EventIdType"/>
+ * <element name="ApplicationName" type="{http://www.eclipse.org/alf/schema/EventBase/1}ApplicationNameType"/>
+ * <element name="EventMatchName" type="{http://www.eclipse.org/alf/schema/EventBase/1}EventMatchNameType"/>
+ * <element name="ServiceFlowName" type="{http://www.eclipse.org/alf/schema/EventBase/1}ServiceFlowNameType"/>
+ * <element name="ServiceFlowId" type="{http://www.eclipse.org/alf/schema/EventBase/1}ServiceFlowIdType"/>
+ * <element name="Callback" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
+ * <element name="Environment" type="{http://www.eclipse.org/alf/schema/EventBase/1}EnvironmentType"/>
+ * <element name="EmUser" type="{http://www.eclipse.org/alf/schema/EventBase/1}CredentialsType"/>
+ * <element name="EmExtension" type="{http://www.eclipse.org/alf/schema/EventBase/1}EmExtensionType" minOccurs="0"/>
+ * </sequence>
+ * <anyAttribute/>
+ * </restriction>
+ * </complexContent>
+ * </complexType>
+ *
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "EmBaseType", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", propOrder = {
+ "emEventId",
+ "emTimestamp",
+ "precedingEmEventId",
+ "applicationName",
+ "eventMatchName",
+ "serviceFlowName",
+ "serviceFlowId",
+ "callback",
+ "environment",
+ "emUser",
+ "emExtension"
+})
+public class EmBaseType {
+
+ @XmlElement(name = "EmEventId", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
+ protected String emEventId;
+ @XmlElement(name = "EmTimestamp", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
+ @XmlSchemaType(name = "dateTime")
+ protected XMLGregorianCalendar emTimestamp;
+ @XmlElement(name = "PrecedingEmEventId", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
+ protected String precedingEmEventId;
+ @XmlElement(name = "ApplicationName", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
+ protected String applicationName;
+ @XmlElement(name = "EventMatchName", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
+ protected String eventMatchName;
+ @XmlElement(name = "ServiceFlowName", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
+ protected String serviceFlowName;
+ @XmlElement(name = "ServiceFlowId", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
+ protected String serviceFlowId;
+ @XmlElement(name = "Callback", namespace = "http://www.eclipse.org/alf/schema/EventBase/1")
+ protected boolean callback;
+ @XmlElement(name = "Environment", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
+ protected String environment;
+ @XmlElement(name = "EmUser", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
+ protected CredentialsType emUser;
+ @XmlElement(name = "EmExtension", namespace = "http://www.eclipse.org/alf/schema/EventBase/1")
+ protected EmExtensionType emExtension;
+ @XmlAnyAttribute
+ private Map otherAttributes = new HashMap();
+
+ /**
+ * Ruft den Wert der emEventId-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getEmEventId() {
+ return emEventId;
+ }
+
+ /**
+ * Legt den Wert der emEventId-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setEmEventId(String value) {
+ this.emEventId = value;
+ }
+
+ /**
+ * Ruft den Wert der emTimestamp-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link XMLGregorianCalendar }
+ *
+ */
+ public XMLGregorianCalendar getEmTimestamp() {
+ return emTimestamp;
+ }
+
+ /**
+ * Legt den Wert der emTimestamp-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link XMLGregorianCalendar }
+ *
+ */
+ public void setEmTimestamp(XMLGregorianCalendar value) {
+ this.emTimestamp = value;
+ }
+
+ /**
+ * Ruft den Wert der precedingEmEventId-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getPrecedingEmEventId() {
+ return precedingEmEventId;
+ }
+
+ /**
+ * Legt den Wert der precedingEmEventId-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setPrecedingEmEventId(String value) {
+ this.precedingEmEventId = value;
+ }
+
+ /**
+ * Ruft den Wert der applicationName-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getApplicationName() {
+ return applicationName;
+ }
+
+ /**
+ * Legt den Wert der applicationName-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setApplicationName(String value) {
+ this.applicationName = value;
+ }
+
+ /**
+ * Ruft den Wert der eventMatchName-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getEventMatchName() {
+ return eventMatchName;
+ }
+
+ /**
+ * Legt den Wert der eventMatchName-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setEventMatchName(String value) {
+ this.eventMatchName = value;
+ }
+
+ /**
+ * Ruft den Wert der serviceFlowName-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getServiceFlowName() {
+ return serviceFlowName;
+ }
+
+ /**
+ * Legt den Wert der serviceFlowName-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setServiceFlowName(String value) {
+ this.serviceFlowName = value;
+ }
+
+ /**
+ * Ruft den Wert der serviceFlowId-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getServiceFlowId() {
+ return serviceFlowId;
+ }
+
+ /**
+ * Legt den Wert der serviceFlowId-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setServiceFlowId(String value) {
+ this.serviceFlowId = value;
+ }
+
+ /**
+ * Ruft den Wert der callback-Eigenschaft ab.
+ *
+ */
+ public boolean isCallback() {
+ return callback;
+ }
+
+ /**
+ * Legt den Wert der callback-Eigenschaft fest.
+ *
+ */
+ public void setCallback(boolean value) {
+ this.callback = value;
+ }
+
+ /**
+ * Ruft den Wert der environment-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getEnvironment() {
+ return environment;
+ }
+
+ /**
+ * Legt den Wert der environment-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setEnvironment(String value) {
+ this.environment = value;
+ }
+
+ /**
+ * Ruft den Wert der emUser-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link CredentialsType }
+ *
+ */
+ public CredentialsType getEmUser() {
+ return emUser;
+ }
+
+ /**
+ * Legt den Wert der emUser-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link CredentialsType }
+ *
+ */
+ public void setEmUser(CredentialsType value) {
+ this.emUser = value;
+ }
+
+ /**
+ * Ruft den Wert der emExtension-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link EmExtensionType }
+ *
+ */
+ public EmExtensionType getEmExtension() {
+ return emExtension;
+ }
+
+ /**
+ * Legt den Wert der emExtension-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link EmExtensionType }
+ *
+ */
+ public void setEmExtension(EmExtensionType value) {
+ this.emExtension = value;
+ }
+
+ /**
+ * Gets a map that contains attributes that aren't bound to any typed property on this class.
+ *
+ *
+ * the map is keyed by the name of the attribute and
+ * the value is the string value of the attribute.
+ *
+ * the map returned by this method is live, and you can add new attribute
+ * by updating the map directly. Because of this design, there's no setter.
+ *
+ *
+ * @return
+ * always non-null
+ */
+ public Map getOtherAttributes() {
+ return otherAttributes;
+ }
+
+}
diff --git a/src/main/java/net/brutex/xservices/types/alfevent/EmExtensionType.java b/src/main/java/net/brutex/xservices/types/alfevent/EmExtensionType.java
new file mode 100644
index 0000000..49db1d2
--- /dev/null
+++ b/src/main/java/net/brutex/xservices/types/alfevent/EmExtensionType.java
@@ -0,0 +1,98 @@
+
+package net.brutex.xservices.types.alfevent;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlAnyElement;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.namespace.QName;
+
+
+/**
+ *
+ * Place holder type for future extensions of EmBaseType
+ *
+ *
+ * Java-Klasse für EmExtensionType complex type.
+ *
+ *
Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist.
+ *
+ *
+ * <complexType name="EmExtensionType">
+ * <complexContent>
+ * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ * <sequence>
+ * <any namespace='targetnamespace' maxOccurs="unbounded"/>
+ * </sequence>
+ * <anyAttribute/>
+ * </restriction>
+ * </complexContent>
+ * </complexType>
+ *
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "EmExtensionType", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", propOrder = {
+ "any"
+})
+public class EmExtensionType {
+
+ @XmlAnyElement(lax = true)
+ protected List any;
+ @XmlAnyAttribute
+ private Map otherAttributes = new HashMap();
+
+ /**
+ * Gets the value of the any property.
+ *
+ *
+ * This accessor method returns a reference to the live list,
+ * not a snapshot. Therefore any modification you make to the
+ * returned list will be present inside the JAXB object.
+ * This is why there is not a set
method for the any property.
+ *
+ *
+ * For example, to add a new item, do as follows:
+ *
+ * getAny().add(newItem);
+ *
+ *
+ *
+ *
+ * Objects of the following type(s) are allowed in the list
+ * {@link Object }
+ *
+ *
+ */
+ public List getAny() {
+ if (any == null) {
+ any = new ArrayList();
+ }
+ return this.any;
+ }
+
+ /**
+ * Gets a map that contains attributes that aren't bound to any typed property on this class.
+ *
+ *
+ * the map is keyed by the name of the attribute and
+ * the value is the string value of the attribute.
+ *
+ * the map returned by this method is live, and you can add new attribute
+ * by updating the map directly. Because of this design, there's no setter.
+ *
+ *
+ * @return
+ * always non-null
+ */
+ public Map getOtherAttributes() {
+ return otherAttributes;
+ }
+
+}
diff --git a/src/main/java/net/brutex/xservices/types/alfevent/EventBaseType.java b/src/main/java/net/brutex/xservices/types/alfevent/EventBaseType.java
new file mode 100644
index 0000000..217db38
--- /dev/null
+++ b/src/main/java/net/brutex/xservices/types/alfevent/EventBaseType.java
@@ -0,0 +1,320 @@
+
+package net.brutex.xservices.types.alfevent;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAnyAttribute;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+import javax.xml.datatype.XMLGregorianCalendar;
+import javax.xml.namespace.QName;
+
+
+/**
+ *
+ * EventBaseType is a container for that portion of an ALF
+ * Event that is generally set by the Tool that raises the
+ * event.
+ *
+ *
+ * Java-Klasse für EventBaseType complex type.
+ *
+ *
Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist.
+ *
+ *
+ * <complexType name="EventBaseType">
+ * <complexContent>
+ * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ * <sequence>
+ * <element name="EventId" type="{http://www.eclipse.org/alf/schema/EventBase/1}EventIdType"/>
+ * <element name="Timestamp" type="{http://www.eclipse.org/alf/schema/EventBase/1}TimestampType"/>
+ * <element name="EventType" type="{http://www.eclipse.org/alf/schema/EventBase/1}EventTypeType"/>
+ * <element name="ObjectType" type="{http://www.eclipse.org/alf/schema/EventBase/1}ObjectTypeType"/>
+ * <element name="ObjectId" type="{http://www.eclipse.org/alf/schema/EventBase/1}ObjectIdType"/>
+ * <element name="Source" type="{http://www.eclipse.org/alf/schema/EventBase/1}SourceType"/>
+ * <element name="User" type="{http://www.eclipse.org/alf/schema/EventBase/1}CredentialsType"/>
+ * <element name="EventControl" type="{http://www.eclipse.org/alf/schema/EventBase/1}EmBaseType" minOccurs="0"/>
+ * <element name="BaseExtension" type="{http://www.eclipse.org/alf/schema/EventBase/1}BaseExtensionType" minOccurs="0"/>
+ * </sequence>
+ * <anyAttribute/>
+ * </restriction>
+ * </complexContent>
+ * </complexType>
+ *
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "EventBaseType", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", propOrder = {
+ "eventId",
+ "timestamp",
+ "eventType",
+ "objectType",
+ "objectId",
+ "source",
+ "user",
+ "eventControl",
+ "baseExtension"
+})
+public class EventBaseType {
+
+ @XmlElement(name = "EventId", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
+ protected String eventId;
+ @XmlElement(name = "Timestamp", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
+ @XmlSchemaType(name = "dateTime")
+ protected XMLGregorianCalendar timestamp;
+ @XmlElement(name = "EventType", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
+ protected String eventType;
+ @XmlElement(name = "ObjectType", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
+ protected String objectType;
+ @XmlElement(name = "ObjectId", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
+ protected String objectId;
+ @XmlElement(name = "Source", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
+ protected SourceType source;
+ @XmlElement(name = "User", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
+ protected CredentialsType user;
+ @XmlElement(name = "EventControl", namespace = "http://www.eclipse.org/alf/schema/EventBase/1")
+ protected EmBaseType eventControl;
+ @XmlElement(name = "BaseExtension", namespace = "http://www.eclipse.org/alf/schema/EventBase/1")
+ protected BaseExtensionType baseExtension;
+ @XmlAnyAttribute
+ private Map otherAttributes = new HashMap();
+
+ /**
+ * Ruft den Wert der eventId-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getEventId() {
+ return eventId;
+ }
+
+ /**
+ * Legt den Wert der eventId-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setEventId(String value) {
+ this.eventId = value;
+ }
+
+ /**
+ * Ruft den Wert der timestamp-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link XMLGregorianCalendar }
+ *
+ */
+ public XMLGregorianCalendar getTimestamp() {
+ return timestamp;
+ }
+
+ /**
+ * Legt den Wert der timestamp-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link XMLGregorianCalendar }
+ *
+ */
+ public void setTimestamp(XMLGregorianCalendar value) {
+ this.timestamp = value;
+ }
+
+ /**
+ * Ruft den Wert der eventType-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getEventType() {
+ return eventType;
+ }
+
+ /**
+ * Legt den Wert der eventType-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setEventType(String value) {
+ this.eventType = value;
+ }
+
+ /**
+ * Ruft den Wert der objectType-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getObjectType() {
+ return objectType;
+ }
+
+ /**
+ * Legt den Wert der objectType-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setObjectType(String value) {
+ this.objectType = value;
+ }
+
+ /**
+ * Ruft den Wert der objectId-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getObjectId() {
+ return objectId;
+ }
+
+ /**
+ * Legt den Wert der objectId-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setObjectId(String value) {
+ this.objectId = value;
+ }
+
+ /**
+ * Ruft den Wert der source-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link SourceType }
+ *
+ */
+ public SourceType getSource() {
+ return source;
+ }
+
+ /**
+ * Legt den Wert der source-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link SourceType }
+ *
+ */
+ public void setSource(SourceType value) {
+ this.source = value;
+ }
+
+ /**
+ * Ruft den Wert der user-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link CredentialsType }
+ *
+ */
+ public CredentialsType getUser() {
+ return user;
+ }
+
+ /**
+ * Legt den Wert der user-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link CredentialsType }
+ *
+ */
+ public void setUser(CredentialsType value) {
+ this.user = value;
+ }
+
+ /**
+ * Ruft den Wert der eventControl-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link EmBaseType }
+ *
+ */
+ public EmBaseType getEventControl() {
+ return eventControl;
+ }
+
+ /**
+ * Legt den Wert der eventControl-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link EmBaseType }
+ *
+ */
+ public void setEventControl(EmBaseType value) {
+ this.eventControl = value;
+ }
+
+ /**
+ * Ruft den Wert der baseExtension-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link BaseExtensionType }
+ *
+ */
+ public BaseExtensionType getBaseExtension() {
+ return baseExtension;
+ }
+
+ /**
+ * Legt den Wert der baseExtension-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link BaseExtensionType }
+ *
+ */
+ public void setBaseExtension(BaseExtensionType value) {
+ this.baseExtension = value;
+ }
+
+ /**
+ * Gets a map that contains attributes that aren't bound to any typed property on this class.
+ *
+ *
+ * the map is keyed by the name of the attribute and
+ * the value is the string value of the attribute.
+ *
+ * the map returned by this method is live, and you can add new attribute
+ * by updating the map directly. Because of this design, there's no setter.
+ *
+ *
+ * @return
+ * always non-null
+ */
+ public Map getOtherAttributes() {
+ return otherAttributes;
+ }
+
+}
diff --git a/src/main/java/net/brutex/xservices/types/alfevent/ObjectFactory.java b/src/main/java/net/brutex/xservices/types/alfevent/ObjectFactory.java
new file mode 100644
index 0000000..3d902d6
--- /dev/null
+++ b/src/main/java/net/brutex/xservices/types/alfevent/ObjectFactory.java
@@ -0,0 +1,133 @@
+
+package net.brutex.xservices.types.alfevent;
+
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.annotation.XmlElementDecl;
+import javax.xml.bind.annotation.XmlRegistry;
+import javax.xml.namespace.QName;
+
+
+/**
+ * This object contains factory methods for each
+ * Java content interface and Java element interface
+ * generated in the net.brutex.xservices.types.alfevent package.
+ * An ObjectFactory allows you to programatically
+ * construct new instances of the Java representation
+ * for XML content. The Java representation of XML
+ * content can consist of schema derived interfaces
+ * and classes representing the binding of schema
+ * type definitions, element declarations and model
+ * groups. Factory methods for each of these are
+ * provided in this class.
+ *
+ */
+@XmlRegistry
+public class ObjectFactory {
+
+ private final static QName _EventNotice_QNAME = new QName("http://www.eclipse.org/alf/schema/EventBase/1", "EventNotice");
+
+ /**
+ * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: net.brutex.xservices.types.alfevent
+ *
+ */
+ public ObjectFactory() {
+ }
+
+ /**
+ * Create an instance of {@link ALFEventType }
+ *
+ */
+ public ALFEventType createALFEventType() {
+ return new ALFEventType();
+ }
+
+ /**
+ * Create an instance of {@link DetailExtensionType }
+ *
+ */
+ public DetailExtensionType createDetailExtensionType() {
+ return new DetailExtensionType();
+ }
+
+ /**
+ * Create an instance of {@link CustomExtensionType }
+ *
+ */
+ public CustomExtensionType createCustomExtensionType() {
+ return new CustomExtensionType();
+ }
+
+ /**
+ * Create an instance of {@link CredentialsType }
+ *
+ */
+ public CredentialsType createCredentialsType() {
+ return new CredentialsType();
+ }
+
+ /**
+ * Create an instance of {@link SourceType }
+ *
+ */
+ public SourceType createSourceType() {
+ return new SourceType();
+ }
+
+ /**
+ * Create an instance of {@link BaseExtensionType }
+ *
+ */
+ public BaseExtensionType createBaseExtensionType() {
+ return new BaseExtensionType();
+ }
+
+ /**
+ * Create an instance of {@link EmExtensionType }
+ *
+ */
+ public EmExtensionType createEmExtensionType() {
+ return new EmExtensionType();
+ }
+
+ /**
+ * Create an instance of {@link ALFEventWithReplyResponseType }
+ *
+ */
+ public ALFEventWithReplyResponseType createALFEventWithReplyResponseType() {
+ return new ALFEventWithReplyResponseType();
+ }
+
+ /**
+ * Create an instance of {@link EventBaseType }
+ *
+ */
+ public EventBaseType createEventBaseType() {
+ return new EventBaseType();
+ }
+
+ /**
+ * Create an instance of {@link ALFEventResponseType }
+ *
+ */
+ public ALFEventResponseType createALFEventResponseType() {
+ return new ALFEventResponseType();
+ }
+
+ /**
+ * Create an instance of {@link EmBaseType }
+ *
+ */
+ public EmBaseType createEmBaseType() {
+ return new EmBaseType();
+ }
+
+ /**
+ * Create an instance of {@link JAXBElement }{@code <}{@link ALFEventType }{@code >}}
+ *
+ */
+ @XmlElementDecl(namespace = "http://www.eclipse.org/alf/schema/EventBase/1", name = "EventNotice")
+ public JAXBElement createEventNotice(ALFEventType value) {
+ return new JAXBElement(_EventNotice_QNAME, ALFEventType.class, null, value);
+ }
+
+}
diff --git a/src/main/java/net/brutex/xservices/types/alfevent/SourceType.java b/src/main/java/net/brutex/xservices/types/alfevent/SourceType.java
new file mode 100644
index 0000000..ddb23a9
--- /dev/null
+++ b/src/main/java/net/brutex/xservices/types/alfevent/SourceType.java
@@ -0,0 +1,155 @@
+
+package net.brutex.xservices.types.alfevent;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlSchemaType;
+import javax.xml.bind.annotation.XmlType;
+
+
+/**
+ *
+ * A Source element is a container type that describes the
+ * source of the event. ProductCallbackURI is optional for
+ * tools that don't provide a listener to accept the
+ * callback from a tool or serviceflow at a later time.
+ *
+ *
+ * Java-Klasse für SourceType complex type.
+ *
+ *
Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist.
+ *
+ *
+ * <complexType name="SourceType">
+ * <complexContent>
+ * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ * <sequence>
+ * <element name="Product" type="{http://www.eclipse.org/alf/schema/EventBase/1}ProductType"/>
+ * <element name="ProductVersion" type="{http://www.eclipse.org/alf/schema/EventBase/1}ProductVersionType"/>
+ * <element name="ProductInstance" type="{http://www.eclipse.org/alf/schema/EventBase/1}ProductInstanceType"/>
+ * <element name="ProductCallbackURI" type="{http://www.eclipse.org/alf/schema/EventBase/1}ProductCallbackURIType" minOccurs="0"/>
+ * </sequence>
+ * </restriction>
+ * </complexContent>
+ * </complexType>
+ *
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "SourceType", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", propOrder = {
+ "product",
+ "productVersion",
+ "productInstance",
+ "productCallbackURI"
+})
+public class SourceType {
+
+ @XmlElement(name = "Product", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
+ protected String product;
+ @XmlElement(name = "ProductVersion", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
+ protected String productVersion;
+ @XmlElement(name = "ProductInstance", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
+ protected String productInstance;
+ @XmlElement(name = "ProductCallbackURI", namespace = "http://www.eclipse.org/alf/schema/EventBase/1")
+ @XmlSchemaType(name = "anyURI")
+ protected String productCallbackURI;
+
+ /**
+ * Ruft den Wert der product-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getProduct() {
+ return product;
+ }
+
+ /**
+ * Legt den Wert der product-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setProduct(String value) {
+ this.product = value;
+ }
+
+ /**
+ * Ruft den Wert der productVersion-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getProductVersion() {
+ return productVersion;
+ }
+
+ /**
+ * Legt den Wert der productVersion-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setProductVersion(String value) {
+ this.productVersion = value;
+ }
+
+ /**
+ * Ruft den Wert der productInstance-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getProductInstance() {
+ return productInstance;
+ }
+
+ /**
+ * Legt den Wert der productInstance-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setProductInstance(String value) {
+ this.productInstance = value;
+ }
+
+ /**
+ * Ruft den Wert der productCallbackURI-Eigenschaft ab.
+ *
+ * @return
+ * possible object is
+ * {@link String }
+ *
+ */
+ public String getProductCallbackURI() {
+ return productCallbackURI;
+ }
+
+ /**
+ * Legt den Wert der productCallbackURI-Eigenschaft fest.
+ *
+ * @param value
+ * allowed object is
+ * {@link String }
+ *
+ */
+ public void setProductCallbackURI(String value) {
+ this.productCallbackURI = value;
+ }
+
+}
diff --git a/src/main/java/net/brutex/xservices/util/EventEmitter.java b/src/main/java/net/brutex/xservices/util/EventEmitter.java
new file mode 100644
index 0000000..9b37b71
--- /dev/null
+++ b/src/main/java/net/brutex/xservices/util/EventEmitter.java
@@ -0,0 +1,180 @@
+package net.brutex.xservices.util;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.IOUtils;
+import org.h2.jdbcx.JdbcConnectionPool;
+import org.quartz.*;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.sql.*;
+import java.time.Instant;
+import java.util.Date;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicLong;
+
+import static org.quartz.TriggerBuilder.newTrigger;
+
+@Slf4j
+public class EventEmitter implements Job, InterruptableJob {
+
+ private final AtomicBoolean isInterrupted = new AtomicBoolean(false);
+
+ @Override
+ public void execute(JobExecutionContext context) throws JobExecutionException {
+ final Instant d = Instant.now();
+ final long ts = d.toEpochMilli();
+ final EventmanagerConfiguration conf = (EventmanagerConfiguration) context.getMergedJobDataMap()
+ .get(EventmanagerConfiguration.KEY);
+
+ final String url = conf.getTargeturl();
+
+ final JdbcConnectionPool pool = (JdbcConnectionPool) context.getMergedJobDataMap().get("mdbConnection");
+ final JdbcConnectionPool fpool = (JdbcConnectionPool) context.getMergedJobDataMap().get("fdbConnection");
+ final long run_key = context.getMergedJobDataMap().getLong("run_key");
+ final AtomicLong egres_counter = (AtomicLong) context.getMergedJobDataMap().get("egres_counter");
+
+ final String querySQL = "SELECT btx_id, btx_event, btx_obj_id, btx_event_type, btx_obj_type, btx_timestamp FROM brutex.tbl_events_snap ORDER BY btx_timestamp asc FOR UPDATE;";
+ final String deleteSQL = "DELETE FROM brutex.tbl_events_snap where btx_id=?";
+ final String deleteTable = "TRUNCATE TABLE brutex.tbl_events;";
+
+ final String moveSQL = "INSERT INTO brutex.tbl_events_snap DIRECT SELECT " +
+ " btx_event_type, btx_id, btx_obj_type, btx_obj_id, btx_timestamp, ?, btx_event FROM brutex.tbl_events; ";
+
+
+ final String moveErrorSQL = "MERGE INTO brutex.tbl_events_errors " +
+ "KEY (btx_event_type, btx_obj_type, btx_obj_id) " +
+ "VALUES (?,?,?,?,?,?,?,?);";
+
+ /**
+ * Move event table data to snapshot
+ */
+
+ Connection con = null;
+ Connection fcon = null;
+ try {
+ con = pool.getConnection();
+ con.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
+ con.setAutoCommit(false);
+ Statement stmt = con.createStatement();
+ PreparedStatement moveprep= con.prepareStatement(moveSQL);
+ moveprep.setLong(1, run_key);
+ moveprep.execute();
+ stmt.execute(deleteTable);
+ con.commit(); //all events moved from tbl_events to tbl_events_snap at this point
+
+
+ fcon = fpool.getConnection();
+ PreparedStatement errorPrepSql = fcon.prepareStatement(moveErrorSQL);
+
+ PreparedStatement del = con.prepareStatement(deleteSQL);
+
+ ResultSet rs = stmt.executeQuery(querySQL);
+
+
+ while(rs.next() && !isInterrupted.get()) {
+ /* btx_id, btx_event, btx_obj_id, btx_event_type, btx_obj_typ */
+ String id = rs.getString(1);
+ Clob c = rs.getClob(2);
+ String obj_id = rs.getString(3);
+ String event_type = rs.getString(4);
+ String obj_type = rs.getString(5);
+ long event_ts = rs.getLong(6);
+ boolean bretry = false;
+
+ SimpleSoap ss = new SimpleSoap( url, id, IOUtils.toString(c.getCharacterStream()));
+ int retry = 0;
+ Reader response = null;
+ String rsp = "";
+ boolean succeeded = false;
+ while(retry < 3 && !succeeded && !isInterrupted.get()) {
+ retry++;
+ response = ss.sendSoap(false);
+ succeeded = true;
+ if(response!=null) {
+ rsp = IOUtils.toString(response);
+ }
+
+ if (rsp.contains("
+ * Called by the {@link Scheduler}
when a user
+ * interrupts the Job
.
+ *
+ *
+ * @throws UnableToInterruptJobException if there is an exception while interrupting the job.
+ */
+ @Override
+ public synchronized void interrupt() throws UnableToInterruptJobException {
+ isInterrupted.set(true);
+ log.warn("ALFEmitter received and interrupt.");
+ }
+}
diff --git a/src/main/java/net/brutex/xservices/util/EventmanagerConfiguration.java b/src/main/java/net/brutex/xservices/util/EventmanagerConfiguration.java
new file mode 100644
index 0000000..efde8a9
--- /dev/null
+++ b/src/main/java/net/brutex/xservices/util/EventmanagerConfiguration.java
@@ -0,0 +1,68 @@
+package net.brutex.xservices.util;
+
+import lombok.Data;
+import lombok.Singular;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.configuration2.Configuration;
+import org.apache.commons.configuration2.FileBasedConfiguration;
+import org.apache.commons.configuration2.PropertiesConfiguration;
+import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
+import org.apache.commons.configuration2.builder.PropertiesBuilderParametersImpl;
+import org.apache.commons.configuration2.ex.ConfigurationException;
+
+import javax.servlet.ServletContext;
+
+/**
+ * A configuration object for the MiscService -> Eventmanager. Implemented as singleton.
+ * @author Brian Rosenberger, bru@brutex.de
+**/
+@Data
+@Slf4j
+public class EventmanagerConfiguration {
+
+ public static final String KEY = "net.brutex.xservices.EventmanagerConfiguration";
+
+ private static class InstanceHolder {
+ public static final EventmanagerConfiguration instance = new EventmanagerConfiguration();
+ }
+
+ private EventmanagerConfiguration() {
+ refreshConfig();
+ }
+
+ public static EventmanagerConfiguration getInstance() {
+ return InstanceHolder.instance;
+ }
+
+
+ private String targeturl;
+ private int interval;
+ private String jdbc_memdb;
+ private String jdbc_filedb;
+
+
+ public synchronized EventmanagerConfiguration refreshConfig() {
+ log.trace("Reading EventmanagerConfiguration from file eventmanager.properties.");
+ FileBasedConfigurationBuilder builder =
+ new FileBasedConfigurationBuilder(PropertiesConfiguration.class)
+ .configure(new PropertiesBuilderParametersImpl().setFileName("eventmanager.properties"));
+
+ try {
+ Configuration config = builder.getConfiguration();
+
+ /* Read from eventmanager.properties file */
+ this.targeturl = config.getString("target.url");
+ this.interval = config.getInt("interval", 10);
+ this.jdbc_memdb = config.getString("memdb", "jdbc:h2:mem:lockdb;DB_CLOSE_DELAY=-1;");
+ this.jdbc_filedb = config.getString("fdb", "jdbc:h2:mem:lockdb;DB_CLOSE_DELAY=-1;");
+
+
+ } catch (ConfigurationException e) {
+ log.error("Error loading configuration for event manager in XServices MiscServices: {}", e.getMessage());
+ throw new RuntimeException(e);
+ }
+ return this;
+ }
+
+
+}
diff --git a/src/main/java/net/brutex/xservices/util/MiscServiceServletContextListener.java b/src/main/java/net/brutex/xservices/util/MiscServiceServletContextListener.java
new file mode 100644
index 0000000..c06cd0e
--- /dev/null
+++ b/src/main/java/net/brutex/xservices/util/MiscServiceServletContextListener.java
@@ -0,0 +1,192 @@
+package net.brutex.xservices.util;
+
+
+import lombok.extern.slf4j.Slf4j;
+import org.h2.jdbcx.JdbcConnectionPool;
+import org.quartz.*;
+import org.quartz.impl.StdSchedulerFactory;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.annotation.WebListener;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.time.Instant;
+import java.util.concurrent.atomic.AtomicLong;
+
+import static org.quartz.TriggerBuilder.newTrigger;
+
+//For Servlet container 3.x, you can annotate the listener with @WebListener, no need to declares in web.xml.
+
+/**
+ * Handle servlet lifecycle actions for the MiscService servlet, such as
+ * initializing in-memory database, persist on shutdown etc.
+ */
+
+
+@WebListener
+@Slf4j
+public class MiscServiceServletContextListener implements ServletContextListener {
+
+ /**
+ * SQL initialization for in-memory database
+ * INIT=RUNSCRIPT FROM 'classpath:scripts/create.sql'"
+ */
+ private final static String dbinit = "RUNSCRIPT FROM 'classpath:ddl/BRTX_schema.ddl';";
+
+ private final EventmanagerConfiguration configuration = EventmanagerConfiguration.getInstance().refreshConfig();
+ private final JdbcConnectionPool mempool = getDbPool(configuration.getJdbc_memdb());
+ private final JdbcConnectionPool fdbpool = getDbPool(configuration.getJdbc_filedb());
+
+ /**
+ * Create DB connection pool and initialize the in-memory database with schema.
+ *
+ * @return connection pool
+ */
+ private static JdbcConnectionPool getDbPool(String dbConnectString) {
+ JdbcConnectionPool p = JdbcConnectionPool.create(dbConnectString, "", "");
+ p.setMaxConnections(16);
+ p.setLoginTimeout(5);
+ try {
+ Connection c = p.getConnection();
+ Statement s = c.createStatement();
+ s.execute(dbinit);
+ log.trace("Running SQL against database '{}': '{}'", dbConnectString, dbinit);
+ c.close();
+ log.debug("Successfully created schema for database 'Brutex' at '{}'.", dbConnectString);
+ } catch (SQLException e) {
+ log.error("Error creating the schema for database 'Brutex' using '{}': {}", dbConnectString, e.getMessage());
+ throw new RuntimeException(e);
+ }
+ return p;
+ }
+
+ @Override
+ public void contextDestroyed(ServletContextEvent arg0) {
+ log.trace("contextDestroyed called.");
+ try {
+ Scheduler scheduler = (Scheduler) arg0.getServletContext().getAttribute("scheduler");
+ log.debug("Active jobs to be terminated: {}", scheduler.getCurrentlyExecutingJobs());
+
+ JobKey key = JobKey.jobKey("ALFEmitter");
+ synchronized (scheduler) {
+ if (!scheduler.isShutdown() && scheduler.checkExists(key) ) {
+ scheduler.interrupt(key);
+ scheduler.deleteJob(key);
+ log.info("Gracefully stopped the ALFEventEmitter job.");
+ }
+ if (!scheduler.isShutdown()) {
+ scheduler.shutdown(true);
+ }
+ }
+ } catch (SchedulerException e) {
+ log.error("Failed to stop the ALFEmitter job: {}", e.getMessage());
+ throw new RuntimeException(e);
+ }
+
+ log.info("ServletContextListener destroyed. Saving in-memory database to file based database.");
+ int act_i = mempool.getActiveConnections();
+ if (act_i > 0) {
+ log.warn("There are still {} connections to the XServices in-memory database active.", act_i);
+ }
+
+ try {
+ log.info("Create/Re-open file based database to persist memory database.");
+ Connection con = fdbpool.getConnection();
+ Statement s = con.createStatement();
+
+ final String insert = "INSERT INTO brutex.tbl_events SELECT * from LINK UNION SELECT " + "btx_event_type, btx_id, btx_obj_type, btx_obj_id, btx_timestamp, btx_event from LINK2;";
+ s.execute(insert);
+ int count = s.getUpdateCount();
+ log.info("Persisted {} rows in file-based database.", count);
+ log.info("Shutting down in-memory database. Closing file-based database. Please wait ...");
+ s.execute("SHUTDOWN;");
+ con.close();
+ log.info("Shutting down databases complete.");
+ } catch (SQLException e) {
+ log.error("An error occurred during database persistence: {}", e.getMessage());
+ throw new RuntimeException(e);
+ }
+ log.debug("Handled {} egress events.", arg0.getServletContext().getAttribute("egres_counter"));
+ log.debug("Handled {} ingress events.", arg0.getServletContext().getAttribute("ingres_counter"));
+ }
+
+ //Run this before web application is started
+ @Override
+ public void contextInitialized(ServletContextEvent arg0) {
+ log.debug("ServletContextListener started");
+ ServletContext context = arg0.getServletContext();
+ readConfiguration(context);
+
+ context.setAttribute("mdbConnection", mempool);
+ context.setAttribute("fdbConnection", fdbpool);
+ context.setAttribute("ingres_counter", 0);
+ AtomicLong egres = new AtomicLong(0);
+ context.setAttribute("egres_counter", egres);
+ context.setAttribute("ingres_counter", new AtomicLong(0));
+ try {
+ StdSchedulerFactory fact = new StdSchedulerFactory();
+ fact.initialize("MiscServicesScheduler-quartz.properties");
+ Scheduler scheduler = fact.getScheduler();
+ scheduler.start();
+ context.setAttribute("scheduler", scheduler);
+ } catch (SchedulerException e) {
+ log.error("Error creating scheduler within ServletContext: {}", e.getMessage());
+ throw new RuntimeException(e);
+ }
+
+ //Load events from file based database into in-memory database
+ try {
+ log.info("Start recovery of previously unsend alf events. Trying to load them into in-memory database.");
+ final String link = "CREATE LINKED TABLE IF NOT EXISTS LINK('org.h2.Driver', '"+configuration.getJdbc_memdb()+"', '', '', 'brutex.tbl_events'); " +
+ "CREATE LINKED TABLE IF NOT EXISTS LINK2('org.h2.Driver', '"+configuration.getJdbc_memdb()+"', '', '', 'brutex.tbl_events_snap');";
+ final String recoverSQL = "INSERT INTO LINK DIRECT SELECT * FROM brutex.tbl_events;";
+ final String truncate = "TRUNCATE TABLE brutex.tbl_events;";
+ int count = 0;
+ Connection con = fdbpool.getConnection();
+ con.setAutoCommit(false);
+ Statement statement = con.createStatement();
+ statement.execute(link);
+ con.commit();
+ ResultSet rs = statement.executeQuery("SELECT COUNT(1) FROM brutex.tbl_events");
+ if(rs.next()) count = rs.getInt(1);
+ statement.execute(recoverSQL);
+ log.info("Recovered {} events and loaded them into in-memory database.", count);
+ statement.execute(truncate);
+ con.commit();
+ con.close();
+ } catch (SQLException e) {
+ log.error("Exception during recovery of events from previous runs: {}", e.getMessage());
+ throw new RuntimeException(e);
+ }
+ //Start initial run of the emitter
+ startEmitterImmediate(egres, (Scheduler) context.getAttribute("scheduler"));
+ }
+
+ private synchronized void startEmitterImmediate(AtomicLong egres_counter, Scheduler scheduler) {
+ try {
+ if (!scheduler.checkExists(JobKey.jobKey("ALFEmitter"))) {
+ JobDetail job2 = JobBuilder.newJob(EventEmitter.class).withIdentity("ALFEmitter").build();
+ job2.getJobDataMap().put("mdbConnection", mempool);
+ job2.getJobDataMap().put("fdbConnection", fdbpool);
+ job2.getJobDataMap().put("run_key", Instant.now().toEpochMilli());
+ job2.getJobDataMap().put("egres_counter", egres_counter);
+ job2.getJobDataMap().put(EventmanagerConfiguration.KEY, EventmanagerConfiguration.getInstance());
+ SimpleTrigger t = (SimpleTrigger) newTrigger().withIdentity("ALFEmitter").startNow().build();
+ scheduler.scheduleJob(job2, t);
+ }
+ } catch (SchedulerException ex) {
+ log.error("Could not start EventEmitter to process existing queue directly after startup: {}", ex.getMessage());
+ }
+ }
+
+ private void readConfiguration(ServletContext ctx) {
+ /* Configure ServletContext attributes using configuration object*/
+ EventmanagerConfiguration c = EventmanagerConfiguration.getInstance().refreshConfig();
+ ctx.setAttribute(EventmanagerConfiguration.KEY, c);
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/net/brutex/xservices/util/SimpleSoap.java b/src/main/java/net/brutex/xservices/util/SimpleSoap.java
new file mode 100644
index 0000000..4ed8942
--- /dev/null
+++ b/src/main/java/net/brutex/xservices/util/SimpleSoap.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2013 Brian Rosenberger (Brutex Network)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package net.brutex.xservices.util;
+
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.entity.EntityBuilder;
+import org.apache.http.client.fluent.Request;
+import org.apache.http.client.fluent.Response;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+
+/**
+ * Construct a HTTP POST and send it.
+ *
+ * @author Brian Rosenberger, bru(at)brutex.de
+ * @since 0.1
+ */
+@Slf4j
+public class SimpleSoap {
+
+ private final String url;
+ private final String soapBody;
+ private final String id;
+ private long duration = 0;
+
+
+ final AtomicBoolean isInterrupted = new AtomicBoolean(false);
+
+ /**
+ * Instantiates a new simple http event.
+ *
+ * @param url the url
+ * @param soapBody the soap body
+ */
+ public SimpleSoap(String url, String id, String soapBody) {
+ this.url = url;
+ this.id = id;
+ this.soapBody = soapBody;
+ }
+
+ /**
+ * Send soap.
+ *
+ * @param isDropResponse show interest in response or not
+ * @throws ClientProtocolException the client protocol exception
+ * @throws IOException Signals that an I/O exception has occurred.
+ */
+ public Reader sendSoap(boolean isDropResponse) {
+ Reader response = null;
+ long start = System.currentTimeMillis();
+ EntityBuilder entitybuilder = EntityBuilder.create();
+ entitybuilder.setContentEncoding("UTF-8");
+ entitybuilder.setText(soapBody);
+ HttpEntity entity = entitybuilder.build();
+
+ log.trace("Sending event '{}' to target ALF Event Manager.", id);
+
+ if(isInterrupted.get()) return null;
+
+ try {
+ Response resp = Request.Post(url)
+ .addHeader("Accept", "text/xml")
+ .addHeader("Content-Type", "text/xml; charset=utf-8")
+ .addHeader("SOAPAction", "")
+ .body(entity).execute();
+
+ if (!isDropResponse) {
+ HttpEntity e = resp.returnResponse().getEntity();
+ response = new BufferedReader(new InputStreamReader(e.getContent()));
+ /*
+ StringBuilder sb = new StringBuilder();
+ BufferedReader in = new BufferedReader(new InputStreamReader(e.getContent()));
+ String s;
+ while ((s = in.readLine()) != null) {
+ sb.append(s);
+ }
+ log.trace("Response: \n {}", sb.toString());
+ if (sb.toString().contains("")) { return false;};
+ if (! sb.toString().contains(":Envelope ")) { return false;};
+
+ */
+ } else {
+ log.debug("Response intentionally ignored.");
+ }
+ } catch (IOException e) {
+ log.error("Error sending ALF Event '{}'. Got IOException: {}", id, e.getMessage());
+ }
+
+ duration = System.currentTimeMillis() - start;
+ return response;
+ }
+
+ public void interrupt() {
+ this.isInterrupted.set(true);
+ }
+}
diff --git a/src/main/java/net/brutex/xservices/ws/impl/MiscServiceImpl.java b/src/main/java/net/brutex/xservices/ws/impl/MiscServiceImpl.java
index a7fbfe4..1f72d60 100644
--- a/src/main/java/net/brutex/xservices/ws/impl/MiscServiceImpl.java
+++ b/src/main/java/net/brutex/xservices/ws/impl/MiscServiceImpl.java
@@ -16,12 +16,14 @@
package net.brutex.xservices.ws.impl;
+import lombok.extern.slf4j.Slf4j;
import net.brutex.xservices.types.*;
import net.brutex.xservices.types.alfevent.ALFEventResponseType;
import net.brutex.xservices.types.alfevent.ALFEventType;
import net.brutex.xservices.types.alfevent.ObjectFactory;
import net.brutex.xservices.types.ant.FileSetResource;
import net.brutex.xservices.util.EventEmitter;
+import net.brutex.xservices.util.EventmanagerConfiguration;
import net.brutex.xservices.util.RunTask;
import net.brutex.xservices.ws.MiscService;
import net.brutex.xservices.ws.XServicesFault;
@@ -46,11 +48,11 @@ import java.io.StringWriter;
import java.math.BigInteger;
import java.sql.*;
import java.time.Instant;
-import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;
import java.util.UUID;
+import java.util.concurrent.atomic.AtomicLong;
import static org.quartz.TriggerBuilder.newTrigger;
@@ -60,30 +62,13 @@ import static org.quartz.TriggerBuilder.newTrigger;
*
* @author Brian Rosenberger, bru@brutex.de
*/
+@Slf4j
@WebService(targetNamespace="http://ws.xservices.brutex.net", endpointInterface="net.brutex.xservices.ws.MiscService", serviceName="MiscService")
public class MiscServiceImpl
implements MiscService {
@Resource
private WebServiceContext context;
-
- // Grab the Scheduler instance from the Factory
- private final Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
- private final static String conStr = "jdbc:h2:mem:lockdb;DB_CLOSE_DELAY=-1;";
-
- private final static String dbinit = "" +
- "CREATE SCHEMA IF NOT EXISTS brutex;" +
- "CREATE TABLE IF NOT EXISTS brutex.tbl_events (" +
- "btx_event_type VARCHAR(128) NOT NULL," +
- "btx_id VARCHAR(32) NOT NULL, " +
- "btx_obj_type VARCHAR(32) NOT NULL, " +
- "btx_obj_id VARCHAR(32) NOT NULL, " +
- "btx_timestamp BIGINT NOT NULL," +
- "btx_event CLOB" +
- ");" +
- "CREATE INDEX IF NOT EXISTS brutex.btx_idx ON brutex.tbl_events (btx_obj_id, btx_obj_type, btx_event_type);" +
- "CREATE INDEX IF NOT EXISTS brutex.IDX_TO_DESC ON brutex.tbl_events (btx_timestamp ASC);";
-
public MiscServiceImpl() throws SchedulerException {
}
@@ -241,11 +226,21 @@ public class MiscServiceImpl
public ALFEventResponseType mergeALFEvent(ALFEventType event) throws XServicesFault {
final Instant d = Instant.now();
final long ts = d.toEpochMilli();
- //System.out.println("Step 1: " + ChronoUnit.MILLIS.between(Instant.now(), d));
+ //Get Parameters from the Servlet Context
final ServletContext servletContext =
(ServletContext) context.getMessageContext().get(MessageContext.SERVLET_CONTEXT);
- final JdbcConnectionPool pool = (JdbcConnectionPool) servletContext.getAttribute("dbConnection");
+ final EventmanagerConfiguration conf = (EventmanagerConfiguration) servletContext
+ .getAttribute(EventmanagerConfiguration.KEY);
+
+ final JdbcConnectionPool pool = (JdbcConnectionPool) servletContext.getAttribute("mdbConnection");
+ final JdbcConnectionPool fpool = (JdbcConnectionPool) servletContext.getAttribute("fdbConnection");
+ final AtomicLong egres_counter = (AtomicLong) servletContext.getAttribute("egres_counter");
+ final AtomicLong ingres_counter = (AtomicLong) servletContext.getAttribute("ingres_counter");
+ final Scheduler scheduler = (Scheduler) servletContext.getAttribute("scheduler");
+
+ log.trace("Read dbConnection from servlet context: {}", pool);
+
//System.out.println("Step 2: " + ChronoUnit.MILLIS.between(Instant.now(), d));
final ObjectFactory of = new ObjectFactory();
@@ -253,16 +248,15 @@ public class MiscServiceImpl
final String eventId = event.getBase().getEventId();
final String objectType = event.getBase().getObjectType();
final String eventType = event.getBase().getEventType();
+ log.debug("Event id '{}', type '{}' received for object '{}' with object_id '{}'.",
+ eventId, eventType, objectType, objectId);
final String mergeStatememt = "MERGE INTO brutex.tbl_events " +
"KEY (btx_event_type, btx_obj_type, btx_obj_id) " +
- "VALUES (?,?,?,?,?,?) " +
- "";
+ "VALUES (?,?,?,?,?,?);";
+
- long rows = 0L;
- //System.out.println("Step 3: " + ChronoUnit.MILLIS.between(Instant.now(), d));
try {
- //System.out.println("Step 4: " + ChronoUnit.MILLIS.between(Instant.now(), d));
Marshaller m = JAXBContext.newInstance(ALFEventType.class).createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
@@ -270,16 +264,16 @@ public class MiscServiceImpl
StringWriter sw = new StringWriter();
m.marshal(e, sw);
StringBuilder sb = new StringBuilder();
- sb.append(" \n");
+ sb.append(" \n");
sb.append("\n");
sb.append("\n");
sb.append(sw);
sb.append(" \n");
sb.append(" ");
sb.append(" ");
- //System.out.println("Step 5: " + ChronoUnit.MILLIS.between(Instant.now(), d));
+
Connection con = pool.getConnection();
- //System.out.println("Step 6: " + ChronoUnit.MILLIS.between(Instant.now(), d));
PreparedStatement prep = con.prepareStatement(mergeStatememt);
prep.setString(1, eventType);
prep.setString(2, eventId);
@@ -287,41 +281,35 @@ public class MiscServiceImpl
prep.setString(4, objectId);
prep.setLong(5, ts);
prep.setClob(6, new StringReader(sb.toString()));
- //prep.setLong(7, ts-20000);
- //System.out.println("Step 7 SQL START: " + ChronoUnit.MILLIS.between(Instant.now(), d));
prep.execute();
con.commit();
con.close();
- //System.out.println("Step 8 SQL END: " + ChronoUnit.MILLIS.between(Instant.now(), d));
- //SimpleSoap ss = new SimpleSoap("http://localhost:8099/ALFEventManager/services/ALFEventManagerSOAP", sb.toString());
- //ss.sendSoap(false);
+ ingres_counter.incrementAndGet();
- // and start it off
-
- if (!scheduler.isStarted())
- scheduler.start();
- if (scheduler.isInStandbyMode())
- scheduler.resumeAll();
- //System.out.println("Step 9: " + ChronoUnit.MILLIS.between(Instant.now(), d));
synchronized (scheduler) {
if (!scheduler.checkExists(JobKey.jobKey("ALFEmitter"))) {
JobDetail job2 = JobBuilder.newJob(EventEmitter.class)
- .withIdentity("ALFEmitter").build();
- //job2.getJobDataMap().put("script", job.getScript());
- //job2.getJobDataMap().put("description", job.getDescription());
- //job2.getJobDataMap().put("date", job.getDate());
+ .withIdentity("ALFEmitter")
+ .build();
+ job2.getJobDataMap().put("mdbConnection", pool);
+ job2.getJobDataMap().put("fdbConnection", fpool);
+ job2.getJobDataMap().put("run_key", ts);
+ job2.getJobDataMap().put("egres_counter", egres_counter);
+ job2.getJobDataMap().put("ingres_counter", ingres_counter);
+
+ job2.getJobDataMap().put(EventmanagerConfiguration.KEY, conf);
SimpleTrigger t = (SimpleTrigger) newTrigger()
- .withIdentity("ALFEmitter").startAt(Date.from(d.plusSeconds(20)))
+ .withIdentity("ALFEmitter").startAt(Date.from(d.plusSeconds(conf.getInterval())))
.build();
scheduler.scheduleJob(job2, t);
- }
+ }
}
- //System.out.println("Step 10: " + ChronoUnit.MILLIS.between(Instant.now(), d));
} catch (JAXBException | SQLException | SchedulerException e) {
- throw new XServicesFault(e);
+ log.error(e.getMessage());
+ throw new XServicesFault(e);
}
return of.createALFEventResponseType();
}
diff --git a/src/main/resources/MiscServicesScheduler-quartz.properties b/src/main/resources/MiscServicesScheduler-quartz.properties
new file mode 100644
index 0000000..462c5c0
--- /dev/null
+++ b/src/main/resources/MiscServicesScheduler-quartz.properties
@@ -0,0 +1,4 @@
+org.quartz.scheduler.instanceName = MiscServicesScheduler
+org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
+org.quartz.threadPool.threadCount = 2
+org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
diff --git a/src/main/resources/ddl/BRTX_schema.ddl b/src/main/resources/ddl/BRTX_schema.ddl
new file mode 100644
index 0000000..b142cd5
--- /dev/null
+++ b/src/main/resources/ddl/BRTX_schema.ddl
@@ -0,0 +1,42 @@
+-- Create Schema for Brutex
+CREATE SCHEMA IF NOT EXISTS brutex;
+
+CREATE TABLE IF NOT EXISTS brutex.tbl_events
+ (
+ btx_event_type VARCHAR(128) NOT NULL,
+ btx_id VARCHAR(32) NOT NULL,
+ btx_obj_type VARCHAR(32) NOT NULL,
+ btx_obj_id VARCHAR(32) NOT NULL,
+ btx_timestamp BIGINT NOT NULL,
+ btx_event CLOB
+ );
+CREATE INDEX IF NOT EXISTS brutex.btx_idx_key ON brutex.tbl_events (btx_obj_id, btx_obj_type, btx_event_type);
+CREATE INDEX IF NOT EXISTS brutex.btx_idx_ts ON brutex.tbl_events (btx_timestamp ASC);
+
+
+CREATE TABLE IF NOT EXISTS brutex.tbl_events_snap
+(
+ btx_event_type VARCHAR(128) NOT NULL,
+ btx_id VARCHAR(32) NOT NULL,
+ btx_obj_type VARCHAR(32) NOT NULL,
+ btx_obj_id VARCHAR(32) NOT NULL,
+ btx_timestamp BIGINT NOT NULL,
+ btx_run BIGINT NOT NULL,
+ btx_event CLOB
+);
+
+CREATE INDEX IF NOT EXISTS brutex.btx_idx_ts ON brutex.tbl_events_snap (btx_timestamp ASC);
+
+CREATE TABLE IF NOT EXISTS brutex.tbl_events_errors
+(
+ btx_event_type VARCHAR(128) NOT NULL,
+ btx_id VARCHAR(32) NOT NULL,
+ btx_obj_type VARCHAR(32) NOT NULL,
+ btx_obj_id VARCHAR(32) NOT NULL,
+ btx_timestamp BIGINT NOT NULL,
+ btx_retry BOOL,
+ btx_response CLOB,
+ btx_event CLOB
+);
+CREATE INDEX IF NOT EXISTS brutex.btx_idx_ts ON brutex.tbl_events_errors (btx_timestamp ASC);
+CREATE INDEX IF NOT EXISTS brutex.btx_idx_retry ON brutex.tbl_events_errors (btx_retry);
diff --git a/src/main/resources/eventmanager.properties b/src/main/resources/eventmanager.properties
new file mode 100644
index 0000000..b26df90
--- /dev/null
+++ b/src/main/resources/eventmanager.properties
@@ -0,0 +1,21 @@
+
+# The target ALF Event Manager to forward processed events to
+target.url = http://localhost:8099/ALFEventManager/services/ALFEventManagerSOAP
+
+# Merging interval in seconds
+# This specifies the minimum time the service will merge incoming events before starting
+# to move them into the outbound queue. Please note, that this is a minimum delay before
+# events are forwarded. In cases where the outbound queue processing takes longer than the
+# given interval, merging will continue until outbound queue has been processed completely.
+# default: interval = 10
+interval = 30
+
+# In-Memory Database (H2 in this case) to use for event processing
+# This is the JDBC connection string.
+# default: memdb = jdbc:h2:mem:lockdb;DB_CLOSE_DELAY=-1;
+memdb = jdbc:h2:mem:lockdb;DB_CLOSE_DELAY=-1;
+
+# Embedded file based database (H2 in this case) to use for event persistence
+# This is the JDBC connection string.
+# default: fdb = jdbc:h2:file:~/alf_event_db
+fdb = jdbc:h2:file:~/alf_event_db
\ No newline at end of file
diff --git a/src/main/resources/simplelogger.properties b/src/main/resources/simplelogger.properties
index 1a4c042..a037279 100644
--- a/src/main/resources/simplelogger.properties
+++ b/src/main/resources/simplelogger.properties
@@ -4,12 +4,12 @@
# Default logging detail level for all instances of SimpleLogger.
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, defaults to "info".
-org.slf4j.simpleLogger.defaultLogLevel=debug
+org.slf4j.simpleLogger.defaultLogLevel=warn
# Logging detail level for a SimpleLogger instance named "xxxxx".
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, the default logging detail level is used.
-org.slf4j.simpleLogger.log.net.brutex.xservices=debug
+org.slf4j.simpleLogger.log.net.brutex.xservices=info
# Set to true if you want the current date and time to be included in output messages.
# Default is false, and will output the number of milliseconds elapsed since startup.
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index 1772052..b2127e9 100644
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -73,7 +73,7 @@
1
-
+
CacheServlet
net.brutex.xservices.util.cache.CacheServlet
diff --git a/test/DateService-soapui-project.xml b/test/DateService-soapui-project.xml
index 4512b4b..9ff81cf 100644
--- a/test/DateService-soapui-project.xml
+++ b/test/DateService-soapui-project.xml
@@ -1,5 +1,5 @@
-
+
@@ -659,7 +659,17 @@
years
- ]]>Global HTTP Settings UTF-8 http://localhost:8080/XServices/DateService
+]]> Basic Basic Global HTTP Settings UTF-8 http://localhost:8080/XServices/DateService
+
+
+
+ 1970-01-01T00:00:00.000Z
+ ${=java.time.Instant.now()}
+
+ milliseconds
+
+
+]]> Basic Basic Global HTTP Settings UTF-8 http://localhost:8080/XServices/DateService
@@ -879,4 +889,14 @@
seconds
-]]> Global HTTP Settings false 30 0 250 true true -1 180 TIME Burst 60000 10000 100 true 500
\ No newline at end of file
+]]>Global HTTP Settings false 30 0 250 true true -1 180 TIME Burst 60000 10000 100 true 500 DateServiceSoapBinding dateTimeDiff2 UTF-8 http://localhost:8080/XServices/DateService
+
+
+
+ 1970-01-01T00:00:00.000Z
+ ${=java.time.Instant.now()}
+
+ milliseconds
+
+
+]]> Basic Basic Global HTTP Settings false 32 0 250 true true -1 120 TIME Simple 10 0.5 100 true 500
\ No newline at end of file
diff --git a/test/MiscService-soapui-project.xml b/test/MiscService-soapui-project.xml
index 9b53761..f3856a8 100644
--- a/test/MiscService-soapui-project.xml
+++ b/test/MiscService-soapui-project.xml
@@ -1,7 +1,100 @@
-http://localhost:8080/XServices/MiscService?WSDL
+http://localhost:8080/XServices/MiscService?WSDL
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -11,24 +104,16 @@
+
+
-
-
-
-
+
+
-
+
-
-
-
-
-
-
-
-
-
+
@@ -40,15 +125,41 @@
-
-
-
-
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -67,90 +178,140 @@
-
-
-
-
+
-
+
-
-
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Various service operations.
-
- Get information about a host.
-
-
+
+ Generate a UUID.
+
+
Get memory and processor information
-
- Delay request response a specified duration.
-
-
+
+
+
+
-
- Generate a UUID.
-
-
+
+ Get a lock.
+
+
+
Get XService information.
+
+ Get information about a host.
+
+
+
+
+ Delay request response a specified duration.
+
+
+
-
+
-
+
-
+
@@ -163,23 +324,29 @@
-
+
-
+
-
+
+
+
+
-
+
-
+
-
+
+
+
+
@@ -190,23 +357,92 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-]]> http://schemas.xmlsoap.org/wsdl/ http://localhost:8080/XServices/MiscService UTF-8 http://localhost:8080/XServices/MiscService
+]]> http://schemas.xmlsoap.org/wsdl/ http://localhost:8080/XServices/MiscService UTF-8 http://localhost:8080/XServices/MiscService
-]]> UTF-8 http://localhost:8080/XServices/MiscService
+]]> UTF-8 http://localhost:8080/XServices/MiscService \r
+ \r
+ \r
+ \r
+ \r
+]]> No Authorization UTF-8 http://localhost:8080/XServices/MiscService
-]]> SEQUENTIAL http://localhost:8080/XServices/MiscService?WSDL 200 MiscServiceSoapBinding getHostinfo UTF-8 http://localhost:8080/XServices/MiscService
+]]> No Authorization UTF-8 http://localhost:8080/XServices/MiscService
+
+
+
+
+ ${=org.apache.commons.lang.RandomStringUtils.randomNumeric(12)}
+
+ 12345-${=org.apache.commons.lang.RandomStringUtils.randomNumeric(1)}
+
+
+]]> No Authorization UTF-8 http://localhost:8080/XServices/MiscService \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ ${=org.apache.commons.lang.RandomStringUtils.randomNumeric(12)} \r
+
+ ${=java.time.Instant.now()} \r
+ sync \r
+ User \r
+ ABC${=org.apache.commons.lang.RandomStringUtils.randomNumeric(1)} \r
+ \r
+ IDM \r
+ 1.0 \r
+ Default \r
+
+ \r
+ \r
+ \r
+ \r
+
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+]]> No Authorization SEQUENTIAL http://localhost:8080/XServices/MiscService?WSDL 200 MiscServiceSoapBinding getHostinfo UTF-8 http://localhost:8080/XServices/MiscService
@@ -214,7 +450,7 @@
localhost
-]]> Global HTTP Settings MiscServiceSoapBinding getHostinfo UTF-8 http://localhost:8080/XServices/MiscService
+]]> Global HTTP Settings MiscServiceSoapBinding getHostinfo UTF-8 http://localhost:8080/XServices/MiscService
@@ -222,7 +458,7 @@
google.de
-]]> 5000 Global HTTP Settings MiscServiceSoapBinding getHostinfo UTF-8 http://localhost:8080/XServices/MiscService
+]]> 5000 Global HTTP Settings MiscServiceSoapBinding getHostinfo UTF-8 http://localhost:8080/XServices/MiscService
@@ -230,7 +466,7 @@
heise.de
-]]> 5000 Global HTTP Settings MiscServiceSoapBinding getHostinfo UTF-8 http://localhost:8080/XServices/MiscService
+]]> 5000 Global HTTP Settings MiscServiceSoapBinding getHostinfo UTF-8 http://localhost:8080/XServices/MiscService
@@ -238,12 +474,12 @@
173.194.69.94
-]]> 5000 Global HTTP Settings MiscServiceSoapBinding generateUUID UTF-8 http://localhost:8080/XServices/MiscService
+]]> 5000 Global HTTP Settings MiscServiceSoapBinding generateUUID UTF-8 http://localhost:8080/XServices/MiscService
-]]> Global HTTP Settings MiscServiceSoapBinding sleep UTF-8 http://localhost:8080/XServices/MiscService
+]]> Global HTTP Settings MiscServiceSoapBinding sleep UTF-8 http://localhost:8080/XServices/MiscService
@@ -251,12 +487,12 @@
4
-]]> 4100 Global HTTP Settings MiscServiceSoapBinding getInfo UTF-8 http://localhost:8080/XServices/MiscService
+]]> 4100 Global HTTP Settings MiscServiceSoapBinding getInfo UTF-8 http://localhost:8080/XServices/MiscService
-]]> Global HTTP Settings MiscServiceSoapBinding sleep UTF-8 http://localhost:8080/XServices/MiscService
+]]> Global HTTP Settings MiscServiceSoapBinding sleep UTF-8 http://localhost:8080/XServices/MiscService
@@ -264,7 +500,7 @@
0
-]]> 120200 Global HTTP Settings MiscServiceSoapBinding sleep UTF-8 http://localhost:8080/XServices/MiscService
+]]> 120200 Global HTTP Settings MiscServiceSoapBinding sleep UTF-8 http://localhost:8080/XServices/MiscService
@@ -272,9 +508,60 @@
32
-]]> Global HTTP Settings MiscServiceSoapBinding getMemory UTF-8 http://localhost:8080/XServices/MiscService
+]]> Global HTTP Settings MiscServiceSoapBinding getMemory UTF-8 http://localhost:8080/XServices/MiscService
-]]> Global HTTP Settings
\ No newline at end of file
+]]>Global HTTP Settings MiscServiceSoapBinding lock UTF-8 http://localhost:8080/XServices/MiscService \r
+ \r
+ \r
+ \r
+ \r
+ ${=org.apache.commons.lang.RandomStringUtils.randomNumeric(12)} \r
+ \r
+ 12345-${=org.apache.commons.lang.RandomStringUtils.randomNumeric(1)} \r
+ \r
+ \r
+]]> No Authorization false 2 0 250 true true -1 30 TIME Simple 300 0.5 100 true 500 MiscServiceSoapBinding EventNotice UTF-8 http://localhost:8080/XServices/MiscService \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ ${=org.apache.commons.lang.RandomStringUtils.randomNumeric(12)} \r
+
+ ${=java.time.Instant.now()} \r
+ sync \r
+ User \r
+ ABC${=org.apache.commons.lang.RandomStringUtils.randomNumeric(5)} \r
+ \r
+ IDM \r
+ 1.0 \r
+ Default \r
+
+ \r
+ \r
+ \r
+ \r
+
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+ \r
+]]> No Authorization false true true 1 0 250 true true -1 5000 COUNT Simple 20 0.5 100 0 false false true 500 false MiscServiceSoapBinding generateUUID UTF-8 http://localhost:8080/XServices/MiscService \r
+ \r
+ \r
+ \r
+ \r
+]]> No Authorization false 32 0 250 true true -1 60 TIME Simple 100 true 500
\ No newline at end of file