Git Product home page Git Product logo

fiware-cepheus's Introduction

FIWARE Cepheus

Build Status Coverity Scan Status Coverage Status Docs Status Docker Pulls Support badge GNU GPL Version 2 Licence Join the chat at https://gitter.im/Orange-OpenSource/fiware-cepheus

This is the code repository for the Fiware-Cepheus project.

This project was part of FIWARE under the IoT Data Edge Consolidation GE project.

Status

The current project is in maintenance mode: This means that no new features will be added, nor issues fixed by the original team.

Feel free however to fork the project and contribute issues and pull requests if you feel the community can benefit of your work. We will gladely review changes and merge any viable contributions.

Overall description

Fiware-Cepheus provides NGSI-compatible gateway level components. This project contains two Spring Boot applications:

  • cepheus-cep: A CEP (Complex Event Processor) engine.
  • cepheus-broker: A light broker (NGSI forwarding-only).

NGSI v1 implementation is provided by the Orange-OpenSource/fiware-ngsi-api library.

Renaming

The previous name of the project was "EspR4FastData". It was renamed to a more generic name (using the convention of other FIWARE Generic Enablers).

Quick instructions

You can find the complete build and installation instructions for each components in the administrator guide here.

Requirements

  • JAVA 8
  • Maven 2 (for build)
  • OS/CPU supported by Sqlite-JDBC (for cepheus-broker)

Build via Maven

git clone https://github.com/Orange-OpenSource/fiware-cepheus.git
cd fiware-cepheus
mvn clean install

Installing from Docker

Using Docker is the fastest way to have a working setup :

docker pull orangeopensource/fiware-cepheus

Our docker manual can be found here

Installing from Debian packaging

Using mvn install will create two debian packages: cepheus-cep-{version}.deb and cepeheus-lb-{version}.deb. Then you can install these packages lauching :

dpkg -i cepheus-cep-{version}.deb
dpkg -i cepheus-broker-{version}.deb

Running

The project provides two SpringBoot applications. You can run them simply with:

java -jar cepheus-cep.jar
java -jar cepheus-broker.jar

Documentation

The user & programming guide can be found under the /doc folder. It is also available though readthedocs.org: User guide

The administrator manual can be found under the /doc/admin folder. It is also available though readthedocs.org: Administrator manual

Examples

Some simple examples to learn how to use Cepheus-CEP and Cepheus-Broker can be found under the doc/examples folder.

LinkSprite-NGSI Sample

An example to use a Raspberry Pi with LinkSprite sensors and actuators communicating with Cepheus can be found here

License

FIWARE Cepheus is licensed under the GNU General Public License Version 2.

Support

Use the issue tracker of this project for any issues or questions related to the project.

fiware-cepheus's People

Contributors

adeeb-khan avatar chazemar avatar flaviops avatar fsuc avatar iamarnavgarg avatar iaoiui avatar laurent-bury avatar marcc-orange avatar pascaleborscia avatar pooja1pathak avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fiware-cepheus's Issues

Cepheus-CEP multitenancy issue for multiple subscription

I have enabled the multi-tenant profile from application.properties:
spring.profiles.active=multi-tenant

and then uploaded config file as:

POST cepheus:8080/v1/admin/config
Fiware-Service: testservice
Fiware-ServicePath: /testservicepath

{
  "host":"http://localhost:8080",
  "in":[
      ...
      "providers":[
      	{ 
          "url":"http://localhost:1026",
          "serviceName": "testprovider",
          "servicePath": "/test"
        }
      ],
      ...
   ]
  "out":[
      ...
      "brokers":[
        {
          "url":"http://localhost:1026",
          "serviceName": "testbroker",
          "servicePath": "/test"
        }
      ]
   ]
}

A JSON file having name cep-testservice-testservicepath is created as a result of the above request.

Then I uploaded another config file as:

POST cepheus:8080/v1/admin/config
Fiware-Service: testservicenew
Fiware-ServicePath: /testservicepathnew

{
  "host":"http://localhost:8080",
  "in":[
      ...
      "providers":[
      	{ 
          "url":"http://localhost:1026",
          "serviceName": "testprovidernew",
          "servicePath": "/testnew"
        }
      ],
      ...
   ]
  "out":[
      ...
      "brokers":[
        {
          "url":"http://localhost:1026",
          "serviceName": "testbrokernew",
          "servicePath": "/testnew"
        }
      ]
   ]
}

A JSON file having name cep-testservicenew-testservicepathnew is created as a result of the above request.

As per my understanding of multi-tenant Cepheu-CEP, it should store both configuration file and subscriptions.

But according to my observation, Cepheus-CEP stores both the configuration file but does not stores both subscription. It handles only one subscription at a time.
Whenever new configuration is uploaded to Cepheus-CEP, it first unsubscribes the previous subscription from orion and then subscribe orion with the new configuration. Which can be seen in the below logs:

2018-10-17 11:58:44.946  INFO 20984 --- [nio-8080-exec-5] c.o.cepheus.cep.EsperEventProcessor      : Apply configuration
2018-10-17 11:58:44.947  INFO 20984 --- [nio-8080-exec-5] c.o.cepheus.cep.EsperEventProcessor      : Add new event type: EventType{id='Test1', type='Test', isPattern=false, attributes=[Attribute{name='CO2Level', type='int', metadata=[], jsonpath='null'}]}
2018-10-17 11:58:44.947  INFO 20984 --- [nio-8080-exec-5] c.o.cepheus.cep.EsperEventProcessor      : Add new event type: EventType{id='Test1', type='Alert', isPattern=false, attributes=[Attribute{name='CO2Level', type='int', metadata=[], jsonpath='null'}]}
2018-10-17 11:58:44.947  INFO 20984 --- [nio-8080-exec-5] c.o.cepheus.cep.EsperEventProcessor      : Add new statement: INSERT INTO Alert SELECT * FROM Test WHERE CO2Level > 20
2018-10-17 11:58:44.947 DEBUG 20984 --- [nio-8080-exec-5] c.e.e.c.service.EPAdministratorHelper    : .createEPLStmt statementName=null eplStatement=INSERT INTO Alert SELECT * FROM Test WHERE CO2Level > 20
2018-10-17 11:58:44.947 DEBUG 20984 --- [nio-8080-exec-5] c.espertech.esper.epl.parse.ParseHelper  : .parse Parsing expr=INSERT INTO Alert SELECT * FROM Test WHERE CO2Level > 20
2018-10-17 11:58:44.948 DEBUG 20984 --- [nio-8080-exec-5] c.e.esper.epl.parse.Antlr4ErrorListener  : reportAttemptingFullContext
2018-10-17 11:58:44.949 DEBUG 20984 --- [nio-8080-exec-5] c.e.esper.epl.parse.Antlr4ErrorListener  : reportAmbiguity
2018-10-17 11:58:44.949 DEBUG 20984 --- [nio-8080-exec-5] c.espertech.esper.epl.parse.ParseHelper  : .parse Dumping AST...
2018-10-17 11:58:44.950 DEBUG 20984 --- [nio-8080-exec-5] c.espertech.esper.epl.parse.ParseHelper  : .walk Walking AST using walker com.espertech.esper.epl.parse.EPLTreeWalkerListener
2018-10-17 11:58:44.950 DEBUG 20984 --- [nio-8080-exec-5] c.e.e.c.s.StatementResultServiceImpl     : .ctor
2018-10-17 11:58:44.950 DEBUG 20984 --- [nio-8080-exec-5] c.e.esper.filter.FilterSpecCompiler      : .makeFilterSpec spec=FilterSpecCompiled type=com.espertech.esper.event.map.MapEventType@f944f4b parameters=[[Lcom.espertech.esper.filter.FilterSpecParam;@14a4a5]
2018-10-17 11:58:44.950 DEBUG 20984 --- [nio-8080-exec-5] c.e.e.c.s.StatementLifecycleSvcImpl      : .start Starting statement 6d5018bb-725d-4bf4-a644-839c6cce0042 from desc=com.espertech.esper.core.service.StatementLifecycleSvcImpl$EPStatementDesc@728b97be
2018-10-17 11:58:44.950 DEBUG 20984 --- [nio-8080-exec-5] c.e.e.c.s.StatementLifecycleSvcImpl      : .startInternal Starting statement 6d5018bb-725d-4bf4-a644-839c6cce0042 from desc=com.espertech.esper.core.service.StatementLifecycleSvcImpl$EPStatementDesc@728b97be
2018-10-17 11:58:44.950 DEBUG 20984 --- [nio-8080-exec-5] c.e.esper.view.ViewServiceHelper         : .addMergeViews Incoming specifications=[]
2018-10-17 11:58:44.950 DEBUG 20984 --- [nio-8080-exec-5] c.e.esper.view.ViewServiceHelper         : .addMergeViews Outgoing specifications=[]
2018-10-17 11:58:44.950 DEBUG 20984 --- [nio-8080-exec-5] c.e.e.e.c.OrderByProcessorFactoryFactory : .getProcessor Using no OrderByProcessor
2018-10-17 11:58:44.950 DEBUG 20984 --- [nio-8080-exec-5] e.e.e.c.ResultSetProcessorFactoryFactory : .getProcessor Using no result processor
2018-10-17 11:58:44.950 DEBUG 20984 --- [nio-8080-exec-5] c.e.e.view.stream.StreamFactorySvcImpl   : .createStream hashCode=-1539986878 filter=FilterSpecCompiled type=com.espertech.esper.event.map.MapEventType@f944f4b parameters=[[Lcom.espertech.esper.filter.FilterSpecParam;@14a4a5]
2018-10-17 11:58:44.951 DEBUG 20984 --- [nio-8080-exec-5] c.espertech.esper.view.ViewServiceImpl   : .createView No new views created, dumping stream ... com.espertech.esper.view.ZeroDepthStreamNoIterate@379a44
2018-10-17 11:58:44.951 DEBUG 20984 --- [nio-8080-exec-5] c.e.e.core.service.EPAdministratorImpl   : .createEPLStmt Statement created and started
2018-10-17 11:58:44.951 DEBUG 20984 --- [nio-8080-exec-5] c.e.e.c.s.StatementLifecycleSvcImpl      : .updatedListeners No action for base implementation
2018-10-17 11:58:44.951 DEBUG 20984 --- [nio-8080-exec-5] c.o.cepheus.cep.SubscriptionManager      : Unsubscribe from http://<orion>:1026 for 5bc6d5b2b2b093eb19f1aeef
2018-10-17 11:58:44.951 DEBUG 20984 --- [nio-8080-exec-5] o.s.web.client.AsyncRestTemplate         : Created asynchronous POST request for "http://<orion>:1026/ngsi10/unsubscribeContext"
2018-10-17 11:58:44.951 DEBUG 20984 --- [nio-8080-exec-5] o.s.web.client.RestTemplate              : Setting request Accept header to [application/xml, text/xml, application/json, application/*+xml, application/*+json]
2018-10-17 11:58:44.951 DEBUG 20984 --- [nio-8080-exec-5] o.s.web.client.RestTemplate              : Writing [com.orange.ngsi.model.UnsubscribeContext@2e2fdb9b] as "application/json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@1027cbcc]
2018-10-17 11:58:44.952 DEBUG 20984 --- [nio-8080-exec-5] o.a.http.impl.nio.client.MainClientExec  : [exchange: 9] start execution
2018-10-17 11:58:44.952 DEBUG 20984 --- [nio-8080-exec-5] o.a.h.client.protocol.RequestAddCookies  : CookieSpec selected: default
2018-10-17 11:58:44.952 DEBUG 20984 --- [nio-8080-exec-5] o.a.h.client.protocol.RequestAuthCache   : Auth cache not set in the context
2018-10-17 11:58:44.952 DEBUG 20984 --- [nio-8080-exec-5] o.a.h.i.n.c.InternalHttpAsyncClient      : [exchange: 9] Request connection for {}->http://<orion>:1026
2018-10-17 11:58:44.952 DEBUG 20984 --- [nio-8080-exec-5] .n.c.PoolingNHttpClientConnectionManager : Connection request: [route: {}->http://<orion>:1026][total kept alive: 1; route allocated: 1 of 2; total allocated: 1 of 20]
2018-10-17 11:58:44.952 DEBUG 20984 --- [nio-8080-exec-5] h.i.n.c.ManagedNHttpClientConnectionImpl : http-outgoing-0 <cep>:62454<-><orion>:1026[ACTIVE][r:r]: Set timeout 0
2018-10-17 11:58:44.952 DEBUG 20984 --- [nio-8080-exec-5] .n.c.PoolingNHttpClientConnectionManager : Connection leased: [id: http-outgoing-0][route: {}->http://<orion>:1026][total kept alive: 0; route allocated: 1 of 2; total allocated: 1 of 20]
2018-10-17 11:58:44.952 DEBUG 20984 --- [nio-8080-exec-5] o.a.h.i.n.c.InternalHttpAsyncClient      : [exchange: 9] Connection allocated: CPoolProxy{http-outgoing-0 [ACTIVE]}
2018-10-17 11:58:44.952 DEBUG 20984 --- [nio-8080-exec-5] h.i.n.c.ManagedNHttpClientConnectionImpl : http-outgoing-0 <orion>:62454<-><orion>:1026[ACTIVE][r:r]: Set attribute http.nio.exchange-handler
2018-10-17 11:58:44.952 DEBUG 20984 --- [/O dispatcher 1] o.a.h.i.nio.client.InternalIODispatch    : http-outgoing-0 [ACTIVE] Request ready
2018-10-17 11:58:44.952 DEBUG 20984 --- [/O dispatcher 1] o.a.h.i.n.c.InternalHttpAsyncClient      : Connection route already established
2018-10-17 11:58:44.952 DEBUG 20984 --- [/O dispatcher 1] o.a.http.impl.nio.client.MainClientExec  : [exchange: 9] Attempt 1 to execute request
2018-10-17 11:58:44.952 DEBUG 20984 --- [/O dispatcher 1] o.a.http.impl.nio.client.MainClientExec  : Target auth state: UNCHALLENGED
2018-10-17 11:58:44.952 DEBUG 20984 --- [/O dispatcher 1] o.a.http.impl.nio.client.MainClientExec  : Proxy auth state: UNCHALLENGED
2018-10-17 11:58:44.952 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.headers                  : http-outgoing-0 >> POST /ngsi10/unsubscribeContext HTTP/1.1
2018-10-17 11:58:44.952 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.headers                  : http-outgoing-0 >> Accept: application/json
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.headers                  : http-outgoing-0 >> Content-Type: application/json
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.headers                  : http-outgoing-0 >> Fiware-Service: testprovider
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.headers                  : http-outgoing-0 >> Fiware-ServicePath: /test
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.headers                  : http-outgoing-0 >> Content-Length: 45
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.headers                  : http-outgoing-0 >> Host: <orion>:1026
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.headers                  : http-outgoing-0 >> Connection: Keep-Alive
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.headers                  : http-outgoing-0 >> User-Agent: Apache-HttpAsyncClient/4.1 (Java/1.8.0_181)
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] h.i.n.c.ManagedNHttpClientConnectionImpl : http-outgoing-0 <cep>:62454<-><orion>:1026[ACTIVE][rw:w]: Event set [w]
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] o.a.h.i.nio.client.InternalIODispatch    : http-outgoing-0 [ACTIVE] Output ready
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] o.a.http.impl.nio.client.MainClientExec  : [exchange: 9] produce content
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] o.a.http.impl.nio.client.MainClientExec  : [exchange: 9] Request completed
2018-10-17 11:58:44.953 DEBUG 20984 --- [nio-8080-exec-5] h.i.n.c.ManagedNHttpClientConnectionImpl : http-outgoing-0 <cep>:62454<-><orion>:1026[ACTIVE][rw:w]: Event set [w]
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] o.a.h.i.nio.client.InternalIODispatch    : http-outgoing-0 [ACTIVE] [content length: 45; pos: 45; completed: true]
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] h.i.n.c.ManagedNHttpClientConnectionImpl : http-outgoing-0 <cep>:62454<-><orion>:1026[ACTIVE][rw:w]: 331 bytes written
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.wire                     : http-outgoing-0 >> "POST /ngsi10/unsubscribeContext HTTP/1.1[\r][\n]"
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.wire                     : http-outgoing-0 >> "Accept: application/json[\r][\n]"
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.wire                     : http-outgoing-0 >> "Content-Type: application/json[\r][\n]"
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.wire                     : http-outgoing-0 >> "Fiware-Service: testprovider[\r][\n]"
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.wire                     : http-outgoing-0 >> "Fiware-ServicePath: /test[\r][\n]"
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.wire                     : http-outgoing-0 >> "Content-Length: 45[\r][\n]"
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.wire                     : http-outgoing-0 >> "Host: <orion>:1026[\r][\n]"
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.wire                     : http-outgoing-0 >> "Connection: Keep-Alive[\r][\n]"
2018-10-17 11:58:44.953 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.wire                     : http-outgoing-0 >> "User-Agent: Apache-HttpAsyncClient/4.1 (Java/1.8.0_181)[\r][\n]"
2018-10-17 11:58:44.953  INFO 20984 --- [nio-8080-exec-5] c.o.c.cep.persistence.JsonPersistence    : Save configuration in C:\Users\<user>\AppData\Local\Temp\/cep-testservicenew-testservicepathnew.json
2018-10-17 11:58:44.953  INFO 20984 --- [taskScheduler-1] c.o.cepheus.cep.SubscriptionManager      : Launch of the periodic subscription task at 2018-10-17T06:28:44.953Z
2018-10-17 11:58:44.954 DEBUG 20984 --- [taskScheduler-1] c.o.cepheus.cep.SubscriptionManager      : Subscribe to http://<orion>:1026 for SubscribeContext{entityIdList=[EntityId{id='Test1', type='Test', isPattern=false}], attributeList=[CO2Level]}
2018-10-17 11:58:44.954 DEBUG 20984 --- [taskScheduler-1] o.s.web.client.AsyncRestTemplate         : Created asynchronous POST request for "http://<orion>:1026/ngsi10/subscribeContext"
2018-10-17 11:58:44.955 DEBUG 20984 --- [taskScheduler-1] o.s.web.client.RestTemplate              : Setting request Accept header to [application/xml, text/xml, application/json, application/*+xml, application/*+json]
2018-10-17 11:58:44.955 DEBUG 20984 --- [taskScheduler-1] o.s.web.client.RestTemplate              : Writing [SubscribeContext{entityIdList=[EntityId{id='Test1', type='Test', isPattern=false}], attributeList=[CO2Level]}] as "application/json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@1027cbcc]
2018-10-17 11:58:44.955 DEBUG 20984 --- [taskScheduler-1] o.a.http.impl.nio.client.MainClientExec  : [exchange: 10] start execution
2018-10-17 11:58:44.955 DEBUG 20984 --- [taskScheduler-1] o.a.h.client.protocol.RequestAddCookies  : CookieSpec selected: default
2018-10-17 11:58:44.955 DEBUG 20984 --- [taskScheduler-1] o.a.h.client.protocol.RequestAuthCache   : Auth cache not set in the context
2018-10-17 11:58:44.955 DEBUG 20984 --- [taskScheduler-1] o.a.h.i.n.c.InternalHttpAsyncClient      : [exchange: 10] Request connection for {}->http://<orion>:1026
2018-10-17 11:58:44.955 DEBUG 20984 --- [taskScheduler-1] .n.c.PoolingNHttpClientConnectionManager : Connection request: [route: {}->http://<orion>:1026][total kept alive: 0; route allocated: 1 of 2; total allocated: 1 of 20]
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.wire                     : http-outgoing-0 >> "[\r][\n]"
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.wire                     : http-outgoing-0 >> "{"subscriptionId":"5bc6d5b2b2b093eb19f1aeef"}"
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] h.i.n.c.ManagedNHttpClientConnectionImpl : http-outgoing-0 <cep>:62454<-><orion>:1026[ACTIVE][r:w]: Event cleared [w]
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] h.i.n.c.ManagedNHttpClientConnectionImpl : http-outgoing-0 <cep>:62454<-><orion>:1026[ACTIVE][r:r]: 282 bytes read
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.wire                     : http-outgoing-0 << "HTTP/1.1 200 OK[\r][\n]"
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.wire                     : http-outgoing-0 << "Connection: Keep-Alive[\r][\n]"
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.wire                     : http-outgoing-0 << "Content-Length: 93[\r][\n]"
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.wire                     : http-outgoing-0 << "Content-Type: application/json[\r][\n]"
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.wire                     : http-outgoing-0 << "Fiware-Correlator: f0b12754-d1d5-11e8-b7ad-0298bb5d193c[\r][\n]"
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.wire                     : http-outgoing-0 << "Date: Wed, 17 Oct 2018 06:29:03 GMT[\r][\n]"
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.wire                     : http-outgoing-0 << "[\r][\n]"
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.wire                     : http-outgoing-0 << "{"subscriptionId":"5bc6d5b2b2b093eb19f1aeef","statusCode":{"code":"200","reasonPhrase":"OK"}}"
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.headers                  : http-outgoing-0 << HTTP/1.1 200 OK
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.headers                  : http-outgoing-0 << Connection: Keep-Alive
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.headers                  : http-outgoing-0 << Content-Length: 93
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.headers                  : http-outgoing-0 << Content-Type: application/json
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.headers                  : http-outgoing-0 << Fiware-Correlator: f0b12754-d1d5-11e8-b7ad-0298bb5d193c
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] org.apache.http.headers                  : http-outgoing-0 << Date: Wed, 17 Oct 2018 06:29:03 GMT
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] o.a.h.i.nio.client.InternalIODispatch    : http-outgoing-0 [ACTIVE(93)] Response received
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] o.a.http.impl.nio.client.MainClientExec  : [exchange: 9] Response received HTTP/1.1 200 OK
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] o.a.h.i.nio.client.InternalIODispatch    : http-outgoing-0 [ACTIVE(93)] Input ready
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] o.a.http.impl.nio.client.MainClientExec  : [exchange: 9] Consume content
2018-10-17 11:58:44.957 DEBUG 20984 --- [/O dispatcher 1] o.a.h.i.n.c.InternalHttpAsyncClient      : [exchange: 9] Connection can be kept alive indefinitely
2018-10-17 11:58:44.958 DEBUG 20984 --- [/O dispatcher 1] o.a.http.impl.nio.client.MainClientExec  : [exchange: 9] Response processed
2018-10-17 11:58:44.958 DEBUG 20984 --- [/O dispatcher 1] o.a.h.i.n.c.InternalHttpAsyncClient      : [exchange: 9] releasing connection
2018-10-17 11:58:44.958 DEBUG 20984 --- [/O dispatcher 1] h.i.n.c.ManagedNHttpClientConnectionImpl : http-outgoing-0 <cep>:62454<-><orion>:1026[ACTIVE][r:r]: Remove attribute http.nio.exchange-handler
2018-10-17 11:58:44.958 DEBUG 20984 --- [/O dispatcher 1] .n.c.PoolingNHttpClientConnectionManager : Releasing connection: [id: http-outgoing-0][route: {}->http://<orion>:1026][total kept alive: 0; route allocated: 1 of 2; total allocated: 1 of 20]
2018-10-17 11:58:44.958 DEBUG 20984 --- [/O dispatcher 1] .n.c.PoolingNHttpClientConnectionManager : Connection [id: http-outgoing-0][route: {}->http://<orion>:1026] can be kept alive indefinitely
2018-10-17 11:58:44.958 DEBUG 20984 --- [/O dispatcher 1] h.i.n.c.ManagedNHttpClientConnectionImpl : http-outgoing-0 <cep>:62454<-><orion>:1026[ACTIVE][r:r]: Set timeout 0
2018-10-17 11:58:44.958 DEBUG 20984 --- [/O dispatcher 1] .n.c.PoolingNHttpClientConnectionManager : Connection released: [id: http-outgoing-0][route: {}->http://<orion>:1026][total kept alive: 1; route allocated: 1 of 2; total allocated: 1 of 20]
2018-10-17 11:58:44.958 DEBUG 20984 --- [/O dispatcher 1] o.s.web.client.AsyncRestTemplate         : Async POST request for "http://<orion>:1026/ngsi10/unsubscribeContext" resulted in 200 (OK)
2018-10-17 11:58:44.958 DEBUG 20984 --- [/O dispatcher 1] o.s.web.client.RestTemplate              : Reading [class com.orange.ngsi.model.UnsubscribeContextResponse] as "application/json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@1027cbcc]
2018-10-17 11:58:44.958 DEBUG 20984 --- [/O dispatcher 1] c.o.cepheus.cep.SubscriptionManager      : Unsubscribe response for 5bc6d5b2b2b093eb19f1aeef: 200
2018-10-17 11:58:44.958 DEBUG 20984 --- [/O dispatcher 1] o.a.h.i.nio.client.InternalIODispatch    : http-outgoing-0 [ACTIVE] [content length: 93; pos: 93; completed: true]
2018-10-17 11:58:44.959 DEBUG 20984 --- [/O dispatcher 2] .n.c.PoolingNHttpClientConnectionManager : Connection leased: [id: http-outgoing-1][route: {}->http://<orion>:1026][total kept alive: 1; route allocated: 2 of 2; total allocated: 2 of 20]
2018-10-17 11:58:44.959 DEBUG 20984 --- [/O dispatcher 2] o.a.h.i.n.c.InternalHttpAsyncClient      : [exchange: 10] Connection allocated: CPoolProxy{http-outgoing-1 [ACTIVE]}
2018-10-17 11:58:44.959 DEBUG 20984 --- [/O dispatcher 2] h.i.n.c.ManagedNHttpClientConnectionImpl : http-outgoing-1 <cep>:63334<-><orion>:1026[ACTIVE][r:]: Set attribute http.nio.exchange-handler
2018-10-17 11:58:44.959 DEBUG 20984 --- [/O dispatcher 2] h.i.n.c.ManagedNHttpClientConnectionImpl : http-outgoing-1 <cep>:63334<-><orion>:1026[ACTIVE][rw:]: Event set [w]
2018-10-17 11:58:44.959 DEBUG 20984 --- [/O dispatcher 2] h.i.n.c.ManagedNHttpClientConnectionImpl : http-outgoing-1 <cep>:63334<-><orion>:1026[ACTIVE][rw:]: Set timeout 0
2018-10-17 11:58:44.959 DEBUG 20984 --- [/O dispatcher 2] o.a.h.i.nio.client.InternalIODispatch    : http-outgoing-1 [ACTIVE]: Connected
2018-10-17 11:58:44.959 DEBUG 20984 --- [/O dispatcher 2] h.i.n.c.ManagedNHttpClientConnectionImpl : http-outgoing-1 <cep>:63334<-><orion>:1026[ACTIVE][rw:]: Set attribute http.nio.http-exchange-state
2018-10-17 11:58:44.960 DEBUG 20984 --- [/O dispatcher 2] o.a.h.i.n.c.InternalHttpAsyncClient      : Start connection routing
2018-10-17 11:58:44.960 DEBUG 20984 --- [/O dispatcher 2] o.a.http.impl.nio.client.MainClientExec  : Connection route established
2018-10-17 11:58:44.960 DEBUG 20984 --- [/O dispatcher 2] o.a.http.impl.nio.client.MainClientExec  : [exchange: 10] Attempt 1 to execute request
2018-10-17 11:58:44.960 DEBUG 20984 --- [/O dispatcher 2] o.a.http.impl.nio.client.MainClientExec  : Target auth state: UNCHALLENGED
2018-10-17 11:58:44.960 DEBUG 20984 --- [/O dispatcher 2] o.a.http.impl.nio.client.MainClientExec  : Proxy auth state: UNCHALLENGED
2018-10-17 11:58:44.960 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.headers                  : http-outgoing-1 >> POST /ngsi10/subscribeContext HTTP/1.1
2018-10-17 11:58:44.960 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.headers                  : http-outgoing-1 >> Accept: application/json
2018-10-17 11:58:44.960 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.headers                  : http-outgoing-1 >> Content-Type: application/json
2018-10-17 11:58:44.960 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.headers                  : http-outgoing-1 >> Fiware-Service: testprovidernew
2018-10-17 11:58:44.960 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.headers                  : http-outgoing-1 >> Fiware-ServicePath: /testnew
2018-10-17 11:58:44.960 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.headers                  : http-outgoing-1 >> Content-Length: 191
2018-10-17 11:58:44.960 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.headers                  : http-outgoing-1 >> Host: <orion>:1026
2018-10-17 11:58:44.961 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.headers                  : http-outgoing-1 >> Connection: Keep-Alive
2018-10-17 11:58:44.961 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.headers                  : http-outgoing-1 >> User-Agent: Apache-HttpAsyncClient/4.1 (Java/1.8.0_181)
2018-10-17 11:58:44.962 DEBUG 20984 --- [/O dispatcher 2] h.i.n.c.ManagedNHttpClientConnectionImpl : http-outgoing-1 <cep>:63334<-><orion>:1026[ACTIVE][rw:]: Event set [w]
2018-10-17 11:58:44.962 DEBUG 20984 --- [/O dispatcher 2] o.a.h.i.nio.client.InternalIODispatch    : http-outgoing-1 [ACTIVE] Output ready
2018-10-17 11:58:44.962 DEBUG 20984 --- [/O dispatcher 2] o.a.http.impl.nio.client.MainClientExec  : [exchange: 10] produce content
2018-10-17 11:58:44.962 DEBUG 20984 --- [/O dispatcher 2] o.a.http.impl.nio.client.MainClientExec  : [exchange: 10] Request completed
2018-10-17 11:58:44.963 DEBUG 20984 --- [/O dispatcher 2] o.a.h.i.nio.client.InternalIODispatch    : http-outgoing-1 [ACTIVE] [content length: 191; pos: 191; completed: true]
2018-10-17 11:58:44.963 DEBUG 20984 --- [/O dispatcher 2] h.i.n.c.ManagedNHttpClientConnectionImpl : http-outgoing-1 <cep>:63334<-><orion>:1026[ACTIVE][rw:w]: 482 bytes written
2018-10-17 11:58:44.963 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.wire                     : http-outgoing-1 >> "POST /ngsi10/subscribeContext HTTP/1.1[\r][\n]"
2018-10-17 11:58:44.963 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.wire                     : http-outgoing-1 >> "Accept: application/json[\r][\n]"
2018-10-17 11:58:44.963 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.wire                     : http-outgoing-1 >> "Content-Type: application/json[\r][\n]"
2018-10-17 11:58:44.963 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.wire                     : http-outgoing-1 >> "Fiware-Service: testprovidernew[\r][\n]"
2018-10-17 11:58:44.963 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.wire                     : http-outgoing-1 >> "Fiware-ServicePath: /testnew[\r][\n]"
2018-10-17 11:58:44.963 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.wire                     : http-outgoing-1 >> "Content-Length: 191[\r][\n]"
2018-10-17 11:58:44.963 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.wire                     : http-outgoing-1 >> "Host: <orion>:1026[\r][\n]"
2018-10-17 11:58:44.963 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.wire                     : http-outgoing-1 >> "Connection: Keep-Alive[\r][\n]"
2018-10-17 11:58:44.963 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.wire                     : http-outgoing-1 >> "User-Agent: Apache-HttpAsyncClient/4.1 (Java/1.8.0_181)[\r][\n]"
2018-10-17 11:58:44.963 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.wire                     : http-outgoing-1 >> "[\r][\n]"
2018-10-17 11:58:44.963 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.wire                     : http-outgoing-1 >> "{"reference":"http://<cep>:8080/ngsi10/notifyContext","duration":"PT1H","entities":[{"id":"Test1","type":"Test","isPattern":"false"}],"attributes":["CO2Level"],"notifyConditions":null}"
2018-10-17 11:58:44.963 DEBUG 20984 --- [/O dispatcher 2] h.i.n.c.ManagedNHttpClientConnectionImpl : http-outgoing-1 <cep>:63334<-><orion>:1026[ACTIVE][r:w]: Event cleared [w]
2018-10-17 11:58:44.964 DEBUG 20984 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
2018-10-17 11:58:44.964 DEBUG 20984 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Successfully completed request
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] h.i.n.c.ManagedNHttpClientConnectionImpl : http-outgoing-1 <cep>:63334<-><orion>:1026[ACTIVE][r:r]: 274 bytes read
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.wire                     : http-outgoing-1 << "HTTP/1.1 200 OK[\r][\n]"
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.wire                     : http-outgoing-1 << "Connection: Keep-Alive[\r][\n]"
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.wire                     : http-outgoing-1 << "Content-Length: 85[\r][\n]"
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.wire                     : http-outgoing-1 << "Content-Type: application/json[\r][\n]"
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.wire                     : http-outgoing-1 << "Fiware-Correlator: f0b2b358-d1d5-11e8-aa34-0298bb5d193c[\r][\n]"
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.wire                     : http-outgoing-1 << "Date: Wed, 17 Oct 2018 06:29:03 GMT[\r][\n]"
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.wire                     : http-outgoing-1 << "[\r][\n]"
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.wire                     : http-outgoing-1 << "{"subscribeResponse":{"subscriptionId":"5bc6d6afb2b093eb19f1aef0","duration":"PT1H"}}"
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.headers                  : http-outgoing-1 << HTTP/1.1 200 OK
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.headers                  : http-outgoing-1 << Connection: Keep-Alive
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.headers                  : http-outgoing-1 << Content-Length: 85
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.headers                  : http-outgoing-1 << Content-Type: application/json
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.headers                  : http-outgoing-1 << Fiware-Correlator: f0b2b358-d1d5-11e8-aa34-0298bb5d193c
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] org.apache.http.headers                  : http-outgoing-1 << Date: Wed, 17 Oct 2018 06:29:03 GMT
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] o.a.h.i.nio.client.InternalIODispatch    : http-outgoing-1 [ACTIVE(85)] Response received
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] o.a.http.impl.nio.client.MainClientExec  : [exchange: 10] Response received HTTP/1.1 200 OK
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] o.a.h.i.nio.client.InternalIODispatch    : http-outgoing-1 [ACTIVE(85)] Input ready
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] o.a.http.impl.nio.client.MainClientExec  : [exchange: 10] Consume content
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] o.a.h.i.n.c.InternalHttpAsyncClient      : [exchange: 10] Connection can be kept alive indefinitely
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] o.a.http.impl.nio.client.MainClientExec  : [exchange: 10] Response processed
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] o.a.h.i.n.c.InternalHttpAsyncClient      : [exchange: 10] releasing connection
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] h.i.n.c.ManagedNHttpClientConnectionImpl : http-outgoing-1 <cep>:63334<-><orion>:1026[ACTIVE][r:r]: Remove attribute http.nio.exchange-handler
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] .n.c.PoolingNHttpClientConnectionManager : Releasing connection: [id: http-outgoing-1][route: {}->http://<orion>:1026][total kept alive: 1; route allocated: 2 of 2; total allocated: 2 of 20]
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] .n.c.PoolingNHttpClientConnectionManager : Connection [id: http-outgoing-1][route: {}->http://<orion>:1026] can be kept alive indefinitely
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] h.i.n.c.ManagedNHttpClientConnectionImpl : http-outgoing-1 <cep>:63334<-><orion>:1026[ACTIVE][r:r]: Set timeout 0
2018-10-17 11:58:45.012 DEBUG 20984 --- [/O dispatcher 2] .n.c.PoolingNHttpClientConnectionManager : Connection released: [id: http-outgoing-1][route: {}->http://<orion>:1026][total kept alive: 2; route allocated: 2 of 2; total allocated: 2 of 20]
2018-10-17 11:58:45.026 DEBUG 20984 --- [/O dispatcher 2] o.s.web.client.AsyncRestTemplate         : Async POST request for "http://<orion>:1026/ngsi10/subscribeContext" resulted in 200 (OK)
2018-10-17 11:58:45.027 DEBUG 20984 --- [/O dispatcher 2] o.s.web.client.RestTemplate              : Reading [class com.orange.ngsi.model.SubscribeContextResponse] as "application/json" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@1027cbcc]
2018-10-17 11:58:45.027 DEBUG 20984 --- [/O dispatcher 2] c.o.cepheus.cep.SubscriptionManager      : Subscription done for http://<orion>:1026
2018-10-17 11:58:45.027 DEBUG 20984 --- [/O dispatcher 2] o.a.h.i.nio.client.InternalIODispatch    : http-outgoing-1 [ACTIVE] [content length: 85; pos: 85; completed: true]

Should it be concluded that the function for handling subscription needs be improved for multi-tenant cepheus-CEP so that it can handle multiple subscriptions for multiple config files?

Cepheus-CEP does not hold multiple subscription in multi-tenant mode

Hi @marcc-orange as per our discussion on #79 , I was having issue:

Every-time CEP receives any configuration, it first unsubscribes from the previous Provider and then subscribe to the new Provider as given in the configuration. In this way Cepheus-CEP have multiple configuration files but only one subscription at a time even when multi-tenancy is enabled.

I tried to use Docker containers for running Cepheus but I am unable to find application.properties or cep.peroperties or any config file which can be used to enable multi-tenancy.

Please guide me with the steps to enable multi-tenancy in Docker container environment.

I also want to contribute on this bug fix.

NGSI - Java 7 support

I would like to use the cepheus-ngsi library in a Google App Engine application but GAE does not support Java 8.

My question is, what is the dependency who requires Java 8 ?

I hope to be able to make a fork with Java 7.

Events sent from CEP to Orion fail with XML parser error

Running the following example:
https://fiware-cepheus.readthedocs.org/en/latest/examples/4_CepAndBrokerAndOrion/index.html

Used components:
cepheus-cep/broker: latest
orion: latest deb package

Problem:
Events resulting from the CEP (and forwarded to Orion) fail (see details in request/response) below. Strangely, orion returns http status 200, even though the content indicates, that the request failed. Other unrelated request sent to orion with updateAction=APPEND do work though.

HTTP Request from cepheus-CEP to Orion

POST /ngsi10/updateContext HTTP/1.1
Accept: application/xml
Content-Type: application/xml
Content-Length: 403
Host: localhost:1026
Connection: Keep-Alive
User-Agent: Apache-HttpAsyncClient/4.1 (Java/1.8.0_65)

<updateContextRequest><updateAction>UPDATE</updateAction><contextElementList><contextElement><entityId type="Floor" isPattern="false"><id>Floor3</id></entityId><contextAttributeList><contextAttribute><name>temperature</name><type>double</type><contextValue>23.46153846153846</contextValue><metadata/></contextAttribute></contextAttributeList></contextElement></contextElementList></updateContextRequest>

HTTP Request from Orion

HTTP/1.1 200 OK
Content-Length: 126
Content-Type: application/xml
Date: Thu, 12 Nov 2015 17:17:45 GMT

<orionError>
  <code>400</code>
  <reasonPhrase>Bad Request</reasonPhrase>
  <details>XML Parse Error</details>
</orionError>

Notification not triggered if subscription contains subset of updated attributes

There is a Subscription on:

entityId = device.12345
attributes = "temperature"

Let's send an updateContext with 2 attributes:

temperature = 15.0
pressure = 200

Result: No notification is triggered.

If we send an updateContext with only one temperature attribute, the notification gets fired:

temperature = 15.0

Result: Notification is triggered. Subscription works.

If we do the same thing with Orion Broker, the behaviour is different.
Is this a bug in cepheus?

Cepheus CEP DELETE request doesn't unsubscribe Provider

Experimenting with Cepheus I discovered that if a Cepheus CEP configuration is deleted by sending request:

DELETE cepheus:8080/v1/admin/config

It deletes the configuration file but does not unsubscribe from Orion for that entity.
So whenever there is an update occurs in Orion it receives a notification and throws an Event processing error.
Logs which I received:

2018-10-18 09:49:59.873  INFO 15232 --- [nio-8080-exec-4] c.e.e.c.service.EPServiceProviderImpl    : Destroying engine URI 'default'
2018-10-18 09:50:00.176  INFO 15232 --- [nio-8080-exec-4] c.o.c.cep.persistence.JsonPersistence    : Delete configuration from C:\Users\<user>\AppData\Local\Temp\/cep-default-.json
2018-10-18 09:50:00.188 DEBUG 15232 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : Successfully completed request
2018-10-18 09:50:55.191 DEBUG 15232 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing POST request for [/ngsi10/notifyContext]
2018-10-18 09:50:55.193 DEBUG 15232 --- [nio-8080-exec-5] c.o.c.cep.controller.NgsiController      : notifyContext incoming request id:5bc809d8b2b093eb19f1af0c originator:localhost
2018-10-18 09:50:55.193  INFO 15232 --- [nio-8080-exec-5] c.o.cepheus.cep.EsperEventProcessor      : EventIn: Event{type='Test', values={CO2Level=170, id=Test1}}
2018-10-18 09:50:55.194 DEBUG 15232 --- [nio-8080-exec-5] .m.m.a.ExceptionHandlerExceptionResolver : Resolving exception from handler [public final org.springframework.http.ResponseEntity<com.orange.ngsi.model.NotifyContextResponse> com.orange.ngsi.server.NgsiBaseController.notifyContextRequest(com.orange.ngsi.model.NotifyContext,javax.servlet.http.HttpServletRequest) throws java.lang.Exception]: com.orange.cepheus.cep.exception.EventProcessingException: Event type named 'Test' has not been defined or is not a Map event type, the name 'Test' has not been defined as an event type
2018-10-18 09:50:55.196 DEBUG 15232 --- [nio-8080-exec-5] .m.m.a.ExceptionHandlerExceptionResolver : Invoking @ExceptionHandler method: public org.springframework.http.ResponseEntity<java.lang.Object> com.orange.cepheus.cep.controller.NgsiController.eventProcessinExceptionHandler(javax.servlet.http.HttpServletRequest,com.orange.cepheus.cep.exception.EventProcessingException)
2018-10-18 09:50:55.196 ERROR 15232 --- [nio-8080-exec-5] c.o.c.cep.controller.NgsiController      : Event processing error: {}

com.orange.cepheus.cep.exception.EventProcessingException: Event type named 'Test' has not been defined or is not a Map event type, the name 'Test' has not been defined as an event type

2018-10-18 09:50:55.198 DEBUG 15232 --- [nio-8080-exec-5] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Written [NotifyContextResponse{responseCode=StatusCode{code='500', reasonPhrase='event processing error', detail='com.orange.cepheus.cep.exception.EventProcessingException: Event type named 'Test' has not been defined or is not a Map event type, the name 'Test' has not been defined as an event type'}}] as "application/json;charset=UTF-8" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@6136773b]
2018-10-18 09:50:55.198 DEBUG 15232 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling

The same I have tested with Cepheus CEP in multi-tenant profile by changing application.properties as:
spring.profiles.active=multi-tenant
There also no unsubscribe request is executed in DELETE request of configuration and any update context in Orion notifies Cepheus CEP and throws NullPointerException.
Logs are as:

2018-10-18 09:42:47.930  INFO 20984 --- [nio-8080-exec-4] c.e.e.c.service.EPServiceProviderImpl    : Destroying engine URI 'testservice/testservicepath'
2018-10-18 09:42:48.131  INFO 20984 --- [nio-8080-exec-4] c.e.e.c.service.EPServiceProviderImpl    : Initializing engine URI 'testservice/testservicepath' version 5.3.0
2018-10-18 09:42:48.232  INFO 20984 --- [nio-8080-exec-4] c.o.c.cep.persistence.JsonPersistence    : Delete configuration from C:\Users\<user>\AppData\Local\Temp\/cep-testservice-testservicepath.json
2018-10-18 09:42:48.238 DEBUG 20984 --- [nio-8080-exec-4] o.s.web.servlet.DispatcherServlet        : Successfully completed request
2018-10-18 09:43:11.786 DEBUG 20984 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing POST request for [/ngsi10/notifyContext]
2018-10-18 09:43:11.786 DEBUG 20984 --- [nio-8080-exec-5] s.w.s.m.m.a.RequestMappingHandlerMapping : Returning handler method [public final org.springframework.http.ResponseEntity<com.orange.ngsi.model.NotifyContextResponse> com.orange.ngsi.server.NgsiBaseController.notifyContextRequest(com.orange.ngsi.model.NotifyContext,javax.servlet.http.HttpServletRequest) throws java.lang.Exception]
2018-10-18 09:43:11.787 DEBUG 20984 --- [nio-8080-exec-5] c.o.c.cep.controller.NgsiController      : notifyContext incoming request id:5bc80826b2b093eb19f1af0b originator:localhost
2018-10-18 09:43:11.788 DEBUG 20984 --- [nio-8080-exec-5] .m.m.a.ExceptionHandlerExceptionResolver : Resolving exception from handler [public final org.springframework.http.ResponseEntity<com.orange.ngsi.model.NotifyContextResponse> com.orange.ngsi.server.NgsiBaseController.notifyContextRequest(com.orange.ngsi.model.NotifyContext,javax.servlet.http.HttpServletRequest) throws java.lang.Exception]: java.lang.NullPointerExceptioncom.orange.ngsi.server.NgsiBaseController.exceptionHandler(javax.servlet.http.HttpServletRequest,java.lang.Exception)
2018-10-18 09:43:11.791 ERROR 20984 --- [nio-8080-exec-5] c.orange.ngsi.server.NgsiBaseController  : Exception handler: {}

java.lang.NullPointerException: null

2018-10-18 09:43:11.794 DEBUG 20984 --- [nio-8080-exec-5] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Written [NotifyContextResponse{responseCode=StatusCode{code='500', reasonPhrase='Receiver internal error', detail='An unknown error at the receiver has occured'}}] as "application/json;charset=UTF-8" using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@1027cbcc]
2018-10-18 09:43:11.795 DEBUG 20984 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Successfully completed request

It would seem that these Exceptions occur because DELETE request doesn't unsubscribe Cepheus CEP from Provider.
It should unsubscribe from Provider at the time of DELETE request.

Add guaranteed delivery to Cepheus Broker

When the Cepheus Broker does not manage to forward updates to a remote broker, it just ignores the failed updates (just logging an error).

The broker could support a guaranteed delivery mode where not delivered updates would be stored locally (in memory or persisted on disk) and send back to the remote broker when the connection is recovered.

Optionally, the broker could smartly only keep the latest update for a given context entity to limit local storage and traffic when historic data is not relevant.

Move NGSI library to a dedicated repo

The cepheus-ngsi library currently is under the GPLv2 licence which is very restrictive for library reuse. We will move the cepheus-ngsi library to its own git repo and modify the licensing to use Apache Licence v2.

Compatibility with Orion 1.X.X

Cepheus 0.1.16 is compatible with Orion up to 0.28 only.

Because XML support was removed from Orion 1.0.0 and Cepheus 0.1.16 uses XML as the default format when it has no information that a remote NGSI host supports JSON, Cepheus CEP and Broker cannot communicate with the latest version of Orion.

long support not working in the Esper with Date-Time Methods

When i send timestamp field as long and try in the EPL query to do timestamp.get('minute') although in the Esper documentation it's said that it should work with long value (and it worked in the Esper4FastData) i get the following exception:

Date-time enumeration method 'get' requires either a Calendar, Date or long value as input or events of an event type that declares a timestamp property but received java.lang.Object

when i did in the EPL typeof(timestamp) i got String

i attached the log file so you will be able to check the exception

cep.txt

QueryContext sends empty restriction.

Hi,

When i use a QueryContext to send a query to http://orion.lab.fiware.org:1026 without defining any restrictions, i get this reply from the server:

<queryContextResponse>
  <errorCode>
    <code>400</code>
    <reasonPhrase>Bad Request</reasonPhrase>
    <details>empty restriction</details>
  </errorCode>
</queryContextResponse>

The query sent to the server is:

<queryContextRequest>
<restriction/>
<entityIdList>
<entityId type="EventbusEvent" isPattern="true">
<id>dk.cavi.eventbus.*</id>
</entityId>
</entityIdList>
</queryContextRequest>

It seems that the <restriction/> should not be present if no restrictions are applied?

Cepheus CEP in a multi-tenancy way

Is the Cepheus CEP ready for working alone in a multy-tenancy way without Cepheus Broker?
I have been doing some test with a simple architecture: IoTAgent, Orion and Cepheus CEP
And I just realized that the code where the requests are made isn't sending "Fiware-Service" neither "Fiware-ServicePath" SubscriptionManager headers are null.

change remote.url in docker container

Hi,
I used the below code to run my docker cepheus image:
docker run -d --name cepheus1 -p 8080:8080 -p 8081:8081 orangeopensource/fiware-cepheus
And my orion context broker is on 1026 port
How can i change remote broker default value to forward updated to orion ?

thanks

Stack Overflow Error processing rules with nested geopoint type attributes

I am experiencing a problem when I define geofencing rules using an attribute of type geo: point in an Event-In and then try to save this attribute together with others within another attribute in the Event-Out.

This is a concrete example of my configuration based on the "Tracker" example of the Cepheus doc. I also simplified the statements and added some extra parameters in configuration. BTW, I am using Docker Containers:

{ "service": "test", "servicePath": "/tracker", "host": "http://172.17.0.1:8080", "reset": true, "statements": [ "INSERT INTO Alert SELECT * FROM Tracker t WHERE NOT polygon({point(0, 0), point(0,50), point(50,50), point(50, 0), point(0, 0)}).contains(t.location)" ], "in": [ { "id": ".*", "type": "Tracker", "isPattern": true, "attributes": [ { "name": "time", "type": "date" }, { "name": "location", "type": "geo:point" } ], "providers": [ { "url": "http://172.17.0.1:1026", "service": "test", "servicePath": "/tracker" } ] } ], "out":[ { "id":"Fence1", "type":"Alert", "attributes":[ { "name":"time", "type":"date" }, { "name":"location", "type":"geo:point" }, { "name":"inside", "type":"boolean" }, { "name":"nested", "type":"text" } ], "brokers": [ { "url": "http://172.17.0.1:1026", "serviceName": "test", "servicePath": "/tracker", "authToken": null } ] } ] }

Then this is the Tracker1 context entity that I just created using Orion NGSI v2 API.

{ "id": "Tracker1", "type": "Tracker", "time": { "value": "2015-10-26T22:47:09Z", "type": "date" }, "location": { "value": "45.1234, 1.6543", "type": "geo:point" } }

Then if you make an UPDATE context like the following everything works fine and the Alarm is raised.

curl -X POST \ 'http://localhost:1026/v2/entities/Tracker1/attrs?type=Tracker' \ -H 'Content-Type: application/json' \ -H 'Fiware-Service: test' \ -H 'Fiware-ServicePath: /tracker' \ -d '{ "time": { "value": "2015-10-26T22:47:09Z", "type": "date" }, "location": { "value": "60.1234, 1.6543", "type": "geo:point" } }'

The problem is what happens if for some reason you want to generate a new attribute, for example an attribute called "nested" and then populate it with the entire Event In context information.

This is my configuration example in order to do so:

{ "service": "test", "servicePath": "/tracker", "host": "http://172.17.0.1:8080", "reset": true, "statements": [ "INSERT INTO Alert SELECT *, t as nested FROM Tracker t WHERE NOT polygon({point(0, 0), point(0,50), point(50,50), point(50, 0), point(0, 0)}).contains(t.location)" ], "in": [ { "id": ".*", "type": "Tracker", "isPattern": true, "attributes": [ { "name": "time", "type": "date" }, { "name": "location", "type": "geo:point" } ], "providers": [ { "url": "http://172.17.0.1:1026", "service": "test", "servicePath": "/tracker" } ] } ], "out":[ { "id":"Fence1", "type":"Alert", "attributes":[ { "name":"time", "type":"date" }, { "name":"location", "type":"geo:point" }, { "name":"inside", "type":"boolean" }, { "name":"nested", "type":"text" } ], "brokers": [ { "url": "http://172.17.0.1:1026", "serviceName": "test", "servicePath": "/tracker", "authToken": null } ] } ] }

Cepheus CEP accept the configuration files but when I make an UPDATE context request I get the following error in Cepheus CEP logs:

2018-02-15 20:43:44.508 INFO 6 --- [taskScheduler-1] c.o.cepheus.cep.SubscriptionManager : Launch of the periodic subscription task at 2018-02-15T20:43:44.508Z 2018-02-15 20:43:57.786 INFO 6 --- [nio-8080-exec-5] c.o.cepheus.cep.EsperEventProcessor : EventIn: Event{type='Tracker', values={location=POINT (60.1234 1.6543), time=Mon Oct 26 22:47:09 GMT 2015, id=Tracker1}} 2018-02-15 20:43:57.786 INFO 6 --- [nio-8080-exec-5] c.orange.cepheus.cep.EventSinkListener : EventOut: Alert / location:POINT (60.1234 1.6543) / time:Mon Oct 26 22:47:09 GMT 2015 / id:Tracker1 / inside:null / nested:{location=POINT (60.1234 1.6543), time=Mon Oct 26 22:47:09 GMT 2015, id=Tracker1} from insert into Alert select *, t as nested from Tracker as t where not polygon({point(0,0),point(0,50),point(50,50),point(50,0),point(0,0)}).contains(t.location) 2018-02-15 20:43:57.787 INFO 6 --- [nio-8080-exec-5] c.orange.cepheus.cep.EventSinkListener : [[outgoingEvents]] :::> [EventType{id='Fence1', type='Alert', isPattern=false, attributes=[Attribute{name='inside', type='boolean', metadata=[], jsonpath='null'}, Attribute{name='location', type='geo:point', metadata=[], jsonpath='null'}, Attribute{name='nested', type='text', metadata=[], jsonpath='null'}, Attribute{name='time', type='date', metadata=[], jsonpath='null'}]}, EventType{id='AutoConectadox', type='AutoConectadoEvent', isPattern=false, attributes=[Attribute{name='InputEntityFiwareService', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='InputEntityContext', type='java.util.Map', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='InputEntityFiwareServicePath', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='InputEntityId', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='InputEntityTypeId', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='RuleId', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}]}, EventType{id='OUT1', type='TempSensorAvg', isPattern=false, attributes=[Attribute{name='avgTemp', type='double', metadata=[Metadata{name='unit', type='string', jsonpath='null'}], jsonpath='null'}]}] 2018-02-15 20:43:57.792 INFO 6 --- [nio-8080-exec-6] c.o.cepheus.cep.EsperEventProcessor : EventIn: Event{type='Tracker', values={location=POINT (60.1234 1.6543), time=Mon Oct 26 22:47:09 GMT 2015, id=Tracker1}} 2018-02-15 20:43:57.793 INFO 6 --- [nio-8080-exec-6] c.orange.cepheus.cep.EventSinkListener : EventOut: Alert / location:POINT (60.1234 1.6543) / time:Mon Oct 26 22:47:09 GMT 2015 / id:Tracker1 / inside:null / nested:{location=POINT (60.1234 1.6543), time=Mon Oct 26 22:47:09 GMT 2015, id=Tracker1} from insert into Alert select *, t as nested from Tracker as t where not polygon({point(0,0),point(0,50),point(50,50),point(50,0),point(0,0)}).contains(t.location) 2018-02-15 20:43:57.793 INFO 6 --- [nio-8080-exec-6] c.orange.cepheus.cep.EventSinkListener : [[outgoingEvents]] :::> [EventType{id='Fence1', type='Alert', isPattern=false, attributes=[Attribute{name='inside', type='boolean', metadata=[], jsonpath='null'}, Attribute{name='location', type='geo:point', metadata=[], jsonpath='null'}, Attribute{name='nested', type='text', metadata=[], jsonpath='null'}, Attribute{name='time', type='date', metadata=[], jsonpath='null'}]}, EventType{id='AutoConectadox', type='AutoConectadoEvent', isPattern=false, attributes=[Attribute{name='InputEntityFiwareService', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='InputEntityContext', type='java.util.Map', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='InputEntityFiwareServicePath', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='InputEntityId', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='InputEntityTypeId', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='RuleId', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}]}, EventType{id='OUT1', type='TempSensorAvg', isPattern=false, attributes=[Attribute{name='avgTemp', type='double', metadata=[Metadata{name='unit', type='string', jsonpath='null'}], jsonpath='null'}]}] 2018-02-15 20:43:57.802 INFO 6 --- [nio-8080-exec-8] c.o.cepheus.cep.EsperEventProcessor : EventIn: Event{type='Tracker', values={location=POINT (60.1234 1.6543), time=Mon Oct 26 22:47:09 GMT 2015, id=Tracker1}} 2018-02-15 20:43:57.803 INFO 6 --- [nio-8080-exec-8] c.orange.cepheus.cep.EventSinkListener : EventOut: Alert / location:POINT (60.1234 1.6543) / time:Mon Oct 26 22:47:09 GMT 2015 / id:Tracker1 / inside:null / nested:{location=POINT (60.1234 1.6543), time=Mon Oct 26 22:47:09 GMT 2015, id=Tracker1} from insert into Alert select *, t as nested from Tracker as t where not polygon({point(0,0),point(0,50),point(50,50),point(50,0),point(0,0)}).contains(t.location) 2018-02-15 20:43:57.803 INFO 6 --- [nio-8080-exec-8] c.orange.cepheus.cep.EventSinkListener : [[outgoingEvents]] :::> [EventType{id='Fence1', type='Alert', isPattern=false, attributes=[Attribute{name='inside', type='boolean', metadata=[], jsonpath='null'}, Attribute{name='location', type='geo:point', metadata=[], jsonpath='null'}, Attribute{name='nested', type='text', metadata=[], jsonpath='null'}, Attribute{name='time', type='date', metadata=[], jsonpath='null'}]}, EventType{id='AutoConectadox', type='AutoConectadoEvent', isPattern=false, attributes=[Attribute{name='InputEntityFiwareService', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='InputEntityContext', type='java.util.Map', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='InputEntityFiwareServicePath', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='InputEntityId', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='InputEntityTypeId', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='RuleId', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}]}, EventType{id='OUT1', type='TempSensorAvg', isPattern=false, attributes=[Attribute{name='avgTemp', type='double', metadata=[Metadata{name='unit', type='string', jsonpath='null'}], jsonpath='null'}]}] 2018-02-15 20:43:57.807 INFO 6 --- [nio-8080-exec-9] c.o.cepheus.cep.EsperEventProcessor : EventIn: Event{type='Tracker', values={location=POINT (60.1234 1.6543), time=Mon Oct 26 22:47:09 GMT 2015, id=Tracker1}} 2018-02-15 20:43:57.807 INFO 6 --- [nio-8080-exec-9] c.orange.cepheus.cep.EventSinkListener : EventOut: Alert / location:POINT (60.1234 1.6543) / time:Mon Oct 26 22:47:09 GMT 2015 / id:Tracker1 / inside:null / nested:{location=POINT (60.1234 1.6543), time=Mon Oct 26 22:47:09 GMT 2015, id=Tracker1} from insert into Alert select *, t as nested from Tracker as t where not polygon({point(0,0),point(0,50),point(50,50),point(50,0),point(0,0)}).contains(t.location) 2018-02-15 20:43:57.808 INFO 6 --- [nio-8080-exec-9] c.orange.cepheus.cep.EventSinkListener : [[outgoingEvents]] :::> [EventType{id='Fence1', type='Alert', isPattern=false, attributes=[Attribute{name='inside', type='boolean', metadata=[], jsonpath='null'}, Attribute{name='location', type='geo:point', metadata=[], jsonpath='null'}, Attribute{name='nested', type='text', metadata=[], jsonpath='null'}, Attribute{name='time', type='date', metadata=[], jsonpath='null'}]}, EventType{id='AutoConectadox', type='AutoConectadoEvent', isPattern=false, attributes=[Attribute{name='InputEntityFiwareService', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='InputEntityContext', type='java.util.Map', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='InputEntityFiwareServicePath', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='InputEntityId', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='InputEntityTypeId', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}, Attribute{name='RuleId', type='text', metadata=[Metadata{name='TimeInstant', type='ISO8601', jsonpath='null'}], jsonpath='null'}]}, EventType{id='OUT1', type='TempSensorAvg', isPattern=false, attributes=[Attribute{name='avgTemp', type='double', metadata=[Metadata{name='unit', type='string', jsonpath='null'}], jsonpath='null'}]}] 2018-02-15 20:43:57.960 ERROR 6 --- [nio-8080-exec-6] c.e.e.c.s.StatementResultServiceImpl : Unexpected exception invoking listener update method on listener class 'EventSinkListener' : HttpMessageNotWritableException : Could not write content: Infinite recursion (StackOverflowError) (through reference chain: com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["envelope"]

It seems to be blocked in an infinite recursion, right?

The interesting thing is that if the event does not have an attribute of type geo:point, the rule with a nested attribute works correctly. It seems to be related to the parsing of an attribute of type geo:point only.

I am using Cepheus CEP v1.0.0 without Cepheus broker.

Any help?

Best Regards.

CEP: cleanup invalid subscriptions

The CEP subscribes to the Broker entities configured in the configuration file.
The CEP does not persist subscriptions.
If the CEP is restarted (after a crash or a user stop), the CEP done again the subscriptions.
The broker sends two notifications (during 1H of subscription time), and one of them is invalid and therefore rejected.

It is proposed to reject the notification but also to send the Broker an unregistration so the Broker could clean the subscription. The Broker will send a single notification.

The unsubscribe will be made only if the subscription is invalid and if the susbcription third mechanism is not engaged.

cep: configuration fails to apply on variable definition updates

When the cep receives a new configuration with a modified variable definition, the configuration fails to apply.

Example: first configuration:

{
 [...]
 "statements": [
  "create variable int myNumber = 1"
 ]
}

then:

{
 [...]
 "statements": [
   "create variable int myNumber = 2"
 ]
}

Fix File name of .deb package after sonatype download

Hello,

i have downloaded the debian package with : wget "https://oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=com.orange.cepheus&a=cepheus-broker&v=LATEST&p=deb"

ubuntu@egmfdls:~/cepheus$ wget "https://oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=com.orange.cepheus&a=cepheus-broker&v=LATEST&p=deb"
--2015-12-04 10:19:04--  https://oss.sonatype.org/service/local/artifact/maven/redirect?r=snapshots&g=com.orange.cepheus&a=cepheus-broker&v=LATEST&p=deb
Resolving oss.sonatype.org (oss.sonatype.org)... 54.84.56.57, 52.21.178.28, 52.20.70.160, ...
Connecting to oss.sonatype.org (oss.sonatype.org)|54.84.56.57|:443... connected.
HTTP request sent, awaiting response... 307 Temporary Redirect
Location: https://oss.sonatype.org/service/local/repositories/snapshots/content/com/orange/cepheus/cepheus-broker/0.1.3-SNAPSHOT/cepheus-broker-0.1.3-20151202.141035-5.deb [following]
--2015-12-04 10:19:04--  https://oss.sonatype.org/service/local/repositories/snapshots/content/com/orange/cepheus/cepheus-broker/0.1.3-SNAPSHOT/cepheus-broker-0.1.3-20151202.141035-5.deb
Reusing existing connection to oss.sonatype.org:443.
HTTP request sent, awaiting response... 200 OK
Length: 21426974 (20M) [application/x-debian-package]
Saving to: ‘redirect?r=snapshots&g=com.orange.cepheus&a=cepheus-broker&v=LATEST&p=deb’

100%[===========================================================================>] 21,426,974  19.9MB/s   in 1.0s

2015-12-04 10:19:05 (19.9 MB/s) - ‘redirect?r=snapshots&g=com.orange.cepheus&a=cepheus-broker&v=LATEST&p=deb’ saved [21426974/21426974]

It saves the package with filename : ‘redirect?r=snapshots&g=com.orange.cepheus&a=cepheus-broker&v=LATEST&p=deb’

I did a cp ‘redirect?r=snapshots&g=com.orange.cepheus&a=cepheus-broker&v=LATEST&p=deb’ cepeus.deb and installed it correctly but the wget should save the file with a .deb name.

Cepheus does not send subscribeContext request on changing ServiceName and ServicePath

On sending config.json file with provider field as below:
"providers":[
{
"url":"http://orion:1026",
"serviceName":"tenant",
"servicePath":"/test"
}
]
Cepheus send a subscribe context request to the this provider.

Now if you change the service name or service path,Cepheus will not send subscribe context request. Cepheus sends subscribe context request only when the url in provider will change.

Detection of existing statements is not working

When posting the following configuration twice to the CEP, I'd expect that the EPL statement is not removed and added again according to the logic in:
com.orange.cepheus.cep. EsperEventProcessor.updateStatements(...)

This leads to a full data loss with each configuration update.

Also the logs point out, that this is a bug:
2016-01-14 13:11:24.732 INFO 4831 --- [nio-8080-exec-4] c.o.c.cep.controller.AdminController : Update configuration
2016-01-14 13:11:24.732 INFO 4831 --- [nio-8080-exec-4] c.o.cepheus.cep.EsperEventProcessor : Apply configuration
2016-01-14 13:11:24.733 INFO 4831 --- [nio-8080-exec-4] c.o.cepheus.cep.EsperEventProcessor : Remove statement: insert into Dummy select "1" as userId from Dummy
2016-01-14 13:11:24.733 INFO 4831 --- [nio-8080-exec-4] c.o.cepheus.cep.EsperEventProcessor : Add new statement: /* Dummy Statement */ INSERT INTO Dummy SELECT "1" as userId From Dummy

Configuration for reproduction:
{
"in": [{
"attributes": [{
"name": "userId",
"type": "string"
}],
"id": ".",
"type": "Dummy",
"isPattern": true,
"providers": ["http://localhost:8081"]
}],
"host": "http://localhost:8080",
"statements": ["/
Dummy Statement */ INSERT INTO Dummy SELECT "1" as userId From Dummy"],
"out": []
}

Version used:
0.1.2

broker: filter forwarded requests

Add option to disable forwarding or filter of updateContext requests to the remote broker.

Currently all updateContext request comming from devices are forwarded to the remote broker by Cepheus-Broker by default.

We might want to prevent or filter the updateContext requests beeing sent to a remote broker to let the Cepheus-CEP component forward it (using more complex transformations, like rate limiting)

Adding persistance to Cepheus

Hello,

We are interested in adding persistance to Cepheus gateway.
We are working on a project that needs this feature and we are ready to contribute!

Thanks and best regards,
Sabrine FATNASSI
Easy Global Market

Error with cepheus Broker 0.1.7

I just downloaded the new release of the cepheus broker and found 1 errors:

  1. When i use this config:
## Broker port
server.port = 1027

## Public URL to this instance
local.url = http://localhost:1027

## URL to the remote broker (Orion)
remote.url = http://localhost:1026

## Remote broker Service Name
# remote.serviceName    =

## Remote broker Service Path
# remote.servicePath    =

## OAuth token for secured broker
# remote.authToken =

## UpdateContext forwarding to remote broker
remote.forward.updateContext = true

## Log level
# logging.level.com.orange.cepheus.broker = INFO

## DataBase url
# spring.datasource.url = jdbc:sqlite:${java.io.tmpdir:-/tmp}/cepheus-broker.db

it throws me this error:

root@PAPELclub-VM013cen-Prod cepheus-broker]# nano application.properties 
[root@PAPELclub-VM013cen-Prod cepheus-broker]# java -jar cepheus-broker-0.1.7.jar 
2016-05-19 11:52:58.680  INFO 54512 --- [           main] com.orange.cepheus.broker.Application    : Starting Application on PAPELclub-VM013cen-Prod with PID 54512 (/home/FiWare-VM013cen-Admin/fiware-cepheus/cepheus-broker/cepheus-broker-0.1.7.jar started by root in /home/FiWare-VM013cen-Admin/fiware-cepheus/cepheus-broker)
2016-05-19 11:53:23.540  INFO 54512 --- [           main] com.orange.cepheus.broker.Application    : Started Application in 26.305 seconds (JVM running for 28.577)
2016-05-19 11:54:31.131  WARN 54512 --- [/O dispatcher 1] c.o.c.broker.controller.NgsiController   : UpdateContext failed for http://localhost:1026: java.lang.NullPointerException
2016-05-19 11:54:31.318  WARN 54512 --- [/O dispatcher 1] c.o.c.broker.controller.NgsiController   : UpdateContext failed for http://localhost:1026: java.lang.NullPointerException
2016-05-19 11:54:31.399  WARN 54512 --- [nio-1027-exec-6] c.o.c.broker.controller.NgsiController   : UpdateContext failed for http://localhost:1026: java.lang.NullPointerException
2016-05-19 11:54:31.514  WARN 54512 --- [nio-1027-exec-8] c.o.c.broker.controller.NgsiController   : UpdateContext failed for http://localhost:1026: java.lang.NullPointerException

Have I something misconfigurated?

Incorrect processing for notification about changes in multiple context entities.

Experimenting with Orion and Cepheus I discovered that if a cepheus configuration is used for an EventIn that refers to a particular context entity, everything works as expected.

"in": [ { "host":"http://localhost:8080", "in":[ { "id":"Room1", "type":"Room", "attributes":[ { "name":"temperature", "type":"double" }, { "name":"floor", "type":"string" } ], ... }

How ever If I define a generic EventIn for all rooms, then the Cepheus behaves unexpectedly. When configuring the cepheus with such a configuration and despite having well-defined rules, no exit event is recorded and no errors appear in the logfile. This is rare since Cepheus generates a subscription for each EventIn that is defined in the configuration file. When creating the subscription in Orion, it should notify the cepheus by means of a request, sending all the contexts that meet the criteria of this subscription.

"in": [ { "host":"http://localhost:8080", "in":[ { "id":".*", "type":"Room", "isPattern": true, "attributes":[ { "name":"temperature", "type":"double" }, { "name":"floor", "type":"string" } ], ... }

Perhaps the cepheus is not ready to receive a notifyContext request where changes to multiple context entities are notified.

I did not mention it, I have three different rooms in my Orion context broker: Room1, Room2 and Room3. When the subscription is created in Orion, the three context entities are notified. Finally my application has the Fiware-ServicePath: /hotel.

I did some dubugging using the Fiware accumulator-server.py and then I got the following notifyContext request:

POST http://172.17.0.1:1028/accumulate
Fiware-Servicepath: /hotel,/hotel,/hotel
Content-Length: 1551
User-Agent: orion/1.7.0-next libcurl/7.19.7
Host: 172.17.0.1:1028
Accept: application/json
Fiware-Service: sheraton
Content-Type: application/json; charset=utf-8
Fiware-Correlator: b5324fd4-7f8f-11e8-b121-0242ac110003

{
    "contextResponses": [
        {
            "contextElement": {
                "attributes": [
                    {
                        "name": "pressure", 
                        "type": "Integer", 
                        "value": 720
                    }, 
                    {
                        "name": "temperature", 
                        "type": "Float", 
                        "value": 23
                    }
                ], 
                "id": "Room1", 
                "isPattern": "false", 
                "type": "Room"
            }, 
            "statusCode": {
                "code": "200", 
                "reasonPhrase": "OK"
            }
        }, 
        {
            "contextElement": {
                "attributes": [
                    {
                        "name": "pressure", 
                        "type": "Integer", 
                        "value": 700
                    }, 
                    {
                        "name": "temperature", 
                        "type": "Float", 
                        "value": 21
                    }
                ], 
                "id": "Room2", 
                "isPattern": "false", 
                "type": "Room"
            }, 
            "statusCode": {
                "code": "200", 
                "reasonPhrase": "OK"
            }
        }, 
        {
            "contextElement": {
                "attributes": [
                    {
                        "name": "pressure", 
                        "type": "Integer", 
                        "value": 740
                    }, 
                    {
                        "name": "temperature", 
                        "type": "Float", 
                        "value": 18
                    }
                ], 
                "id": "Room3", 
                "isPattern": "false", 
                "type": "Room"
            }, 
            "statusCode": {
                "code": "200", 
                "reasonPhrase": "OK"
            }
        }
    ], 
    "originator": "localhost", 
    "subscriptionId": "5b3cce1faa7643a55888eb77"
}

Is it possible that the cepheus is not doing anything when receiving the request, because of the value of the header it brings? Look at the value that the accumulator-server saved in the log file:

/hotel, /hotel, /hotel

It would seem that Orion concatenated the Fiware-ServicePath of each context that met the criteria of the subscription. So, since the Cepheus configuration has a value other than Fiware-ServicePath ("/ hotel"), nothing happens.

Exception logging

Please,
Can you improve exception logging by print stacktrace and not only Exception name ?
Thanks.

long should be supported

We use the EPL function ext_timed which expects long parameters. However, the CEP component does not allow long sized integers ("Failed to parse value") nor know long as primitive type.

Cepheus-CEP multitenancy issue for multi-tenant provider

I have enabled the multi-tenant profile from application.properties:
spring.profiles.active=multi-tenant

and then uploaded config files having Fiware-Service and Fiware-ServicePath in Headers with serviceName, servicePath in providers section as:

image

A JSON file having name cep-testservice-testservicepath is created.

I have an entity of type Room having id Room1 in my Orion context broker.

These are my orion logs:

9/6/2018 5:12:57 PMtime=Thursday 06 Sep 11:42:57 2018.187Z | lvl=INFO | corr=ffbc3846-b1c9-11e8-843e-0298bbe0d856 | trans=1534488995-284-00000000503 | from=<cepheus-cep> | srv=pending | subsrv=/test | comp=Orion | op=rest.cpp[895]:servicePathSplit | msg=Service Path 0: '/test'
9/6/2018 5:12:57 PMtime=Thursday 06 Sep 11:42:57 2018.188Z | lvl=INFO | corr=ffbc3846-b1c9-11e8-843e-0298bbe0d856 | trans=1534488995-284-00000000503 | from=<cepheus-cep> | srv=testprovider | subsrv=/test | comp=Orion | op=connectionOperations.cpp[175]:collectionRangedQuery | msg=Database Operation Successful (query: { query: { $or: [ { _id.id: "Room1", _id.type: "Room" } ], _id.servicePath: { $in: [ /^/test$/ ] }, attrNames: { $in: [ "temperature", "floor" ] } }, orderby: { creDate: 1 } })
9/6/2018 5:12:57 PMtime=Thursday 06 Sep 11:42:57 2018.189Z | lvl=INFO | corr=ffbc3846-b1c9-11e8-843e-0298bbe0d856 | trans=1534488995-284-00000000503 | from=<cepheus-cep> | srv=testprovider | subsrv=/test | comp=Orion | op=connectionOperations.cpp[175]:collectionRangedQuery | msg=Database Operation Successful (query: { query: { $or: [ { _id.id: "Room1", _id.type: "Room" } ], _id.servicePath: { $in: [ /^/test$/ ] } }, orderby: { creDate: 1 } })
9/6/2018 5:12:57 PMtime=Thursday 06 Sep 11:42:57 2018.189Z | lvl=INFO | corr=N/A | trans=1534488995-284-00000000504 | from=pending | srv=pending | subsrv=pending | comp=Orion | op=logMsg.h[1832]:lmTransactionStart | msg=Starting transaction to http://<cepheus-cep>:8080/ngsi10/notifyContext
9/6/2018 5:12:57 PMtime=Thursday 06 Sep 11:42:57 2018.190Z | lvl=INFO | corr=N/A | trans=1534488995-284-00000000504 | from=pending | srv=pending | subsrv=pending | comp=Orion | op=httpRequestSend.cpp[599]:httpRequestSendWithCurl | msg=Sending message 153 to HTTP server: sending message of 594 bytes to HTTP server
9/6/2018 5:12:57 PMtime=Thursday 06 Sep 11:42:57 2018.191Z | lvl=INFO | corr=ffbc3846-b1c9-11e8-843e-0298bbe0d856 | trans=1534488995-284-00000000503 | from=<cepheus-cep> | srv=testprovider | subsrv=/test | comp=Orion | op=connectionOperations.cpp[373]:collectionInsert | msg=Database Operation Successful (insert: { _id: ObjectId('5b9112c1fab1f7327c478692'), expiration: 1536237777, reference: "http://<cepheus-cep>:8080/ngsi10/notifyContext", custom: false, throttling: -1, servicePath: "/test", status: "active", entities: [ { id: "Room1", isPattern: "false", type: "Room", isTypePattern: false } ], attrs: [ "temperature", "floor" ], metadata: [], blacklist: false, conditions: [], lastNotification: 1536234177, count: 1, expression: { q: "", mq: "", geometry: "", coords: "", georel: "" }, format: "JSON" })
9/6/2018 5:12:57 PMtime=Thursday 06 Sep 11:42:57 2018.191Z | lvl=INFO | corr=ffbc3846-b1c9-11e8-843e-0298bbe0d856 | trans=1534488995-284-00000000503 | from=<cepheus-cep> | srv=testprovider | subsrv=/test | comp=Orion | op=logMsg.h[1916]:lmTransactionEnd | msg=Transaction ended
9/6/2018 5:12:57 PMtime=Thursday 06 Sep 11:42:57 2018.364Z | lvl=INFO | corr=N/A | trans=1534488995-284-00000000504 | from=pending | srv=pending | subsrv=pending | comp=Orion | op=httpRequestSend.cpp[620]:httpRequestSendWithCurl | msg=Notification Successfully Sent to http://<cepheus-cep>:8080/ngsi10/notifyContext
9/6/2018 5:12:57 PMtime=Thursday 06 Sep 11:42:57 2018.364Z | lvl=INFO | corr=N/A | trans=1534488995-284-00000000504 | from=pending | srv=pending | subsrv=pending | comp=Orion | op=logMsg.h[1916]:lmTransactionEnd | msg=Transaction ended

And these are my Cepheus-CEP log:

2018-09-06 17:12:56.550  INFO 10680 --- [nio-8080-exec-2] c.e.e.c.service.EPServiceProviderImpl    : Initializing engine URI 'testservice/testservicepath' version 5.3.0
2018-09-06 17:12:56.651  INFO 10680 --- [nio-8080-exec-2] c.o.cepheus.cep.EsperEventProcessor      : Apply configuration
2018-09-06 17:12:56.652  INFO 10680 --- [nio-8080-exec-2] c.o.cepheus.cep.EsperEventProcessor      : Add new event type: EventType{id='Room1', type='Room', isPattern=false, attributes=[Attribute{name='temperature', type='double', metadata=[], jsonpath='null'}, Attribute{name='floor', type='string', metadata=[], jsonpath='null'}]}
2018-09-06 17:12:56.682  INFO 10680 --- [nio-8080-exec-2] c.o.cepheus.cep.EsperEventProcessor      : Add new event type: EventType{id='FloorX', type='Floor', isPattern=false, attributes=[Attribute{name='temperature', type='double', metadata=[], jsonpath='null'}]}
2018-09-06 17:12:56.683  INFO 10680 --- [nio-8080-exec-2] c.o.cepheus.cep.EsperEventProcessor      : Add new statement: INSERT INTO Floor SELECT floor as id, avg(temperature) as temperature FROM Room.win:time(10 min) GROUP BY floor OUTPUT LAST EVERY 10 sec
2018-09-06 17:12:57.080  INFO 10680 --- [nio-8080-exec-2] c.o.c.cep.persistence.JsonPersistence    : Save configuration in C:\Users\<user-name>\AppData\Local\Temp\/cep-testservice-testservicepath.json
2018-09-06 17:12:57.082  INFO 10680 --- [taskScheduler-1] c.o.cepheus.cep.SubscriptionManager      : Launch of the periodic subscription task at 2018-09-06T11:42:57.081Z
2018-09-06 17:12:57.229  INFO 10680 --- [nio-8080-exec-3] c.e.e.c.service.EPServiceProviderImpl    : Initializing engine URI 'testprovider/test' version 5.3.0
2018-09-06 17:12:57.333  INFO 10680 --- [nio-8080-exec-3] c.o.cepheus.cep.EsperEventProcessor      : EventIn: Event{type='Room', values={temperature=30.0, id=Room1, floor=aaa}}
2018-09-06 17:12:57.339 ERROR 10680 --- [nio-8080-exec-3] c.o.c.cep.controller.NgsiController      : Event processing error: {}

com.orange.cepheus.cep.exception.EventProcessingException: Event type named 'Room' has not been defined or is not a Map event type, the name 'Room' has not been defined as an event type
	at com.orange.cepheus.cep.EsperEventProcessor.processEvent(EsperEventProcessor.java:190)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133)
	at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
	at com.sun.proxy.$Proxy46.processEvent(Unknown Source)
	at com.orange.cepheus.cep.controller.NgsiController.notifyContext(NgsiController.java:62)
	at com.orange.ngsi.server.NgsiBaseController.notifyContextRequest(NgsiBaseController.java:54)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration$ApplicationContextHeaderFilter.doFilterInternal(EndpointWebMvcAutoConfiguration.java:291)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at com.orange.cepheus.cep.tenant.TenantFilter.doFilter(TenantFilter.java:82)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:102)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration$MetricsFilter.doFilterInternal(MetricFilterAutoConfiguration.java:90)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659)
	at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Unknown Source)

Observations:

  1. Subscription is done for the entity.
  2. notifyContext is send to Cepheus-CEP from orion.
  3. On having EventIn NgsiController throws an Event processing error saying Event type named 'Room' has not been defined or is not a Map event type, the name 'Room' has not been defined as an event type.

Although if i remove serviceName, servicePath fromproviders section in configuration, the same request works fine and does not give any error.

Should it be concluded that there is no function for handling multi-tenant provider in configuration of multi-tenant Cepheus-CEP?

Issues which I refered are: #60 and #69

Using Cepheus

Hello,

i was looking for Espr4FastData and i found this. Is it good for production env ?
I will begin testing it soon this afternoon.

Cepheus-CEP multitenancy issue on filtering requests

I have made my cepheus-cep in mutitenant mode and then uploaded two config files with different servicepaths . Now , when i send any http request having the service and servicepath for either of the two tenants , the Cepheus-cep runs the last uploaded config file even if the servicepath in the incoming request is different . as far as i know , the cepheus-cep could filter the requests and accordingly run the config file corresponding to the service and servicepath in the request . I feel that the cepheus-cep caches only the last config file uploaded even in multitenancy mode .So What could be the issue in my case ??

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.