You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2014/09/23 18:46:02 UTC
svn commit: r1627086 - in /qpid/proton/trunk: proton-c/bindings/python/
proton-c/include/proton/ proton-c/src/
proton-j/src/main/java/org/apache/qpid/proton/messenger/impl/
proton-j/src/main/resources/
proton-j/src/test/java/org/apache/qpid/proton/mess...
Author: aconway
Date: Tue Sep 23 16:46:02 2014
New Revision: 1627086
URL: http://svn.apache.org/r1627086
Log:
PROTON-693: Implement C-API wrappers in Java for jython, clean up Url implementation.
- Java implementation of fake C API for Jython SWIG wrappers based on messenger.impl.Address.
- Minor extensions to Address.java
- Minor change to Address.java to be consistent with C parser on one corner case:
- is url("/foo") a host called "/foo" or an empty host and a path "foo"
- fixed Java parser to agree with C - path "foo"
- Rename getters from url_* to url_get_*.
- Use pn_string_t formatting functions to build URL string.
Added:
qpid/proton/trunk/proton-j/src/main/resources/curl.py
Modified:
qpid/proton/trunk/proton-c/bindings/python/proton.py
qpid/proton/trunk/proton-c/include/proton/url.h
qpid/proton/trunk/proton-c/src/url.c
qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/messenger/impl/Address.java
qpid/proton/trunk/proton-j/src/main/resources/cproton.py
qpid/proton/trunk/proton-j/src/test/java/org/apache/qpid/proton/messenger/impl/AddressTest.java
Modified: qpid/proton/trunk/proton-c/bindings/python/proton.py
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/bindings/python/proton.py?rev=1627086&r1=1627085&r2=1627086&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/bindings/python/proton.py (original)
+++ qpid/proton/trunk/proton-c/bindings/python/proton.py Tue Sep 23 16:46:02 2014
@@ -31,6 +31,7 @@ The proton APIs consist of the following
"""
from cproton import *
+
import weakref, re, socket
try:
import uuid
@@ -3718,7 +3719,7 @@ class Url(object):
class PartDescriptor(object):
def __init__(self, part):
- self.getter = globals()["pn_url_%s" % part]
+ self.getter = globals()["pn_url_get_%s" % part]
self.setter = globals()["pn_url_set_%s" % part]
def __get__(self, obj, type=None): return self.getter(obj._url)
def __set__(self, obj, value): return self.setter(obj._url, str(value))
@@ -3729,20 +3730,24 @@ class Url(object):
host = PartDescriptor('host')
path = PartDescriptor('path')
- @property
- def port(self):
- portstr = pn_url_port(self._url)
+ def _get_port(self):
+ portstr = pn_url_get_port(self._url)
return portstr and Url.Port(portstr)
- @port.setter
- def port(self, value):
+ def _set_port(self, value):
if value is None: pn_url_set_port(self._url, None)
else: pn_url_set_port(self._url, str(Url.Port(value)))
+ port = property(_get_port, _set_port)
+
def __str__(self): return pn_url_str(self._url)
def __repr__(self): return "Url(%r)" % str(self)
+ def __del__(self):
+ pn_url_free(self._url);
+ self._url = None
+
def defaults(self):
"""
Fill in missing values (scheme, host or port) with defaults
Modified: qpid/proton/trunk/proton-c/include/proton/url.h
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/include/proton/url.h?rev=1627086&r1=1627085&r2=1627086&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/include/proton/url.h (original)
+++ qpid/proton/trunk/proton-c/include/proton/url.h Tue Sep 23 16:46:02 2014
@@ -46,7 +46,12 @@ PN_EXTERN void pn_url_free(pn_url_t *url
/** Clear the contents of the URL. */
PN_EXTERN void pn_url_clear(pn_url_t *url);
-/** Return the string form of a URL. Owned by the pn_url_t.*/
+/**
+ * Return the string form of a URL.
+ *
+ * The returned string is owned by the pn_url_t and will become invalid if it
+ * is modified.
+ */
PN_EXTERN const char *pn_url_str(pn_url_t *url);
/**
@@ -56,12 +61,12 @@ PN_EXTERN const char *pn_url_str(pn_url_
*
*@{
*/
-PN_EXTERN const char *pn_url_scheme(pn_url_t *url);
-PN_EXTERN const char *pn_url_username(pn_url_t *url);
-PN_EXTERN const char *pn_url_password(pn_url_t *url);
-PN_EXTERN const char *pn_url_host(pn_url_t *url);
-PN_EXTERN const char *pn_url_port(pn_url_t *url);
-PN_EXTERN const char *pn_url_path(pn_url_t *url);
+PN_EXTERN const char *pn_url_get_scheme(pn_url_t *url);
+PN_EXTERN const char *pn_url_get_username(pn_url_t *url);
+PN_EXTERN const char *pn_url_get_password(pn_url_t *url);
+PN_EXTERN const char *pn_url_get_host(pn_url_t *url);
+PN_EXTERN const char *pn_url_get_port(pn_url_t *url);
+PN_EXTERN const char *pn_url_get_path(pn_url_t *url);
///@}
/**
Modified: qpid/proton/trunk/proton-c/src/url.c
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-c/src/url.c?rev=1627086&r1=1627085&r2=1627086&view=diff
==============================================================================
--- qpid/proton/trunk/proton-c/src/url.c (original)
+++ qpid/proton/trunk/proton-c/src/url.c Tue Sep 23 16:46:02 2014
@@ -20,6 +20,7 @@
*/
#include "proton/url.h"
+#include "proton/object.h"
#include "proton/util.h"
#include "platform.h"
@@ -29,7 +30,7 @@
static char* copy(const char* str) {
if (str == NULL) return NULL;
- char *str2 = (char*)malloc(strlen(str));
+ char *str2 = (char*)malloc(strlen(str)+1);
if (str2) strcpy(str2, str);
return str2;
}
@@ -41,12 +42,13 @@ struct pn_url_t {
char *host;
char *port;
char *path;
- char *str;
+ pn_string_t *str;
};
PN_EXTERN pn_url_t *pn_url() {
pn_url_t *url = (pn_url_t*)malloc(sizeof(pn_url_t));
- memset(url, 0, sizeof(*url));
+ if (url) memset(url, 0, sizeof(*url));
+ url->str = pn_string("");
return url;
}
@@ -59,7 +61,7 @@ PN_EXTERN pn_url_t *pn_url_parse(const c
return NULL;
pn_url_t *url = pn_url();
- char *str2 = copy(str); /* FIXME aconway 2014-09-19: clean up */
+ char *str2 = copy(str);
pni_parse_url(str2, &url->scheme, &url->username, &url->password, &url->host, &url->port, &url->path);
url->scheme = copy(url->scheme);
url->username = copy(url->username);
@@ -67,56 +69,53 @@ PN_EXTERN pn_url_t *pn_url_parse(const c
url->host = (url->host && !*url->host) ? NULL : copy(url->host);
url->port = copy(url->port);
url->path = copy(url->path);
+
+ free(str2);
return url;
}
/** Free a URL */
PN_EXTERN void pn_url_free(pn_url_t *url) {
pn_url_clear(url);
+ pn_free(url->str);
free(url);
}
/** Clear the contents of the URL. */
PN_EXTERN void pn_url_clear(pn_url_t *url) {
+ pn_url_set_scheme(url, NULL);
pn_url_set_username(url, NULL);
pn_url_set_password(url, NULL);
pn_url_set_host(url, NULL);
pn_url_set_port(url, NULL);
pn_url_set_path(url, NULL);
- free(url->str); url->str = NULL;
+ pn_string_clear(url->str);
}
static inline int len(const char *str) { return str ? strlen(str) : 0; }
/** Return the string form of a URL. */
PN_EXTERN const char *pn_url_str(pn_url_t *url) {
- int size = len(url->scheme) + len(url->username) + len(url->password)
- + len(url->host) + len(url->port) + len(url->path)
- + len("s://u:p@[h]:p/p");
- free(url->str);
- url->str = (char*)malloc(size);
- if (!url->str) return NULL;
-
- int i = 0;
- if (url->scheme) i += snprintf(url->str+i, size-i, "%s://", url->scheme);
- if (url->username) i += snprintf(url->str+i, size-i, "%s", url->username);
- if (url->password) i += snprintf(url->str+i, size-i, ":%s", url->password);
- if (url->username || url->password) i += snprintf(url->str+i, size-i, "@");
+ pn_string_set(url->str, "");
+ if (url->scheme) pn_string_addf(url->str, "%s://", url->scheme);
+ if (url->username) pn_string_addf(url->str, "%s", url->username);
+ if (url->password) pn_string_addf(url->str, ":%s", url->password);
+ if (url->username || url->password) pn_string_addf(url->str, "@");
if (url->host) {
- if (strchr(url->host, ':')) i += snprintf(url->str+i, size-i, "[%s]", url->host);
- else i += snprintf(url->str+i, size-i, "%s", url->host);
+ if (strchr(url->host, ':')) pn_string_addf(url->str, "[%s]", url->host);
+ else pn_string_addf(url->str, "%s", url->host);
}
- if (url->port) i += snprintf(url->str+i, size-i, ":%s", url->port);
- if (url->path) i += snprintf(url->str+i, size-i, "/%s", url->path);
- return url->str;
+ if (url->port) pn_string_addf(url->str, ":%s", url->port);
+ if (url->path) pn_string_addf(url->str, "/%s", url->path);
+ return pn_string_get(url->str);
}
-PN_EXTERN const char *pn_url_scheme(pn_url_t *url) { return url->scheme; }
-PN_EXTERN const char *pn_url_username(pn_url_t *url) { return url->username; }
-PN_EXTERN const char *pn_url_password(pn_url_t *url) { return url->password; }
-PN_EXTERN const char *pn_url_host(pn_url_t *url) { return url->host; }
-PN_EXTERN const char *pn_url_port(pn_url_t *url) { return url->port; }
-PN_EXTERN const char *pn_url_path(pn_url_t *url) { return url->path; }
+PN_EXTERN const char *pn_url_get_scheme(pn_url_t *url) { return url->scheme; }
+PN_EXTERN const char *pn_url_get_username(pn_url_t *url) { return url->username; }
+PN_EXTERN const char *pn_url_get_password(pn_url_t *url) { return url->password; }
+PN_EXTERN const char *pn_url_get_host(pn_url_t *url) { return url->host; }
+PN_EXTERN const char *pn_url_get_port(pn_url_t *url) { return url->port; }
+PN_EXTERN const char *pn_url_get_path(pn_url_t *url) { return url->path; }
#define SET(part) free(url->part); url->part = copy(part)
PN_EXTERN void pn_url_set_scheme(pn_url_t *url, const char *scheme) { SET(scheme); }
Modified: qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/messenger/impl/Address.java
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/messenger/impl/Address.java?rev=1627086&r1=1627085&r2=1627086&view=diff
==============================================================================
--- qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/messenger/impl/Address.java (original)
+++ qpid/proton/trunk/proton-j/src/main/java/org/apache/qpid/proton/messenger/impl/Address.java Tue Sep 23 16:46:02 2014
@@ -26,7 +26,7 @@ package org.apache.qpid.proton.messenger
*
*/
-class Address
+public class Address
{
private String _address;
@@ -38,13 +38,7 @@ class Address
private String _port;
private String _name;
- public Address(String address)
- {
- _address = address;
- parse();
- }
-
- private void parse()
+ public void clear()
{
_passive = false;
_scheme = null;
@@ -53,21 +47,30 @@ class Address
_host = null;
_port = null;
_name = null;
+ }
+
+ public Address()
+ {
+ clear();
+ }
+ public Address(String address)
+ {
+ clear();
int start = 0;
- int schemeEnd = _address.indexOf("://", start);
+ int schemeEnd = address.indexOf("://", start);
if (schemeEnd >= 0) {
- _scheme = _address.substring(start, schemeEnd);
+ _scheme = address.substring(start, schemeEnd);
start = schemeEnd + 3;
}
String uphp;
- int slash = _address.indexOf("/", start);
- if (slash > 0) {
- uphp = _address.substring(start, slash);
- _name = _address.substring(slash + 1);
+ int slash = address.indexOf("/", start);
+ if (slash >= 0) {
+ uphp = address.substring(start, slash);
+ _name = address.substring(slash + 1);
} else {
- uphp = _address.substring(start);
+ uphp = address.substring(start);
}
String hp;
@@ -115,7 +118,18 @@ class Address
public String toString()
{
- return _address;
+ String str = new String();
+ if (_scheme != null) str += _scheme + "://";
+ if (_user != null) str += _user;
+ if (_pass != null) str += ":" + _pass;
+ if (_user != null || _pass != null) str += "@";
+ if (_host != null) {
+ if (_host.contains(":")) str += "[" + _host + "]";
+ else str += _host;
+ }
+ if (_port != null) str += ":" + _port;
+ if (_name != null) str += "/" + _name;
+ return str;
}
public boolean isPassive()
@@ -168,4 +182,33 @@ class Address
return _name;
}
+ public void setScheme(String scheme)
+ {
+ _scheme= scheme;
+ }
+
+ public void setUser(String user)
+ {
+ _user= user;
+ }
+
+ public void setPass(String pass)
+ {
+ _pass= pass;
+ }
+
+ public void setHost(String host)
+ {
+ _host= host;
+ }
+
+ public void setPort(String port)
+ {
+ _port= port;
+ }
+
+ public void setName(String name)
+ {
+ _name= name;
+ }
}
Modified: qpid/proton/trunk/proton-j/src/main/resources/cproton.py
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/src/main/resources/cproton.py?rev=1627086&r1=1627085&r2=1627086&view=diff
==============================================================================
--- qpid/proton/trunk/proton-j/src/main/resources/cproton.py (original)
+++ qpid/proton/trunk/proton-j/src/main/resources/cproton.py Tue Sep 23 16:46:02 2014
@@ -36,3 +36,4 @@ from cssl import *
from cdriver import *
from cmessenger import *
from cmessage import *
+from curl import *
Added: qpid/proton/trunk/proton-j/src/main/resources/curl.py
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/src/main/resources/curl.py?rev=1627086&view=auto
==============================================================================
--- qpid/proton/trunk/proton-j/src/main/resources/curl.py (added)
+++ qpid/proton/trunk/proton-j/src/main/resources/curl.py Tue Sep 23 16:46:02 2014
@@ -0,0 +1,47 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License
+#
+
+from org.apache.qpid.proton.messenger.impl import Address
+
+def pn_url():
+ return Address()
+
+def pn_url_parse(urlstr):
+ return Address(urlstr)
+
+def pn_url_free(url): pass
+
+def pn_url_clear(url):
+ url.clear();
+
+def pn_url_str(url): return url.toString()
+
+def pn_url_get_scheme(url): return url.getScheme()
+def pn_url_get_username(url): return url.getUser()
+def pn_url_get_password(url): return url.getPass()
+def pn_url_get_host(url): return url.getHost() or None
+def pn_url_get_port(url): return url.getPort()
+def pn_url_get_path(url): return url.getName()
+
+def pn_url_set_scheme(url, value): url.setScheme(value)
+def pn_url_set_username(url, value): url.setUser(value)
+def pn_url_set_password(url, value): url.setPass(value)
+def pn_url_set_host(url, value): url.setHost(value)
+def pn_url_set_port(url, value): url.setPort(value)
+def pn_url_set_path(url, value): url.setName(value)
Modified: qpid/proton/trunk/proton-j/src/test/java/org/apache/qpid/proton/messenger/impl/AddressTest.java
URL: http://svn.apache.org/viewvc/qpid/proton/trunk/proton-j/src/test/java/org/apache/qpid/proton/messenger/impl/AddressTest.java?rev=1627086&r1=1627085&r2=1627086&view=diff
==============================================================================
--- qpid/proton/trunk/proton-j/src/test/java/org/apache/qpid/proton/messenger/impl/AddressTest.java (original)
+++ qpid/proton/trunk/proton-j/src/test/java/org/apache/qpid/proton/messenger/impl/AddressTest.java Tue Sep 23 16:46:02 2014
@@ -6,24 +6,25 @@ import org.junit.Test;
public class AddressTest {
- private void testParse(String url, String scheme, String user, String pass, String host, String port, String name)
- {
- Address address = new Address(url);
- assertEquals(scheme, address.getScheme());
- assertEquals(user, address.getUser());
- assertEquals(pass, address.getPass());
- assertEquals(host, address.getHost());
- assertEquals(port, address.getPort());
- }
+ private void testParse(String url, String scheme, String user, String pass, String host, String port, String name)
+ {
+ Address address = new Address(url);
+ assertEquals(scheme, address.getScheme());
+ assertEquals(user, address.getUser());
+ assertEquals(pass, address.getPass());
+ assertEquals(host, address.getHost());
+ assertEquals(port, address.getPort());
+ assertEquals(url, address.toString());
+ }
- @Test
- public void addressTests()
- {
- testParse("host", null, null, null, "host", null, null);
- testParse("host:423", null, null, null, "host", "423", null);
- testParse("user@host", null, "user", null, "host", null, null);
- testParse("user:1243^&^:pw@host:423", null, "user", "1243^&^:pw", "host", "423", null);
- testParse("user:1243^&^:pw@host:423/Foo.bar:90087", null, "user", "1243^&^:pw", "host", "423", "Foo.bar:90087");
+ @Test
+ public void addressTests()
+ {
+ testParse("host", null, null, null, "host", null, null);
+ testParse("host:423", null, null, null, "host", "423", null);
+ testParse("user@host", null, "user", null, "host", null, null);
+ testParse("user:1243^&^:pw@host:423", null, "user", "1243^&^:pw", "host", "423", null);
+ testParse("user:1243^&^:pw@host:423/Foo.bar:90087", null, "user", "1243^&^:pw", "host", "423", "Foo.bar:90087");
testParse("user:1243^&^:pw@host:423/Foo.bar:90087@somewhere", null, "user", "1243^&^:pw", "host", "423", "Foo.bar:90087@somewhere");
testParse("[::1]", null, null, null, "::1", null, null);
testParse("[::1]:amqp", null, null, null, "::1", "amqp", null);
@@ -38,14 +39,13 @@ public class AddressTest {
testParse("amqp://user@[1234:52:0:1260:f2de:f1ff:fe59:8f87]:amqp", "amqp", "user", null, "1234:52:0:1260:f2de:f1ff:fe59:8f87", "amqp", null);
testParse("amqp://user:1243^&^:pw@[::1]:amqp", "amqp", "user", "1243^&^:pw", "::1", "amqp", null);
testParse("amqp://user:1243^&^:pw@[::1]:amqp/Foo.bar:90087", "amqp", "user", "1243^&^:pw", "::1", "amqp", "Foo.bar:90087");
- testParse("amqp://host", "amqp", null, null, "host", null, null);
- testParse("amqp://user@host", "amqp", "user", null, "host", null, null);
- testParse("amqp://user@host/path:%", "amqp", "user", null, "host", null, "path:%");
- testParse("amqp://user@host:5674/path:%", "amqp", "user", null, "host", "5674", "path:%");
- testParse("amqp://user@host/path:%", "amqp", "user", null, "host", null, "path:%");
- testParse("amqp://bigbird@host/queue@host", "amqp", "bigbird", null, "host", null, "queue@host");
- testParse("amqp://host/queue@host", "amqp", null, null, "host", null, "queue@host");
- testParse("amqp://host:9765/queue@host", "amqp", null, null, "host", "9765", "queue@host");
- }
-
+ testParse("amqp://host", "amqp", null, null, "host", null, null);
+ testParse("amqp://user@host", "amqp", "user", null, "host", null, null);
+ testParse("amqp://user@host/path:%", "amqp", "user", null, "host", null, "path:%");
+ testParse("amqp://user@host:5674/path:%", "amqp", "user", null, "host", "5674", "path:%");
+ testParse("amqp://user@host/path:%", "amqp", "user", null, "host", null, "path:%");
+ testParse("amqp://bigbird@host/queue@host", "amqp", "bigbird", null, "host", null, "queue@host");
+ testParse("amqp://host/queue@host", "amqp", null, null, "host", null, "queue@host");
+ testParse("amqp://host:9765/queue@host", "amqp", null, null, "host", "9765", "queue@host");
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org