From 076e78afe27edd40b369f5726abde8f46feb203f Mon Sep 17 00:00:00 2001 From: Brian Rosenberger Date: Thu, 21 Sep 2023 13:02:06 +0000 Subject: [PATCH] Initial version 2.0.0-SNAPHSOT, now includes preview of event manager service and lock service (both within MiscServices git-svn-id: https://brutex.net/svn/xservices/trunk@201 e7e49efb-446e-492e-b9ec-fcafc1997a86 --- build.gradle | 67 ++- .../types/alfevent/ALFEventBase_1.xsd | 339 +++++++++++++ .../types/alfevent/ALFEventManagerSOAP.xsd | 135 +++++ .../types/alfevent/ALFEventResponseType.java | 62 +++ .../types/alfevent/ALFEventType.java | 188 +++++++ .../ALFEventWithReplyResponseType.java | 62 +++ .../types/alfevent/BaseExtensionType.java | 99 ++++ .../types/alfevent/CredentialsType.java | 101 ++++ .../types/alfevent/CustomExtensionType.java | 100 ++++ .../types/alfevent/DetailExtensionType.java | 100 ++++ .../xservices/types/alfevent/EmBaseType.java | 370 ++++++++++++++ .../types/alfevent/EmExtensionType.java | 98 ++++ .../types/alfevent/EventBaseType.java | 320 ++++++++++++ .../types/alfevent/ObjectFactory.java | 133 +++++ .../xservices/types/alfevent/SourceType.java | 155 ++++++ .../brutex/xservices/util/EventEmitter.java | 180 +++++++ .../util/EventmanagerConfiguration.java | 68 +++ .../MiscServiceServletContextListener.java | 192 ++++++++ .../net/brutex/xservices/util/SimpleSoap.java | 117 +++++ .../xservices/ws/impl/MiscServiceImpl.java | 86 ++-- .../MiscServicesScheduler-quartz.properties | 4 + src/main/resources/ddl/BRTX_schema.ddl | 42 ++ src/main/resources/eventmanager.properties | 21 + src/main/resources/simplelogger.properties | 4 +- src/main/webapp/WEB-INF/web.xml | 3 +- test/DateService-soapui-project.xml | 26 +- test/MiscService-soapui-project.xml | 463 ++++++++++++++---- 27 files changed, 3391 insertions(+), 144 deletions(-) create mode 100644 src/main/java/net/brutex/xservices/types/alfevent/ALFEventBase_1.xsd create mode 100644 src/main/java/net/brutex/xservices/types/alfevent/ALFEventManagerSOAP.xsd create mode 100644 src/main/java/net/brutex/xservices/types/alfevent/ALFEventResponseType.java create mode 100644 src/main/java/net/brutex/xservices/types/alfevent/ALFEventType.java create mode 100644 src/main/java/net/brutex/xservices/types/alfevent/ALFEventWithReplyResponseType.java create mode 100644 src/main/java/net/brutex/xservices/types/alfevent/BaseExtensionType.java create mode 100644 src/main/java/net/brutex/xservices/types/alfevent/CredentialsType.java create mode 100644 src/main/java/net/brutex/xservices/types/alfevent/CustomExtensionType.java create mode 100644 src/main/java/net/brutex/xservices/types/alfevent/DetailExtensionType.java create mode 100644 src/main/java/net/brutex/xservices/types/alfevent/EmBaseType.java create mode 100644 src/main/java/net/brutex/xservices/types/alfevent/EmExtensionType.java create mode 100644 src/main/java/net/brutex/xservices/types/alfevent/EventBaseType.java create mode 100644 src/main/java/net/brutex/xservices/types/alfevent/ObjectFactory.java create mode 100644 src/main/java/net/brutex/xservices/types/alfevent/SourceType.java create mode 100644 src/main/java/net/brutex/xservices/util/EventEmitter.java create mode 100644 src/main/java/net/brutex/xservices/util/EventmanagerConfiguration.java create mode 100644 src/main/java/net/brutex/xservices/util/MiscServiceServletContextListener.java create mode 100644 src/main/java/net/brutex/xservices/util/SimpleSoap.java create mode 100644 src/main/resources/MiscServicesScheduler-quartz.properties create mode 100644 src/main/resources/ddl/BRTX_schema.ddl create mode 100644 src/main/resources/eventmanager.properties 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; + + +/** + *

Java-Klasse für ALFEventResponseType complex type. + * + *

Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist. + * + *

+ * <complexType name="ALFEventResponseType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <any minOccurs="0"/>
+ *       </sequence>
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "ALFEventResponseType", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", propOrder = { + "any" +}) +public class ALFEventResponseType { + + @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/ALFEventType.java b/src/main/java/net/brutex/xservices/types/alfevent/ALFEventType.java new file mode 100644 index 0000000..776d275 --- /dev/null +++ b/src/main/java/net/brutex/xservices/types/alfevent/ALFEventType.java @@ -0,0 +1,188 @@ + +package net.brutex.xservices.types.alfevent; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAnyElement; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlType; +import org.w3c.dom.Element; + + +/** + *

Java-Klasse für ALFEventType complex type. + * + *

Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist. + * + *

+ * <complexType name="ALFEventType">
+ *   <complexContent>
+ *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       <sequence>
+ *         <element name="Base" type="{http://www.eclipse.org/alf/schema/EventBase/1}EventBaseType"/>
+ *         <element name="Detail" type="{http://www.eclipse.org/alf/schema/EventBase/1}DetailExtensionType" minOccurs="0"/>
+ *         <element name="Extension" type="{http://www.eclipse.org/alf/schema/EventBase/1}CustomExtensionType" minOccurs="0"/>
+ *         <any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/>
+ *       </sequence>
+ *       <attribute name="version" type="{http://www.eclipse.org/alf/schema/EventBase/1}ALFSchemaVersionType" default="1.0" />
+ *     </restriction>
+ *   </complexContent>
+ * </complexType>
+ * 
+ * + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "ALFEventType", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", propOrder = { + "base", + "detail", + "extension", + "any" +}) +public class ALFEventType { + + @XmlElement(name = "Base", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true) + protected EventBaseType base; + @XmlElement(name = "Detail", namespace = "http://www.eclipse.org/alf/schema/EventBase/1") + protected DetailExtensionType detail; + @XmlElement(name = "Extension", namespace = "http://www.eclipse.org/alf/schema/EventBase/1") + protected CustomExtensionType extension; + @XmlAnyElement(lax = true) + protected List 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<xml-fragment/>UTF-8http://localhost:8080/XServices/DateService +]]>BasicBasicGlobal HTTP Settings<xml-fragment/>UTF-8http://localhost:8080/XServices/DateService + + + + 1970-01-01T00:00:00.000Z + ${=java.time.Instant.now()} + + milliseconds + + +]]>BasicBasicGlobal HTTP Settings<xml-fragment/>UTF-8http://localhost:8080/XServices/DateService @@ -879,4 +889,14 @@ seconds -]]>Global HTTP Settingsfalse300250truetrue-1180TIMEBurst6000010000100true500 \ No newline at end of file +]]>Global HTTP Settingsfalse300250truetrue-1180TIMEBurst6000010000100true500DateServiceSoapBindingdateTimeDiff2<xml-fragment/>UTF-8http://localhost:8080/XServices/DateService + + + + 1970-01-01T00:00:00.000Z + ${=java.time.Instant.now()} + + milliseconds + + +]]>BasicBasicGlobal HTTP Settingsfalse320250truetrue-1120TIMESimple100.5100true500 \ 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<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService +]]>http://schemas.xmlsoap.org/wsdl/http://localhost:8080/XServices/MiscService<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService -]]><xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService +]]>UTF-8http://localhost:8080/XServices/MiscService\r + \r + \r + \r + \r +]]>No Authorization<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService -]]>SEQUENTIAL<xml-fragment/>http://localhost:8080/XServices/MiscService?WSDL200MiscServiceSoapBindinggetHostinfo<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService +]]>No Authorization<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService + + + + + ${=org.apache.commons.lang.RandomStringUtils.randomNumeric(12)} + + 12345-${=org.apache.commons.lang.RandomStringUtils.randomNumeric(1)} + + +]]>No Authorization<xml-fragment/>UTF-8http://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 AuthorizationSEQUENTIAL<xml-fragment/>http://localhost:8080/XServices/MiscService?WSDL200MiscServiceSoapBindinggetHostinfo<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService @@ -214,7 +450,7 @@ localhost -]]>Global HTTP SettingsMiscServiceSoapBindinggetHostinfo<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService +]]>Global HTTP SettingsMiscServiceSoapBindinggetHostinfo<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService @@ -222,7 +458,7 @@ google.de -]]>5000Global HTTP SettingsMiscServiceSoapBindinggetHostinfo<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService +]]>5000Global HTTP SettingsMiscServiceSoapBindinggetHostinfo<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService @@ -230,7 +466,7 @@ heise.de -]]>5000Global HTTP SettingsMiscServiceSoapBindinggetHostinfo<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService +]]>5000Global HTTP SettingsMiscServiceSoapBindinggetHostinfo<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService @@ -238,12 +474,12 @@ 173.194.69.94 -]]>5000Global HTTP SettingsMiscServiceSoapBindinggenerateUUID<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService +]]>5000Global HTTP SettingsMiscServiceSoapBindinggenerateUUID<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService -]]>Global HTTP SettingsMiscServiceSoapBindingsleep<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService +]]>Global HTTP SettingsMiscServiceSoapBindingsleep<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService @@ -251,12 +487,12 @@ 4 -]]>4100Global HTTP SettingsMiscServiceSoapBindinggetInfo<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService +]]>4100Global HTTP SettingsMiscServiceSoapBindinggetInfo<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService -]]>Global HTTP SettingsMiscServiceSoapBindingsleep<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService +]]>Global HTTP SettingsMiscServiceSoapBindingsleep<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService @@ -264,7 +500,7 @@ 0 -]]>120200Global HTTP SettingsMiscServiceSoapBindingsleep<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService +]]>120200Global HTTP SettingsMiscServiceSoapBindingsleep<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService @@ -272,9 +508,60 @@ 32 -]]>Global HTTP SettingsMiscServiceSoapBindinggetMemory<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService +]]>Global HTTP SettingsMiscServiceSoapBindinggetMemory<xml-fragment/>UTF-8http://localhost:8080/XServices/MiscService -]]>Global HTTP Settings \ No newline at end of file +]]>Global HTTP SettingsMiscServiceSoapBindinglock<xml-fragment/>UTF-8http://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 Authorizationfalse20250truetrue-130TIMESimple3000.5100true500MiscServiceSoapBindingEventNotice<xml-fragment/>UTF-8http://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 Authorizationfalsetruetrue10250truetrue-15000COUNTSimple200.51000falsefalsetrue500falseMiscServiceSoapBindinggenerateUUIDUTF-8http://localhost:8080/XServices/MiscService\r + \r + \r + \r + \r +]]>No Authorizationfalse320250truetrue-160TIMESimple100true500 \ No newline at end of file