Subversion Repositories XServices

Compare Revisions

Ignore whitespace Rev 203 → Rev 202

/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/ALFSecurityType.java
File deleted
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/ALFEventBase_1.xsd
File deleted
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/ALFEventManagerDocLit.xsd
File deleted
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/ALFEventResponseType.java
1,13 → 1,10
 
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;
 
 
/**
20,7 → 17,7
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <any processContents='lax' maxOccurs="unbounded" minOccurs="0"/>
* <any minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
36,36 → 33,30
public class ALFEventResponseType {
 
@XmlAnyElement(lax = true)
protected List<Object> any;
protected Object any;
 
/**
* Gets the value of the any property.
* Ruft den Wert der any-Eigenschaft ab.
*
* <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.
* @return
* possible object is
* {@link Object }
*
*/
public Object getAny() {
return any;
}
 
/**
* Legt den Wert der any-Eigenschaft fest.
*
* <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 }
*
*
* @param value
* allowed object is
* {@link Object }
*
*/
public List<Object> getAny() {
if (any == null) {
any = new ArrayList<Object>();
}
return this.any;
public void setAny(Object value) {
this.any = value;
}
 
}
/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 Object }
* {@link Element }
* {@link Object }
*
*
*/
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/ALFEventWithReplyResponseType.java
1,13 → 1,10
 
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;
 
 
/**
20,7 → 17,7
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;any processContents='lax' maxOccurs="unbounded" minOccurs="0"/>
* &lt;any minOccurs="0"/>
* &lt;/sequence>
* &lt;/restriction>
* &lt;/complexContent>
36,36 → 33,30
public class ALFEventWithReplyResponseType {
 
@XmlAnyElement(lax = true)
protected List<Object> any;
protected Object any;
 
/**
* Gets the value of the any property.
* Ruft den Wert der any-Eigenschaft ab.
*
* <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.
* @return
* possible object is
* {@link Object }
*
*/
public Object getAny() {
return any;
}
 
/**
* Legt den Wert der any-Eigenschaft fest.
*
* <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 }
*
*
* @param value
* allowed object is
* {@link Object }
*
*/
public List<Object> getAny() {
if (any == null) {
any = new ArrayList<Object>();
}
return this.any;
public void setAny(Object value) {
this.any = value;
}
 
}
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/BaseExtensionType.java
11,7 → 11,6
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.namespace.QName;
import org.w3c.dom.Element;
 
 
/**
29,7 → 28,7
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;any processContents='lax' namespace='http://www.eclipse.org/alf/schema/EventBase/1' maxOccurs="unbounded"/>
* &lt;any namespace='targetnamespace' maxOccurs="unbounded"/>
* &lt;/sequence>
* &lt;anyAttribute/>
* &lt;/restriction>
68,7 → 67,6
*
* <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,7 → 9,6
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;
17,9 → 16,8
 
/**
*
* 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.
31,8 → 29,7
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &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;any processContents='lax' maxOccurs="unbounded" minOccurs="0"/>
* &lt;/sequence>
* &lt;anyAttribute/>
* &lt;/restriction>
44,13 → 41,10
*/
@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
57,30 → 51,6
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>
98,8 → 68,8
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Object }
* {@link Element }
* {@link Object }
*
*
*/
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/CustomExtensionType.java
17,7 → 17,6
/**
*
* 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.
29,7 → 28,7
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;any processContents='lax' maxOccurs="unbounded"/>
* &lt;any processContents='lax' namespace='##other' maxOccurs="unbounded"/>
* &lt;/sequence>
* &lt;anyAttribute/>
* &lt;/restriction>
68,8 → 67,8
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Object }
* {@link Element }
* {@link Object }
*
*
*/
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/DetailExtensionType.java
16,8 → 16,7
 
/**
*
* 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.
68,8 → 67,8
*
* <p>
* Objects of the following type(s) are allowed in the list
* {@link Object }
* {@link Element }
* {@link Object }
*
*
*/
/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.eclipse.org/alf/schema/EventBase/1}EventIdType"/>
* &lt;element name="EmEventId" type="{http://www.w3.org/2001/XMLSchema}string"/>
* &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,7 → 41,6
* &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/>
64,7 → 63,6
"callback",
"environment",
"emUser",
"attemptCount",
"emExtension"
})
public class EmBaseType {
90,8 → 88,6
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
330,30 → 326,6
}
 
/**
* 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,7 → 11,6
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.namespace.QName;
import org.w3c.dom.Element;
 
 
/**
28,7 → 27,7
* &lt;complexContent>
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* &lt;sequence>
* &lt;any processContents='lax' namespace='http://www.eclipse.org/alf/schema/EventBase/1' maxOccurs="unbounded"/>
* &lt;any namespace='targetnamespace' maxOccurs="unbounded"/>
* &lt;/sequence>
* &lt;anyAttribute/>
* &lt;/restriction>
67,7 → 66,6
*
* <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}SourceEventIdType"/>
* &lt;element name="EventId" type="{http://www.eclipse.org/alf/schema/EventBase/1}EventIdType"/>
* &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, nillable = true)
@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)
/xservices/trunk/src/main/java/net/brutex/xservices/types/alfevent/ObjectFactory.java
24,7 → 24,7
@XmlRegistry
public class ObjectFactory {
 
private final static QName _ALFEventNoticeDoc_QNAME = new QName("http://www.eclipse.org/alf/schema/EventBase/1", "ALFEventNoticeDoc");
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
34,14 → 34,6
}
 
/**
* Create an instance of {@link ALFSecurityType }
*
*/
public ALFSecurityType createALFSecurityType() {
return new ALFSecurityType();
}
 
/**
* Create an instance of {@link ALFEventType }
*
*/
130,20 → 122,12
}
 
/**
* 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 = "ALFEventNoticeDoc")
public JAXBElement<ALFEventType> createALFEventNoticeDoc(ALFEventType value) {
return new JAXBElement<ALFEventType>(_ALFEventNoticeDoc_QNAME, ALFEventType.class, null, value);
@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);
}
 
}
/xservices/trunk/src/main/java/net/brutex/xservices/util/EventLogCleanerJob.java
File deleted
/xservices/trunk/src/main/java/net/brutex/xservices/util/EventEmitter.java
51,11 → 51,10
* Move event table data to snapshot
*/
 
 
try( Connection con = pool.getConnection();
Connection fcon = fpool.getConnection();
) {
 
Connection con = null;
Connection fcon = null;
try {
con = pool.getConnection();
con.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
con.setAutoCommit(false);
Statement stmt = con.createStatement();
66,7 → 65,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);
84,8 → 83,7
long event_ts = rs.getLong(6);
boolean bretry = false;
 
//SimpleSoap ss = new SimpleSoap( url, id, IOUtils.toString(c.getAsciiStream()c.getCharacterStream()));
SimpleSoap ss = new SimpleSoap(url, id, c.getSubString(1L, (int) c.length()));
SimpleSoap ss = new SimpleSoap( url, id, IOUtils.toString(c.getCharacterStream()));
int retry = 0;
Reader response = null;
String rsp = "";
154,6 → 152,14
} 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/EventmanagerConfiguration.java
8,8 → 8,6
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;
41,8 → 39,6
private int interval;
private String jdbc_memdb;
private String jdbc_filedb;
private boolean isEmitterActive = true;
private int cleaner_interval;
 
 
public synchronized EventmanagerConfiguration refreshConfig() {
49,7 → 45,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();
59,8 → 55,6
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,8 → 15,6
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;
50,12 → 48,12
*/
private static JdbcConnectionPool getDbPool(String dbConnectString) {
JdbcConnectionPool p = JdbcConnectionPool.create(dbConnectString, "", "");
p.setMaxConnections(256);
p.setLoginTimeout(20);
try (Connection c = p.getConnection();){
p.setMaxConnections(16);
p.setLoginTimeout(5);
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);
74,7 → 72,6
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);
81,11 → 78,6
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);
}
106,19 → 98,12
Connection con = fdbpool.getConnection();
Statement s = con.createStatement();
 
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;";
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 {} 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("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) {
156,8 → 141,9
//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 = getLinkSQL();
final String recoverSQL = "INSERT INTO MEM_INBOUND DIRECT SELECT * FROM brutex.tbl_events;";
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();
177,26 → 163,10
throw new RuntimeException(e);
}
//Start initial run of the emitter
if(configuration.isEmitterActive()) {
startEmitterImmediate(egres, (Scheduler) context.getAttribute("scheduler"));
}
 
//Start mem db log cleaner
if(configuration.getCleaner_interval()>0) {
startEventLogCleaner((Scheduler) context.getAttribute("scheduler"));
}
startEmitterImmediate(egres, (Scheduler) context.getAttribute("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) {
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();
203,7 → 173,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);
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);
213,27 → 183,6
}
}
 
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,14 → 22,11
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;
 
 
72,13 → 69,11
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;
86,7 → 81,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/impl/MiscServiceImpl.java
41,7 → 41,6
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;
60,288 → 59,258
 
/**
* 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");
}
 
return r;
String propValue = (String) props.get(propName);
r.stdOut = (r.stdOut + propName + ": " + propValue + "\n");
}
 
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);
}
return r;
}
 
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 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 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 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 sleep(int minutes, int seconds) {
return sleep(0, minutes, seconds, 0);
}
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 String generateUUID() {
return UUID.randomUUID().toString();
}
public ReturnCode sleep(int minutes, int seconds) {
return sleep(0, minutes, seconds, 0);
}
 
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();
}
public String generateUUID() {
return UUID.randomUUID().toString();
}
 
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();
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();
}
 
public RuntimeInfoType getMemory() {
return new RuntimeInfoType();
}
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();
}
 
@Override
public BigInteger lock(String id, String objectId) throws XServicesFault {
public RuntimeInfoType getMemory() {
return new RuntimeInfoType();
}
 
@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);
 
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);
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);";
 
ResultSet rs = prep.executeQuery();
StringBuffer bf = new StringBuffer();
while (rs.next()) {
//bf.append(rs.getString(1));
rows++;
}
rs.close();
//JdbcConnectionPool cp = JdbcConnectionPool.create(conString, "sa", "");
//cp.setMaxConnections(1);
 
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();
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("DELETE from brutex.tbl_lock WHERE btx_timestamp < ?");
prep.setLong(1, ts - 10000);
prep.execute();
prep.close();
ResultSet rs = prep.executeQuery();
StringBuffer bf = new StringBuffer();
while (rs.next()) {
//bf.append(rs.getString(1));
rows++;
}
rs.close();
 
con.close();
//System.out.println(bf);
} catch (SQLException | ClassNotFoundException e) {
throw new XServicesFault(e);
}
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();
 
return BigInteger.valueOf(rows);
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);
}
 
@Override
public ALFEventResponseType mergeALFEvent(ALFEventType event) throws XServicesFault {
final Instant d = Instant.now();
final long ts = d.toEpochMilli();
return BigInteger.valueOf(rows);
}
 
MessageContext cont = context.getMessageContext();
@Override
public ALFEventResponseType mergeALFEvent(ALFEventType event) throws XServicesFault {
final Instant d = Instant.now();
final long ts = d.toEpochMilli();
 
//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 = "SELECT btx_id FROM OLD TABLE (MERGE INTO brutex.tbl_events " +
"KEY (btx_event_type, btx_obj_type, btx_obj_id) " +
"VALUES (?,?,?,?,?,?));";
final String mergeStatememt = "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>");
 
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();
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();
 
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");
ingres_counter.incrementAndGet();
 
sb.append(sw);
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("</soapenv:Body>");
sb.append("</soapenv:Envelope>");
job2.getJobDataMap().put(EventmanagerConfiguration.KEY, conf);
 
SimpleTrigger t = (SimpleTrigger) newTrigger()
.withIdentity("ALFEmitter").startAt(Date.from(d.plusSeconds(conf.getInterval())))
.build();
 
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();
scheduler.scheduleJob(job2, t);
}
}
} catch (JAXBException | SQLException | SchedulerException e) {
log.error(e.getMessage());
throw new XServicesFault(e);
}
return of.createALFEventResponseType();
}
}
/xservices/trunk/src/main/java/net/brutex/xservices/ws/MiscService.java
74,7 → 74,6
public abstract BigInteger lock(@WebParam(name="id") @XmlElement(nillable = false) String id,
@WebParam(name="objectId") @XmlElement(nillable = false) String objectId) 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;
@WebMethod(operationName="EventNotice")
public abstract ALFEventResponseType mergeALFEvent(@WebParam(name="EventNotice", targetNamespace = "http://www.eclipse.org/alf/schema/EventBase/1") ALFEventType event) throws XServicesFault;
}
/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(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,
12,13 → 12,12
);
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(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,
31,7 → 30,7
CREATE TABLE IF NOT EXISTS brutex.tbl_events_errors
(
btx_event_type VARCHAR(128) NOT NULL,
btx_id 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,
41,17 → 40,3
);
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/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
/xservices/trunk/src/main/webapp/WEB-INF/eventmanager.properties
File deleted
\ No newline at end of file
/xservices/trunk/src/main/webapp/WEB-INF/web.xml
131,17 → 131,16
<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>true</param-value>
<param-value></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>
/xservices/trunk/src/main/webapp/WEB-INF/data/getEventManagerStatus.sql
File deleted
\ No newline at end of file
/xservices/trunk/build.gradle
91,6 → 91,10
 
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"