| /** |
| * 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.activemq.transport.udp; |
| |
| |
| import java.io.DataInputStream; |
| import java.io.DataOutputStream; |
| import java.net.DatagramPacket; |
| import java.net.SocketAddress; |
| import java.nio.ByteBuffer; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import org.apache.activemq.command.Command; |
| import org.apache.activemq.command.Endpoint; |
| |
| /** |
| * |
| * |
| */ |
| public class DatagramHeaderMarshaller { |
| |
| // TODO for large dynamic networks |
| // we may want to evict endpoints that disconnect |
| // from a transport - e.g. for multicast |
| private Map<SocketAddress, Endpoint> endpoints = new HashMap<SocketAddress, Endpoint>(); |
| |
| /** |
| * Reads any header if applicable and then creates an endpoint object |
| */ |
| public Endpoint createEndpoint(ByteBuffer readBuffer, SocketAddress address) { |
| return getEndpoint(address); |
| } |
| |
| public Endpoint createEndpoint(DatagramPacket datagram, DataInputStream dataIn) { |
| return getEndpoint(datagram.getSocketAddress()); |
| } |
| |
| public void writeHeader(Command command, ByteBuffer writeBuffer) { |
| /* |
| writeBuffer.putLong(command.getCounter()); |
| writeBuffer.putInt(command.getDataSize()); |
| byte flags = command.getFlags(); |
| //System.out.println("Writing header with counter: " + header.getCounter() + " size: " + header.getDataSize() + " with flags: " + flags); |
| writeBuffer.put(flags); |
| */ |
| } |
| |
| public void writeHeader(Command command, DataOutputStream dataOut) { |
| } |
| |
| /** |
| * Gets the current endpoint object for this address or creates one if not available. |
| * |
| * Note that this method does not need to be synchronized as its only ever going to be |
| * used by the already-synchronized read() method of a CommandChannel |
| * |
| */ |
| protected Endpoint getEndpoint(SocketAddress address) { |
| Endpoint endpoint = endpoints.get(address); |
| if (endpoint == null) { |
| endpoint = createEndpoint(address); |
| endpoints.put(address, endpoint); |
| } |
| return endpoint; |
| } |
| |
| protected Endpoint createEndpoint(SocketAddress address) { |
| return new DatagramEndpoint(address.toString(), address); |
| } |
| } |