Repository: qpid-proton Updated Branches: refs/heads/rajith-codec c836e07a1 -> 4c1c1eaa2
Added more skeleton code to flush out the new approach. Using POJOBuilder and a lookup to construct the Performative. Further changes are planned to avoid constructing a list and instead directly construct the object from the Decoder by pulling relevant bits. For that to happen we need a hybrid parser that does both push/pull style. Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/4c1c1eaa Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/4c1c1eaa Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/4c1c1eaa Branch: refs/heads/rajith-codec Commit: 4c1c1eaa2845b518cedbfcdbed1104fd7a513c55 Parents: c836e07 Author: Rajith Attapattu <[email protected]> Authored: Mon Feb 2 13:34:32 2015 -0500 Committer: Rajith Attapattu <[email protected]> Committed: Mon Feb 2 13:34:32 2015 -0500 ---------------------------------------------------------------------- .../qpid/proton/amqp/transport2/Flow.java | 158 ++++++++++++++----- .../qpid/proton/codec2/DecodeException.java | 36 +++++ .../org/apache/qpid/proton/codec2/Decoder.java | 13 +- .../apache/qpid/proton/codec2/Encodable.java | 26 +++ .../apache/qpid/proton/codec2/POJOBuilder.java | 23 ++- .../qpid/proton/codec2/PerformativeFactory.java | 26 +++ .../proton/codec2/TransportTypesDecoder.java | 102 ------------ .../proton/codec2/TransportTypesEncoder.java | 62 -------- .../apache/qpid/proton/codec2/TypeRegistry.java | 63 ++++++++ 9 files changed, 301 insertions(+), 208 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4c1c1eaa/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport2/Flow.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport2/Flow.java b/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport2/Flow.java index 388cbef..714ef3c 100644 --- a/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport2/Flow.java +++ b/proton-j/src/main/java/org/apache/qpid/proton/amqp/transport2/Flow.java @@ -1,42 +1,57 @@ - /* -* -* 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. -* -*/ + * + * 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. + * + */ package org.apache.qpid.proton.amqp.transport2; +import java.util.List; import java.util.Map; -public class Flow +import org.apache.qpid.proton.codec2.DecodeException; +import org.apache.qpid.proton.codec2.Encodable; +import org.apache.qpid.proton.codec2.Encoder; +import org.apache.qpid.proton.codec2.PerformativeFactory; + +public class Flow implements Encodable { private long _nextIncomingId; + private long _incomingWindow; + private long _nextOutgoingId; + private long _outgoingWindow; + private long _handle; + private long _deliveryCount; + private long _linkCredit; + private long _available; + private boolean _drain; + private boolean _echo; - private Map _properties; + + private Map<Object, Object> _properties; public long getNextIncomingId() { @@ -75,7 +90,7 @@ public class Flow public void setOutgoingWindow(long outgoingWindow) { - _outgoingWindow = outgoingWindow; + _outgoingWindow = outgoingWindow; } public long getHandle() @@ -138,12 +153,12 @@ public class Flow _echo = echo; } - public Map getProperties() + public Map<Object, Object> getProperties() { return _properties; } - public void setProperties(Map properties) + public void setProperties(Map<Object, Object> properties) { _properties = properties; } @@ -151,18 +166,85 @@ public class Flow @Override public String toString() { - return "Flow{" + - "nextIncomingId=" + _nextIncomingId + - ", incomingWindow=" + _incomingWindow + - ", nextOutgoingId=" + _nextOutgoingId + - ", outgoingWindow=" + _outgoingWindow + - ", handle=" + _handle + - ", deliveryCount=" + _deliveryCount + - ", linkCredit=" + _linkCredit + - ", available=" + _available + - ", drain=" + _drain + - ", echo=" + _echo + - ", properties=" + _properties + - '}'; + return "Flow{" + "nextIncomingId=" + _nextIncomingId + ", incomingWindow=" + _incomingWindow + + ", nextOutgoingId=" + _nextOutgoingId + ", outgoingWindow=" + _outgoingWindow + ", handle=" + _handle + + ", deliveryCount=" + _deliveryCount + ", linkCredit=" + _linkCredit + ", available=" + _available + + ", drain=" + _drain + ", echo=" + _echo + ", properties=" + _properties + '}'; + } + + @Override + public void encode(Encoder encoder) + { + encoder.putDescriptor(); + encoder.putUlong(0x0000000000000013L); + encoder.putList(); + // unsigned int ? + encoder.putLong(_nextIncomingId); + encoder.putLong(_incomingWindow); + encoder.putLong(_nextOutgoingId); + encoder.putLong(_outgoingWindow); + encoder.putLong(_handle); + encoder.putLong(_deliveryCount); + encoder.putLong(_linkCredit); + encoder.putLong(_available); + if (_drain) + { + encoder.putBoolean(true); + } + if (_echo) + { + encoder.putBoolean(true); + } + if (_properties != null && _properties.size() > 0) + { + encoder.putMap(); + // ..... handle map + encoder.end(); + } + encoder.end(); + } + + public static final class Factory implements PerformativeFactory + { + public Object create(Object in) throws DecodeException + { + List<Object> l = (List<Object>) in; + + if (l.size() <= 3) + { + throw new DecodeException("The outgoing-window field cannot be omitted"); + } + + Flow flow = new Flow(); + + switch (11 - l.size()) + { + + case 0: + flow.setProperties(((Map<Object, Object>) l.get(10))); + case 1: + flow.setEcho(l.get(9) == null ? false : (Boolean) l.get(9)); + case 2: + flow.setDrain(l.get(8) == null ? false : (Boolean) l.get(8)); + case 3: + flow.setAvailable((int) l.get(7)); + case 4: + flow.setLinkCredit((int) l.get(6)); + case 5: + flow.setDeliveryCount((int) l.get(5)); + case 6: + flow.setHandle((int) l.get(4)); + case 7: + flow.setOutgoingWindow((int) l.get(3)); + case 8: + flow.setNextOutgoingId((int) l.get(2)); + case 9: + flow.setIncomingWindow((int) l.get(1)); + case 10: + flow.setNextIncomingId((int) l.get(0)); + } + + return flow; + } } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4c1c1eaa/proton-j/src/main/java/org/apache/qpid/proton/codec2/DecodeException.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec2/DecodeException.java b/proton-j/src/main/java/org/apache/qpid/proton/codec2/DecodeException.java new file mode 100644 index 0000000..f568542 --- /dev/null +++ b/proton-j/src/main/java/org/apache/qpid/proton/codec2/DecodeException.java @@ -0,0 +1,36 @@ +/* + * + * 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. + * + */ +package org.apache.qpid.proton.codec2; + +@SuppressWarnings("serial") +public class DecodeException extends Exception +{ + + public DecodeException(String message, Throwable cause) + { + super(message, cause); + } + + public DecodeException(String message) + { + super(message); + } +} http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4c1c1eaa/proton-j/src/main/java/org/apache/qpid/proton/codec2/Decoder.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec2/Decoder.java b/proton-j/src/main/java/org/apache/qpid/proton/codec2/Decoder.java index d61fdef..5a14081 100644 --- a/proton-j/src/main/java/org/apache/qpid/proton/codec2/Decoder.java +++ b/proton-j/src/main/java/org/apache/qpid/proton/codec2/Decoder.java @@ -20,18 +20,22 @@ */ package org.apache.qpid.proton.codec2; + /** * Decoder - * + * */ public interface Decoder { - Type getType(); int getSize(); + byte getByte(); + + short getShort(); + int getInt(); long getLong(); @@ -50,4 +54,9 @@ public interface Decoder long getLoBits(); + boolean getBoolean(); + + char getChar(); + + void decode(DataHandler handler); } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4c1c1eaa/proton-j/src/main/java/org/apache/qpid/proton/codec2/Encodable.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec2/Encodable.java b/proton-j/src/main/java/org/apache/qpid/proton/codec2/Encodable.java new file mode 100644 index 0000000..4d749e1 --- /dev/null +++ b/proton-j/src/main/java/org/apache/qpid/proton/codec2/Encodable.java @@ -0,0 +1,26 @@ +/* + * + * 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. + * + */ +package org.apache.qpid.proton.codec2; + +public interface Encodable +{ + void encode(Encoder encoder); +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4c1c1eaa/proton-j/src/main/java/org/apache/qpid/proton/codec2/POJOBuilder.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec2/POJOBuilder.java b/proton-j/src/main/java/org/apache/qpid/proton/codec2/POJOBuilder.java index c95844b..0e04cd5 100644 --- a/proton-j/src/main/java/org/apache/qpid/proton/codec2/POJOBuilder.java +++ b/proton-j/src/main/java/org/apache/qpid/proton/codec2/POJOBuilder.java @@ -29,7 +29,6 @@ import java.util.*; public class POJOBuilder implements DataHandler { - public static class Described { private Object descriptor; @@ -62,7 +61,7 @@ public class POJOBuilder implements DataHandler private class DescribedBuilder implements Builder { private Object descriptor; - private Described described; + private Object described; private boolean first = true; public DescribedBuilder() {} @@ -72,12 +71,28 @@ public class POJOBuilder implements DataHandler descriptor = o; first = false; } else { - described = new Described(descriptor, o); + PerformativeFactory factory = TypeRegistry.lookup(descriptor); + if (factory != null) + { + try + { + described = factory.create(o); + } + catch (DecodeException e) + { + // TODO handle exception + e.printStackTrace(); + } + } + else + { + described = new Described(descriptor, o); + } end(); } } - public Described build() { + public Object build() { return described; } http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4c1c1eaa/proton-j/src/main/java/org/apache/qpid/proton/codec2/PerformativeFactory.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec2/PerformativeFactory.java b/proton-j/src/main/java/org/apache/qpid/proton/codec2/PerformativeFactory.java new file mode 100644 index 0000000..e428207 --- /dev/null +++ b/proton-j/src/main/java/org/apache/qpid/proton/codec2/PerformativeFactory.java @@ -0,0 +1,26 @@ +/* + * + * 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. + * + */ +package org.apache.qpid.proton.codec2; + +public interface PerformativeFactory +{ + public Object create(Object in) throws DecodeException; +} http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4c1c1eaa/proton-j/src/main/java/org/apache/qpid/proton/codec2/TransportTypesDecoder.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec2/TransportTypesDecoder.java b/proton-j/src/main/java/org/apache/qpid/proton/codec2/TransportTypesDecoder.java deleted file mode 100644 index a262760..0000000 --- a/proton-j/src/main/java/org/apache/qpid/proton/codec2/TransportTypesDecoder.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.proton.codec2; - -import org.apache.qpid.proton.amqp.transport2.Flow; - -public class TransportTypesDecoder -{ - public static Open decodeOpen(Decoder decoder) - { - - } - - public static Flow decodeFlow(Decoder decoder) - { - final Flow flow = new Flow(); - DataHandler dh = new AbstractDataHandler() - { - - int index = 0; - - public void onLong(org.apache.qpid.proton.codec2.Decoder d) - { - switch (index) - { - case 0: - flow.setNextIncomingId(d.getLongBits()); - index++; - break; - case 1: - flow.setIncomingWindow(d.getLongBits()); - index++; - break; - case 2: - flow.setNextOutgoingId(d.getLongBits()); - index++; - break; - case 3: - flow.setOutgoingWindow(d.getLongBits()); - index++; - break; - case 4: - flow.setHandle(d.getLongBits()); - index++; - break; - case 5: - flow.setDeliveryCount(d.getLongBits()); - index++; - break; - case 6: - flow.setLinkCredit(d.getLongBits()); - index++; - break; - case 7: - flow.setAvailable(d.getLongBits()); - index++; - break; - } - } - - public void onBoolean(org.apache.qpid.proton.codec2.Decoder d) - { - switch (index) - { - case 8: - flow.setDrain(); // what should be used here? - index++; - break; - case 9: - flow.setEcho(); // what should be used here? - index++; - break; - } - } - - public void onMap(org.apache.qpid.proton.codec2.Decoder d) - { - flow.setProperties(decodeMap(d)); // - } - }; - - return flow; - } -} http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4c1c1eaa/proton-j/src/main/java/org/apache/qpid/proton/codec2/TransportTypesEncoder.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec2/TransportTypesEncoder.java b/proton-j/src/main/java/org/apache/qpid/proton/codec2/TransportTypesEncoder.java deleted file mode 100644 index c7c888c..0000000 --- a/proton-j/src/main/java/org/apache/qpid/proton/codec2/TransportTypesEncoder.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * - * 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. - * - */ -package org.apache.qpid.proton.codec2; - -import org.apache.qpid.proton.amqp.transport2.Flow; - -public class TransportTypesEncoder -{ - public static void encodeOpen(Encoder encoder, Open open) - { - - } - - public static void encodeFlow(Encoder encoder, Flow flow) - { - encoder.putDescriptor(); - encoder.putUlong(0x0000000000000013L); - encoder.putList(); - // unsigned int ? - encoder.putLong(flow.getNextIncomingId()); - encoder.putLong(flow.getIncomingWindow()); - encoder.putLong(flow.getNextOutgoingId()); - encoder.putLong(flow.getOutgoingWindow()); - encoder.putLong(flow.getHandle()); - encoder.putLong(flow.getDeliveryCount()); - encoder.putLong(flow.getLinkCredit()); - encoder.putLong(flow.getAvailable()); - if (flow.getDrain()) - { - encoder.putBoolean(true); - } - if (flow.getEcho()) - { - encoder.putBoolean(true); - } - if (flow.getProperties() != null && flow.getProperties().size() > 0) - { - encoder.putMap(); - // ..... handle map - encoder.end(); - } - encoder.end(); - } -} http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/4c1c1eaa/proton-j/src/main/java/org/apache/qpid/proton/codec2/TypeRegistry.java ---------------------------------------------------------------------- diff --git a/proton-j/src/main/java/org/apache/qpid/proton/codec2/TypeRegistry.java b/proton-j/src/main/java/org/apache/qpid/proton/codec2/TypeRegistry.java new file mode 100644 index 0000000..85eb4aa --- /dev/null +++ b/proton-j/src/main/java/org/apache/qpid/proton/codec2/TypeRegistry.java @@ -0,0 +1,63 @@ +/* + * + * 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. + * + */ +package org.apache.qpid.proton.codec2; + +import java.util.HashMap; +import java.util.Map; + +public class TypeRegistry +{ + private static Map<String, PerformativeFactory> _typeRegByStrCode = new HashMap<String, PerformativeFactory>(); + + private static Map<Long, PerformativeFactory> _typeRegByLongCode = new HashMap<Long, PerformativeFactory>(); + + public static void registerType(long longCode, String strCode, PerformativeFactory factory) + { + _typeRegByStrCode.put(strCode, factory); + _typeRegByLongCode.put(longCode, factory); + } + + public static PerformativeFactory lookup(Object code) + { + if (code instanceof Long) + { + return lookup((Long) code); + } + else if (code instanceof String) + { + return lookup((String) code); + } + else + { + return null; + } + } + + static PerformativeFactory lookup(long code) + { + return _typeRegByLongCode.get(code); + } + + static PerformativeFactory lookup(String code) + { + return _typeRegByStrCode.get(code); + } +} \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
