first round of filling out jython shims; most of the python reactor examples pass in jython now with the exception of the ones that depend on file descriptors and tornado
Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/a3d9d433 Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/a3d9d433 Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/a3d9d433 Branch: refs/heads/master Commit: a3d9d43383ba262df78502dda1e0009aea519141 Parents: 2d3cefc Author: Rafael Schloming <r...@alum.mit.edu> Authored: Thu Jun 18 06:35:06 2015 -0400 Committer: Rafael Schloming <r...@alum.mit.edu> Committed: Thu Jun 18 06:35:06 2015 -0400 ---------------------------------------------------------------------- .../apache/qpid/proton/engine/BaseHandler.java | 8 +++ .../org/apache/qpid/proton/engine/Delivery.java | 2 +- .../org/apache/qpid/proton/engine/Event.java | 2 +- .../org/apache/qpid/proton/engine/Record.java | 1 + .../qpid/proton/engine/impl/DeliveryImpl.java | 7 +++ .../qpid/proton/engine/impl/EventImpl.java | 10 +++ .../qpid/proton/engine/impl/RecordImpl.java | 8 +++ .../qpid/proton/message/impl/MessageImpl.java | 20 ++++++ proton-j/src/main/resources/ccodec.py | 2 +- proton-j/src/main/resources/cengine.py | 25 ++++---- proton-j/src/main/resources/chandlers.py | 17 ++++- proton-j/src/main/resources/cmessage.py | 3 + proton-j/src/main/resources/cobject.py | 33 +++++++++- proton-j/src/main/resources/compat.py | 8 +++ proton-j/src/main/resources/cproton.py | 1 + proton-j/src/main/resources/creactor.py | 65 +++++++++++++++++++- proton-j/src/main/resources/csasl.py | 2 +- proton-j/src/main/resources/ctypes.py | 21 +++++++ 18 files changed, 212 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a3d9d433/proton-j/src/main/java/org/apache/qpid/proton/engine/BaseHandler.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/BaseHandler.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/BaseHandler.java index 02e10d5..c9c5d51 100644 --- a/proton-j/src/main/java/org/apache/qpid/proton/engine/BaseHandler.java +++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/BaseHandler.java @@ -32,6 +32,14 @@ import java.util.Iterator; public class BaseHandler implements Handler { + public static Handler getHandler(Record r) { + return r.get(Handler.class, Handler.class); + } + + public static void setHandler(Record r, Handler handler) { + r.set(Handler.class, Handler.class, handler); + } + public static Handler getHandler(Extendable ext) { return ext.attachments().get(Handler.class, Handler.class); } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a3d9d433/proton-j/src/main/java/org/apache/qpid/proton/engine/Delivery.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/Delivery.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/Delivery.java index e42e56e..d08efc2 100644 --- a/proton-j/src/main/java/org/apache/qpid/proton/engine/Delivery.java +++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/Delivery.java @@ -28,7 +28,7 @@ import org.apache.qpid.proton.amqp.transport.DeliveryState; * Whilst a message is logically a long-lived object, a delivery is short-lived - it * is only intended to be used by the application until it is settled and all its data has been read. */ -public interface Delivery +public interface Delivery extends Extendable { public byte[] getTag(); http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a3d9d433/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java index d69b282..743b6d0 100644 --- a/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java +++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/Event.java @@ -30,7 +30,7 @@ import org.apache.qpid.proton.reactor.Task; * */ -public interface Event +public interface Event extends Extendable { public enum Type { http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a3d9d433/proton-j/src/main/java/org/apache/qpid/proton/engine/Record.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/Record.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/Record.java index 1496449..e97948d 100644 --- a/proton-j/src/main/java/org/apache/qpid/proton/engine/Record.java +++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/Record.java @@ -31,5 +31,6 @@ public interface Record <T> T get(Object key, Class<T> klass); <T> void set(Object key, Class<T> klass, T value); + void clear(); } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a3d9d433/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/DeliveryImpl.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/DeliveryImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/DeliveryImpl.java index 566b84a..3136d7a 100644 --- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/DeliveryImpl.java +++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/DeliveryImpl.java @@ -23,6 +23,7 @@ package org.apache.qpid.proton.engine.impl; import java.util.Arrays; import org.apache.qpid.proton.engine.Delivery; +import org.apache.qpid.proton.engine.Record; import org.apache.qpid.proton.engine.Transport; import org.apache.qpid.proton.amqp.transport.DeliveryState; @@ -39,6 +40,7 @@ public class DeliveryImpl implements Delivery private DeliveryImpl _transportWorkPrev; boolean _transportWork; + private Record _attachments = new RecordImpl(); private Object _context; private final byte[] _tag; @@ -402,6 +404,11 @@ public class DeliveryImpl implements Delivery _context = context; } + public Record attachments() + { + return _attachments; + } + @Override public String toString() { http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a3d9d433/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/EventImpl.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/EventImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/EventImpl.java index 6abec58..1210eca 100644 --- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/EventImpl.java +++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/EventImpl.java @@ -27,6 +27,7 @@ import org.apache.qpid.proton.engine.Delivery; import org.apache.qpid.proton.engine.Event; import org.apache.qpid.proton.engine.Handler; import org.apache.qpid.proton.engine.Link; +import org.apache.qpid.proton.engine.Record; import org.apache.qpid.proton.engine.Session; import org.apache.qpid.proton.engine.Transport; import org.apache.qpid.proton.reactor.Reactor; @@ -44,6 +45,7 @@ class EventImpl implements Event Type type; Object context; EventImpl next; + RecordImpl attachments = new RecordImpl(); EventImpl() { @@ -54,12 +56,14 @@ class EventImpl implements Event { this.type = type; this.context = context; + this.attachments.clear(); } void clear() { type = null; context = null; + attachments.clear(); } @Override @@ -318,10 +322,16 @@ class EventImpl implements Event } @Override + public Record attachments() { + return attachments; + } + + @Override public Event copy() { EventImpl newEvent = new EventImpl(); newEvent.init(type, context); + newEvent.attachments.copy(attachments); return newEvent; } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a3d9d433/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/RecordImpl.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/RecordImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/RecordImpl.java index 849e694..85408cb 100644 --- a/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/RecordImpl.java +++ b/proton-j/src/main/java/org/apache/qpid/proton/engine/impl/RecordImpl.java @@ -43,4 +43,12 @@ public class RecordImpl implements Record return klass.cast(values.get(key)); } + public void clear() { + values.clear(); + } + + void copy(RecordImpl src) { + values.putAll(src.values); + } + } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a3d9d433/proton-j/src/main/java/org/apache/qpid/proton/message/impl/MessageImpl.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/message/impl/MessageImpl.java b/proton-j/src/main/java/org/apache/qpid/proton/message/impl/MessageImpl.java index c43ba3e..9ea09a2 100644 --- a/proton-j/src/main/java/org/apache/qpid/proton/message/impl/MessageImpl.java +++ b/proton-j/src/main/java/org/apache/qpid/proton/message/impl/MessageImpl.java @@ -859,4 +859,24 @@ public class MessageImpl implements ProtonJMessage return MessageError.OK; } + public String toString() + { + StringBuilder sb = new StringBuilder(); + sb.append("Message{"); + if (_header != null) { + sb.append("header="); + sb.append(_header); + } + if (_properties != null) { + sb.append("properties="); + sb.append(_properties); + } + if (_body != null) { + sb.append("body="); + sb.append(_body); + } + sb.append("}"); + return sb.toString(); + } + } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a3d9d433/proton-j/src/main/resources/ccodec.py ---------------------------------------------------------------------- diff --git a/proton-j/src/main/resources/ccodec.py b/proton-j/src/main/resources/ccodec.py index 629fe0a..fb86735 100644 --- a/proton-j/src/main/resources/ccodec.py +++ b/proton-j/src/main/resources/ccodec.py @@ -23,7 +23,7 @@ from org.apache.qpid.proton.codec.Data import DataType from java.util import UUID as JUUID, Date as JDate from java.nio import ByteBuffer -from jarray import array, zeros +from compat import array, zeros # from proton/codec.h PN_NULL = 1 http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a3d9d433/proton-j/src/main/resources/cengine.py ---------------------------------------------------------------------- diff --git a/proton-j/src/main/resources/cengine.py b/proton-j/src/main/resources/cengine.py index 6c45f33..b5cd703 100644 --- a/proton-j/src/main/resources/cengine.py +++ b/proton-j/src/main/resources/cengine.py @@ -28,7 +28,7 @@ from org.apache.qpid.proton.engine import EndpointState, Sender, \ Receiver, Transport as _Transport, TransportException from java.util import EnumSet -from jarray import array, zeros +from compat import array, zeros from cerror import * from ccodec import * @@ -143,7 +143,6 @@ class endpoint_wrapper: def __init__(self, impl): self.impl = impl - self.attachments = {} self.condition = pn_condition() self.remote_condition = pn_condition() @@ -215,7 +214,7 @@ def pn_connection_remote_desired_capabilities(conn): return array2dat(conn.impl.getRemoteDesiredCapabilities(), PN_SYMBOL) def pn_connection_attachments(conn): - return conn.attachments + return conn.impl.attachments() def pn_connection_set_container(conn, name): conn.impl.setContainer(name) @@ -264,7 +263,7 @@ def pn_session(conn): return wrap(conn.impl.session(), pn_session_wrapper) def pn_session_attachments(ssn): - return ssn.attachments + return ssn.impl.attachments() def pn_session_state(ssn): return endpoint_state(ssn.impl) @@ -524,7 +523,7 @@ class pn_link_wrapper(endpoint_wrapper): self.impl.setTarget(self.target.encode()) def pn_link_attachments(link): - return link.attachments + return link.impl.attachments() def pn_link_source(link): link.source.decode(link.impl.getSource()) @@ -801,7 +800,6 @@ class pn_delivery_wrapper: def __init__(self, impl): self.impl = impl - self.attachments = {} self.local = pn_disposition() self.remote = pn_disposition() @@ -812,7 +810,7 @@ def pn_delivery_tag(dlv): return dlv.impl.getTag().tostring() def pn_delivery_attachments(dlv): - return dlv.attachments + return dlv.impl.attachments() def pn_delivery_partial(dlv): return dlv.impl.isPartial() @@ -861,7 +859,6 @@ def pn_delivery_settle(dlv): class pn_transport_wrapper: def __init__(self, impl): self.impl = impl - self.attachments = {} self.server = False self.condition = pn_condition() @@ -869,7 +866,7 @@ def pn_transport(): return wrap(Proton.transport(), pn_transport_wrapper) def pn_transport_attachments(trans): - return trans.attachments + return trans.impl.attachments() def pn_transport_set_server(trans): trans.server = True; @@ -1021,7 +1018,6 @@ class pn_event: def __init__(self, impl): self.impl = impl - self.attachments = {} def pn_collector_peek(coll): ev = coll.peek() @@ -1037,7 +1033,7 @@ def pn_collector_free(coll): pass def pn_event_reactor(event): - return None + return event.impl.getReactor() def pn_event_connection(event): return wrap(event.impl.getConnection(), pn_connection_wrapper) @@ -1056,6 +1052,7 @@ def pn_event_transport(event): from org.apache.qpid.proton.engine.impl import ConnectionImpl, SessionImpl, \ SenderImpl, ReceiverImpl, DeliveryImpl, TransportImpl +from org.apache.qpid.proton.reactor.impl import TaskImpl J2C = { ConnectionImpl: "pn_connection", @@ -1063,7 +1060,8 @@ J2C = { SenderImpl: "pn_link", ReceiverImpl: "pn_link", DeliveryImpl: "pn_delivery", - TransportImpl: "pn_transport" + TransportImpl: "pn_transport", + TaskImpl: "pn_task" } wrappers = { @@ -1072,6 +1070,7 @@ wrappers = { "pn_link": lambda x: wrap(x, pn_link_wrapper), "pn_delivery": lambda x: wrap(x, pn_delivery_wrapper), "pn_transport": lambda x: wrap(x, pn_transport_wrapper), + "pn_task": lambda x: x, "pn_void": lambda x: x } @@ -1092,4 +1091,4 @@ def pn_event_category(event): return event.impl.getCategory() def pn_event_attachments(event): - return event.attachments + return event.impl.attachments() http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a3d9d433/proton-j/src/main/resources/chandlers.py ---------------------------------------------------------------------- diff --git a/proton-j/src/main/resources/chandlers.py b/proton-j/src/main/resources/chandlers.py index 429d0a3..aa5bd19 100644 --- a/proton-j/src/main/resources/chandlers.py +++ b/proton-j/src/main/resources/chandlers.py @@ -18,13 +18,26 @@ # from cerror import Skipped +from org.apache.qpid.proton.reactor import FlowController, Handshaker +from org.apache.qpid.proton.engine import BaseHandler # from proton/handlers.h def pn_flowcontroller(window): - raise Skipped() + return FlowController(window) def pn_handshaker(): - raise Skipped() + return Handshaker() def pn_iohandler(): raise Skipped() + +from cengine import pn_event, pn_event_type + +class pn_pyhandler(BaseHandler): + + def __init__(self, pyobj): + self.pyobj = pyobj + + def onUnhandled(self, event): + ev = pn_event(event) + self.pyobj.dispatch(ev, pn_event_type(ev)) http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a3d9d433/proton-j/src/main/resources/cmessage.py ---------------------------------------------------------------------- diff --git a/proton-j/src/main/resources/cmessage.py b/proton-j/src/main/resources/cmessage.py index 6035d54..6e003ad 100644 --- a/proton-j/src/main/resources/cmessage.py +++ b/proton-j/src/main/resources/cmessage.py @@ -78,6 +78,9 @@ class pn_message_wrapper: bod = AmqpValue(bod) self.impl.setBody(bod) + def __repr__(self): + return self.impl.toString() + def pn_message(): return pn_message_wrapper() http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a3d9d433/proton-j/src/main/resources/cobject.py ---------------------------------------------------------------------- diff --git a/proton-j/src/main/resources/cobject.py b/proton-j/src/main/resources/cobject.py index 18ad7e9..140e62a 100644 --- a/proton-j/src/main/resources/cobject.py +++ b/proton-j/src/main/resources/cobject.py @@ -41,19 +41,48 @@ def pn_cast_pn_delivery(obj): def pn_cast_pn_transport(obj): return obj +def pn_cast_pn_reactor(obj): + return obj + +def pn_cast_pn_task(obj): + return obj + PN_PYREF = None def pn_record_def(record, key, clazz): pass +from java.lang import Object + def pn_record_get(record, key): - return record.get(key) + return record.get(key, Object) def pn_record_set(record, key, value): - record[key] = value + record.set(key, Object, value) def pn_incref(obj): pass def pn_decref(obj): pass + +def pn_free(obj): + pass + +from java.lang import StringBuilder + +def pn_string(st): + sb = StringBuilder() + if st: + sb.append(st) + return sb + +def pn_string_get(sb): + return sb.toString() + +def pn_inspect(obj, st): + if obj is None: + st.append("null") + else: + st.append(repr(obj)) + return 0 http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a3d9d433/proton-j/src/main/resources/compat.py ---------------------------------------------------------------------- diff --git a/proton-j/src/main/resources/compat.py b/proton-j/src/main/resources/compat.py new file mode 100644 index 0000000..bdff669 --- /dev/null +++ b/proton-j/src/main/resources/compat.py @@ -0,0 +1,8 @@ +import sys +from jarray import zeros, array as _array + +if (sys.version_info[0] == 2 and sys.version_info[1] == 5): + array = _array +else: + def array(obj, code): + return obj http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a3d9d433/proton-j/src/main/resources/cproton.py ---------------------------------------------------------------------- diff --git a/proton-j/src/main/resources/cproton.py b/proton-j/src/main/resources/cproton.py index a4ad018..16cb660 100644 --- a/proton-j/src/main/resources/cproton.py +++ b/proton-j/src/main/resources/cproton.py @@ -27,6 +27,7 @@ against both the C and Java protocol implementations. PN_VERSION_MAJOR = 0 PN_VERSION_MINOR = 0 +from ctypes import * from cobject import * from cerror import * from ccodec import * http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a3d9d433/proton-j/src/main/resources/creactor.py ---------------------------------------------------------------------- diff --git a/proton-j/src/main/resources/creactor.py b/proton-j/src/main/resources/creactor.py index 7ba22d4..d21e830 100644 --- a/proton-j/src/main/resources/creactor.py +++ b/proton-j/src/main/resources/creactor.py @@ -18,9 +18,70 @@ # from cerror import Skipped +from cengine import wrap, pn_connection_wrapper + +from org.apache.qpid.proton.reactor import Reactor +from org.apache.qpid.proton.engine import BaseHandler # from proton/reactor.h def pn_reactor(): - raise Skipped() + return Reactor.Factory.create() def pn_reactor_attachments(r): - raise Skipped() + return r.attachments() +def pn_reactor_get_global_handler(r): + return r.getGlobalHandler() +def pn_reactor_set_global_handler(r, h): + r.setGlobalHandler(h) +def pn_reactor_get_handler(r): + return r.getHandler() +def pn_reactor_set_handler(r, h): + r.setHandler(h) +def pn_reactor_set_timeout(r, t): + r.setTimeout(t) +def pn_reactor_get_timeout(r): + return r.getTimeout() +def pn_reactor_schedule(r, t, h): + return r.schedule(t, h) +def pn_reactor_yield(r): + getattr(r, "yield")() +def pn_reactor_start(r): + r.start() +def pn_reactor_process(r): + return r.process() +def pn_reactor_stop(r): + return r.stop() +def pn_reactor_selectable(r): + return r.selectable() +def pn_reactor_connection(r, h): + return wrap(r.connection(h), pn_connection_wrapper) +def pn_reactor_acceptor(r, host, port, handler): + return r.acceptor(host, int(port), handler) + +def pn_handler_add(h, c): + h.add(c) +def pn_handler_dispatch(h, ev, et): + ev.impl.dispatch(h) +def pn_record_set_handler(r, h): + BaseHandler.setHandler(r, h) +def pn_record_get_handler(r): + return BaseHandler.getHandler(r) + +def pn_task_attachments(t): + return t.attachments() + +def pn_selectable_attachments(s): + return s.attachments() + +def pn_acceptor_close(a): + a.close() + +def pn_object_reactor(o): + if hasattr(o, "impl"): + if hasattr(o.impl, "getSession"): + return o.impl.getSession().getConnection().getReactor() + elif hasattr(o.impl, "getConnection"): + return o.impl.getConnection().getReactor() + else: + return o.impl.getReactor() + else: + return o.getReactor() http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a3d9d433/proton-j/src/main/resources/csasl.py ---------------------------------------------------------------------- diff --git a/proton-j/src/main/resources/csasl.py b/proton-j/src/main/resources/csasl.py index ea5e489..a48c2ba 100644 --- a/proton-j/src/main/resources/csasl.py +++ b/proton-j/src/main/resources/csasl.py @@ -18,7 +18,7 @@ # from org.apache.qpid.proton.engine import Sasl -from jarray import array, zeros +from compat import array, zeros from cerror import * http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/a3d9d433/proton-j/src/main/resources/ctypes.py ---------------------------------------------------------------------- diff --git a/proton-j/src/main/resources/ctypes.py b/proton-j/src/main/resources/ctypes.py new file mode 100644 index 0000000..bd88b17 --- /dev/null +++ b/proton-j/src/main/resources/ctypes.py @@ -0,0 +1,21 @@ +# +# 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 proton/types.h +PN_MILLIS_MAX = 4294967295 --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org