Subversion Repositories XServices

Compare Revisions

Ignore whitespace Rev 202 → Rev 203

/xservices/trunk/build.gradle
91,10 → 91,6
 
implementation "org.quartz-scheduler:quartz:2.3.2"
 
//implementation "org.apache.logging.log4j:log4j-core:2.20.0"
//implementation "org.apache.logging.log4j:log4j-web:2.20.0"
//implementation "org.apache.logging.log4j:log4j-1.2-api:2.20.0"
//implementation "org.apache.logging.log4j:log4j-slf4j18-impl:2.18.0"
implementation "org.slf4j:slf4j-api:2.0.7"
 
runtimeOnly "org.slf4j:slf4j-simple:2.0.7"
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/ALFEventBase_1.xsd
0,0 → 1,354
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.eclipse.org/alf/schema/EventBase/1"
attributeFormDefault="unqualified" elementFormDefault="qualified"
targetNamespace="http://www.eclipse.org/alf/schema/EventBase/1">
<xs:annotation>
<xs:documentation>
Copyright Notice The material in this document is Copyright
(c) Serena Software, Inc. and others, 2005, 2006, 2007 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.
</xs:documentation>
</xs:annotation>
<xs:complexType name="EventBaseType">
<xs:annotation>
<xs:documentation>
EventBaseType is a container for that portion of an ALF
Event that is generally set by the Tool that raises the
event.
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="EventId" type="SourceEventIdType"/>
<xs:element name="Timestamp" nillable="true" type="TimestampType"/>
<xs:element name="EventType" type="EventTypeType"/>
<xs:element name="ObjectType" type="ObjectTypeType"/>
<xs:element name="ObjectId" type="ObjectIdType"/>
<xs:element name="Source" type="SourceType"/>
<xs:element name="User" type="CredentialsType"/>
<xs:element minOccurs="0" name="EventControl" type="EmBaseType"/>
<xs:element minOccurs="0" name="BaseExtension" type="BaseExtensionType"/>
</xs:sequence>
<xs:anyAttribute/>
</xs:complexType>
<xs:complexType name="EmBaseType">
<xs:annotation>
<xs:documentation>
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.
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="EmEventId" type="EventIdType"/>
<xs:element name="EmTimestamp" type="TimestampType"/>
<xs:element name="PrecedingEmEventId" type="EventIdType"/>
<xs:element name="ApplicationName" type="ApplicationNameType"/>
<xs:element name="EventMatchName" type="EventMatchNameType"/>
<xs:element name="ServiceFlowName" type="ServiceFlowNameType"/>
<xs:element name="ServiceFlowId" type="ServiceFlowIdType"/>
<xs:element name="Callback" type="xs:boolean"/>
<xs:element name="Environment" type="EnvironmentType"/>
<xs:element name="EmUser" type="CredentialsType"/>
<xs:element minOccurs="0" name="AttemptCount" type="xs:int"/>
<xs:element minOccurs="0" name="EmExtension" type="EmExtensionType"/>
</xs:sequence>
<xs:anyAttribute/>
</xs:complexType>
<xs:simpleType name="SourceEventIdType">
<xs:annotation>
<xs:documentation>
A id that uniquely identifies the Event instance at the source.
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:maxLength value="36"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="EventIdType">
<xs:annotation>
<xs:documentation>
A UUID that uniquely identifies the Event instance.
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:maxLength value="36"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ServiceFlowIdType">
<xs:annotation>
<xs:documentation>
A UUID that uniquely identifies the ServiceFlow
instance.
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:maxLength value="36"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="TimestampType">
<xs:annotation>
<xs:documentation>
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.
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:dateTime"/>
</xs:simpleType>
<xs:simpleType name="EventTypeType">
<xs:annotation>
<xs:documentation>
A string indicating the type of event. EventType
designates the verb. That is what action happened to the
Objects that triggered the event.
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="ObjectIdType">
<xs:annotation>
<xs:documentation>
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.
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="ObjectTypeType">
<xs:annotation>
<xs:documentation>
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.
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:complexType name="SourceType">
<xs:annotation>
<xs:documentation>
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.
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="Product" type="ProductType"/>
<xs:element name="ProductVersion" type="ProductVersionType"/>
<xs:element name="ProductInstance" type="ProductInstanceType"/>
<xs:element minOccurs="0" name="ProductCallbackURI" type="ProductCallbackURIType"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="ProductType">
<xs:annotation>
<xs:documentation>
A descriptive name for the tool (i.e., program) that
emitted the Event. Note that this is a datatype for a
Product element.
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="ProductCallbackURIType">
<xs:annotation>
<xs:documentation>
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.
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:anyURI"/>
</xs:simpleType>
<xs:simpleType name="ProductInstanceType">
<xs:annotation>
<xs:documentation>
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.
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="ProductVersionType">
<xs:annotation>
<xs:documentation>
The release version of the product, such as 5.06
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:complexType name="ALFSecurityType">
<xs:sequence>
<xs:element name="UsernameToken">
<xs:complexType>
<xs:sequence>
<xs:element name="Username" type="xs:string"/>
<xs:element name="Password" type="xs:string"/>
<xs:any maxOccurs="unbounded" minOccurs="0" processContents="lax"/>
</xs:sequence>
<xs:anyAttribute/>
</xs:complexType>
</xs:element>
<xs:any maxOccurs="unbounded" minOccurs="0" processContents="lax"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="CredentialsType">
<xs:annotation>
<xs:documentation>
A structure to hold security
authentication-relevant data. If present the
data within may be encrypted.
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element minOccurs="0" name="ALFSecurity" type="ALFSecurityType"/>
<xs:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="lax"/>
</xs:sequence>
<xs:anyAttribute/>
</xs:complexType>
<xs:simpleType name="ApplicationNameType">
<xs:annotation>
<xs:documentation>
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.
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="EventMatchNameType">
<xs:annotation>
<xs:documentation>
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.
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="ServiceFlowNameType">
<xs:annotation>
<xs:documentation>
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.
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="EnvironmentType">
<xs:annotation>
<xs:documentation>
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.
</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="ALFSchemaVersionType">
<xs:restriction base="xs:string">
<xs:enumeration value="1.0"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="BaseExtensionType">
<xs:annotation>
<xs:documentation>
Place holder type for future extensions of
BaseExtensionType
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:any maxOccurs="unbounded" namespace="##targetNamespace" processContents="lax"/>
</xs:sequence>
<xs:anyAttribute/>
</xs:complexType>
<xs:complexType name="EmExtensionType">
<xs:annotation>
<xs:documentation>
Place holder type for future extensions of EmBaseType
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:any maxOccurs="unbounded" namespace="##targetNamespace" processContents="lax"/>
</xs:sequence>
<xs:anyAttribute/>
</xs:complexType>
<xs:complexType name="DetailExtensionType">
<xs:annotation>
<xs:documentation>
Place holder type for vocabulary based Event payload
"details"
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:any maxOccurs="unbounded" namespace="##other" processContents="lax"/>
</xs:sequence>
<xs:anyAttribute/>
</xs:complexType>
<xs:complexType name="CustomExtensionType">
<xs:annotation>
<xs:documentation>
Place holder type for custom Event payload "extensions"
##other namespace is recommended but ##any is specified allowing more primitive sources
</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:any maxOccurs="unbounded" namespace="##any" processContents="lax"/>
</xs:sequence>
<xs:anyAttribute/>
</xs:complexType>
<xs:complexType name="ALFEventType">
<xs:sequence>
<xs:element name="Base" type="EventBaseType"/>
<xs:element minOccurs="0" name="Detail" type="DetailExtensionType"/>
<xs:element minOccurs="0" name="Extension" type="CustomExtensionType"/>
<xs:any maxOccurs="unbounded" minOccurs="0" namespace="##other" processContents="lax"/>
</xs:sequence>
<xs:attribute default="1.0" name="version" type="ALFSchemaVersionType"/>
</xs:complexType>
<xs:complexType name="ALFEventResponseType">
<xs:sequence>
<xs:any maxOccurs="unbounded" minOccurs="0" processContents="lax"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ALFEventWithReplyResponseType">
<xs:sequence>
<xs:any maxOccurs="unbounded" minOccurs="0" processContents="lax"/>
</xs:sequence>
</xs:complexType>
 
<!-- Element declaration for creating documents -->
<xs:element name="ALFEventNoticeDoc" type="ALFEventType"/>
 
</xs:schema>
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/ALFEventManagerDocLit.xsd
0,0 → 1,202
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="ALFEventManager" targetNamespace="http://www.eclipse.org/alf/schema/EventBase/1" xmlns="http://www.eclipse.org/alf/schema/EventBase/1" xmlns:evt="http://www.eclipse.org/alf/schema/EventBase/1" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:tns="http://www.eclipse.org/alf/schema/EventBase/1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<wsdl:documentation>
WARNING: PRELIMINARY VERSION SUBJECT TO CHANGE
 
Copyright Notice The material in this document is Copyright (c)
Serena Software, Inc. and others, 2005, 2006, 2007, 2008 Terms and
Conditions: The Eclipse Foundation makes available all content
in this document (&quot;Content&quot;). Unless otherwise indicated below,
the Content is provided to you under the terms and conditions of
the Eclipse Public License Version 1.0 (&quot;EPL&quot;). A copy of the
EPL is available at http://www.eclipse.org/legal/epl-v10.html.
For purposes of the EPL, &quot;Program&quot; will mean the Content. If you
did not receive this Content directly from the Eclipse
Foundation, the Content is being redistributed by another party
(&quot;Redistributor&quot;) 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.
</wsdl:documentation>
<wsdl:types>
<xsd:schema elementFormDefault="qualified" targetNamespace="http://www.eclipse.org/alf/schema/EventBase/1" xmlns="http://www.eclipse.org/alf/schema/EventBase/1" xmlns:evt="http://www.eclipse.org/alf/schema/EventBase/1">
<xsd:include schemaLocation="ALFEventBase_1.xsd"/>
 
<!-- Document Literal EventNotice service document elements -->
 
<xsd:element name="ALFEventNoticeDoc" type="evt:ALFEventType">
</xsd:element>
 
<xsd:element name="ALFEventNoticeDocResponse" type="evt:ALFEventResponseType">
</xsd:element>
 
<xsd:element name="ALFEventNoticeWithReplyDoc" type="evt:ALFEventType">
</xsd:element>
 
<xsd:element name="ALFEventNoticeWithReplyDocResponse" type="evt:ALFEventWithReplyResponseType">
</xsd:element>
 
 
<!-- EventNoticeWithReply exceptions -->
<xsd:complexType name="NoEventActionMatchFaultType">
<xsd:sequence>
<xsd:any maxOccurs="unbounded" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="NoEventActionMatchFault" type="evt:NoEventActionMatchFaultType">
</xsd:element>
 
<xsd:complexType name="ServiceFlowNotAvailableFaultType">
<xsd:sequence>
<xsd:any maxOccurs="unbounded" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="ServiceFlowNotAvailableFault" type="evt:ServiceFlowNotAvailableFaultType">
</xsd:element>
 
<xsd:complexType name="ServiceFlowFaultType">
<xsd:sequence>
<xsd:any maxOccurs="unbounded" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="ServiceFlowFault" type="evt:ServiceFlowFaultType">
</xsd:element>
 
<xsd:complexType name="UnexpectedFaultType">
<xsd:sequence>
<xsd:any maxOccurs="unbounded" minOccurs="0"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="UnexpectedFault" type="evt:UnexpectedFaultType">
</xsd:element>
 
</xsd:schema>
</wsdl:types>
<wsdl:message name="EventNoticeWithReplyDocResponse">
<wsdl:part name="EventNoticeWithReplyDocResponse" element="ALFEventNoticeWithReplyDocResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="EventNotice">
<wsdl:part name="EventNotice" type="ALFEventType">
</wsdl:part>
</wsdl:message>
<wsdl:message name="EventNoticeDocResponse">
<wsdl:part name="EventNoticeDocResponse" element="ALFEventNoticeDocResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="EventNoticeWithReplyResponse">
<wsdl:part name="EventNoticeWithReplyResponse" type="ALFEventWithReplyResponseType">
</wsdl:part>
</wsdl:message>
 
<wsdl:message name="EventNoticeDoc">
<wsdl:part name="EventNoticeDoc" element="ALFEventNoticeDoc">
</wsdl:part>
</wsdl:message>
 
 
<wsdl:message name="EventNoticeWithReplyDoc">
<wsdl:part name="EventNoticeWithReplyDoc" element="ALFEventNoticeWithReplyDoc">
</wsdl:part>
</wsdl:message>
<wsdl:message name="UnexpectedFault">
<wsdl:part name="UnexpectedFault" element="UnexpectedFault">
</wsdl:part>
</wsdl:message>
<wsdl:message name="EventNoticeResponse">
<wsdl:part name="EventNoticeResponse" type="ALFEventResponseType">
</wsdl:part>
</wsdl:message>
<wsdl:message name="NoEventActionMatchFault">
<wsdl:part name="NoEventActionMatchFault" element="NoEventActionMatchFault">
</wsdl:part>
</wsdl:message>
<wsdl:message name="ServiceFlowNotAvailableFault">
<wsdl:part name="ServiceFlowNotAvailableFault" element="ServiceFlowNotAvailableFault">
</wsdl:part>
</wsdl:message>
<wsdl:message name="ServiceFlowFault">
<wsdl:part name="ServiceFlowFault" element="ServiceFlowFault">
</wsdl:part>
</wsdl:message>
<wsdl:message name="EventNoticeWithReply">
<wsdl:part name="EventNoticeWithReply" type="ALFEventType">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="ALFEventManagerDocLit">
 
<wsdl:operation name="EventNotice">
<wsdl:input message="EventNoticeDoc" wsaw:Action="urn:EventNotice">
</wsdl:input>
<wsdl:output message="EventNoticeDocResponse" wsaw:Action="urn:EventNotice">
</wsdl:output>
<wsdl:fault name="UnexpectedFault" message="UnexpectedFault">
</wsdl:fault>
</wsdl:operation>
 
 
<wsdl:operation name="EventNoticeWithReply">
<wsdl:input message="EventNoticeWithReplyDoc" wsaw:Action="urn:EventNoticeWithReply">
</wsdl:input>
<wsdl:output message="EventNoticeWithReplyDocResponse" wsaw:Action="urn:EventNoticeWithReply">
</wsdl:output>
<wsdl:fault name="ServiceFlowNotAvailableFault" message="ServiceFlowNotAvailableFault">
</wsdl:fault>
<wsdl:fault name="ServiceFlowFault" message="ServiceFlowFault">
</wsdl:fault>
<wsdl:fault name="NoEventActionMatchFault" message="NoEventActionMatchFault">
</wsdl:fault>
<wsdl:fault name="UnexpectedFault" message="UnexpectedFault">
</wsdl:fault>
</wsdl:operation>
</wsdl:portType>
 
<wsdl:binding name="ALFEventManagerDocLitSOAP" type="ALFEventManagerDocLit">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="EventNotice">
<soap:operation soapAction="urn:EventNotice" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="UnexpectedFault">
<soap:fault name="UnexpectedFault" use="literal"/>
</wsdl:fault>
</wsdl:operation>
<wsdl:operation name="EventNoticeWithReply">
<soap:operation soapAction="urn:EventNoticeWithReply" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
<wsdl:fault name="ServiceFlowNotAvailableFault">
<soap:fault name="ServiceFlowNotAvailableFault" use="literal"/>
</wsdl:fault>
<wsdl:fault name="ServiceFlowFault">
<soap:fault name="ServiceFlowFault" use="literal"/>
</wsdl:fault>
<wsdl:fault name="NoEventActionMatchFault">
<soap:fault name="NoEventActionMatchFault" use="literal"/>
</wsdl:fault>
<wsdl:fault name="UnexpectedFault">
<soap:fault name="UnexpectedFault" use="literal"/>
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="ALFEventManagerDocLit">
<wsdl:port name="ALFEventManagerDocLitSOAP" binding="ALFEventManagerDocLitSOAP">
<soap:address location="http://localhost:8085/eventmanager/services/ALFEventManagerDocLit/"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/ALFEventResponseType.java
1,10 → 1,13
 
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.XmlType;
import org.w3c.dom.Element;
 
 
/**
17,7 → 20,7
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;any minOccurs="0"/>
* &lt;any processContents='lax' maxOccurs="unbounded" minOccurs="0"/>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
33,30 → 36,36
public class ALFEventResponseType {
 
@XmlAnyElement(lax = true)
protected Object any;
protected List<Object> any;
 
/**
* Ruft den Wert der any-Eigenschaft ab.
* Gets the value of the any property.
*
* @return
* possible object is
* {@link Object }
*
*/
public Object getAny() {
return any;
}
 
/**
* Legt den Wert der any-Eigenschaft fest.
* <p>
* 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 <CODE>set</CODE> method for the any property.
*
* @param value
* allowed object is
* {@link Object }
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getAny().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Element }
* {@link Object }
*
*
*/
public void setAny(Object value) {
this.any = value;
public List<Object> getAny() {
if (any == null) {
any = new ArrayList<Object>();
}
return this.any;
}
 
}
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/ALFEventType.java
145,8 → 145,8
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Element }
* {@link Object }
* {@link Element }
*
*
*/
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/ALFEventWithReplyResponseType.java
1,10 → 1,13
 
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.XmlType;
import org.w3c.dom.Element;
 
 
/**
17,7 → 20,7
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;any minOccurs="0"/>
* &lt;any processContents='lax' maxOccurs="unbounded" minOccurs="0"/>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
33,30 → 36,36
public class ALFEventWithReplyResponseType {
 
@XmlAnyElement(lax = true)
protected Object any;
protected List<Object> any;
 
/**
* Ruft den Wert der any-Eigenschaft ab.
* Gets the value of the any property.
*
* @return
* possible object is
* {@link Object }
*
*/
public Object getAny() {
return any;
}
 
/**
* Legt den Wert der any-Eigenschaft fest.
* <p>
* 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 <CODE>set</CODE> method for the any property.
*
* @param value
* allowed object is
* {@link Object }
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getAny().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Element }
* {@link Object }
*
*
*/
public void setAny(Object value) {
this.any = value;
public List<Object> getAny() {
if (any == null) {
any = new ArrayList<Object>();
}
return this.any;
}
 
}
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/ALFSecurityType.java
0,0 → 1,255
 
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.XmlElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.namespace.QName;
import org.w3c.dom.Element;
 
 
/**
* <p>Java-Klasse für ALFSecurityType complex type.
*
* <p>Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist.
*
* <pre>
* &lt;complexType name="ALFSecurityType">
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element name="UsernameToken">
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element name="Username" type="{http://www.w3.org/2001/XMLSchema}string"/>
* &lt;element name="Password" type="{http://www.w3.org/2001/XMLSchema}string"/>
* &lt;any processContents='lax' maxOccurs="unbounded" minOccurs="0"/>
* &lt;/sequence>
* &lt;anyAttribute/>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* &lt;/element>
* &lt;any processContents='lax' maxOccurs="unbounded" minOccurs="0"/>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ALFSecurityType", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", propOrder = {
"usernameToken",
"any"
})
public class ALFSecurityType {
 
@XmlElement(name = "UsernameToken", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
protected ALFSecurityType.UsernameToken usernameToken;
@XmlAnyElement(lax = true)
protected List<Object> any;
 
/**
* Ruft den Wert der usernameToken-Eigenschaft ab.
*
* @return
* possible object is
* {@link ALFSecurityType.UsernameToken }
*
*/
public ALFSecurityType.UsernameToken getUsernameToken() {
return usernameToken;
}
 
/**
* Legt den Wert der usernameToken-Eigenschaft fest.
*
* @param value
* allowed object is
* {@link ALFSecurityType.UsernameToken }
*
*/
public void setUsernameToken(ALFSecurityType.UsernameToken value) {
this.usernameToken = value;
}
 
/**
* Gets the value of the any property.
*
* <p>
* 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 <CODE>set</CODE> method for the any property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getAny().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Element }
* {@link Object }
*
*
*/
public List<Object> getAny() {
if (any == null) {
any = new ArrayList<Object>();
}
return this.any;
}
 
 
/**
* <p>Java-Klasse für anonymous complex type.
*
* <p>Das folgende Schemafragment gibt den erwarteten Content an, der in dieser Klasse enthalten ist.
*
* <pre>
* &lt;complexType>
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element name="Username" type="{http://www.w3.org/2001/XMLSchema}string"/>
* &lt;element name="Password" type="{http://www.w3.org/2001/XMLSchema}string"/>
* &lt;any processContents='lax' maxOccurs="unbounded" minOccurs="0"/>
* &lt;/sequence>
* &lt;anyAttribute/>
* &lt;/restriction>
* &lt;/complexContent>
* &lt;/complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"username",
"password",
"any"
})
public static class UsernameToken {
 
@XmlElement(name = "Username", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
protected String username;
@XmlElement(name = "Password", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
protected String password;
@XmlAnyElement(lax = true)
protected List<Object> any;
@XmlAnyAttribute
private Map<QName, String> otherAttributes = new HashMap<QName, String>();
 
/**
* Ruft den Wert der username-Eigenschaft ab.
*
* @return
* possible object is
* {@link String }
*
*/
public String getUsername() {
return username;
}
 
/**
* Legt den Wert der username-Eigenschaft fest.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setUsername(String value) {
this.username = value;
}
 
/**
* Ruft den Wert der password-Eigenschaft ab.
*
* @return
* possible object is
* {@link String }
*
*/
public String getPassword() {
return password;
}
 
/**
* Legt den Wert der password-Eigenschaft fest.
*
* @param value
* allowed object is
* {@link String }
*
*/
public void setPassword(String value) {
this.password = value;
}
 
/**
* Gets the value of the any property.
*
* <p>
* 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 <CODE>set</CODE> method for the any property.
*
* <p>
* For example, to add a new item, do as follows:
* <pre>
* getAny().add(newItem);
* </pre>
*
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Element }
* {@link Object }
*
*
*/
public List<Object> getAny() {
if (any == null) {
any = new ArrayList<Object>();
}
return this.any;
}
 
/**
* Gets a map that contains attributes that aren't bound to any typed property on this class.
*
* <p>
* 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<QName, String> getOtherAttributes() {
return otherAttributes;
}
 
}
 
}
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/BaseExtensionType.java
11,6 → 11,7
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.namespace.QName;
import org.w3c.dom.Element;
 
 
/**
28,7 → 29,7
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;any namespace='targetnamespace' maxOccurs="unbounded"/>
* &lt;any processContents='lax' namespace='http://www.eclipse.org/alf/schema/EventBase/1' maxOccurs="unbounded"/>
* &lt;/sequence>
* &lt;anyAttribute/>
* &lt;/restriction>
67,6 → 68,7
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Element }
* {@link Object }
*
*
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/CredentialsType.java
9,6 → 9,7
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyAttribute;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.namespace.QName;
import org.w3c.dom.Element;
16,8 → 17,9
 
/**
*
* A structure to hold security authentication-relevant data.
* If present the data within may be encrypted.
* A structure to hold security
* authentication-relevant data. If present the
* data within may be encrypted.
*
*
* <p>Java-Klasse für CredentialsType complex type.
29,7 → 31,8
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;any processContents='lax' maxOccurs="unbounded" minOccurs="0"/>
* &lt;element name="ALFSecurity" type="{http://www.eclipse.org/alf/schema/EventBase/1}ALFSecurityType" minOccurs="0"/>
* &lt;any processContents='lax' namespace='##other' maxOccurs="unbounded" minOccurs="0"/>
* &lt;/sequence>
* &lt;anyAttribute/>
* &lt;/restriction>
41,10 → 44,13
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "CredentialsType", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", propOrder = {
"alfSecurity",
"any"
})
public class CredentialsType {
 
@XmlElement(name = "ALFSecurity", namespace = "http://www.eclipse.org/alf/schema/EventBase/1")
protected ALFSecurityType alfSecurity;
@XmlAnyElement(lax = true)
protected List<Object> any;
@XmlAnyAttribute
51,6 → 57,30
private Map<QName, String> otherAttributes = new HashMap<QName, String>();
 
/**
* Ruft den Wert der alfSecurity-Eigenschaft ab.
*
* @return
* possible object is
* {@link ALFSecurityType }
*
*/
public ALFSecurityType getALFSecurity() {
return alfSecurity;
}
 
/**
* Legt den Wert der alfSecurity-Eigenschaft fest.
*
* @param value
* allowed object is
* {@link ALFSecurityType }
*
*/
public void setALFSecurity(ALFSecurityType value) {
this.alfSecurity = value;
}
 
/**
* Gets the value of the any property.
*
* <p>
68,8 → 98,8
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Element }
* {@link Object }
* {@link Element }
*
*
*/
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/CustomExtensionType.java
17,6 → 17,7
/**
*
* Place holder type for custom Event payload "extensions"
* ##other namespace is recommended but ##any is specified allowing more primitive sources
*
*
* <p>Java-Klasse für CustomExtensionType complex type.
28,7 → 29,7
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;any processContents='lax' namespace='##other' maxOccurs="unbounded"/>
* &lt;any processContents='lax' maxOccurs="unbounded"/>
* &lt;/sequence>
* &lt;anyAttribute/>
* &lt;/restriction>
67,8 → 68,8
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Element }
* {@link Object }
* {@link Element }
*
*
*/
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/DetailExtensionType.java
16,7 → 16,8
 
/**
*
* Place holder type for vocabulary based Event payload "details"
* Place holder type for vocabulary based Event payload
* "details"
*
*
* <p>Java-Klasse für DetailExtensionType complex type.
67,8 → 68,8
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Element }
* {@link Object }
* {@link Element }
*
*
*/
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/EmBaseType.java
31,7 → 31,7
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element name="EmEventId" type="{http://www.w3.org/2001/XMLSchema}string"/>
* &lt;element name="EmEventId" type="{http://www.eclipse.org/alf/schema/EventBase/1}EventIdType"/>
* &lt;element name="EmTimestamp" type="{http://www.eclipse.org/alf/schema/EventBase/1}TimestampType"/>
* &lt;element name="PrecedingEmEventId" type="{http://www.eclipse.org/alf/schema/EventBase/1}EventIdType"/>
* &lt;element name="ApplicationName" type="{http://www.eclipse.org/alf/schema/EventBase/1}ApplicationNameType"/>
41,6 → 41,7
* &lt;element name="Callback" type="{http://www.w3.org/2001/XMLSchema}boolean"/>
* &lt;element name="Environment" type="{http://www.eclipse.org/alf/schema/EventBase/1}EnvironmentType"/>
* &lt;element name="EmUser" type="{http://www.eclipse.org/alf/schema/EventBase/1}CredentialsType"/>
* &lt;element name="AttemptCount" type="{http://www.w3.org/2001/XMLSchema}int" minOccurs="0"/>
* &lt;element name="EmExtension" type="{http://www.eclipse.org/alf/schema/EventBase/1}EmExtensionType" minOccurs="0"/>
* &lt;/sequence>
* &lt;anyAttribute/>
63,6 → 64,7
"callback",
"environment",
"emUser",
"attemptCount",
"emExtension"
})
public class EmBaseType {
88,6 → 90,8
protected String environment;
@XmlElement(name = "EmUser", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
protected CredentialsType emUser;
@XmlElement(name = "AttemptCount", namespace = "http://www.eclipse.org/alf/schema/EventBase/1")
protected Integer attemptCount;
@XmlElement(name = "EmExtension", namespace = "http://www.eclipse.org/alf/schema/EventBase/1")
protected EmExtensionType emExtension;
@XmlAnyAttribute
326,6 → 330,30
}
 
/**
* Ruft den Wert der attemptCount-Eigenschaft ab.
*
* @return
* possible object is
* {@link Integer }
*
*/
public Integer getAttemptCount() {
return attemptCount;
}
 
/**
* Legt den Wert der attemptCount-Eigenschaft fest.
*
* @param value
* allowed object is
* {@link Integer }
*
*/
public void setAttemptCount(Integer value) {
this.attemptCount = value;
}
 
/**
* Ruft den Wert der emExtension-Eigenschaft ab.
*
* @return
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/EmExtensionType.java
11,6 → 11,7
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.namespace.QName;
import org.w3c.dom.Element;
 
 
/**
27,7 → 28,7
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;any namespace='targetnamespace' maxOccurs="unbounded"/>
* &lt;any processContents='lax' namespace='http://www.eclipse.org/alf/schema/EventBase/1' maxOccurs="unbounded"/>
* &lt;/sequence>
* &lt;anyAttribute/>
* &lt;/restriction>
66,6 → 67,7
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Element }
* {@link Object }
*
*
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/EventBaseType.java
29,7 → 29,7
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;element name="EventId" type="{http://www.eclipse.org/alf/schema/EventBase/1}EventIdType"/>
* &lt;element name="EventId" type="{http://www.eclipse.org/alf/schema/EventBase/1}SourceEventIdType"/>
* &lt;element name="Timestamp" type="{http://www.eclipse.org/alf/schema/EventBase/1}TimestampType"/>
* &lt;element name="EventType" type="{http://www.eclipse.org/alf/schema/EventBase/1}EventTypeType"/>
* &lt;element name="ObjectType" type="{http://www.eclipse.org/alf/schema/EventBase/1}ObjectTypeType"/>
63,7 → 63,7
 
@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)
@XmlElement(name = "Timestamp", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true, nillable = true)
@XmlSchemaType(name = "dateTime")
protected XMLGregorianCalendar timestamp;
@XmlElement(name = "EventType", namespace = "http://www.eclipse.org/alf/schema/EventBase/1", required = true)
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/ObjectFactory.java
24,7 → 24,7
@XmlRegistry
public class ObjectFactory {
 
private final static QName _EventNotice_QNAME = new QName("http://www.eclipse.org/alf/schema/EventBase/1", "EventNotice");
private final static QName _ALFEventNoticeDoc_QNAME = new QName("http://www.eclipse.org/alf/schema/EventBase/1", "ALFEventNoticeDoc");
 
/**
* Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: net.brutex.xservices.types.alfevent
34,6 → 34,14
}
 
/**
* Create an instance of {@link ALFSecurityType }
*
*/
public ALFSecurityType createALFSecurityType() {
return new ALFSecurityType();
}
 
/**
* Create an instance of {@link ALFEventType }
*
*/
122,12 → 130,20
}
 
/**
* Create an instance of {@link ALFSecurityType.UsernameToken }
*
*/
public ALFSecurityType.UsernameToken createALFSecurityTypeUsernameToken() {
return new ALFSecurityType.UsernameToken();
}
 
/**
* Create an instance of {@link JAXBElement }{@code <}{@link ALFEventType }{@code >}}
*
*/
@XmlElementDecl(namespace = "http://www.eclipse.org/alf/schema/EventBase/1", name = "EventNotice")
public JAXBElement<ALFEventType> createEventNotice(ALFEventType value) {
return new JAXBElement<ALFEventType>(_EventNotice_QNAME, ALFEventType.class, null, value);
@XmlElementDecl(namespace = "http://www.eclipse.org/alf/schema/EventBase/1", name = "ALFEventNoticeDoc")
public JAXBElement<ALFEventType> createALFEventNoticeDoc(ALFEventType value) {
return new JAXBElement<ALFEventType>(_ALFEventNoticeDoc_QNAME, ALFEventType.class, null, value);
}
 
}
/xservices/trunk/src/main/java/net/brutex/xservices/util/EventEmitter.java
51,10 → 51,11
* Move event table data to snapshot
*/
 
Connection con = null;
Connection fcon = null;
try {
con = pool.getConnection();
 
try( Connection con = pool.getConnection();
Connection fcon = fpool.getConnection();
) {
 
con.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
con.setAutoCommit(false);
Statement stmt = con.createStatement();
65,7 → 66,7
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);
83,7 → 84,8
long event_ts = rs.getLong(6);
boolean bretry = false;
 
SimpleSoap ss = new SimpleSoap( url, id, IOUtils.toString(c.getCharacterStream()));
//SimpleSoap ss = new SimpleSoap( url, id, IOUtils.toString(c.getAsciiStream()c.getCharacterStream()));
SimpleSoap ss = new SimpleSoap(url, id, c.getSubString(1L, (int) c.length()));
int retry = 0;
Reader response = null;
String rsp = "";
152,14 → 154,6
} catch (IOException e) {
log.error("Exception in SQL execution: {}", e.getMessage());
throw new RuntimeException(e);
} finally {
try {
if(fcon!=null) fcon.close();
if(con!=null) con.close();
} catch (SQLException e) {
log.error("Error closing the database connections: {}", e.getMessage());
throw new RuntimeException(e);
}
}
}
 
/xservices/trunk/src/main/java/net/brutex/xservices/util/EventLogCleanerJob.java
0,0 → 1,83
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.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
 
@Slf4j
@DisallowConcurrentExecution
public class EventLogCleanerJob 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();
 
log.info("EventLogCleaner is executing now.");
final EventmanagerConfiguration conf = (EventmanagerConfiguration) context.getMergedJobDataMap()
.get(EventmanagerConfiguration.KEY);
 
final JdbcConnectionPool fpool = (JdbcConnectionPool) context.getMergedJobDataMap().get("fdbConnection");
final JdbcConnectionPool mpool = (JdbcConnectionPool) context.getMergedJobDataMap().get("mdbConnection");
 
final String moveSQL = "INSERT INTO brutex.tbl_events_all DIRECT SELECT * FROM MEM_ALL_EVENTS " +
"where btx_timestamp < " + (ts-5000) + " ";
final String deleteTable = "DELETE FROM MEM_ALL_EVENTS where btx_timestamp < " + (ts-5000);
final String deleteMemTable = "DELETE FROM brutex.tbl_events_all where btx_timestamp < " + (ts-5000);
 
 
/**
* Move event table data to all events log
*/
 
 
try (Connection fcon = fpool.getConnection();
Connection mcon = mpool.getConnection()){
fcon.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
fcon.setAutoCommit(false);
Statement stmt = fcon.createStatement();
stmt.execute(moveSQL);
int count = stmt.getUpdateCount();
fcon.commit();
Statement mstm = mcon.createStatement();
 
 
mstm.execute(deleteMemTable);
int count2 = mstm.getUpdateCount();
mcon.commit();
 
log.info("EventLogCleaner moved '{}/ deleted {}' events into the persistence space.", count, count2);
 
} catch (SQLException e) {
log.error("Exception in SQL execution: {}", e.getMessage());
throw new JobExecutionException(e);
}
}
 
 
/**
* <p>
* Called by the <code>{@link Scheduler}</code> when a user
* interrupts the <code>Job</code>.
* </p>
*
* @throws UnableToInterruptJobException if there is an exception while interrupting the job.
*/
@Override
public synchronized void interrupt() throws UnableToInterruptJobException {
isInterrupted.set(true);
log.warn("EventLogCleaner received and interrupt.");
Thread.currentThread().interrupt();
}
}
/xservices/trunk/src/main/java/net/brutex/xservices/util/EventmanagerConfiguration.java
8,6 → 8,8
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.event.ConfigurationEvent;
import org.apache.commons.configuration2.event.EventListener;
import org.apache.commons.configuration2.ex.ConfigurationException;
 
import javax.servlet.ServletContext;
39,6 → 41,8
private int interval;
private String jdbc_memdb;
private String jdbc_filedb;
private boolean isEmitterActive = true;
private int cleaner_interval;
 
 
public synchronized EventmanagerConfiguration refreshConfig() {
45,7 → 49,7
log.trace("Reading EventmanagerConfiguration from file eventmanager.properties.");
FileBasedConfigurationBuilder<FileBasedConfiguration> builder =
new FileBasedConfigurationBuilder<FileBasedConfiguration>(PropertiesConfiguration.class)
.configure(new PropertiesBuilderParametersImpl().setFileName("eventmanager.properties"));
.configure(new PropertiesBuilderParametersImpl().setFileName("../eventmanager.properties"));
 
try {
Configuration config = builder.getConfiguration();
55,6 → 59,8
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;");
this.isEmitterActive = config.getBoolean("emitter_active", true);
this.cleaner_interval = config.getInt("cleaner_interval", 5);
 
 
} catch (ConfigurationException e) {
/xservices/trunk/src/main/java/net/brutex/xservices/util/MiscServiceServletContextListener.java
15,6 → 15,8
import java.sql.SQLException;
import java.sql.Statement;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.concurrent.atomic.AtomicLong;
 
import static org.quartz.TriggerBuilder.newTrigger;
48,12 → 50,12
*/
private static JdbcConnectionPool getDbPool(String dbConnectString) {
JdbcConnectionPool p = JdbcConnectionPool.create(dbConnectString, "", "");
p.setMaxConnections(16);
p.setLoginTimeout(5);
try {
Connection c = p.getConnection();
p.setMaxConnections(256);
p.setLoginTimeout(20);
try (Connection c = p.getConnection();){
Statement s = c.createStatement();
s.execute(dbinit);
c.commit();
log.trace("Running SQL against database '{}': '{}'", dbConnectString, dbinit);
c.close();
log.debug("Successfully created schema for database 'Brutex' at '{}'.", dbConnectString);
72,6 → 74,7
log.debug("Active jobs to be terminated: {}", scheduler.getCurrentlyExecutingJobs());
 
JobKey key = JobKey.jobKey("ALFEmitter");
JobKey cleanerkey = JobKey.jobKey("EventLogCleaner");
synchronized (scheduler) {
if (!scheduler.isShutdown() && scheduler.checkExists(key) ) {
scheduler.interrupt(key);
78,6 → 81,11
scheduler.deleteJob(key);
log.info("Gracefully stopped the ALFEventEmitter job.");
}
if (!scheduler.isShutdown() && scheduler.checkExists(cleanerkey) ) {
scheduler.interrupt(cleanerkey);
scheduler.deleteJob(cleanerkey);
log.info("Gracefully stopped the ALFEventEmitter job.");
}
if (!scheduler.isShutdown()) {
scheduler.shutdown(true);
}
98,12 → 106,19
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;";
final String insert = "INSERT INTO brutex.tbl_events SELECT * from MEM_INBOUND UNION SELECT " + "btx_event_type, btx_id, btx_obj_type, btx_obj_id, btx_timestamp, btx_event from MEM_OUTBOUND;";
s.execute(insert);
int count = s.getUpdateCount();
log.info("Persisted {} rows in file-based database.", count);
log.info("Persisted {} active event rows in file-based database.", count);
 
final String save_all = "INSERT INTO brutex.tbl_events_all SELECT * from MEM_ALL_EVENTS;";
s.execute(save_all);
count = s.getUpdateCount();
log.info("Persisted {} event rows from all_events log 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) {
141,9 → 156,8
//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 link = getLinkSQL();
final String recoverSQL = "INSERT INTO MEM_INBOUND DIRECT SELECT * FROM brutex.tbl_events;";
final String truncate = "TRUNCATE TABLE brutex.tbl_events;";
int count = 0;
Connection con = fdbpool.getConnection();
163,10 → 177,26
throw new RuntimeException(e);
}
//Start initial run of the emitter
startEmitterImmediate(egres, (Scheduler) context.getAttribute("scheduler"));
if(configuration.isEmitterActive()) {
startEmitterImmediate(egres, (Scheduler) context.getAttribute("scheduler"));
}
 
//Start mem db log cleaner
if(configuration.getCleaner_interval()>0) {
startEventLogCleaner((Scheduler) context.getAttribute("scheduler"));
}
}
 
private synchronized void startEmitterImmediate(AtomicLong egres_counter, Scheduler scheduler) {
private String getLinkSQL() {
final String dbDriverClass = "org.h2.Driver";
final String link = "CREATE LINKED TABLE IF NOT EXISTS MEM_INBOUND('"+dbDriverClass+"', '"+configuration.getJdbc_memdb()+"', '', '', 'brutex.tbl_events'); " +
"CREATE LINKED TABLE IF NOT EXISTS MEM_OUTBOUND('"+dbDriverClass+"', '"+configuration.getJdbc_memdb()+"', '', '', 'brutex.tbl_events_snap'); " +
"CREATE LINKED TABLE IF NOT EXISTS MEM_ALL_EVENTS('"+dbDriverClass+"', '"+configuration.getJdbc_memdb()+"', '', '', 'brutex.tbl_events_all') AUTOCOMMIT OFF; " +
"";
return link;
}
 
private synchronized void startEmitterImmediate(AtomicLong egres, Scheduler scheduler) {
try {
if (!scheduler.checkExists(JobKey.jobKey("ALFEmitter"))) {
JobDetail job2 = JobBuilder.newJob(EventEmitter.class).withIdentity("ALFEmitter").build();
173,7 → 203,7
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("egres_counter", egres);
job2.getJobDataMap().put(EventmanagerConfiguration.KEY, EventmanagerConfiguration.getInstance());
SimpleTrigger t = (SimpleTrigger) newTrigger().withIdentity("ALFEmitter").startNow().build();
scheduler.scheduleJob(job2, t);
183,6 → 213,27
}
}
 
private void startEventLogCleaner(Scheduler scheduler) {
try {
if (!scheduler.checkExists(JobKey.jobKey("EventLogCleaner"))) {
JobDetail job2 = JobBuilder.newJob(EventLogCleanerJob.class).withIdentity("EventLogCleaner").build();
job2.getJobDataMap().put("mdbConnection", mempool);
job2.getJobDataMap().put("fdbConnection", fdbpool);
job2.getJobDataMap().put("run_key", Instant.now().toEpochMilli());
job2.getJobDataMap().put(EventmanagerConfiguration.KEY, EventmanagerConfiguration.getInstance());
SimpleTrigger t = (SimpleTrigger) newTrigger().withIdentity("EventLogCleaner")
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInMinutes(configuration.getCleaner_interval())
.repeatForever())
.startAt(Date.from(Instant.now().plus(configuration.getCleaner_interval(), ChronoUnit.MINUTES)))
.build();
scheduler.scheduleJob(job2, t);
}
} catch (SchedulerException ex) {
log.error("Could not start EventLogCleaner 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();
/xservices/trunk/src/main/java/net/brutex/xservices/util/SimpleSoap.java
22,11 → 22,14
import org.apache.http.client.entity.EntityBuilder;
import org.apache.http.client.fluent.Request;
import org.apache.http.client.fluent.Response;
import org.apache.http.entity.ContentType;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.atomic.AtomicBoolean;
 
 
69,11 → 72,13
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();
 
HttpEntity entity = EntityBuilder.create()
.setText(soapBody)
.setContentType(ContentType.create("text/xml", StandardCharsets.UTF_8))
.setContentEncoding("UTF-8")
.build();
 
log.trace("Sending event '{}' to target ALF Event Manager.", id);
 
if(isInterrupted.get()) return null;
81,7 → 86,7
try {
Response resp = Request.Post(url)
.addHeader("Accept", "text/xml")
.addHeader("Content-Type", "text/xml; charset=utf-8")
//.addHeader("Content-Type", "text/xml; charset=utf-8")
.addHeader("SOAPAction", "")
.body(entity).execute();
 
/xservices/trunk/src/main/java/net/brutex/xservices/ws/MiscService.java
74,6 → 74,7
public abstract BigInteger lock(@WebParam(name="id") @XmlElement(nillable = false) String id,
@WebParam(name="objectId") @XmlElement(nillable = false) String objectId) throws XServicesFault;
 
@WebMethod(operationName="EventNotice")
public abstract ALFEventResponseType mergeALFEvent(@WebParam(name="EventNotice", targetNamespace = "http://www.eclipse.org/alf/schema/EventBase/1") ALFEventType event) throws XServicesFault;
@WebMethod(operationName="", action = "EventNotice")
@SOAPBinding(use = SOAPBinding.Use.LITERAL, style = SOAPBinding.Style.DOCUMENT, parameterStyle = SOAPBinding.ParameterStyle.BARE)
public abstract ALFEventResponseType mergeALFEvent(@WebParam(name="ALFEventNoticeDoc", targetNamespace = "http://www.eclipse.org/alf/schema/EventBase/1") ALFEventType event) throws XServicesFault;
}
/xservices/trunk/src/main/java/net/brutex/xservices/ws/impl/MiscServiceImpl.java
41,6 → 41,7
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import java.io.StringReader;
59,258 → 60,288
 
/**
* Implements the web service
*
*
* @author Brian Rosenberger, bru@brutex.de
*/
@Slf4j
@WebService(targetNamespace="http://ws.xservices.brutex.net", endpointInterface="net.brutex.xservices.ws.MiscService", serviceName="MiscService")
@WebService(targetNamespace = "http://ws.xservices.brutex.net", endpointInterface = "net.brutex.xservices.ws.MiscService", serviceName = "MiscService")
public class MiscServiceImpl
implements MiscService {
implements MiscService {
 
@Resource
private WebServiceContext context;
@Resource
private WebServiceContext context;
 
public MiscServiceImpl() throws SchedulerException {
}
 
public HostinfoType getHostinfo(String hostname) {
HostInfo info = new HostInfo();
info.setTaskName("HostInfo");
RunTask runner = new RunTask(info);
info.setHost(hostname);
HostInfo info = new HostInfo();
info.setTaskName("HostInfo");
RunTask runner = new RunTask(info);
info.setHost(hostname);
 
ReturnCode ret = runner.postTask();
HostinfoType infotype = new HostinfoType(
ret.getProperty("NAME"),
ret.getProperty("DOMAIN"),
ret.getProperty("ADDR4"),
ret.getProperty("ADDR6"));
return infotype;
}
ReturnCode ret = runner.postTask();
HostinfoType infotype = new HostinfoType(
ret.getProperty("NAME"),
ret.getProperty("DOMAIN"),
ret.getProperty("ADDR4"),
ret.getProperty("ADDR6"));
return infotype;
}
 
public ReturnCode getInfo() {
ReturnCode r = new ReturnCode();
r.returnCode = 0;
public ReturnCode getInfo() {
ReturnCode r = new ReturnCode();
r.returnCode = 0;
 
Properties props = System.getProperties();
Properties props = System.getProperties();
 
Enumeration e = props.propertyNames();
while (e.hasMoreElements()) {
String propName = (String) e.nextElement();
Enumeration e = props.propertyNames();
while (e.hasMoreElements()) {
String propName = (String) e.nextElement();
 
String propValue = (String) props.get(propName);
r.stdOut = (r.stdOut + propName + ": " + propValue + "\n");
String propValue = (String) props.get(propName);
r.stdOut = (r.stdOut + propName + ": " + propValue + "\n");
}
 
return r;
}
 
return r;
}
public ReturnCode sendMailSimple(HostConnection mailhost, String from, String tolist, String subject, String message) {
return sendMail(from, from, tolist, "", "", subject, message,
"text/plain", null, mailhost.hostname, mailhost.port,
mailhost.user, mailhost.password, "utf-8", false, false);
}
 
public ReturnCode sendMailSimple(HostConnection mailhost, String from, String tolist, String subject, String message) {
return sendMail(from, from, tolist, "", "", subject, message,
"text/plain", null, mailhost.hostname, mailhost.port,
mailhost.user, mailhost.password, "utf-8", false, false);
}
public ReturnCode sendMailSimpleWithAttachment(HostConnection mailhost, String from, String tolist, String subject, String message, FileSetResource res) {
return sendMail(from, from, tolist, "", "", subject, message,
"text/plain", res, mailhost.hostname, mailhost.port,
mailhost.user, mailhost.password, "utf-8", false, false);
}
 
public ReturnCode sendMailSimpleWithAttachment(HostConnection mailhost, String from, String tolist, String subject, String message, FileSetResource res) {
return sendMail(from, from, tolist, "", "", subject, message,
"text/plain", res, mailhost.hostname, mailhost.port,
mailhost.user, mailhost.password, "utf-8", false, false);
}
public ReturnCode sendMail(HostConnection mailhost, String from, String tolist, String cclist, String bcclist, String subject, MailMimeType mimetype, String charset, String message, FileSetResource res, boolean ssl, boolean tls) {
return sendMail(from, from, tolist, cclist, bcclist, subject, message,
mimetype.value(), res, mailhost.hostname, mailhost.port,
mailhost.user, mailhost.password, charset, tls, ssl);
}
 
public ReturnCode sendMail(HostConnection mailhost, String from, String tolist, String cclist, String bcclist, String subject, MailMimeType mimetype, String charset, String message, FileSetResource res, boolean ssl, boolean tls) {
return sendMail(from, from, tolist, cclist, bcclist, subject, message,
mimetype.value(), res, mailhost.hostname, mailhost.port,
mailhost.user, mailhost.password, charset, tls, ssl);
}
public ReturnCode sleep(int minutes, int seconds) {
return sleep(0, minutes, seconds, 0);
}
 
public ReturnCode sleep(int minutes, int seconds) {
return sleep(0, minutes, seconds, 0);
}
public String generateUUID() {
return UUID.randomUUID().toString();
}
 
public String generateUUID() {
return UUID.randomUUID().toString();
}
private ReturnCode sendMail(String from, String replyto, String tolist, String cclist, String bcclist, String subject, String message, String messagemimetype, FileSetResource attachments, String mailhost, int mailport, String user, String password, String charset, boolean tls, boolean ssl) {
EmailTask mail = new EmailTask();
mail.setTaskName("Mail");
RunTask runner = new RunTask(mail);
mail.setFrom(from);
mail.setReplyTo(replyto);
mail.setToList(tolist);
mail.setCcList(cclist);
mail.setBccList(bcclist);
mail.setSubject(subject);
mail.setMessage(message);
mail.setMessageMimeType(messagemimetype);
if (attachments != null) {
mail.addFileset(attachments.getAntResource(mail.getProject()));
}
mail.setMailhost(mailhost);
mail.setMailport(mailport);
mail.setUser(user);
mail.setPassword(password);
mail.setCharset(charset);
mail.setSSL(ssl);
mail.setEnableStartTLS(tls);
return runner.postTask();
}
 
private ReturnCode sendMail(String from, String replyto, String tolist, String cclist, String bcclist, String subject, String message, String messagemimetype, FileSetResource attachments, String mailhost, int mailport, String user, String password, String charset, boolean tls, boolean ssl) {
EmailTask mail = new EmailTask();
mail.setTaskName("Mail");
RunTask runner = new RunTask(mail);
mail.setFrom(from);
mail.setReplyTo(replyto);
mail.setToList(tolist);
mail.setCcList(cclist);
mail.setBccList(bcclist);
mail.setSubject(subject);
mail.setMessage(message);
mail.setMessageMimeType(messagemimetype);
if (attachments != null) {
mail.addFileset(attachments.getAntResource(mail.getProject()));
private ReturnCode sleep(int hours, int minutes, int seconds, int milliseconds) {
Sleep sleep = new Sleep();
sleep.setTaskName("Sleep");
RunTask runner = new RunTask(sleep);
sleep.setHours(hours);
sleep.setMinutes(minutes);
sleep.setSeconds(seconds);
sleep.setMilliseconds(milliseconds);
return runner.postTask();
}
mail.setMailhost(mailhost);
mail.setMailport(mailport);
mail.setUser(user);
mail.setPassword(password);
mail.setCharset(charset);
mail.setSSL(ssl);
mail.setEnableStartTLS(tls);
return runner.postTask();
}
 
private ReturnCode sleep(int hours, int minutes, int seconds, int milliseconds) {
Sleep sleep = new Sleep();
sleep.setTaskName("Sleep");
RunTask runner = new RunTask(sleep);
sleep.setHours(hours);
sleep.setMinutes(minutes);
sleep.setSeconds(seconds);
sleep.setMilliseconds(milliseconds);
return runner.postTask();
}
public RuntimeInfoType getMemory() {
return new RuntimeInfoType();
}
 
public RuntimeInfoType getMemory() {
return new RuntimeInfoType();
}
@Override
public BigInteger lock(String id, String objectId) throws XServicesFault {
 
@Override
public BigInteger lock(String id, String objectId) throws XServicesFault {
 
final String conString = "jdbc:h2:mem:lockdb;DB_CLOSE_DELAY=10;" +
"INIT=CREATE SCHEMA IF NOT EXISTS brutex\\;" +
// "SET SCHEMA brutex\\;" +
"CREATE SEQUENCE IF NOT EXISTS brutex.btx_sequence1\\;" +
"CREATE TABLE IF NOT EXISTS brutex.tbl_lock (btx_seq BIGINT NOT NULL, btx_id VARCHAR(100) NOT NULL, btx_obj_id VARCHAR(100) NOT NULL, btx_timestamp BIGINT NOT NULL);";
 
//JdbcConnectionPool cp = JdbcConnectionPool.create(conString, "sa", "");
//cp.setMaxConnections(1);
 
final String conString = "jdbc:h2:mem:lockdb;DB_CLOSE_DELAY=10;" +
"INIT=CREATE SCHEMA IF NOT EXISTS brutex\\;" +
// "SET SCHEMA brutex\\;" +
"CREATE SEQUENCE IF NOT EXISTS brutex.btx_sequence1\\;" +
"CREATE TABLE IF NOT EXISTS brutex.tbl_lock (btx_seq BIGINT NOT NULL, btx_id VARCHAR(100) NOT NULL, btx_obj_id VARCHAR(100) NOT NULL, btx_timestamp BIGINT NOT NULL);";
Connection con = null;
long rows = 0L;
final long ts = new Date().getTime();
try {
Class.forName("org.h2.Driver"); //Java 1.8
con = DriverManager.getConnection(conString);
PreparedStatement prep = con.prepareStatement(
"SELECT btx_id from brutex.tbl_lock where btx_obj_id=? ORDER BY btx_seq DESC");
prep.setString(1, objectId);
 
//JdbcConnectionPool cp = JdbcConnectionPool.create(conString, "sa", "");
//cp.setMaxConnections(1);
ResultSet rs = prep.executeQuery();
StringBuffer bf = new StringBuffer();
while (rs.next()) {
//bf.append(rs.getString(1));
rows++;
}
rs.close();
 
Connection con = null;
long rows = 0L;
final long ts = new Date().getTime();
try {
Class.forName("org.h2.Driver"); //Java 1.8
con = DriverManager.getConnection(conString);
PreparedStatement prep = con.prepareStatement(
"SELECT btx_id from brutex.tbl_lock where btx_obj_id=? ORDER BY btx_seq DESC");
prep.setString(1, objectId);
prep = con.prepareStatement("INSERT INTO brutex.tbl_lock values (NEXT VALUE FOR brutex.btx_sequence1, ?, ?, ?)");
prep.setString(1, id);
prep.setString(2, objectId);
prep.setLong(3, ts);
prep.execute();
 
ResultSet rs = prep.executeQuery();
StringBuffer bf = new StringBuffer();
while (rs.next()) {
//bf.append(rs.getString(1));
rows++;
}
rs.close();
prep = con.prepareStatement("DELETE from brutex.tbl_lock WHERE btx_timestamp < ?");
prep.setLong(1, ts - 10000);
prep.execute();
prep.close();
 
prep = con.prepareStatement("INSERT INTO brutex.tbl_lock values (NEXT VALUE FOR brutex.btx_sequence1, ?, ?, ?)");
prep.setString(1, id);
prep.setString(2, objectId);
prep.setLong(3, ts);
prep.execute();
con.close();
//System.out.println(bf);
} catch (SQLException | ClassNotFoundException e) {
throw new XServicesFault(e);
}
 
prep = con.prepareStatement("DELETE from brutex.tbl_lock WHERE btx_timestamp < ?");
prep.setLong(1, ts - 10000);
prep.execute();
prep.close();
 
con.close();
//System.out.println(bf);
} catch (SQLException | ClassNotFoundException e) {
throw new XServicesFault(e);
return BigInteger.valueOf(rows);
}
 
return BigInteger.valueOf(rows);
}
@Override
public ALFEventResponseType mergeALFEvent(ALFEventType event) throws XServicesFault {
final Instant d = Instant.now();
final long ts = d.toEpochMilli();
 
@Override
public ALFEventResponseType mergeALFEvent(ALFEventType event) throws XServicesFault {
final Instant d = Instant.now();
final long ts = d.toEpochMilli();
MessageContext cont = context.getMessageContext();
 
//Get Parameters from the Servlet Context
final ServletContext servletContext =
(ServletContext) context.getMessageContext().get(MessageContext.SERVLET_CONTEXT);
final EventmanagerConfiguration conf = (EventmanagerConfiguration) servletContext
.getAttribute(EventmanagerConfiguration.KEY);
//Get Parameters from the Servlet Context
final ServletContext servletContext =
(ServletContext) context.getMessageContext().get(MessageContext.SERVLET_CONTEXT);
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");
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);
log.trace("Read dbConnection from servlet context: {}", pool);
 
//System.out.println("Step 2: " + ChronoUnit.MILLIS.between(Instant.now(), d));
final ObjectFactory of = new ObjectFactory();
//System.out.println("Step 2: " + ChronoUnit.MILLIS.between(Instant.now(), d));
final ObjectFactory of = new ObjectFactory();
 
final String objectId = event.getBase().getObjectId();
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 objectId = event.getBase().getObjectId();
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 (?,?,?,?,?,?);";
final String mergeStatememt = "SELECT btx_id FROM OLD TABLE (MERGE INTO brutex.tbl_events " +
"KEY (btx_event_type, btx_obj_type, btx_obj_id) " +
"VALUES (?,?,?,?,?,?));";
 
final String insertAll = "INSERT INTO brutex.tbl_events_all VALUES (?,?,?,?,?,?,?)";
 
try {
Marshaller m = JAXBContext.newInstance(ALFEventType.class).createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
JAXBElement<ALFEventType> e = of.createEventNotice(event);
StringWriter sw = new StringWriter();
m.marshal(e, sw);
StringBuilder sb = new StringBuilder();
sb.append(" <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" " +
"xmlns:ns=\"http://www.eclipse.org/alf/schema/EventBase/1\">\n");
sb.append("<soapenv:Body>\n");
sb.append("<ns:EventNotice>\n");
sb.append(sw);
sb.append("</ns:EventNotice>\n");
sb.append("</soapenv:Body>");
sb.append("</soapenv:Envelope>");
 
Connection con = pool.getConnection();
PreparedStatement prep = con.prepareStatement(mergeStatememt);
prep.setString(1, eventType);
prep.setString(2, eventId);
prep.setString(3, objectType);
prep.setString(4, objectId);
prep.setLong(5, ts);
prep.setClob(6, new StringReader(sb.toString()));
prep.execute();
con.commit();
con.close();
try (Connection con = pool.getConnection()) {
Marshaller m = JAXBContext.newInstance(ALFEventType.class).createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
JAXBElement<ALFEventType> e = of.createALFEventNoticeDoc(event);
StringWriter sw = new StringWriter();
m.marshal(e, sw);
StringBuilder sb = new StringBuilder();
 
ingres_counter.incrementAndGet();
sb.append(" <soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" " +
"xmlns:ns=\"http://www.eclipse.org/alf/schema/EventBase/1\">\n");
sb.append("<soapenv:Body>\n");
 
synchronized (scheduler) {
if (!scheduler.checkExists(JobKey.jobKey("ALFEmitter"))) {
JobDetail job2 = JobBuilder.newJob(EventEmitter.class)
.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);
sb.append(sw);
 
job2.getJobDataMap().put(EventmanagerConfiguration.KEY, conf);
sb.append("</soapenv:Body>");
sb.append("</soapenv:Envelope>");
 
SimpleTrigger t = (SimpleTrigger) newTrigger()
.withIdentity("ALFEmitter").startAt(Date.from(d.plusSeconds(conf.getInterval())))
.build();
 
scheduler.scheduleJob(job2, t);
}
}
} catch (JAXBException | SQLException | SchedulerException e) {
log.error(e.getMessage());
throw new XServicesFault(e);
PreparedStatement prep = con.prepareStatement(mergeStatememt);
prep.setString(1, eventType);
prep.setString(2, eventId);
prep.setString(3, objectType);
prep.setString(4, objectId);
prep.setLong(5, ts);
prep.setClob(6, new StringReader(sb.toString()));
ResultSet r = prep.executeQuery();
con.commit();
String supersed_id = null;
if (r.next()) {
supersed_id = r.getString(1);
log.trace("Event '{}' superseded event '{}'", eventId, supersed_id);
} else {
log.trace("Event '{}' inserted into outgoing queue.", eventId);
}
 
 
/* Write all into permanent storage */
//Connection fcon = fpool.getConnection();
prep = con.prepareStatement(insertAll);
prep.setString(1, eventType);
prep.setString(2, eventId);
prep.setString(3, objectType);
prep.setString(4, objectId);
prep.setLong(5, ts);
prep.setString(6, supersed_id);
prep.setClob(7, new StringReader(sb.toString()));
prep.execute();
 
con.commit();
con.close();
 
ingres_counter.incrementAndGet();
 
if (conf.isEmitterActive()) {
synchronized (scheduler) {
if (!scheduler.checkExists(JobKey.jobKey("ALFEmitter"))) {
JobDetail job2 = JobBuilder.newJob(EventEmitter.class)
.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(conf.getInterval())))
.build();
 
scheduler.scheduleJob(job2, t);
}
}
}
} catch (JAXBException | SQLException | SchedulerException e) {
log.error(e.getMessage());
throw new XServicesFault(e);
}
return of.createALFEventResponseType();
}
return of.createALFEventResponseType();
}
}
/xservices/trunk/src/main/resources/eventmanager.properties
File deleted
\ No newline at end of file
/xservices/trunk/src/main/resources/ddl/BRTX_schema.ddl
4,7 → 4,7
CREATE TABLE IF NOT EXISTS brutex.tbl_events
(
btx_event_type VARCHAR(128) NOT NULL,
btx_id VARCHAR(32) NOT NULL,
btx_id VARCHAR(128) NOT NULL,
btx_obj_type VARCHAR(32) NOT NULL,
btx_obj_id VARCHAR(32) NOT NULL,
btx_timestamp BIGINT NOT NULL,
12,12 → 12,13
);
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 INDEX IF NOT EXISTS brutex.btx_idx_id ON brutex.tbl_events (btx_id);
 
 
CREATE TABLE IF NOT EXISTS brutex.tbl_events_snap
(
btx_event_type VARCHAR(128) NOT NULL,
btx_id VARCHAR(32) NOT NULL,
btx_id VARCHAR(128) NOT NULL,
btx_obj_type VARCHAR(32) NOT NULL,
btx_obj_id VARCHAR(32) NOT NULL,
btx_timestamp BIGINT NOT NULL,
30,7 → 31,7
CREATE TABLE IF NOT EXISTS brutex.tbl_events_errors
(
btx_event_type VARCHAR(128) NOT NULL,
btx_id VARCHAR(32) NOT NULL,
btx_id VARCHAR(128) NOT NULL,
btx_obj_type VARCHAR(32) NOT NULL,
btx_obj_id VARCHAR(32) NOT NULL,
btx_timestamp BIGINT NOT NULL,
40,3 → 41,17
);
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);
 
CREATE TABLE IF NOT EXISTS brutex.tbl_events_all
(
btx_event_type VARCHAR(128) NOT NULL,
btx_id VARCHAR(128) NOT NULL,
btx_obj_type VARCHAR(32) NOT NULL,
btx_obj_id VARCHAR(32) NOT NULL,
btx_timestamp BIGINT NOT NULL,
btx_supersed_id VARCHAR(128),
btx_event CLOB
);
 
CREATE INDEX IF NOT EXISTS brutex.btx_idx_ssed ON brutex.tbl_events_all (btx_supersed_id);
CREATE INDEX IF NOT EXISTS brutex.btx_idx_ts ON brutex.tbl_events_all (btx_timestamp ASC);
/xservices/trunk/src/main/webapp/WEB-INF/data/getEventManagerStatus.sql
0,0 → 1,10
select
(select count(*) from MEM_INBOUND) as INBOUND_Queue,
(select count(*) from MEM_OUTBOUND) as OUTBOUND_Queue ,
 
(select count(*) from mem_all_events) as IN_MEMORY_LOG,
(select count(*) from brutex.tbl_events_all) as FILE_LOG,
(select count(*) from brutex.tbl_events_errors) as ERROR_COUNT,
 
((select count(*) from brutex.tbl_events_all where btx_supersed_id is not null) + (select count(*) from mem_all_events where btx_supersed_id is not null)) as MERGED_EVENTS
FROM DUAL;
/xservices/trunk/src/main/webapp/WEB-INF/eventmanager.properties
0,0 → 1,34
 
# The target ALF Event Manager to forward processed events to
#target.url = http://localhost:8099/ALFEventManager/services/ALFEventManagerSOAP
target.url = http://localhost:8085/eventmanager/services/ALFEventManagerDocLit
 
# 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
 
 
# Activate Emitter
# Default is true, otherwise XServices will receive events, but not make any attempt to
# forward them. Memory inbound queue will only be written to disk when the service is
# gracefully stopped.
emitter_active = true
 
# EventLogCleaner interval in minutes, how often to move all registered events from memory to the file based
# storage. For trace and debugging purpose. Default value is every 5 minutes. A value of zero or smaller
# deactivates the cleaner. Value in minutes.
cleaner_interval = 4
/xservices/trunk/src/main/webapp/WEB-INF/web.xml
131,16 → 131,17
<servlet>
<servlet-name>H2Console</servlet-name>
<servlet-class>org.h2.server.web.WebServlet</servlet-class>
<!--
<!-- this should be deactivated or protected -->
<init-param>
<param-name>webAllowOthers</param-name>
<param-value></param-value>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>trace</param-name>
<param-value></param-value>
</init-param>
-->
<!--
<init-param>
<param-name>trace</param-name>
<param-value></param-value>
</init-param>
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>