Author: pnoltes
Date: Tue Oct  8 19:26:44 2013
New Revision: 1530401

URL: http://svn.apache.org/r1530401
Log:
CELIX-89:
- Aligned RSA, endpoint,proxy, example service and discovery with amdatu remote 
services.
- Updated discovery to that added endpoint listeners will be informed about 
existing discovered endpoints.

Modified:
    
incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery.c
    
incubator/celix/trunk/remote_services/example_endpoint/private/src/example_endpoint_impl.c
    
incubator/celix/trunk/remote_services/example_proxy/private/src/example_proxy_impl.c
    
incubator/celix/trunk/remote_services/example_service/public/include/example_service.h
    
incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_impl.c

Modified: 
incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery.c
URL: 
http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery.c?rev=1530401&r1=1530400&r2=1530401&view=diff
==============================================================================
--- 
incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery.c 
(original)
+++ 
incubator/celix/trunk/remote_services/discovery_bonjour/private/src/discovery.c 
Tue Oct  8 19:26:44 2013
@@ -126,7 +126,7 @@ celix_status_t discovery_create(apr_pool
                char *port = NULL;
                bundleContext_getProperty(context, "DISCOVERY_PORT", &port);
                if (port == NULL) {
-                       (*discovery)->discoveryPort = DEFAULT_DISCOVERY_PORT;
+                       (*discovery)->discoveryPort = (char 
*)DEFAULT_DISCOVERY_PORT;
                } else {
                        (*discovery)->discoveryPort = apr_pstrdup(pool, port);
                }
@@ -316,6 +316,27 @@ celix_status_t discovery_endpointListene
                printf("DISCOVERY: EndpointListener Ignored - Discovery 
listener\n");
        } else {
                printf("DISCOVERY: EndpointListener Added - Add Scope\n");
+
+               apr_thread_mutex_lock(discovery->discoveredServicesMutex);
+               if (discovery->discoveredServices != NULL) {
+                       hash_map_iterator_pt iter = 
hashMapIterator_create(discovery->discoveredServices);
+                       while (hashMapIterator_hasNext(iter)) {
+                               endpoint_description_pt endpoint = 
hashMapIterator_nextKey(iter);
+                               endpoint_listener_pt listener = service;
+
+                               char *scope = properties_get(serviceProperties,
+                               (char *) ENDPOINT_LISTENER_SCOPE);
+                               filter_pt filter = filter_create(scope, 
discovery->pool); //FIXME memory leak
+                               bool matchResult = false;
+                               filter_match(filter, endpoint->properties, 
&matchResult);
+                               if (matchResult) {
+                                       listener->endpointAdded(listener, 
endpoint, NULL);
+                               }
+                       }
+                       hashMapIterator_destroy(iter);
+               }
+               apr_thread_mutex_unlock(discovery->discoveredServicesMutex);
+
                apr_thread_mutex_lock(discovery->listenerReferencesMutex);
                if (discovery->listenerReferences != NULL) {
                        hashMap_put(discovery->listenerReferences, reference, 
NULL /*TODO is the scope value needed?*/);
@@ -441,21 +462,21 @@ static void discovery_resolveAddCallback
                properties_set(props, key, valueBuf);
        }
 
-       //check if framework uuid is not this framework uuid
-       char *endpointUuid = properties_get(props, (char 
*)ENDPOINT_FRAMEWORK_UUID);
+       char *endpointFrameworkUuid = properties_get(props, (char 
*)ENDPOINT_FRAMEWORK_UUID);
 
-       if (endpointUuid == NULL) {
+       if (endpointFrameworkUuid == NULL) {
                printf("DISCOVERY: Cannot process endpoint, no %s property\n", 
ENDPOINT_FRAMEWORK_UUID);
-       } else if (strcmp(endpointUuid, discovery->frameworkUuid) != 0) {
+       } else if (strcmp(endpointFrameworkUuid, discovery->frameworkUuid) != 
0) {
                apr_pool_t *childPool = NULL;
                apr_pool_create(&childPool, discovery->pool);
                discovered_endpoint_entry_pt entry = apr_palloc(childPool, 
sizeof(*entry));
                endpoint_description_pt endpoint = apr_palloc(childPool, 
sizeof(*endpoint));
-               //FIXME endpoint id for http should be the url
-//             endpoint->id = apr_pstrdup(childPool, fullname);
-               endpoint->id = properties_get(props, "url");
-               endpoint->serviceId = 0 /*TODO*/;
-               endpoint->service = properties_get(props, "service");
+
+               char *serviceId = properties_get(props, "endpoint.service.id");
+
+               endpoint->id = properties_get(props, "endpoint.id");
+               endpoint->serviceId = serviceId == NULL? 0 : atol(serviceId);
+               endpoint->service = properties_get(props, "objectClass");
                endpoint->properties = props;
 
                entry->pool = childPool;

Modified: 
incubator/celix/trunk/remote_services/example_endpoint/private/src/example_endpoint_impl.c
URL: 
http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/example_endpoint/private/src/example_endpoint_impl.c?rev=1530401&r1=1530400&r2=1530401&view=diff
==============================================================================
--- 
incubator/celix/trunk/remote_services/example_endpoint/private/src/example_endpoint_impl.c
 (original)
+++ 
incubator/celix/trunk/remote_services/example_endpoint/private/src/example_endpoint_impl.c
 Tue Oct  8 19:26:44 2013
@@ -85,14 +85,14 @@ celix_status_t exampleEndpoint_add(remot
        } else {
                double a;
                double b;
-               json_unpack(root, "{s:f, s:f}", "a", &a, "b", &b);
+               json_unpack(root, "{s:f, s:f}", "arg0", &a, "arg1", &b);
 
                if (ep->service != NULL) {
                        double result;
                        json_t *resultRoot;
                        example_service_pt service = ep->service;
                        service->add(service->example, a, b, &result);
-                       resultRoot = json_pack("{s:f}", "result", result);
+                       resultRoot = json_pack("[f]", result);
 
                        char *c = json_dumps(resultRoot, JSON_ENCODE_ANY);
                        *reply = c;
@@ -116,14 +116,14 @@ celix_status_t exampleEndpoint_sub(remot
        } else {
                double a;
                double b;
-               json_unpack(root, "{s:f, s:f}", "a", &a, "b", &b);
+               json_unpack(root, "{s:f, s:f}", "arg0", &a, "arg1", &b);
 
                if (ep->service != NULL) {
                        double result;
                        json_t *resultRoot;
                        example_service_pt service = ep->service;
                        service->sub(service->example, a, b, &result);
-                       resultRoot = json_pack("{s:f}", "result", result);
+                       resultRoot = json_pack("[f]", result);
 
                        char *c = json_dumps(resultRoot, JSON_ENCODE_ANY);
                        *reply = c;
@@ -146,14 +146,14 @@ celix_status_t exampleEndpoint_sqrt(remo
                status = CELIX_ILLEGAL_ARGUMENT;
        } else {
                double a;
-               json_unpack(root, "{s:f}", "a", &a);
+               json_unpack(root, "{s:f}", "arg0", &a);
 
                if (ep->service != NULL) {
                        double result;
                        json_t *resultRoot;
                        example_service_pt service = ep->service;
                        service->sqrt(service->example, a, &result);
-                       resultRoot = json_pack("{s:f}", "result", result);
+                       resultRoot = json_pack("[f]", result);
 
                        char *c = json_dumps(resultRoot, JSON_ENCODE_ANY);
                        *reply = c;

Modified: 
incubator/celix/trunk/remote_services/example_proxy/private/src/example_proxy_impl.c
URL: 
http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/example_proxy/private/src/example_proxy_impl.c?rev=1530401&r1=1530400&r2=1530401&view=diff
==============================================================================
--- 
incubator/celix/trunk/remote_services/example_proxy/private/src/example_proxy_impl.c
 (original)
+++ 
incubator/celix/trunk/remote_services/example_proxy/private/src/example_proxy_impl.c
 Tue Oct  8 19:26:44 2013
@@ -67,12 +67,12 @@ celix_status_t exampleProxy_add(example_
        celix_status_t status = CELIX_SUCCESS;
 
        if (example->endpoint != NULL) {
-               char *serviceUrl = 
properties_get(example->endpoint->properties, "url");
+               char *serviceUrl = 
properties_get(example->endpoint->properties, ".ars.alias");
                printf("CALCULATOR_PROXY: URL: %s\n", serviceUrl);
                char *url = apr_pstrcat(example->pool, serviceUrl, "/add", 
NULL);
 
                json_t *root;
-               root = json_pack("{s:f, s:f}", "a", a, "b", b);
+               root = json_pack("{s:f, s:f}", "arg0", a, "arg1", b);
 
                struct post post;
                char *data = json_dumps(root, 0);
@@ -87,7 +87,7 @@ celix_status_t exampleProxy_add(example_
                if (status == CELIX_SUCCESS) {
                        json_error_t jsonError;
                        json_t *reply = json_loads(get.writeptr, 0, &jsonError);
-                       json_unpack(reply, "{s:f}", "result", result);
+                       json_unpack(reply, "[f]", result);
                }
        } else {
                printf("CALCULATOR_PROXY: No endpoint information available\n");
@@ -103,7 +103,7 @@ celix_status_t exampleProxy_sub(example_
                char *url = apr_pstrcat(example->pool, example->endpoint->id, 
"/sub", NULL);
 
                json_t *root;
-               root = json_pack("{s:f, s:f}", "a", a, "b", b);
+               root = json_pack("{s:f, s:f}", "arg0", a, "arg1", b);
 
                struct post post;
                char *data = json_dumps(root, 0);
@@ -118,7 +118,7 @@ celix_status_t exampleProxy_sub(example_
                if (status == CELIX_SUCCESS) {
                        json_error_t jsonError;
                        json_t *reply = json_loads(get.writeptr, 0, &jsonError);
-                       json_unpack(reply, "{s:f}", "result", result);
+                       json_unpack(reply, "[f]", "result", result);
                }
        } else {
                printf("CALCULATOR_PROXY: No endpoint information available\n");
@@ -134,7 +134,7 @@ celix_status_t exampleProxy_sqrt(example
                char *url = apr_pstrcat(example->pool, example->endpoint->id, 
"/sqrt", NULL);
 
                json_t *root;
-               root = json_pack("{s:f}", "a", a);
+               root = json_pack("{s:f}", "arg0", a);
 
                struct post post;
                char *data = json_dumps(root, 0);
@@ -149,7 +149,7 @@ celix_status_t exampleProxy_sqrt(example
                if (status == CELIX_SUCCESS) {
                        json_error_t jsonError;
                        json_t *reply = json_loads(get.writeptr, 0, &jsonError);
-                       json_unpack(reply, "{s:f}", "result", result);
+                       json_unpack(reply, "[f]", "result", result);
                }
        } else {
                printf("CALCULATOR_PROXY: No endpoint information available\n");

Modified: 
incubator/celix/trunk/remote_services/example_service/public/include/example_service.h
URL: 
http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/example_service/public/include/example_service.h?rev=1530401&r1=1530400&r2=1530401&view=diff
==============================================================================
--- 
incubator/celix/trunk/remote_services/example_service/public/include/example_service.h
 (original)
+++ 
incubator/celix/trunk/remote_services/example_service/public/include/example_service.h
 Tue Oct  8 19:26:44 2013
@@ -27,7 +27,7 @@
 #ifndef EXAMPLE_SERVICE_H_
 #define EXAMPLE_SERVICE_H_
 
-#define EXAMPLE_SERVICE "example"
+#define EXAMPLE_SERVICE "org.example.api.Calculator"
 
 typedef struct example *example_pt;
 

Modified: 
incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_impl.c
URL: 
http://svn.apache.org/viewvc/incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_impl.c?rev=1530401&r1=1530400&r2=1530401&view=diff
==============================================================================
--- 
incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_impl.c
 (original)
+++ 
incubator/celix/trunk/remote_services/remote_service_admin/private/src/remote_service_admin_impl.c
 Tue Oct  8 19:26:44 2013
@@ -27,6 +27,7 @@
 #include <stdlib.h>
 
 #include <apr_strings.h>
+#include <apr_uuid.h>
 
 #include "remote_service_admin_impl.h"
 #include "export_registration_impl.h"
@@ -125,20 +126,22 @@ static int remoteServiceAdmin_callback(s
                printf("REMOTE_SERVICE_ADMIN: Handle request: %s\n", 
request_info->uri);
                remote_service_admin_pt rsa = request_info->user_data;
 
-               if (strncmp(request_info->uri, "/services/", 10) == 0) {
+               if (strncmp(request_info->uri, "/service/", 9) == 0) {
                        // uri = /services/myservice/call
                        const char *uri = request_info->uri;
                        // rest = myservice/call
-                       const char *rest = uri+10;
+                       const char *rest = uri+9;
                        int length = strlen(rest);
-                       char *callStart = strchr(rest, '/');
-                       int pos = callStart - rest;
+                       char *interfaceStart = strchr(rest, '/');
+                       char *callStart = strchr(interfaceStart+1, '/');
+                       int pos = interfaceStart - rest;
                        char service[pos+1];
                        strncpy(service, rest, pos);
                        service[pos] = '\0';
 
-                       char request[length - pos];
-                       strncpy(request, rest + pos + 1, length - pos);
+//                     printf("Got service %s, interfaceStart is %s and 
callStart is %s\n", service, interfaceStart, callStart);
+
+                       char *request = callStart+1;
 
                        const char *lengthStr = mg_get_header(conn, (const char 
*) "Content-Length");
                        int datalength = apr_atoi64(lengthStr);
@@ -153,7 +156,8 @@ static int remoteServiceAdmin_callback(s
                                int expIt = 0;
                                for (expIt = 0; expIt < 
arrayList_size(exports); expIt++) {
                                        export_registration_pt export = 
arrayList_get(exports, expIt);
-                                       if (strcmp(service, 
export->endpointDescription->service) == 0) {
+                                       long serviceId = atol(service);
+                                       if (serviceId == 
export->endpointDescription->serviceId) {
                                                char *reply = NULL;
                                                
export->endpoint->handleRequest(export->endpoint->endpoint, request, data, 
&reply);
                                                if (reply != NULL) {
@@ -286,18 +290,23 @@ celix_status_t remoteServiceAdmin_instal
                properties_set(endpointProperties, key, value);
        }
        char *serviceId = (char *) hashMap_remove(endpointProperties, (void *) 
SERVICE_ID);
-       properties_set(endpointProperties, (char *) OBJECTCLASS, interface);
-       properties_set(endpointProperties, (char *) ENDPOINT_SERVICE_ID, 
serviceId);
        char *uuid = NULL;
        bundleContext_getProperty(admin->context, FRAMEWORK_UUID, &uuid);
+       properties_set(endpointProperties, (char *) OBJECTCLASS, interface);
+       properties_set(endpointProperties, (char *) ENDPOINT_SERVICE_ID, 
serviceId);
+       properties_set(endpointProperties, "service.imported", "true");
        properties_set(endpointProperties, (char *) ENDPOINT_FRAMEWORK_UUID, 
uuid);
-       char *service = "/services/example";
-       properties_set(endpointProperties, (char *) SERVICE_LOCATION, 
apr_pstrdup(admin->pool, service));
-    
+
+//    properties_set(endpointProperties, ".ars.path", buf);
+//    properties_set(endpointProperties, ".ars.port", admin->port);
+
+       char buf[512];
+       sprintf(buf, "/service/%s/%s", serviceId, interface);
     char *url = NULL;
-    constructServiceUrl(admin,interface, &url);
-    printf("url is %s\n", url);
-    properties_set(endpointProperties, "url", url);
+    constructServiceUrl(admin,buf, &url);
+    properties_set(endpointProperties, ".ars.alias", url);
+
+    properties_set(endpointProperties, "service.imported.configs", ".ars");
 
        endpoint_description_pt endpointDescription = NULL;
        remoteServiceAdmin_createEndpointDescription(admin, serviceProperties, 
endpointProperties, interface, &endpointDescription);
@@ -328,7 +337,7 @@ static celix_status_t constructServiceUr
                                if (stat != APR_SUCCESS) {
                                        status = CELIX_BUNDLE_EXCEPTION;
                                } else {
-                                       *serviceUrl = apr_pstrcat(admin->pool, 
"http://";, ip, ":", admin->port, "/services/", service,  NULL );
+                                       *serviceUrl = apr_pstrcat(admin->pool, 
"http://";, ip, ":", admin->port, service, NULL );
                                }
                        }
                }
@@ -344,7 +353,7 @@ celix_status_t remoteServiceAdmin_create
        celix_status_t status = CELIX_SUCCESS;
 
        apr_pool_t *childPool = NULL;
-       apr_pool_create(&childPool, admin->pool);
+       apr_pool_create(&childPool, admin->pool); //TODO pool should be 
destroyed after when endpoint is removed
 
        *description = apr_palloc(childPool, sizeof(*description));
 //     *description = malloc(sizeof(*description));
@@ -357,7 +366,7 @@ celix_status_t remoteServiceAdmin_create
                        (*description)->properties = endpointProperties;
                        (*description)->frameworkUUID = uuid;
                        (*description)->serviceId = 
apr_atoi64(properties_get(serviceProperties, (char *) SERVICE_ID));
-                       (*description)->id = properties_get(endpointProperties, 
(char *) SERVICE_LOCATION);
+                       (*description)->id = apr_pstrdup(childPool, "TODO"); // 
does not work, txt record to big ?? --> apr_pstrcat(childPool, uuid, "-", 
(*description)->serviceId, NULL);
                        (*description)->service = interface;
                }
        }


Reply via email to