Merge branch 'dev'
diff --git a/NOTICE.txt b/NOTICE.txt
new file mode 100644
index 0000000..27af47e
--- /dev/null
+++ b/NOTICE.txt
@@ -0,0 +1,260 @@
+# Notices for the mdmbl webapplication , openMDM(R) Eclipse Working Groupo
+
+This content is produced and maintained by the Eclipse mdmbl project.
+
+ * Project home: https://projects.eclipse.org/projects/technology.mdmbl
+
+## Trademarks
+
+Eclipse mdmbl are
+trademarks of the Eclipse Foundation. Eclipse, and the Eclipse Logo are
+registered trademarks of the Eclipse Foundation.
+
+## Declared Project Licenses
+
+This program and the accompanying materials are made available under the terms
+of the Eclipse Public License v. 1.0 which is available at
+http://www.eclipse.org/legal/epl-v10.html.
+
+SPDX-License-Identifier: EPL-1.0
+
+## Source Code
+
+The project maintains the following source code repositories:
+
+org.eclipse.mdm.api.base.git - The openMDM(R) API.
+org.eclipse.mdm.api.default.git - Extension of the openMDM(R) API containing default elements.
+org.eclipse.mdm.api.odsadapter.git - ODS implementation of persistence adapter.
+org.eclipse.mdm.nucleus.git - Core building blocks for the openMDM Business Logic and Web Frontend.
+org.eclipse.mdm.realms.git - A GlassFish realm using ODS authentication.
+
+
+## Third-party Content
+
+antlr4-4.5.3.jar(2.5.3)
+ * License: New BSD license
+
+aopalliance-repackaged-2.5.0-b05.jar (2.5.0-b05)
+ * License: CDDL
+
+commons-codec-1.2.jar (1.2)
+ * License: Apache License, 2.0
+
+commons-httpclient-3.1.jar (3.1)
+ * License: Apache License, 2.0
+
+commons-lang3-3.4.jar (3.4)
+ * License: Apache License, 2.0
+
+gson-2.7.jar (2.7)
+ * License: Apache License, 2.0
+
+guava-18.0.jar (18.0)
+ * License: Apache License, 2.0
+
+hk2-api-2.5.0-b05.jar (2.5.0-b05)
+ * License: CDDL-1.1 OR GPL-2.0
+
+hk2-locator-2.5.0-b05.jar(2.5.0-b05)
+ * License: CDDL
+
+hk2-utils-2.5.0-b05.jar (2.5.0-b05)
+ * License: CDDL
+
+jackson-annotations-2.9.0.jar (2.9.0)
+ * License: Apache License, 2.0
+
+jackson-core-2.9.2.jar(2.9.2)
+ * License: Apache License, 2.0
+
+jackson-databind-2.9.2.jar (2.9.2)
+ * License: Apache License, 2.0
+
+jackson-jaxrs-base-2.9.2.jar(2.9.2)
+ * License: Apache License, 2.0
+
+jackson-jaxrs-json-provider-2.9.2.jar(2.9.2)
+ * License: Apache License, 2.0
+
+jackson-module-jaxb-annotations-2.9.2.jar (2.9.2)
+ * License: Apache License, 2.0
+
+javassist-3.20.0-GA.jar (2.20.0-GA)
+ * License: Mozilla Public License 1.1 (MPL), Apache 2.0
+
+javax.annotation-api-1.2.jar(1.2)
+ * License: (CDDL-1.1 OR GPL-2.0 OR GPL-2.0-with-classpath-exception) AND Apache-2.0
+
+jcl-over-slf4j-1.7.25.jar(1.7.25)
+ * License: MIT License
+
+jersey-client-2.23.2.jar (2.23.2)
+ * License: CDDL
+
+jersey-common-2.23.2.jar (2.23.2)
+ * License: CDDL
+
+jersey-container-servlet-2.23.2.jar (2.23.2)
+ * License: CDDL
+
+jersey-container-servlet-core-2.23.3.jar(2.23.2)
+ * License: CDDL
+
+jersey-guava-2.23.2.jar (2.23.2)
+ * License: Apache License, 2.0
+
+jersey-media-jaxb-2.23.2.jar(2.23.2)
+ * License: CDDL
+
+jersey-media-sse-2.23.2.jar (2.23.2)
+ * License: CDDL
+
+jersey-server-2.23.2.jar (2.23.2)
+ * License: (CDDL-1.1 OR GPL-2.0) AND Apache-2.0
+
+logback-classic-1.2.3.jar(1.2.3)
+ * License: Eclipse Public License 1.0
+
+logback-core-1.2.3.jar(1.2.3)
+ * License: Eclipse Public License 1.0
+
+osgi-resource-locator-1.0.1.jar(1.0.1)
+ * License: CDDL
+
+protobuf-java-3.2.0.jar (3.2.0)
+ * License: New BSD license
+
+protobuf-java-util-3.2.0.jar (3.2.0)
+ * License: New BSD license
+
+slf4j-api-1.7.25.jar (1.7.25)
+ * License: MIT license
+ * Project URL: https://github.com/qos-ch/slf4j
+ * Source URL: https://github.com/qos-ch/slf4j/releases/tag/v_1.7.25
+
+validation-api-1.1.0.Final.jar (1.1.0.Final)
+* License: Apache License, 2.0
+
+@angular/common@2.4.8
+ * License: MIT
+ * Project: https: //github.com/angular/angular
+ * Source: https: //github.com/angular/angular
+
+@angular/compiler@2.4.8 License: MIT
+ * Project: https: //github.com/angular/angular
+ * Source: https: //github.com/angular/angular
+
+@angular/core@2.4.8
+ * License: MIT
+ * Project: https: //github.com/angular/angular
+ * Source: https: //github.com/angular/angular
+
+@angular/forms@2.4.8
+ * License: MIT
+ * Project: https: //github.com/angular/angular
+ * Source: https: //github.com/angular/angular
+
+@angular/http@2.4.8
+ * License: MIT
+ * Project: https: //github.com/angular/angular
+ * Source: https: //github.com/angular/angular
+
+@angular/platform-browser-dynamic@2.4.8
+ * License: MIT
+ * Project: https: //github.com/angular/angular
+ * Source: https: //github.com/angular/angular
+
+@angular/platform-browser@2.4.8
+ * License: MIT
+ * Project: https: //github.com/angular/angular
+ * Source: https: //github.com/angular/angular
+
+@angular/router@3.4.8
+ * License: MIT
+ * Project: https: //github.com/angular/angular
+ * Source: https: //github.com/angular/angular
+
+@types/file-saver@0.0.0
+ * License: MIT
+ * Project: https: //wwwhub.com/DefinitelyTyped/DefinitelyTyped
+ * Source: https: //wwwhub.com/DefinitelyTyped/DefinitelyTyped
+
+bootstrap@3.3.7
+ * License: MIT
+ * Project: https: //github.com/twbs/bootstrap
+ * Source: https: //github.com/twbs/bootstrap
+
+class-transformer@0.1.6
+ * License: MIT
+ * Project: https: //github.com/pleerock/class-transformer
+ * Source: https: //github.com/pleerock/class-transformer
+
+core-js@2.4.1
+ * License: MIT
+ * Project: https: //github.com/zloirock/core-js
+ * Source: https: //github.com/zloirock/core-js
+
+file-saver@1.3.3
+ * License: MIT
+ * Project: https: //github.com/eligrey/FileSaver.js
+ * Source: https: //github.com/eligrey/FileSaver.js
+
+font-awesome@4.7.0
+ * License: SIL OPEN FONT LICENSE (OFL-1.1) AND MIT
+ * Project: https: //github.com/FortAwesome/Font-Awesome
+ * Source: https: //github.com/FortAwesome/Font-Awesome
+
+moment@2.17.1
+ * License: MIT
+ * Project: https: //github.com/moment/moment
+ * Source: https: //github.com/moment/moment
+
+ng2-bootstrap@1.3.1
+ * License: MIT
+ * Project: https: //github.com/valor-software/ng2-bootstrap
+ * Source: https: //github.com/valor-software/ng2-bootstrap
+
+ng2-split-pane@1.3.1
+ * License: MIT
+ * Project: https: //github.com/wannabegeek/ng2-split-pane
+ * Source: https: //github.com/wannabegeek/ng2-split-pane
+
+primeng@2.0.5
+ * License: MIT
+ * Project: https: //github.com/primefaces/primeng
+ * Source: https: //github.com/primefaces/primeng
+
+reflect-metadata@0.1.3
+ * License: Apache-2.0
+ * Project: https: //github.com/rbuckton/ReflectDecorators
+ * Source: https: //github.com/rbuckton/ReflectDecorators
+
+rxjs@5.1.0
+ * License: Apache-2.0
+ * Project: https: //github.com/ReactiveX/RxJS
+ * Source: https: //github.com/ReactiveX/RxJS
+
+symbol-observable@1.2.0
+ * License: MIT
+ * Project: https: //github.com/blesh/symbol-observable
+ * Source: https: //github.com/blesh/symbol-observable
+
+ts-helpers@1.1.1
+ * License: MIT
+ * Project: https: //github.com/ngParty/ts-helpers
+ * Source: https: //github.com/ngParty/ts-helpers
+
+zone.js@0.7.6
+ * License: MIT
+ * Project: https: //github.com/angular
+ * Source: https: //github.com/angular/zone.js
+
+
+## Cryptography
+
+Content may contain encryption software. The country in which you are currently
+may have restrictions on the import, possession, and use, and/or re-export to
+another country, of encryption software. BEFORE using any encryption software,
+please check the country's laws, regulations and policies concerning the import,
+possession, or use, and re-export of encryption software, to see if this is
+permitted.
diff --git a/build.gradle b/build.gradle
index 0b08a36..66ab357 100644
--- a/build.gradle
+++ b/build.gradle
@@ -8,7 +8,7 @@
description = 'MDM API - ODSAdapter'
group = 'org.eclipse.mdm'
-version = '1.0.0'
+version = '5.0.0M1'
apply plugin: 'java'
apply plugin: 'maven'
@@ -50,30 +50,34 @@
}
}
-configurations {
- all*.exclude group: 'javax.inject', module: 'javax.inject'
+configurations.all {
+ exclude group: 'javax.inject', module: 'javax.inject'
+ exclude group: 'commons-logging', module: 'commons-logging'
}
dependencies {
- compile 'javax:javaee-api:7.0'
+ compileOnly 'javax:javaee-api:7.0'
- // logging
- compile 'org.slf4j:slf4j-api:1.7.19'
-
+ // logging
+ compile 'org.slf4j:slf4j-api:1.7.25'
+ // httpclient uses commons-logging
+ compile 'org.slf4j:jcl-over-slf4j:1.7.25'
+
// MDM5 API
- compile 'org.eclipse.mdm:org.eclipse.mdm.api.base:1.0.0'
- compile 'org.eclipse.mdm:org.eclipse.mdm.api.default:1.0.0'
-
+ compile "org.eclipse.mdm:org.eclipse.mdm.api.base:${version}"
+ compile "org.eclipse.mdm:org.eclipse.mdm.api.default:${version}"
+
// compile CORBA idl using JDK tools
generatedCompile files(System.getenv('JAVA_HOME') + '/lib/tools.jar')
-
+ generatedCompile files('src/main/idl/')
+
// Peak notification service
- compile 'com.google.protobuf:protobuf-java:3.0.0-beta-3'
- compile 'com.google.protobuf:protobuf-java-util:3.0.0-beta-3'
+ compile 'com.google.protobuf:protobuf-java:3.2.0'
+ compile 'com.google.protobuf:protobuf-java-util:3.2.0'
compile 'com.google.guava:guava:18.0'
compile 'org.glassfish.jersey.core:jersey-client:2.23.2'
compile 'org.glassfish.jersey.media:jersey-media-sse:2.23.2'
- generatedCompile 'com.google.protobuf:protobuf-java:3.0.0-beta-3'
+ generatedCompile 'com.google.protobuf:protobuf-java:3.2.0'
// querying es
compile 'commons-httpclient:commons-httpclient:3.1'
@@ -81,8 +85,8 @@
// testing
testCompile 'junit:junit:4.12'
- testRuntime 'org.slf4j:slf4j-simple:1.7.19'
- testCompile 'org.mockito:mockito-core:2.10.0'
+ testRuntime 'org.slf4j:slf4j-simple:1.7.25'
+ testCompile 'org.mockito:mockito-core:2.13.0'
testCompile 'org.assertj:assertj-core:3.6.2'
testCompile(group: 'org.elasticsearch', name: 'elasticsearch', version: '2.3.4')
testCompile(group: 'org.elasticsearch', name: 'elasticsearch', version: '2.3.4', classifier: 'tests')
@@ -112,7 +116,7 @@
protobuf {
protoc {
- artifact = 'com.google.protobuf:protoc:3.0.0-beta-3'
+ artifact = 'com.google.protobuf:protoc:3.2.0'
}
}
@@ -128,6 +132,17 @@
outputs.dir("src/gen/java")
}
+task compileNotificationServiceIDL(type: JavaExec) {
+ classpath = configurations.generatedCompile
+
+ main = 'com.sun.tools.corba.se.idl.toJavaPortable.Compile'
+
+ args '-emitAll', '-fall', '-i', 'src/main/idl/', '-td', 'src/gen/java/', 'src/main/idl/CosNotifyChannelAdmin.idl'
+
+ outputs.dir("src/gen/java")
+ outputs.upToDateWhen { false }
+}
+
compileGeneratedJava {
inputs.dir("build/generated/source")
inputs.dir("src/gen/java")
@@ -135,11 +150,16 @@
// generate classes from idl and compile them
compileGeneratedJava.dependsOn compileIDL
+compileGeneratedJava.dependsOn compileNotificationServiceIDL
+
compileJava.dependsOn compileGeneratedJava
jar {
from sourceSets.generated.output
dependsOn generatedClasses
+
+ metaInf { from 'NOTICE.txt' }
+ metaInf { from 'LICENSE.txt' }
}
task deleteGenerated(type: Delete) {
diff --git a/src/main/idl/CosEventChannelAdmin.idl b/src/main/idl/CosEventChannelAdmin.idl
new file mode 100644
index 0000000..8ddf3a3
--- /dev/null
+++ b/src/main/idl/CosEventChannelAdmin.idl
@@ -0,0 +1,59 @@
+/**
+ * This module is taken from the standard CORBA Event Service
+ * 1.2, as described in:
+ *
+ * https://www.omg.org/spec/EVNT/1.2/
+ *
+ * The idl was extracted from the following PDF:
+ * formal/04-10-02
+ */
+
+#ifndef _COS_EVENT_CHANNEL_ADMIN_IDL_
+#define _COS_EVENT_CHANNEL_ADMIN_IDL_
+
+#include "CosEventComm.idl"
+
+#pragma prefix "omg.org"
+
+module CosEventChannelAdmin {
+
+ exception AlreadyConnected {};
+ exception TypeError {};
+
+ interface ProxyPushConsumer: CosEventComm::PushConsumer {
+ void connect_push_supplier(in CosEventComm::PushSupplier push_supplier)
+ raises(AlreadyConnected);
+ };
+
+ interface ProxyPullSupplier: CosEventComm::PullSupplier {
+ void connect_pull_consumer(in CosEventComm::PullConsumer pull_consumer)
+ raises(AlreadyConnected);
+ };
+
+ interface ProxyPullConsumer: CosEventComm::PullConsumer {
+ void connect_pull_supplier(in CosEventComm::PullSupplier pull_supplier)
+ raises(AlreadyConnected,TypeError);
+ };
+
+ interface ProxyPushSupplier: CosEventComm::PushSupplier {
+ void connect_push_consumer(in CosEventComm::PushConsumer push_consumer)
+ raises(AlreadyConnected, TypeError);
+ };
+
+ interface ConsumerAdmin {
+ ProxyPushSupplier obtain_push_supplier();
+ ProxyPullSupplier obtain_pull_supplier();
+ };
+
+ interface SupplierAdmin {
+ ProxyPushConsumer obtain_push_consumer();
+ ProxyPullConsumer obtain_pull_consumer();
+ };
+
+ interface EventChannel {
+ ConsumerAdmin for_consumers();
+ SupplierAdmin for_suppliers();
+ void destroy();
+ };
+};
+#endif /* ifndef _COS_EVENT_CHANNEL_ADMIN_IDL_ */
diff --git a/src/main/idl/CosEventComm.idl b/src/main/idl/CosEventComm.idl
new file mode 100644
index 0000000..ed88691
--- /dev/null
+++ b/src/main/idl/CosEventComm.idl
@@ -0,0 +1,41 @@
+/**
+ * This module is taken from the standard CORBA Event Service
+ * 1.2, as described in:
+ *
+ * https://www.omg.org/spec/EVNT/1.2/
+ *
+ * The idl was extracted from the following PDF:
+ * formal/04-10-02
+ */
+
+#ifndef _COS_EVENT_COMM_IDL_
+#define _COS_EVENT_COMM_IDL_
+
+#pragma prefix "omg.org"
+
+module CosEventComm {
+
+ exception Disconnected{};
+
+ interface PushConsumer {
+ void push (in any data) raises(Disconnected);
+ void disconnect_push_consumer();
+ };
+
+ interface PushSupplier {
+ void disconnect_push_supplier();
+ };
+
+ interface PullSupplier {
+ any pull () raises(Disconnected);
+ any try_pull (out boolean has_event) raises(Disconnected);
+ void disconnect_pull_supplier();
+ };
+
+ interface PullConsumer {
+ void disconnect_pull_consumer();
+ };
+
+};
+
+#endif /* ifndef _COS_EVENT_COMM_IDL_ */
diff --git a/src/main/idl/CosNotification.idl b/src/main/idl/CosNotification.idl
new file mode 100644
index 0000000..a789700
--- /dev/null
+++ b/src/main/idl/CosNotification.idl
@@ -0,0 +1,180 @@
+/**
+ * This module is taken from the standard CORBA Notification Service
+ * 1.1, as described in:
+ *
+ * https://www.omg.org/spec/NOT/1.1/
+ *
+ * The idl was extracted from the following PDF:
+ * formal/04-10-13
+ */
+
+#ifndef _COS_NOTIFICATION_IDL_
+#define _COS_NOTIFICATION_IDL_
+
+#pragma prefix "omg.org"
+
+module CosNotification {
+
+ typedef string Istring;
+ typedef Istring PropertyName;
+ typedef any PropertyValue;
+
+ struct Property {
+ PropertyName name;
+ PropertyValue value;
+ };
+ typedef sequence<Property> PropertySeq;
+
+ // The following are the same, but serve different purposes.
+ typedef PropertySeq OptionalHeaderFields;
+ typedef PropertySeq FilterableEventBody;
+ typedef PropertySeq QoSProperties;
+ typedef PropertySeq AdminProperties;
+
+ struct _EventType {
+ string domain_name;
+ string type_name;
+ };
+ typedef sequence<_EventType> EventTypeSeq;
+
+ struct PropertyRange {
+ PropertyValue low_val;
+ PropertyValue high_val;
+ };
+
+ struct NamedPropertyRange {
+ PropertyName name;
+ PropertyRange range;
+ };
+ typedef sequence<NamedPropertyRange> NamedPropertyRangeSeq;
+
+ enum QoSError_code {
+ UNSUPPORTED_PROPERTY,
+ UNAVAILABLE_PROPERTY,
+ UNSUPPORTED_VALUE,
+ UNAVAILABLE_VALUE,
+ BAD_PROPERTY,
+ BAD_TYPE,
+ BAD_VALUE
+ };
+
+ struct PropertyError {
+ QoSError_code code;
+ PropertyName name;
+ PropertyRange available_range;
+ };
+ typedef sequence<PropertyError> PropertyErrorSeq;
+
+ exception UnsupportedQoS { PropertyErrorSeq qos_err; };
+ exception UnsupportedAdmin { PropertyErrorSeq admin_err; };
+
+ // Define the Structured Event structure
+ struct FixedEventHeader {
+ _EventType event_type;
+ string event_name;
+ };
+
+ struct EventHeader {
+ FixedEventHeader fixed_header;
+ OptionalHeaderFields variable_header;
+ };
+
+ struct StructuredEvent {
+ EventHeader header;
+ FilterableEventBody filterable_data;
+ any remainder_of_body;
+ }; // StructuredEvent
+ typedef sequence<StructuredEvent> EventBatch;
+
+ // The following constant declarations define the standard
+ // QoS property names and the associated values each property
+ // can take on. The name/value pairs for each standard property
+ // are grouped, beginning with a string constant defined for the
+ // property name, followed by the values the property can take on.
+
+ const string EventReliability = "EventReliability";
+ const short BestEffort = 0;
+ const short Persistent = 1;
+
+ const string ConnectionReliability = "ConnectionReliability";
+ // Can take on the same values as EventReliability
+
+ const string Priority = "Priority";
+ const short LowestPriority = -32767;
+ const short HighestPriority = 32767;
+ const short DefaultPriority = 0;
+
+ const string StartTime = "StartTime";
+ // StartTime takes a value of type TimeBase::UtcT.
+
+ const string StopTime = "StopTime";
+ // StopTime takes a value of type TimeBase::UtcT.
+
+ const string Timeout = "Timeout";
+ // Timeout takes on a value of type TimeBase::TimeT
+
+ const string OrderPolicy = "OrderPolicy";
+ const short AnyOrder = 0;
+ const short FifoOrder = 1;
+ const short PriorityOrder = 2;
+ const short DeadlineOrder = 3;
+
+ const string DiscardPolicy = "DiscardPolicy";
+ // DiscardPolicy takes on the same values as OrderPolicy, plus
+ const short LifoOrder = 4;
+
+ const string MaximumBatchSize = "MaximumBatchSize";
+ // MaximumBatchSize takes on a value of type long
+
+ const string PacingInterval = "PacingInterval";
+ // PacingInterval takes on a value of type TimeBase::TimeT
+
+ const string StartTimeSupported = "StartTimeSupported";
+ // StartTimeSupported takes on a boolean value
+
+ const string StopTimeSupported = "StopTimeSupported";
+ // StopTimeSupported takes on a boolean value
+
+ const string MaxEventsPerConsumer = "MaxEventsPerConsumer";
+ // MaxEventsPerConsumer takes on a value of type long
+
+ interface QoSAdmin {
+
+ QoSProperties get_qos();
+
+ void set_qos ( in QoSProperties qos) raises ( UnsupportedQoS );
+
+ void validate_qos (
+ in QoSProperties required_qos,
+ out NamedPropertyRangeSeq available_qos ) raises ( UnsupportedQoS );
+
+ }; // QosAdmin
+
+ // Admin properties are defined in similar manner as QoS
+ // properties. The only difference is that these properties
+ // are related to channel administration policies, as opposed
+ // message quality of service
+
+ const string MaxQueueLength = "MaxQueueLength";
+ // MaxQueueLength takes on a value of type long
+
+ const string MaxConsumers = "MaxConsumers";
+ // MaxConsumers takes on a value of type long
+
+ const string MaxSuppliers = "MaxSuppliers";
+ // MaxSuppliers takes on a value of type long
+
+ const string RejectNewEvents = "RejectNewEvents";
+ // RejectNewEvents takes on a value of type Boolean
+
+ interface AdminPropertiesAdmin {
+
+ AdminProperties get_admin();
+
+ void set_admin (in AdminProperties admin) raises ( UnsupportedAdmin);
+
+ }; // AdminPropertiesAdmin
+
+}; // CosNotification
+
+#endif /* _COS_NOTIFICATION_IDL_ */
diff --git a/src/main/idl/CosNotifyChannelAdmin.idl b/src/main/idl/CosNotifyChannelAdmin.idl
new file mode 100644
index 0000000..524d3ea
--- /dev/null
+++ b/src/main/idl/CosNotifyChannelAdmin.idl
@@ -0,0 +1,394 @@
+/**
+ * This module is taken from the standard CORBA Notification Service
+ * 1.1, as described in:
+ *
+ * https://www.omg.org/spec/NOT/1.1/
+ *
+ * The idl was extracted from the following PDF:
+ * formal/04-10-13
+ */
+
+#ifndef _COS_NOTIFY_CHANNEL_ADMIN_IDL_
+#define _COS_NOTIFY_CHANNEL_ADMIN_IDL_
+
+#include "CosNotification.idl"
+#include "CosNotifyFilter.idl"
+#include "CosNotifyComm.idl"
+#include "CosEventChannelAdmin.idl"
+
+#pragma prefix "omg.org"
+
+module CosNotifyChannelAdmin {
+
+ exception ConnectionAlreadyActive {};
+ exception ConnectionAlreadyInactive {};
+ exception NotConnected {};
+
+ // Forward declarations
+ interface ConsumerAdmin;
+ interface SupplierAdmin;
+ interface EventChannel;
+ interface EventChannelFactory;
+
+ enum ProxyType {
+ PUSH_ANY,
+ PULL_ANY,
+ PUSH_STRUCTURED,
+ PULL_STRUCTURED,
+ PUSH_SEQUENCE,
+ PULL_SEQUENCE,
+ PUSH_TYPED,
+ PULL_TYPED
+ };
+
+ enum ObtainInfoMode {
+ ALL_NOW_UPDATES_OFF,
+ ALL_NOW_UPDATES_ON,
+ NONE_NOW_UPDATES_OFF,
+ NONE_NOW_UPDATES_ON
+ };
+
+ interface ProxyConsumer :
+ CosNotification::QoSAdmin,
+ CosNotifyFilter::FilterAdmin {
+
+ readonly attribute ProxyType MyType;
+ readonly attribute SupplierAdmin MyAdmin;
+
+ CosNotification::EventTypeSeq obtain_subscription_types(
+ in ObtainInfoMode mode );
+
+ void validate_event_qos (
+ in CosNotification::QoSProperties required_qos,
+ out CosNotification::NamedPropertyRangeSeq available_qos)
+ raises (CosNotification::UnsupportedQoS);
+
+ }; // ProxyConsumer
+
+ interface ProxySupplier :
+ CosNotification::QoSAdmin,
+ CosNotifyFilter::FilterAdmin {
+
+ readonly attribute ProxyType MyType;
+ readonly attribute ConsumerAdmin MyAdmin;
+
+ attribute CosNotifyFilter::MappingFilter priority_filter;
+ attribute CosNotifyFilter::MappingFilter lifetime_filter;
+
+ CosNotification::EventTypeSeq obtain_offered_types(
+ in ObtainInfoMode mode );
+
+ void validate_event_qos (
+ in CosNotification::QoSProperties required_qos,
+ out CosNotification::NamedPropertyRangeSeq available_qos)
+ raises (CosNotification::UnsupportedQoS);
+
+ }; // ProxySupplier
+
+ interface ProxyPushConsumer :
+ ProxyConsumer,
+ CosNotifyComm::PushConsumer {
+
+ void connect_any_push_supplier (
+ in CosEventComm::PushSupplier push_supplier)
+ raises(CosEventChannelAdmin::AlreadyConnected);
+
+ }; // ProxyPushConsumer
+
+ interface StructuredProxyPushConsumer :
+ ProxyConsumer,
+ CosNotifyComm::StructuredPushConsumer {
+
+ void connect_structured_push_supplier (
+ in CosNotifyComm::StructuredPushSupplier push_supplier)
+ raises(CosEventChannelAdmin::AlreadyConnected);
+
+ }; // StructuredProxyPushConsumer
+
+ interface SequenceProxyPushConsumer :
+ ProxyConsumer,
+ CosNotifyComm::SequencePushConsumer {
+
+ void connect_sequence_push_supplier (
+ in CosNotifyComm::SequencePushSupplier push_supplier)
+ raises(CosEventChannelAdmin::AlreadyConnected);
+
+ }; // SequenceProxyPushConsumer
+
+ interface ProxyPullSupplier :
+ ProxySupplier,
+ CosNotifyComm::PullSupplier {
+
+ void connect_any_pull_consumer (
+ in CosEventComm::PullConsumer pull_consumer)
+ raises(CosEventChannelAdmin::AlreadyConnected);
+
+ }; // ProxyPullSupplier
+
+ interface StructuredProxyPullSupplier :
+ ProxySupplier,
+ CosNotifyComm::StructuredPullSupplier {
+
+ void connect_structured_pull_consumer (
+ in CosNotifyComm::StructuredPullConsumer pull_consumer)
+ raises(CosEventChannelAdmin::AlreadyConnected);
+
+ }; // StructuredProxyPullSupplier
+
+ interface SequenceProxyPullSupplier :
+ ProxySupplier,
+ CosNotifyComm::SequencePullSupplier {
+
+ void connect_sequence_pull_consumer (
+ in CosNotifyComm::SequencePullConsumer pull_consumer)
+ raises(CosEventChannelAdmin::AlreadyConnected);
+
+ }; // SequenceProxyPullSupplier
+
+ interface ProxyPullConsumer :
+ ProxyConsumer,
+ CosNotifyComm::PullConsumer {
+
+ void connect_any_pull_supplier (
+ in CosEventComm::PullSupplier pull_supplier)
+ raises(CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError );
+
+ void suspend_connection()
+ raises(ConnectionAlreadyInactive, NotConnected);
+
+ void resume_connection()
+ raises(ConnectionAlreadyActive, NotConnected);
+
+ }; // ProxyPullConsumer
+
+ interface StructuredProxyPullConsumer :
+ ProxyConsumer,
+ CosNotifyComm::StructuredPullConsumer {
+
+ void connect_structured_pull_supplier (
+ in CosNotifyComm::StructuredPullSupplier pull_supplier)
+ raises(CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError );
+
+ void suspend_connection()
+ raises(ConnectionAlreadyInactive, NotConnected);
+
+ void resume_connection()
+ raises(ConnectionAlreadyActive, NotConnected);
+
+ }; // StructuredProxyPullConsumer
+
+ interface SequenceProxyPullConsumer :
+ ProxyConsumer,
+ CosNotifyComm::SequencePullConsumer {
+
+ void connect_sequence_pull_supplier (
+ in CosNotifyComm::SequencePullSupplier pull_supplier)
+ raises(CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError );
+
+ void suspend_connection()
+ raises(ConnectionAlreadyInactive, NotConnected);
+
+ void resume_connection()
+ raises(ConnectionAlreadyActive, NotConnected);
+
+ }; // SequenceProxyPullConsumer
+
+ interface ProxyPushSupplier :
+ ProxySupplier,
+ CosNotifyComm::PushSupplier {
+
+ void connect_any_push_consumer (
+ in CosEventComm::PushConsumer push_consumer)
+ raises(CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError );
+
+ void suspend_connection()
+ raises(ConnectionAlreadyInactive, NotConnected);
+
+ void resume_connection()
+ raises(ConnectionAlreadyActive, NotConnected);
+
+ }; // ProxyPushSupplier
+
+ interface StructuredProxyPushSupplier :
+ ProxySupplier,
+ CosNotifyComm::StructuredPushSupplier {
+
+ void connect_structured_push_consumer (
+ in CosNotifyComm::StructuredPushConsumer push_consumer)
+ raises(CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError );
+
+ void suspend_connection()
+ raises(ConnectionAlreadyInactive, NotConnected);
+
+ void resume_connection()
+ raises(ConnectionAlreadyActive, NotConnected);
+
+ }; // StructuredProxyPushSupplier
+
+ interface SequenceProxyPushSupplier :
+ ProxySupplier,
+ CosNotifyComm::SequencePushSupplier {
+
+ void connect_sequence_push_consumer (
+ in CosNotifyComm::SequencePushConsumer push_consumer)
+ raises(CosEventChannelAdmin::AlreadyConnected,
+ CosEventChannelAdmin::TypeError );
+
+ void suspend_connection()
+ raises(ConnectionAlreadyInactive, NotConnected);
+
+ void resume_connection()
+ raises(ConnectionAlreadyActive, NotConnected);
+
+ }; // SequenceProxyPushSupplier
+
+ typedef long ProxyID;
+ typedef sequence <ProxyID> ProxyIDSeq;
+
+ enum ClientType {
+ ANY_EVENT,
+ STRUCTURED_EVENT,
+ SEQUENCE_EVENT
+ };
+
+ enum InterFilterGroupOperator { AND_OP, OR_OP };
+
+ typedef long AdminID;
+ typedef sequence<AdminID> AdminIDSeq;
+
+ exception AdminNotFound {};
+ exception ProxyNotFound {};
+
+ struct AdminLimit {
+ CosNotification::PropertyName name;
+ CosNotification::PropertyValue value;
+ };
+
+ exception AdminLimitExceeded { AdminLimit admin_property_err; };
+
+ interface ConsumerAdmin :
+ CosNotification::QoSAdmin,
+ CosNotifyComm::NotifySubscribe,
+ CosNotifyFilter::FilterAdmin,
+ CosEventChannelAdmin::ConsumerAdmin {
+
+ readonly attribute AdminID MyID;
+ readonly attribute EventChannel MyChannel;
+
+ readonly attribute InterFilterGroupOperator MyOperator;
+
+ attribute CosNotifyFilter::MappingFilter priority_filter;
+ attribute CosNotifyFilter::MappingFilter lifetime_filter;
+
+ readonly attribute ProxyIDSeq pull_suppliers;
+ readonly attribute ProxyIDSeq push_suppliers;
+
+ ProxySupplier get_proxy_supplier ( in ProxyID proxy_id )
+ raises ( ProxyNotFound );
+
+ ProxySupplier obtain_notification_pull_supplier (
+ in ClientType ctype,
+ out ProxyID proxy_id)
+ raises ( AdminLimitExceeded );
+
+ ProxySupplier obtain_notification_push_supplier (
+ in ClientType ctype,
+ out ProxyID proxy_id)
+ raises ( AdminLimitExceeded );
+
+ void destroy();
+
+ }; // ConsumerAdmin
+
+ interface SupplierAdmin :
+ CosNotification::QoSAdmin,
+ CosNotifyComm::NotifyPublish,
+ CosNotifyFilter::FilterAdmin,
+ CosEventChannelAdmin::SupplierAdmin {
+
+ readonly attribute AdminID MyID;
+ readonly attribute EventChannel MyChannel;
+
+ readonly attribute InterFilterGroupOperator MyOperator;
+
+ readonly attribute ProxyIDSeq pull_consumers;
+ readonly attribute ProxyIDSeq push_consumers;
+
+ ProxyConsumer get_proxy_consumer ( in ProxyID proxy_id )
+ raises ( ProxyNotFound );
+
+ ProxyConsumer obtain_notification_pull_consumer (
+ in ClientType ctype,
+ out ProxyID proxy_id)
+ raises ( AdminLimitExceeded );
+
+ ProxyConsumer obtain_notification_push_consumer (
+ in ClientType ctype,
+ out ProxyID proxy_id)
+ raises ( AdminLimitExceeded );
+
+ void destroy();
+
+ }; // SupplierAdmin
+
+ interface EventChannel :
+ CosNotification::QoSAdmin,
+ CosNotification::AdminPropertiesAdmin,
+ CosEventChannelAdmin::EventChannel {
+
+ readonly attribute EventChannelFactory MyFactory;
+
+ readonly attribute ConsumerAdmin default_consumer_admin;
+ readonly attribute SupplierAdmin default_supplier_admin;
+
+ readonly attribute CosNotifyFilter::FilterFactory
+ default_filter_factory;
+
+ ConsumerAdmin new_for_consumers(
+ in InterFilterGroupOperator op,
+ out AdminID id );
+
+ SupplierAdmin new_for_suppliers(
+ in InterFilterGroupOperator op,
+ out AdminID id );
+
+ ConsumerAdmin get_consumeradmin ( in AdminID id )
+ raises (AdminNotFound);
+
+ SupplierAdmin get_supplieradmin ( in AdminID id )
+ raises (AdminNotFound);
+
+ AdminIDSeq get_all_consumeradmins();
+ AdminIDSeq get_all_supplieradmins();
+
+ }; // EventChannel
+
+ typedef long ChannelID;
+ typedef sequence<ChannelID> ChannelIDSeq;
+
+ exception ChannelNotFound {};
+
+ interface EventChannelFactory {
+
+ EventChannel create_channel (
+ in CosNotification::QoSProperties initial_qos,
+ in CosNotification::AdminProperties initial_admin,
+ out ChannelID id)
+ raises(CosNotification::UnsupportedQoS,
+ CosNotification::UnsupportedAdmin );
+
+ ChannelIDSeq get_all_channels();
+
+ EventChannel get_event_channel ( in ChannelID id )
+ raises (ChannelNotFound);
+
+ }; // EventChannelFactory
+
+}; // CosNotifyChannelAdmin
+
+#endif /* _COS_NOTIFY_CHANNEL_ADMIN_IDL_ */
diff --git a/src/main/idl/CosNotifyComm.idl b/src/main/idl/CosNotifyComm.idl
new file mode 100644
index 0000000..33df3d7
--- /dev/null
+++ b/src/main/idl/CosNotifyComm.idl
@@ -0,0 +1,135 @@
+/**
+ * This module is taken from the standard CORBA Notification Service
+ * 1.1, as described in:
+ *
+ * https://www.omg.org/spec/NOT/1.1/
+ *
+ * The idl was extracted from the following PDF:
+ * formal/04-10-13
+ */
+
+#ifndef _COS_NOTIFY_COMM_IDL_
+#define _COS_NOTIFY_COMM_IDL_
+
+#include "CosNotification.idl"
+#include "CosEventComm.idl"
+
+#pragma prefix "omg.org"
+
+module CosNotifyComm {
+
+ exception InvalidEventType { CosNotification::_EventType type; };
+
+ interface NotifyPublish {
+
+ void offer_change (
+ in CosNotification::EventTypeSeq added,
+ in CosNotification::EventTypeSeq removed )
+ raises ( InvalidEventType );
+
+ }; // NotifyPublish
+
+ interface NotifySubscribe {
+
+ void subscription_change(
+ in CosNotification::EventTypeSeq added,
+ in CosNotification::EventTypeSeq removed )
+ raises ( InvalidEventType );
+
+ }; // NotifySubscribe
+
+ interface PushConsumer :
+ NotifyPublish,
+ CosEventComm::PushConsumer {
+ }; // PushConsumer
+
+ interface PullConsumer :
+ NotifyPublish,
+ CosEventComm::PullConsumer {
+ }; // PullConsumer
+
+ interface PullSupplier :
+ NotifySubscribe,
+ CosEventComm::PullSupplier {
+ }; // PullSupplier
+
+ interface PushSupplier :
+ NotifySubscribe,
+ CosEventComm::PushSupplier {
+ };
+
+ interface StructuredPushConsumer : NotifyPublish {
+
+ void push_structured_event(
+ in CosNotification::StructuredEvent notification)
+ raises(CosEventComm::Disconnected);
+
+ void disconnect_structured_push_consumer();
+
+ }; // StructuredPushConsumer
+
+ interface StructuredPullConsumer : NotifyPublish {
+
+ void disconnect_structured_pull_consumer();
+
+ }; // StructuredPullConsumer
+
+ interface StructuredPullSupplier : NotifySubscribe {
+
+ CosNotification::StructuredEvent pull_structured_event()
+ raises(CosEventComm::Disconnected);
+
+ CosNotification::StructuredEvent try_pull_structured_event(
+ out boolean has_event)
+ raises(CosEventComm::Disconnected);
+
+ void disconnect_structured_pull_supplier();
+
+ }; // StructuredPullSupplier
+
+ interface StructuredPushSupplier : NotifySubscribe {
+
+ void disconnect_structured_push_supplier();
+
+ }; // StructuredPushSupplier
+
+ interface SequencePushConsumer : NotifyPublish {
+
+ void push_structured_events(
+ in CosNotification::EventBatch notifications)
+ raises(CosEventComm::Disconnected);
+
+ void disconnect_sequence_push_consumer();
+
+ }; // SequencePushConsumer
+
+ interface SequencePullConsumer : NotifyPublish {
+
+ void disconnect_sequence_pull_consumer();
+
+ }; // SequencePullConsumer
+
+ interface SequencePullSupplier : NotifySubscribe {
+
+ CosNotification::EventBatch pull_structured_events(
+ in long max_number )
+ raises(CosEventComm::Disconnected);
+
+ CosNotification::EventBatch try_pull_structured_events(
+ in long max_number,
+ out boolean has_event)
+ raises(CosEventComm::Disconnected);
+
+ void disconnect_sequence_pull_supplier();
+
+ }; // SequencePullSupplier
+
+ interface SequencePushSupplier : NotifySubscribe {
+
+ void disconnect_sequence_push_supplier();
+
+ }; // SequencePushSupplier
+
+}; // CosNotifyComm
+
+#endif /* _COS_NOTIFY_COMM_IDL_ */
diff --git a/src/main/idl/CosNotifyFilter.idl b/src/main/idl/CosNotifyFilter.idl
new file mode 100644
index 0000000..977cc3b
--- /dev/null
+++ b/src/main/idl/CosNotifyFilter.idl
@@ -0,0 +1,187 @@
+/**
+ * This module is taken from the standard CORBA Notification Service
+ * 1.1, as described in:
+ *
+ * https://www.omg.org/spec/NOT/1.1/
+ *
+ * The idl was extracted from the following PDF:
+ * formal/04-10-13
+ */
+
+#ifndef _COS_NOTIFY_FILTER_IDL_
+#define _COS_NOTIFY_FILTER_IDL_
+
+#include "CosNotifyComm.idl"
+
+#pragma prefix "omg.org"
+
+module CosNotifyFilter {
+
+ typedef long ConstraintID;
+
+ struct ConstraintExp {
+ CosNotification::EventTypeSeq event_types;
+ string constraint_expr;
+ };
+
+ typedef sequence<ConstraintID> ConstraintIDSeq;
+ typedef sequence<ConstraintExp> ConstraintExpSeq;
+
+ struct ConstraintInfo {
+ ConstraintExp constraint_expression;
+ ConstraintID constraint_id;
+ };
+
+ typedef sequence<ConstraintInfo> ConstraintInfoSeq;
+
+ struct MappingConstraintPair {
+ ConstraintExp constraint_expression;
+ any result_to_set;
+ };
+
+ typedef sequence<MappingConstraintPair> MappingConstraintPairSeq;
+
+ struct MappingConstraintInfo {
+ ConstraintExp constraint_expression;
+ ConstraintID constraint_id;
+ any value;
+ };
+
+ typedef sequence<MappingConstraintInfo> MappingConstraintInfoSeq;
+
+ typedef long CallbackID;
+ typedef sequence<CallbackID> CallbackIDSeq;
+
+ exception UnsupportedFilterableData {};
+ exception InvalidGrammar {};
+ exception InvalidConstraint {ConstraintExp constr;};
+ exception DuplicateConstraintID {ConstraintID id;};
+ exception ConstraintNotFound {ConstraintID id;};
+
+ exception CallbackNotFound {};
+
+ exception InvalidValue {ConstraintExp constr; any value;};
+
+ interface Filter {
+
+ readonly attribute string constraint_grammar;
+
+ ConstraintInfoSeq add_constraints (
+ in ConstraintExpSeq constraint_list)
+ raises (InvalidConstraint);
+
+ void modify_constraints (
+ in ConstraintIDSeq del_list,
+ in ConstraintInfoSeq modify_list)
+ raises (InvalidConstraint, ConstraintNotFound);
+
+ ConstraintInfoSeq get_constraints(
+ in ConstraintIDSeq id_list)
+ raises (ConstraintNotFound);
+
+ ConstraintInfoSeq get_all_constraints();
+
+ void remove_all_constraints();
+
+ void destroy();
+
+ boolean match ( in any filterable_data )
+ raises (UnsupportedFilterableData);
+
+ boolean match_structured (
+ in CosNotification::StructuredEvent filterable_data )
+ raises (UnsupportedFilterableData);
+
+ boolean match_typed (
+ in CosNotification::PropertySeq filterable_data )
+ raises (UnsupportedFilterableData);
+
+ CallbackID attach_callback (
+ in CosNotifyComm::NotifySubscribe callback);
+
+ void detach_callback ( in CallbackID callback)
+ raises ( CallbackNotFound );
+
+ CallbackIDSeq get_callbacks();
+
+ }; // Filter
+
+ interface MappingFilter {
+
+ readonly attribute string constraint_grammar;
+
+ readonly attribute CORBA::TypeCode value_type;
+
+ readonly attribute any default_value;
+
+ MappingConstraintInfoSeq add_mapping_constraints (
+ in MappingConstraintPairSeq pair_list)
+ raises (InvalidConstraint, InvalidValue);
+
+ void modify_mapping_constraints (
+ in ConstraintIDSeq del_list,
+ in MappingConstraintInfoSeq modify_list)
+ raises (InvalidConstraint, InvalidValue,
+ ConstraintNotFound);
+
+ MappingConstraintInfoSeq get_mapping_constraints (
+ in ConstraintIDSeq id_list)
+ raises (ConstraintNotFound);
+
+ MappingConstraintInfoSeq get_all_mapping_constraints();
+
+ void remove_all_mapping_constraints();
+
+ void destroy();
+
+ boolean match (
+ in any filterable_data,
+ out any result_to_set )
+ raises (UnsupportedFilterableData);
+
+ boolean match_structured (
+ in CosNotification::StructuredEvent filterable_data,
+ out any result_to_set)
+ raises (UnsupportedFilterableData);
+
+ boolean match_typed (
+ in CosNotification::PropertySeq filterable_data,
+ out any result_to_set)
+ raises (UnsupportedFilterableData);
+
+ }; // MappingFilter
+
+ interface FilterFactory {
+
+ Filter create_filter ( in string constraint_grammar)
+ raises (InvalidGrammar);
+
+ MappingFilter create_mapping_filter (
+ in string constraint_grammar,
+ in any default_value)
+ raises(InvalidGrammar);
+
+ }; // FilterFactory
+
+ typedef long FilterID;
+ typedef sequence<FilterID> FilterIDSeq;
+
+ exception FilterNotFound {};
+
+ interface FilterAdmin {
+
+ FilterID add_filter ( in Filter new_filter );
+
+ void remove_filter ( in FilterID filter ) raises ( FilterNotFound );
+
+ Filter get_filter ( in FilterID filter ) raises ( FilterNotFound );
+
+ FilterIDSeq get_all_filters();
+
+ void remove_all_filters();
+
+ }; // FilterAdmin
+
+}; // CosNotifyFilter
+
+#endif /* _COS_NOTIFY_FILTER_IDL_ */
diff --git a/src/main/idl/idl.config b/src/main/idl/idl.config
new file mode 100644
index 0000000..7c76796
--- /dev/null
+++ b/src/main/idl/idl.config
@@ -0,0 +1,6 @@
+PkgPrefix.CosEventComm=org.omg
+PkgPrefix.CosNotification=org.omg
+PkgPrefix.CosNotifyComm=org.omg
+PkgPrefix.CosNotifyFilter=org.omg
+PkgPrefix.CosEventChannelAdmin=org.omg
+PkgPrefix.CosNotifyChannelAdmin=org.omg
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/filetransfer/Transfer.java b/src/main/java/org/eclipse/mdm/api/odsadapter/filetransfer/Transfer.java
index 88605a7..63041b8 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/filetransfer/Transfer.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/filetransfer/Transfer.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt GmbH and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter.filetransfer;
import java.io.InputStream;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/Cache.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/Cache.java
index 2238bff..af9a8ae 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/Cache.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/Cache.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt GmbH and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter.lookup;
import java.util.HashMap;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/ChildRequest.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/ChildRequest.java
index 66e1cc1..cb72fc0 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/ChildRequest.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/ChildRequest.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt GmbH and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter.lookup;
import static java.util.stream.Stream.concat;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityLoader.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityLoader.java
index e8a0916..471301e 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityLoader.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityLoader.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt GmbH and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter.lookup;
import java.util.Collection;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityRecord.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityRecord.java
index 4c5b243..a47ff19 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityRecord.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityRecord.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt GmbH and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter.lookup;
import org.eclipse.mdm.api.base.adapter.Core;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityRequest.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityRequest.java
index c6b53dc..f898e09 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityRequest.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityRequest.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt GmbH and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter.lookup;
import static java.util.stream.Collectors.toList;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityResult.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityResult.java
index c1ab377..fe2046f 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityResult.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/EntityResult.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt GmbH and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter.lookup;
import static org.eclipse.mdm.api.dflt.model.CatalogAttribute.VATTR_ENUMERATION_NAME;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/RelationConfig.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/RelationConfig.java
index a2dee0d..495e498 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/RelationConfig.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/RelationConfig.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt GmbH and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter.lookup;
import java.util.ArrayList;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfig.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfig.java
index 29683eb..e40f7f2 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfig.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfig.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt GmbH and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter.lookup.config;
import java.util.ArrayList;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfigRepository.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfigRepository.java
index d032b59..3cd1536 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfigRepository.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfigRepository.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt GmbH and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter.lookup.config;
import java.util.HashMap;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/NotificationEntityLoader.java b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/NotificationEntityLoader.java
index 63f5d41..62158b4 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/NotificationEntityLoader.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/NotificationEntityLoader.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2017-2018 Peak Solution GmbH and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter.notification;
import java.util.ArrayList;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/ODSNotificationServiceFactory.java b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/ODSNotificationServiceFactory.java
index 57be20d..f612481 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/ODSNotificationServiceFactory.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/ODSNotificationServiceFactory.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2017-2018 Peak Solution GmbH and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter.notification;
import java.util.Map;
@@ -9,6 +17,8 @@
import org.eclipse.mdm.api.base.notification.NotificationService;
import org.eclipse.mdm.api.base.query.QueryService;
import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.odsadapter.ODSContextFactory;
+import org.eclipse.mdm.api.odsadapter.notification.avalon.AvalonNotificationManager;
import org.eclipse.mdm.api.odsadapter.notification.peak.PeakNotificationManager;
import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
import org.slf4j.Logger;
@@ -59,25 +69,24 @@
}
} else if (SERVER_TYPE_AVALON.equalsIgnoreCase(type)) {
- throw new IllegalArgumentException("Avalon notification service is not supported yet.");
-// String serviceName = getParameter(parameters, ODSContextFactory.PARAM_SERVICENAME);
-// serviceName = serviceName.replace(".ASAM-ODS", "");
-// String nameServiceURL = getParameter(parameters, ODSContextFactory.PARAM_NAMESERVICE);
-//
-// LOGGER.info("Connecting to Avalon Notification Server ...");
-// LOGGER.info("Name service URL: {}", nameServiceURL);
-// LOGGER.info("Service name: {}", serviceName);
-//
-// long pollingInterval = 500L;
-// try {
-// pollingInterval = Long.parseLong(getParameter(parameters, PARAM_POLLING_INTERVAL));
-// } catch (NumberFormatException | ConnectionException e) {
-// LOGGER.warn("Could not parse parse parameter pollingInterval. Using default value: " + pollingInterval,
-// e);
-// }
-//
-// return new AvalonNotificationManager((ODSModelManager) mm, queryService, serviceName, nameServiceURL, true,
-// pollingInterval);
+ String serviceName = getParameter(parameters, ODSContextFactory.PARAM_SERVICENAME);
+ serviceName = serviceName.replace(".ASAM-ODS", "");
+ String nameServiceURL = getParameter(parameters, ODSContextFactory.PARAM_NAMESERVICE);
+
+ LOGGER.info("Connecting to Avalon Notification Server ...");
+ LOGGER.info("Name service URL: {}", nameServiceURL);
+ LOGGER.info("Service name: {}", serviceName);
+
+ long pollingInterval = 500L;
+ try {
+ pollingInterval = Long.parseLong(getParameter(parameters, PARAM_POLLING_INTERVAL));
+ } catch (NumberFormatException | ConnectionException e) {
+ LOGGER.warn("Could not parse parse parameter pollingInterval. Using default value: " + pollingInterval,
+ e);
+ }
+
+ return new AvalonNotificationManager((ODSModelManager) mm, queryService, serviceName, nameServiceURL, true,
+ pollingInterval);
} else {
throw new ConnectionException("Invalid server type. Expected on of: 'peak'");
}
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/avalon/AvalonNotificationManager.java b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/avalon/AvalonNotificationManager.java
index d30c966..e63ccf3 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/avalon/AvalonNotificationManager.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/avalon/AvalonNotificationManager.java
@@ -1,182 +1,190 @@
-//package org.eclipse.mdm.api.odsadapter.notification.avalon;
-//
-//import java.util.Arrays;
-//import java.util.HashMap;
-//import java.util.List;
-//import java.util.Map;
-//import java.util.Set;
-//import java.util.concurrent.Executors;
-//import java.util.concurrent.ScheduledExecutorService;
-//import java.util.concurrent.ScheduledFuture;
-//import java.util.concurrent.TimeUnit;
-//import java.util.stream.Collectors;
-//
-//import org.asam.ods.T_LONGLONG;
-//import org.eclipse.mdm.api.base.adapter.EntityType;
-//import org.eclipse.mdm.api.base.model.ContextComponent;
-//import org.eclipse.mdm.api.base.model.ContextDescribable;
-//import org.eclipse.mdm.api.base.model.ContextRoot;
-//import org.eclipse.mdm.api.base.model.User;
-//import org.eclipse.mdm.api.base.notification.NotificationException;
-//import org.eclipse.mdm.api.base.notification.NotificationFilter;
-//import org.eclipse.mdm.api.base.notification.NotificationFilter.ModificationType;
-//import org.eclipse.mdm.api.base.notification.NotificationListener;
-//import org.eclipse.mdm.api.base.notification.NotificationService;
-//import org.eclipse.mdm.api.base.query.DataAccessException;
-//import org.eclipse.mdm.api.base.query.QueryService;
-//import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfig.Key;
-//import org.eclipse.mdm.api.odsadapter.notification.NotificationEntityLoader;
-//import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
-//import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
-//import org.omg.CORBA.ORB;
-//import org.slf4j.Logger;
-//import org.slf4j.LoggerFactory;
-//
-//import com.highqsoft.avalonCorbaNotification.notification.MODE_DELETE;
-//import com.highqsoft.avalonCorbaNotification.notification.MODE_INSERT;
-//import com.highqsoft.avalonCorbaNotification.notification.MODE_MODIFYRIGHTS;
-//import com.highqsoft.avalonCorbaNotification.notification.MODE_REPLACE;
-//
-///**
-// * Notification manager for handling notifications from the Avalon Notification
-// * Service
-// *
-// * ModificationType.MODEL_MODIFIED is not supported!
-// *
-// * @since 1.0.0
-// * @author Matthias Koller, Peak Solution GmbH
-// *
-// */
-//public class AvalonNotificationManager implements NotificationService {
-//
-// private static final Logger LOGGER = LoggerFactory.getLogger(AvalonNotificationManager.class);
-//
-// private final Map<String, EventProcessor> eventProcessors = new HashMap<>();
-//
-// private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
-//
-// private final ODSModelManager modelManager;
-// private final String serviceName;
-// private final String nameServiceURL;
-// private long pollingInterval = 500L;
-// private final NotificationEntityLoader loader;
-//
-// private final ORB orb = ORB.init(new String[] {}, System.getProperties());
-//
-// /**
-// * Creates a new AvalonNotificationManager.
-// *
-// * @param modelManager
-// * ODSModelManager used to laod entities.
-// * @param serviceName
-// * name of the notification service.
-// * @param nameServiceURL
-// * URL of the name service.
-// * @param loadContextDescribable
-// * if true, notifications for {@link ContextRoot} and
-// * {@link ContextComponent} will load their parent
-// * {@link ContextDescribable}.
-// * @param pollingInterval
-// * polling interval in milleseconds
-// */
-// public AvalonNotificationManager(ODSModelManager modelManager, QueryService queryService, String serviceName, String nameServiceURL,
-// boolean loadContextDescribable, long pollingInterval) {
-// this.modelManager = modelManager;
-// this.serviceName = serviceName;
-// this.nameServiceURL = nameServiceURL;
-// this.pollingInterval = pollingInterval;
-// loader = new NotificationEntityLoader(modelManager, queryService, loadContextDescribable);
-// }
-//
-// @Override
-// public void register(String registration, NotificationFilter filter, final NotificationListener listener)
-// throws NotificationException {
-// try {
-// EventProcessor consumer = new EventProcessor(orb, listener, this, nameServiceURL, serviceName);
-//
-// List<String> aids = filter.getEntityTypes().stream().map(e -> e.getId()).collect(Collectors.toList());
-//
-// Set<ModificationType> modes = filter.getTypes().stream()
-// .filter(m -> !ModificationType.MODEL_MODIFIED.equals(m)).collect(Collectors.toSet());
-//
-// consumer.connect();
-// consumer.setFilter(aids, modes);
-//
-// ScheduledFuture<?> future = executor.scheduleAtFixedRate(consumer, 0, pollingInterval,
-// TimeUnit.MILLISECONDS);
-// consumer.setFuture(future);
-//
-// eventProcessors.put(registration, consumer);
-// } catch (Exception e) {
-// throw new NotificationException("Exception creating notification listener registration!", e);
-// }
-// }
-//
-// @Override
-// public void deregister(String registration) {
-// EventProcessor processor = eventProcessors.get(registration);
-// if (processor != null) {
-// processor.disconnect();
-// eventProcessors.remove(registration);
-// }
-// }
-//
-// @Override
-// public void close(boolean isDeregisterAll) throws NotificationException {
-// LOGGER.info("Closing NotificationManager...");
-//
-// for (String registration : eventProcessors.keySet()) {
-// LOGGER.debug("Disconnecting registration '" + registration + "'.");
-// deregister(registration);
-// }
-//
-// try {
-// executor.shutdown();
-// boolean terminated = executor.awaitTermination(10, TimeUnit.SECONDS);
-// if (!terminated) {
-// throw new NotificationException("Could not close all registrations!");
-// }
-// } catch (InterruptedException e) {
-// throw new NotificationException("Could not close all registrations!", e);
-// }
-// }
-//
-// void processException(Exception e) {
-// LOGGER.error("Exception during notification processing!", e);
-// }
-//
-// void processNotification(short mode, T_LONGLONG aeId, T_LONGLONG ieId, T_LONGLONG userId, String timestamp,
-// NotificationListener notificationListener) {
-//
-// try {
-// User user = loader.load(new Key<>(User.class), Long.toString(ODSConverter.fromODSLong(userId)));
-// LOGGER.debug("User loaded");
-//
-// EntityType entityType = modelManager.getEntityTypeById(Long.toString(ODSConverter.fromODSLong(aeId)));
-// List<String> ids = Arrays.asList(Long.toString(ODSConverter.fromODSLong(ieId)));
-//
-// if (LOGGER.isTraceEnabled()) {
-// LOGGER.trace("Notification event with: entityType=" + entityType + ", user=" + user);
-// }
-//
-// switch (mode) {
-// case MODE_INSERT.value:
-// notificationListener.instanceCreated(loader.loadEntities(entityType, ids), user);
-// break;
-// case MODE_REPLACE.value:
-// notificationListener.instanceModified(loader.loadEntities(entityType, ids), user);
-// break;
-// case MODE_DELETE.value:
-// notificationListener.instanceDeleted(entityType, ids, user);
-// break;
-// case MODE_MODIFYRIGHTS.value:
-// notificationListener.securityModified(entityType, ids, user);
-// break;
-// default:
-// processException(new NotificationException("Invalid notification type!"));
-// }
-// } catch (DataAccessException e) {
-// processException(new NotificationException("Cannot load data for notification!", e));
-// }
-// }
-//}
+/*
+ * Copyright (c) 2017-2018 Peak Solution GmbH and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.eclipse.mdm.api.odsadapter.notification.avalon;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+import org.asam.ods.T_LONGLONG;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.model.ContextComponent;
+import org.eclipse.mdm.api.base.model.ContextDescribable;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.User;
+import org.eclipse.mdm.api.base.notification.NotificationException;
+import org.eclipse.mdm.api.base.notification.NotificationFilter;
+import org.eclipse.mdm.api.base.notification.NotificationFilter.ModificationType;
+import org.eclipse.mdm.api.base.notification.NotificationListener;
+import org.eclipse.mdm.api.base.notification.NotificationService;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.QueryService;
+import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfig.Key;
+import org.eclipse.mdm.api.odsadapter.notification.NotificationEntityLoader;
+import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
+import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
+import org.omg.CORBA.ORB;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.highqsoft.avalonCorbaNotification.notification.MODE_DELETE;
+import com.highqsoft.avalonCorbaNotification.notification.MODE_INSERT;
+import com.highqsoft.avalonCorbaNotification.notification.MODE_MODIFYRIGHTS;
+import com.highqsoft.avalonCorbaNotification.notification.MODE_REPLACE;
+
+/**
+ * Notification manager for handling notifications from the Avalon Notification
+ * Service
+ *
+ * ModificationType.MODEL_MODIFIED is not supported!
+ *
+ * @since 1.0.0
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+public class AvalonNotificationManager implements NotificationService {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(AvalonNotificationManager.class);
+
+ private final Map<String, EventProcessor> eventProcessors = new HashMap<>();
+
+ private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
+
+ private final ODSModelManager modelManager;
+ private final String serviceName;
+ private final String nameServiceURL;
+ private long pollingInterval = 500L;
+ private final NotificationEntityLoader loader;
+
+ private final ORB orb = ORB.init(new String[] {}, System.getProperties());
+
+ /**
+ * Creates a new AvalonNotificationManager.
+ *
+ * @param modelManager
+ * ODSModelManager used to laod entities.
+ * @param serviceName
+ * name of the notification service.
+ * @param nameServiceURL
+ * URL of the name service.
+ * @param loadContextDescribable
+ * if true, notifications for {@link ContextRoot} and
+ * {@link ContextComponent} will load their parent
+ * {@link ContextDescribable}.
+ * @param pollingInterval
+ * polling interval in milleseconds
+ */
+ public AvalonNotificationManager(ODSModelManager modelManager, QueryService queryService, String serviceName, String nameServiceURL,
+ boolean loadContextDescribable, long pollingInterval) {
+ this.modelManager = modelManager;
+ this.serviceName = serviceName;
+ this.nameServiceURL = nameServiceURL;
+ this.pollingInterval = pollingInterval;
+ loader = new NotificationEntityLoader(modelManager, queryService, loadContextDescribable);
+ }
+
+ @Override
+ public void register(String registration, NotificationFilter filter, final NotificationListener listener)
+ throws NotificationException {
+ try {
+ EventProcessor consumer = new EventProcessor(orb, listener, this, nameServiceURL, serviceName);
+
+ List<String> aids = filter.getEntityTypes().stream().map(e -> e.getId()).collect(Collectors.toList());
+
+ Set<ModificationType> modes = filter.getTypes().stream()
+ .filter(m -> !ModificationType.MODEL_MODIFIED.equals(m)).collect(Collectors.toSet());
+
+ consumer.connect();
+ consumer.setFilter(aids, modes);
+
+ ScheduledFuture<?> future = executor.scheduleAtFixedRate(consumer, 0, pollingInterval,
+ TimeUnit.MILLISECONDS);
+ consumer.setFuture(future);
+
+ eventProcessors.put(registration, consumer);
+ } catch (Exception e) {
+ throw new NotificationException("Exception creating notification listener registration!", e);
+ }
+ }
+
+ @Override
+ public void deregister(String registration) {
+ EventProcessor processor = eventProcessors.get(registration);
+ if (processor != null) {
+ processor.disconnect();
+ eventProcessors.remove(registration);
+ }
+ }
+
+ @Override
+ public void close(boolean isDeregisterAll) throws NotificationException {
+ LOGGER.info("Closing NotificationManager...");
+
+ for (String registration : eventProcessors.keySet()) {
+ LOGGER.debug("Disconnecting registration '" + registration + "'.");
+ deregister(registration);
+ }
+
+ try {
+ executor.shutdown();
+ boolean terminated = executor.awaitTermination(10, TimeUnit.SECONDS);
+ if (!terminated) {
+ throw new NotificationException("Could not close all registrations!");
+ }
+ } catch (InterruptedException e) {
+ throw new NotificationException("Could not close all registrations!", e);
+ }
+ }
+
+ void processException(Exception e) {
+ LOGGER.error("Exception during notification processing!", e);
+ }
+
+ void processNotification(short mode, T_LONGLONG aeId, T_LONGLONG ieId, T_LONGLONG userId, String timestamp,
+ NotificationListener notificationListener) {
+
+ try {
+ User user = loader.load(new Key<>(User.class), Long.toString(ODSConverter.fromODSLong(userId)));
+ LOGGER.debug("User loaded");
+
+ EntityType entityType = modelManager.getEntityTypeById(Long.toString(ODSConverter.fromODSLong(aeId)));
+ List<String> ids = Arrays.asList(Long.toString(ODSConverter.fromODSLong(ieId)));
+
+ if (LOGGER.isTraceEnabled()) {
+ LOGGER.trace("Notification event with: entityType=" + entityType + ", user=" + user);
+ }
+
+ switch (mode) {
+ case MODE_INSERT.value:
+ notificationListener.instanceCreated(loader.loadEntities(entityType, ids), user);
+ break;
+ case MODE_REPLACE.value:
+ notificationListener.instanceModified(loader.loadEntities(entityType, ids), user);
+ break;
+ case MODE_DELETE.value:
+ notificationListener.instanceDeleted(entityType, ids, user);
+ break;
+ case MODE_MODIFYRIGHTS.value:
+ notificationListener.securityModified(entityType, ids, user);
+ break;
+ default:
+ processException(new NotificationException("Invalid notification type!"));
+ }
+ } catch (DataAccessException e) {
+ processException(new NotificationException("Cannot load data for notification!", e));
+ }
+ }
+}
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/avalon/EventProcessor.java b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/avalon/EventProcessor.java
index 32f5778..dfab460 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/avalon/EventProcessor.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/avalon/EventProcessor.java
@@ -1,270 +1,278 @@
-//package org.eclipse.mdm.api.odsadapter.notification.avalon;
-//
-//import java.util.List;
-//import java.util.Set;
-//import java.util.concurrent.ScheduledFuture;
-//import java.util.stream.Collectors;
-//
-//import org.eclipse.mdm.api.base.notification.NotificationException;
-//import org.eclipse.mdm.api.base.notification.NotificationFilter.ModificationType;
-//import org.eclipse.mdm.api.base.notification.NotificationListener;
-//import org.omg.CORBA.ORB;
-//import org.omg.CosNaming.NamingContextExt;
-//import org.omg.CosNaming.NamingContextExtHelper;
-//import org.omg.CosNotification.EventType;
-//import org.omg.CosNotification.StructuredEvent;
-//import org.omg.CosNotifyChannelAdmin.ClientType;
-//import org.omg.CosNotifyChannelAdmin.EventChannel;
-//import org.omg.CosNotifyChannelAdmin.EventChannelHelper;
-//import org.omg.CosNotifyChannelAdmin.StructuredProxyPullSupplier;
-//import org.omg.CosNotifyChannelAdmin.StructuredProxyPullSupplierHelper;
-//import org.omg.CosNotifyComm.InvalidEventType;
-//import org.omg.CosNotifyComm.StructuredPullConsumerPOA;
-//import org.omg.CosNotifyFilter.ConstraintExp;
-//import org.omg.CosNotifyFilter.Filter;
-//import org.omg.CosNotifyFilter.FilterFactory;
-//import org.slf4j.Logger;
-//import org.slf4j.LoggerFactory;
-//
-//import com.highqsoft.avalonCorbaNotification.notification.AvalonNotificationCorbaEvent;
-//import com.highqsoft.avalonCorbaNotification.notification.AvalonNotificationCorbaEventHelper;
-//
-///**
-// * Event processor responsible for receiving avalon events from the notification
-// * service and redirect them to the manager.
-// *
-// * @since 1.0.0
-// * @author Matthias Koller, Peak Solution GmbH
-// *
-// */
-//public class EventProcessor extends StructuredPullConsumerPOA implements Runnable {
-//
-// private static final Logger LOGGER = LoggerFactory.getLogger(EventProcessor.class);
-//
-// private static final String eventDomainName = "AVALON";
-//
-// private final ORB orb;
-// private final NotificationListener listener;
-// private final AvalonNotificationManager manager;
-// private final String nameserviceUrl;
-// private final String serviceName;
-//
-// private EventChannel eventChannel;
-// private StructuredProxyPullSupplier proxyPullSupplier;
-//
-// private boolean connected = false;
-//
-// private ScheduledFuture<?> future;
-//
-// /**
-// * Creates a new event processor.
-// *
-// * @param orb
-// * CORBA orb to use
-// * @param listener
-// * notification listener consuming the received events
-// * @param manager
-// * notification manager responsible for processing the events
-// * @param serviceName
-// * service name of the CORBA notification service
-// */
-// public EventProcessor(ORB orb, NotificationListener listener, AvalonNotificationManager manager,
-// String nameserviceUrl, String serviceName) {
-// this.orb = orb;
-// this.nameserviceUrl = nameserviceUrl;
-// this.listener = listener;
-// this.manager = manager;
-// this.serviceName = String.format("com/highqsoft/avalon/notification/%s.Notification", serviceName);
-// }
-//
-// /**
-// * Connect the event processor to the notification service.
-// *
-// * @throws NotificationException
-// * in case the notification service cannot be connected.
-// */
-// public synchronized void connect() throws NotificationException {
-// if (isConnected()) {
-// return;
-// }
-//
-// try {
-// NamingContextExt nc = NamingContextExtHelper.narrow(orb.string_to_object(nameserviceUrl));
-//
-// eventChannel = EventChannelHelper.narrow(nc.resolve(nc.to_name(serviceName)));
-//
-// proxyPullSupplier = StructuredProxyPullSupplierHelper.narrow(eventChannel.default_consumer_admin()
-// .obtain_notification_pull_supplier(ClientType.STRUCTURED_EVENT, new org.omg.CORBA.IntHolder()));
-//
-// proxyPullSupplier.connect_structured_pull_consumer(this._this(orb));
-// connected = true;
-// } catch (Exception e) {
-// throw new NotificationException("Cannot connect to notification service!", e);
-// }
-// }
-//
-// /**
-// * Disconnect the event processor from the notification service.
-// */
-// public synchronized void disconnect() {
-// if (isConnected()) {
-// if (future != null) {
-// future.cancel(false);
-// }
-//
-// proxyPullSupplier = null;
-//
-// eventChannel._release();
-// eventChannel = null;
-//
-// connected = false;
-// }
-// }
-//
-// /**
-// * @return true if the event processor is connected to the notification
-// * service
-// */
-// public synchronized boolean isConnected() {
-// return connected;
-// }
-//
-// /**
-// * Sets the event filter.
-// *
-// * @param aids
-// * List with application element IDs to filter for. Empty list
-// * means no all.
-// * @param modificationTypes
-// * Collection of modification types to filter for.
-// * @throws NotificationException
-// * if the filter cannot be set
-// */
-// public void setFilter(List<String> aids, Set<ModificationType> modificationTypes) throws NotificationException {
-// if (!isConnected()) {
-// throw new IllegalStateException("Cannot set filter when disconnected. Please connect first.");
-// }
-//
-// try {
-// FilterFactory filterFactory = eventChannel.default_filter_factory();
-// if (filterFactory == null) {
-// throw new NotificationException("No default filter factory found!");
-// }
-//
-// Filter filter = filterFactory.create_filter("EXTENDED_TCL");
-// filter.add_constraints(new ConstraintExp[] {
-// new ConstraintExp(getEventTypes(modificationTypes), getConstraintFilter(aids)) });
-// proxyPullSupplier.add_filter(filter);
-// } catch (Exception e) {
-// throw new NotificationException("Exception when creating filter.", e);
-// }
-// }
-//
-// /**
-// * Sets the ScheduledFuture that will be used to stop the event processor
-// * task.
-// *
-// * @param future
-// * ScheduledFuture
-// */
-// public void setFuture(ScheduledFuture<?> future) {
-// this.future = future;
-// }
-//
-// @Override
-// public synchronized void run() {
-// if (isConnected()) {
-// org.omg.CORBA.BooleanHolder bh = new org.omg.CORBA.BooleanHolder();
-//
-// try {
-// LOGGER.trace("Looking for structured events....");
-// // try to pull an event
-// StructuredEvent event = proxyPullSupplier.try_pull_structured_event(bh);
-// if (bh.value) {
-// AvalonNotificationCorbaEvent ev = AvalonNotificationCorbaEventHelper
-// .extract(event.remainder_of_body);
-// manager.processNotification(ev.mode, ev.aeId, ev.ieId, ev.userId, ev.timestamp, listener);
-// } else {
-// LOGGER.trace("No structured events found.");
-// }
-// } catch (Exception e) {
-// manager.processException(e);
-// }
-// } else {
-// LOGGER.warn("Disconnected.");
-// manager.processException(new NotificationException("Not connected"));
-// if (future != null) {
-// future.cancel(false);
-// }
-// }
-// }
-//
-// @Override
-// public void disconnect_structured_pull_consumer() {
-// LOGGER.info("Disconnected!");
-// connected = false;
-// }
-//
-// @Override
-// public void offer_change(EventType[] added, EventType[] removed) throws InvalidEventType {
-// // TODO Auto-generated method stub
-//
-// }
-//
-// /**
-// * Constructs a constraint filter.
-// *
-// * @param aids
-// * Application Element IDs used for filtering. Empty list means
-// * no filter.
-// * @return Constraint filter containing the given aids
-// */
-// private String getConstraintFilter(List<String> aids) {
-// if (aids.isEmpty()) {
-// return "TRUE";
-// } else {
-// return aids.stream().map(aid -> String.format("$.filterable_data(%s) == %s", "ApplicationElement", aid))
-// .collect(Collectors.joining(" or "));
-// }
-// }
-//
-// /**
-// * Converts ModificationTypes in EventTypes.
-// *
-// * @param modificationTypes
-// * @return Array with EventTypes
-// */
-// private EventType[] getEventTypes(Set<ModificationType> modificationTypes) {
-// if (modificationTypes.isEmpty()) {
-// return new EventType[0];
-// } else {
-// return modificationTypes.stream().map(s -> new EventType(eventDomainName, toAvalonString(s)))
-// .collect(Collectors.toList()).toArray(new EventType[0]);
-// }
-// }
-//
-// /**
-// * Converts a {@link ModificationType} enum value to a event type name for
-// * the CORBA notification service.
-// *
-// * @param t
-// * a modification type
-// * @return event type name
-// */
-// private String toAvalonString(ModificationType t) {
-// switch (t) {
-// case INSTANCE_CREATED:
-// return "INSERT";
-// case INSTANCE_MODIFIED:
-// return "REPLACE";
-// case INSTANCE_DELETED:
-// return "DELETE";
-// case SECURITY_MODIFIED:
-// return "MODIFYRIGHTS";
-// case MODEL_MODIFIED:
-// throw new IllegalArgumentException(t.name() + " not supported!");
-// default:
-// throw new IllegalArgumentException("Invalid enum value!");
-// }
-// }
-//}
+/*
+ * Copyright (c) 2017-2018 Peak Solution GmbH and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.eclipse.mdm.api.odsadapter.notification.avalon;
+
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ScheduledFuture;
+import java.util.stream.Collectors;
+
+import org.eclipse.mdm.api.base.notification.NotificationException;
+import org.eclipse.mdm.api.base.notification.NotificationFilter.ModificationType;
+import org.eclipse.mdm.api.base.notification.NotificationListener;
+import org.omg.CORBA.ORB;
+import org.omg.CosNaming.NamingContextExt;
+import org.omg.CosNaming.NamingContextExtHelper;
+import org.omg.CosNotification._EventType;
+import org.omg.CosNotification.StructuredEvent;
+import org.omg.CosNotifyChannelAdmin.ClientType;
+import org.omg.CosNotifyChannelAdmin.EventChannel;
+import org.omg.CosNotifyChannelAdmin.EventChannelHelper;
+import org.omg.CosNotifyChannelAdmin.StructuredProxyPullSupplier;
+import org.omg.CosNotifyChannelAdmin.StructuredProxyPullSupplierHelper;
+import org.omg.CosNotifyComm.InvalidEventType;
+import org.omg.CosNotifyComm.StructuredPullConsumerPOA;
+import org.omg.CosNotifyFilter.ConstraintExp;
+import org.omg.CosNotifyFilter.Filter;
+import org.omg.CosNotifyFilter.FilterFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.highqsoft.avalonCorbaNotification.notification.AvalonNotificationCorbaEvent;
+import com.highqsoft.avalonCorbaNotification.notification.AvalonNotificationCorbaEventHelper;
+
+/**
+ * Event processor responsible for receiving avalon events from the notification
+ * service and redirect them to the manager.
+ *
+ * @since 1.0.0
+ * @author Matthias Koller, Peak Solution GmbH
+ *
+ */
+public class EventProcessor extends StructuredPullConsumerPOA implements Runnable {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(EventProcessor.class);
+
+ private static final String eventDomainName = "AVALON";
+
+ private final ORB orb;
+ private final NotificationListener listener;
+ private final AvalonNotificationManager manager;
+ private final String nameserviceUrl;
+ private final String serviceName;
+
+ private EventChannel eventChannel;
+ private StructuredProxyPullSupplier proxyPullSupplier;
+
+ private boolean connected = false;
+
+ private ScheduledFuture<?> future;
+
+ /**
+ * Creates a new event processor.
+ *
+ * @param orb
+ * CORBA orb to use
+ * @param listener
+ * notification listener consuming the received events
+ * @param manager
+ * notification manager responsible for processing the events
+ * @param serviceName
+ * service name of the CORBA notification service
+ */
+ public EventProcessor(ORB orb, NotificationListener listener, AvalonNotificationManager manager,
+ String nameserviceUrl, String serviceName) {
+ this.orb = orb;
+ this.nameserviceUrl = nameserviceUrl;
+ this.listener = listener;
+ this.manager = manager;
+ this.serviceName = String.format("com/highqsoft/avalon/notification/%s.Notification", serviceName);
+ }
+
+ /**
+ * Connect the event processor to the notification service.
+ *
+ * @throws NotificationException
+ * in case the notification service cannot be connected.
+ */
+ public synchronized void connect() throws NotificationException {
+ if (isConnected()) {
+ return;
+ }
+
+ try {
+ NamingContextExt nc = NamingContextExtHelper.narrow(orb.string_to_object(nameserviceUrl));
+
+ eventChannel = EventChannelHelper.narrow(nc.resolve(nc.to_name(serviceName)));
+
+ proxyPullSupplier = StructuredProxyPullSupplierHelper.narrow(eventChannel.default_consumer_admin()
+ .obtain_notification_pull_supplier(ClientType.STRUCTURED_EVENT, new org.omg.CORBA.IntHolder()));
+
+ proxyPullSupplier.connect_structured_pull_consumer(this._this(orb));
+ connected = true;
+ } catch (Exception e) {
+ throw new NotificationException("Cannot connect to notification service!", e);
+ }
+ }
+
+ /**
+ * Disconnect the event processor from the notification service.
+ */
+ public synchronized void disconnect() {
+ if (isConnected()) {
+ if (future != null) {
+ future.cancel(false);
+ }
+
+ proxyPullSupplier = null;
+
+ eventChannel._release();
+ eventChannel = null;
+
+ connected = false;
+ }
+ }
+
+ /**
+ * @return true if the event processor is connected to the notification
+ * service
+ */
+ public synchronized boolean isConnected() {
+ return connected;
+ }
+
+ /**
+ * Sets the event filter.
+ *
+ * @param aids
+ * List with application element IDs to filter for. Empty list
+ * means no all.
+ * @param modificationTypes
+ * Collection of modification types to filter for.
+ * @throws NotificationException
+ * if the filter cannot be set
+ */
+ public void setFilter(List<String> aids, Set<ModificationType> modificationTypes) throws NotificationException {
+ if (!isConnected()) {
+ throw new IllegalStateException("Cannot set filter when disconnected. Please connect first.");
+ }
+
+ try {
+ FilterFactory filterFactory = eventChannel.default_filter_factory();
+ if (filterFactory == null) {
+ throw new NotificationException("No default filter factory found!");
+ }
+
+ Filter filter = filterFactory.create_filter("EXTENDED_TCL");
+ filter.add_constraints(new ConstraintExp[] {
+ new ConstraintExp(getEventTypes(modificationTypes), getConstraintFilter(aids)) });
+ proxyPullSupplier.add_filter(filter);
+ } catch (Exception e) {
+ throw new NotificationException("Exception when creating filter.", e);
+ }
+ }
+
+ /**
+ * Sets the ScheduledFuture that will be used to stop the event processor
+ * task.
+ *
+ * @param future
+ * ScheduledFuture
+ */
+ public void setFuture(ScheduledFuture<?> future) {
+ this.future = future;
+ }
+
+ @Override
+ public synchronized void run() {
+ if (isConnected()) {
+ org.omg.CORBA.BooleanHolder bh = new org.omg.CORBA.BooleanHolder();
+
+ try {
+ LOGGER.trace("Looking for structured events....");
+ // try to pull an event
+ StructuredEvent event = proxyPullSupplier.try_pull_structured_event(bh);
+ if (bh.value) {
+ AvalonNotificationCorbaEvent ev = AvalonNotificationCorbaEventHelper
+ .extract(event.remainder_of_body);
+ manager.processNotification(ev.mode, ev.aeId, ev.ieId, ev.userId, ev.timestamp, listener);
+ } else {
+ LOGGER.trace("No structured events found.");
+ }
+ } catch (Exception e) {
+ manager.processException(e);
+ }
+ } else {
+ LOGGER.warn("Disconnected.");
+ manager.processException(new NotificationException("Not connected"));
+ if (future != null) {
+ future.cancel(false);
+ }
+ }
+ }
+
+ @Override
+ public void disconnect_structured_pull_consumer() {
+ LOGGER.info("Disconnected!");
+ connected = false;
+ }
+
+ @Override
+ public void offer_change(_EventType[] added, _EventType[] removed) throws InvalidEventType {
+ // TODO Auto-generated method stub
+
+ }
+
+ /**
+ * Constructs a constraint filter.
+ *
+ * @param aids
+ * Application Element IDs used for filtering. Empty list means
+ * no filter.
+ * @return Constraint filter containing the given aids
+ */
+ private String getConstraintFilter(List<String> aids) {
+ if (aids.isEmpty()) {
+ return "TRUE";
+ } else {
+ return aids.stream().map(aid -> String.format("$.filterable_data(%s) == %s", "ApplicationElement", aid))
+ .collect(Collectors.joining(" or "));
+ }
+ }
+
+ /**
+ * Converts ModificationTypes in EventTypes.
+ *
+ * @param modificationTypes
+ * @return Array with EventTypes
+ */
+ private _EventType[] getEventTypes(Set<ModificationType> modificationTypes) {
+ if (modificationTypes.isEmpty()) {
+ return new _EventType[0];
+ } else {
+ return modificationTypes.stream().map(s -> new _EventType(eventDomainName, toAvalonString(s)))
+ .collect(Collectors.toList()).toArray(new _EventType[0]);
+ }
+ }
+
+ /**
+ * Converts a {@link ModificationType} enum value to a event type name for
+ * the CORBA notification service.
+ *
+ * @param t
+ * a modification type
+ * @return event type name
+ */
+ private String toAvalonString(ModificationType t) {
+ switch (t) {
+ case INSTANCE_CREATED:
+ return "INSERT";
+ case INSTANCE_MODIFIED:
+ return "REPLACE";
+ case INSTANCE_DELETED:
+ return "DELETE";
+ case SECURITY_MODIFIED:
+ return "MODIFYRIGHTS";
+ case MODEL_MODIFIED:
+ throw new IllegalArgumentException(t.name() + " not supported!");
+ default:
+ throw new IllegalArgumentException("Invalid enum value!");
+ }
+ }
+}
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/EventProcessor.java b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/EventProcessor.java
index 7d578a2..d750a78 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/EventProcessor.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/EventProcessor.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2017-2018 Peak Solution GmbH and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter.notification.peak;
import javax.ws.rs.ProcessingException;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/JsonMessageBodyProvider.java b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/JsonMessageBodyProvider.java
index 342f3c9..fddb72e 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/JsonMessageBodyProvider.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/JsonMessageBodyProvider.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2017-2018 Peak Solution GmbH and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter.notification.peak;
import java.io.IOException;
@@ -19,7 +27,7 @@
import javax.ws.rs.ext.Provider;
import com.google.common.base.Charsets;
-import com.google.protobuf.GeneratedMessage;
+import com.google.protobuf.GeneratedMessageV3;
import com.google.protobuf.Message;
import com.google.protobuf.util.JsonFormat;
import com.google.protobuf.util.JsonFormat.Parser;
@@ -36,14 +44,11 @@
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class JsonMessageBodyProvider implements MessageBodyReader<Message>, MessageBodyWriter<Message> {
+
private static final Charset charset = Charsets.UTF_8;
private Printer jsonPrinter = JsonFormat.printer();
private Parser jsonParser = JsonFormat.parser();
- public JsonMessageBodyProvider() {
-
- }
-
@Override
public boolean isReadable(final Class<?> type, final Type genericType, final Annotation[] annotations,
final MediaType mediaType) {
@@ -56,7 +61,7 @@
throws IOException {
try {
final Method newBuilder = type.getMethod("newBuilder");
- final GeneratedMessage.Builder<?> builder = (GeneratedMessage.Builder<?>) newBuilder.invoke(type);
+ final GeneratedMessageV3.Builder<?> builder = (GeneratedMessageV3.Builder<?>) newBuilder.invoke(type);
jsonParser.merge(new InputStreamReader(entityStream, charset), builder);
return builder.build();
} catch (Exception e) {
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/PeakNotificationManager.java b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/PeakNotificationManager.java
index 42ec47c..b4d45e7 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/PeakNotificationManager.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/PeakNotificationManager.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2017-2018 Peak Solution GmbH and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter.notification.peak;
import java.util.HashMap;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/ProtobufConverter.java b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/ProtobufConverter.java
index 73a35dd..e70c5b0 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/ProtobufConverter.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/notification/peak/ProtobufConverter.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2017-2018 Peak Solution GmbH and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter.notification.peak;
import java.util.stream.Collectors;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/query/ODSQueryService.java b/src/main/java/org/eclipse/mdm/api/odsadapter/query/ODSQueryService.java
index 9e3a607..343d5a1 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/query/ODSQueryService.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/query/ODSQueryService.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2017-2018 Peak Solution GmbH and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter.query;
import org.eclipse.mdm.api.base.query.Query;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/search/JoinTree.java b/src/main/java/org/eclipse/mdm/api/odsadapter/search/JoinTree.java
index 1918b80..26ef9dd 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/search/JoinTree.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/search/JoinTree.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt GmbH and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter.search;
import java.util.ArrayList;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/UploadService.java b/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/UploadService.java
index ebb9880..88c21bd 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/UploadService.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/UploadService.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt GmbH and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter.transaction;
import java.io.IOException;
diff --git a/src/test/java/org/eclipse/mdm/api/odsadapter/ODSAdapterTest.java b/src/test/java/org/eclipse/mdm/api/odsadapter/ODSAdapterTest.java
index 9d7790d..26a78d7 100644
--- a/src/test/java/org/eclipse/mdm/api/odsadapter/ODSAdapterTest.java
+++ b/src/test/java/org/eclipse/mdm/api/odsadapter/ODSAdapterTest.java
@@ -1,3 +1,11 @@
+/*
+ * Copyright (c) 2016-2018 Gigatronik Ingolstadt GmbH and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+
package org.eclipse.mdm.api.odsadapter;
import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_NAMESERVICE;
diff --git a/src/test/java/org/eclipse/mdm/api/odsadapter/notification/peak/PeakNotificationTest.java b/src/test/java/org/eclipse/mdm/api/odsadapter/notification/peak/PeakNotificationTest.java
index bb33a12..e04ad72 100644
--- a/src/test/java/org/eclipse/mdm/api/odsadapter/notification/peak/PeakNotificationTest.java
+++ b/src/test/java/org/eclipse/mdm/api/odsadapter/notification/peak/PeakNotificationTest.java
@@ -1,3 +1,10 @@
+/*
+ * Copyright (c) 2017-2018 Peak Solution GmbH and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
package org.eclipse.mdm.api.odsadapter.notification.peak;
import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_NAMESERVICE;
diff --git a/src/test/java/org/eclipse/mdm/api/odsadapter/search/ODSFreeTextSearchTest.java b/src/test/java/org/eclipse/mdm/api/odsadapter/search/ODSFreeTextSearchTest.java
index eb99de7..bdad55b 100644
--- a/src/test/java/org/eclipse/mdm/api/odsadapter/search/ODSFreeTextSearchTest.java
+++ b/src/test/java/org/eclipse/mdm/api/odsadapter/search/ODSFreeTextSearchTest.java
@@ -1,3 +1,10 @@
+/*
+ * Copyright (c) 2017-2018 Peak Solution GmbH and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
package org.eclipse.mdm.api.odsadapter.search;
import static org.junit.Assert.assertEquals;
diff --git a/src/test/java/org/eclipse/mdm/api/odsadapter/search/ODSSearchServiceTest.java b/src/test/java/org/eclipse/mdm/api/odsadapter/search/ODSSearchServiceTest.java
index b1228fa..f201b1e 100644
--- a/src/test/java/org/eclipse/mdm/api/odsadapter/search/ODSSearchServiceTest.java
+++ b/src/test/java/org/eclipse/mdm/api/odsadapter/search/ODSSearchServiceTest.java
@@ -1,3 +1,10 @@
+/*
+ * Copyright (c) 2017-2018 Peak Solution GmbH and others
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
package org.eclipse.mdm.api.odsadapter.search;
import static org.assertj.core.api.Assertions.assertThat;