Return-Path: Delivered-To: apmail-geronimo-scm-archive@www.apache.org Received: (qmail 86898 invoked from network); 20 Sep 2006 10:41:55 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 20 Sep 2006 10:41:55 -0000 Received: (qmail 68359 invoked by uid 500); 20 Sep 2006 10:41:54 -0000 Delivered-To: apmail-geronimo-scm-archive@geronimo.apache.org Received: (qmail 68315 invoked by uid 500); 20 Sep 2006 10:41:54 -0000 Mailing-List: contact scm-help@geronimo.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: dev@geronimo.apache.org List-Id: Delivered-To: mailing list scm@geronimo.apache.org Received: (qmail 68304 invoked by uid 99); 20 Sep 2006 10:41:54 -0000 Received: from idunn.apache.osuosl.org (HELO idunn.apache.osuosl.org) (140.211.166.84) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 20 Sep 2006 03:41:54 -0700 X-ASF-Spam-Status: No, hits=-9.8 required=5.0 tests=ALL_TRUSTED,NO_REAL_NAME Received: from ([140.211.166.113:53453] helo=eris.apache.org) by idunn.apache.osuosl.org (ecelerity 2.1 r(10620)) with ESMTP id 4D/F3-00532-FDA11154 for ; Wed, 20 Sep 2006 03:41:36 -0700 Received: by eris.apache.org (Postfix, from userid 65534) id AB9DE1A981D; Wed, 20 Sep 2006 03:41:33 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r448152 - in /geronimo/sandbox/gcache/server/src: main/java/org/apache/geronimo/gcache/command/ main/java/org/apache/geronimo/gcache/transports/tcp/ main/java/org/apache/geronimo/gcache/util/ test/java/org/apache/geronimo/gcache/transports/... Date: Wed, 20 Sep 2006 10:41:30 -0000 To: scm@geronimo.apache.org From: jgenender@apache.org X-Mailer: svnmailer-1.1.0 Message-Id: <20060920104133.AB9DE1A981D@eris.apache.org> X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N Author: jgenender Date: Wed Sep 20 03:41:29 2006 New Revision: 448152 URL: http://svn.apache.org/viewvc?view=rev&rev=448152 Log: Fixed up some more marshalling Added: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/Constants.java (with props) geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteArrayInputStream.java (with props) geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteArrayOutputStream.java (with props) geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteSequence.java (with props) geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteSequenceData.java (with props) Modified: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/command/AddEntryCommand.java geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/command/BaseCommand.java geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/DefaultSelectionKeyProcessor.java geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/TCPSocketHandler.java geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/TCPSocketServer.java geronimo/sandbox/gcache/server/src/test/java/org/apache/geronimo/gcache/transports/tcp/TcpSocketServerTest.java Modified: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/command/AddEntryCommand.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/command/AddEntryCommand.java?view=diff&rev=448152&r1=448151&r2=448152 ============================================================================== --- geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/command/AddEntryCommand.java (original) +++ geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/command/AddEntryCommand.java Wed Sep 20 03:41:29 2006 @@ -26,7 +26,7 @@ import java.nio.channels.WritableByteChannel; import org.apache.geronimo.gcache.marshal.MarshalAware; -import java.io.ByteArrayOutputStream; +import org.apache.geronimo.gcache.util.ByteArrayOutputStream; public class AddEntryCommand extends BaseCommand { private static final int DEFAULT_CAPACITY = 1024; @@ -44,7 +44,7 @@ public void setKey(String key) { this.key = key; } - + public void execute() { //TODO: make this add the payload to the local cache then call back to the pusher } Modified: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/command/BaseCommand.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/command/BaseCommand.java?view=diff&rev=448152&r1=448151&r2=448152 ============================================================================== --- geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/command/BaseCommand.java (original) +++ geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/command/BaseCommand.java Wed Sep 20 03:41:29 2006 @@ -19,12 +19,14 @@ package org.apache.geronimo.gcache.command; import java.io.IOException; +import java.io.Serializable; import java.nio.ByteBuffer; import java.nio.channels.ReadableByteChannel; import java.nio.channels.WritableByteChannel; import java.nio.charset.Charset; public class BaseCommand implements Command { + private String commandId = null; public String getCommandId() { Added: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/Constants.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/Constants.java?view=auto&rev=448152 ============================================================================== --- geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/Constants.java (added) +++ geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/Constants.java Wed Sep 20 03:41:29 2006 @@ -0,0 +1,23 @@ +/* + * 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.geronimo.gcache.transports.tcp; + +public class Constants { + public final static byte MAGIC[] = new byte[]{'G', 'C', 'a', 'c', 'h', 'e'}; +} Propchange: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/Constants.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/Constants.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/Constants.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/DefaultSelectionKeyProcessor.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/DefaultSelectionKeyProcessor.java?view=diff&rev=448152&r1=448151&r2=448152 ============================================================================== --- geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/DefaultSelectionKeyProcessor.java (original) +++ geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/DefaultSelectionKeyProcessor.java Wed Sep 20 03:41:29 2006 @@ -22,19 +22,39 @@ import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.SocketChannel; +import java.util.Arrays; import org.apache.geronimo.gcache.command.Command; import org.apache.geronimo.gcache.command.CommandTypes; public class DefaultSelectionKeyProcessor implements SelectionKeyProcessor { + private final static int HEADER_SIZE = Constants.MAGIC.length + 4; + public void process(SelectionKey key) throws IOException { SocketChannel channel = (SocketChannel) key.channel(); + // first byte is the identifier, the next 4 are the checksum - ByteBuffer buffer = ByteBuffer.allocateDirect(5); + ByteBuffer buffer = ByteBuffer.allocateDirect(HEADER_SIZE); int count; while ((count = channel.read(buffer)) > 0) { + //Better at least have the size of the HEADER + if (count < HEADER_SIZE){ + disconnect(channel); + return; + } + buffer.flip(); + + byte magic[] = new byte[Constants.MAGIC.length]; + buffer.get(magic); + + //Better match the Magic + if (!Arrays.equals(Constants.MAGIC, magic)){ + disconnect(channel); + return; + } + int commandIdentifier = buffer.getInt(); Command command = CommandTypes.createCommand(commandIdentifier); command.readExternal(channel); @@ -45,6 +65,16 @@ if (count < 0) { channel.close(); } + } + + private void disconnect(SocketChannel channel) throws IOException{ + try { + channel.socket().shutdownOutput(); + } catch (IOException e) { + // It seems you have to ignore this due to lots of + // transport endpoint not connected issues. + } + channel.close(); } } Modified: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/TCPSocketHandler.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/TCPSocketHandler.java?view=diff&rev=448152&r1=448151&r2=448152 ============================================================================== --- geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/TCPSocketHandler.java (original) +++ geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/TCPSocketHandler.java Wed Sep 20 03:41:29 2006 @@ -32,14 +32,24 @@ */ public class TCPSocketHandler extends ThreadSupport { Log log = LogFactory.getLog(TCPSocketHandler.class); - - private SelectionKeyProcessor processor = new DefaultSelectionKeyProcessor(); + + private SelectionKeyProcessor processor; private Selector selector = null; private int timeOut = 0; public TCPSocketHandler(int timeOut) throws IOException{ + this(timeOut, null); + } + + public TCPSocketHandler(int timeOut, SelectionKeyProcessor processor) throws IOException{ this.timeOut = timeOut; + + if (processor == null) + this.processor = new DefaultSelectionKeyProcessor(); + else + this.processor = processor; + selector = Selector.open(); } Modified: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/TCPSocketServer.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/TCPSocketServer.java?view=diff&rev=448152&r1=448151&r2=448152 ============================================================================== --- geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/TCPSocketServer.java (original) +++ geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/transports/tcp/TCPSocketServer.java Wed Sep 20 03:41:29 2006 @@ -31,12 +31,18 @@ private ThreadPool pool = null; private TCPSocketHandler handler = null; private int timeOut = 0; + private SelectionKeyProcessor processor; public TCPSocketServer(String address, int port, ThreadPool threadPool, int timeOut) { + this(address, port, threadPool, timeOut, null); + } + + public TCPSocketServer(String address, int port, ThreadPool threadPool, int timeOut, SelectionKeyProcessor processor) { inet = new InetSocketAddress(address, port); pool = threadPool; this.timeOut = timeOut; + this.processor = processor; } @@ -45,7 +51,7 @@ server = ServerSocketChannel.open(); server.configureBlocking(false); //TODO: refactor so this impl is not created here but instead its deferred - handler = new TCPSocketHandler(timeOut); + handler = new TCPSocketHandler(timeOut, processor); // bind the server to the address ServerSocket socket = server.socket(); Added: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteArrayInputStream.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteArrayInputStream.java?view=auto&rev=448152 ============================================================================== --- geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteArrayInputStream.java (added) +++ geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteArrayInputStream.java Wed Sep 20 03:41:29 2006 @@ -0,0 +1,96 @@ +/* + * 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.geronimo.gcache.util; + +import java.io.IOException; +import java.io.InputStream; + +public class ByteArrayInputStream extends InputStream { + byte buffer[]; + int limit; + int pos; + int mark; + + public ByteArrayInputStream(byte data[]) { + this(data, 0, data.length); + } + + public ByteArrayInputStream(ByteSequence sequence) { + this(sequence.getData(), sequence.getOffset(), sequence.getLength()); + } + + public ByteArrayInputStream(byte data[], int offset, int size) { + this.buffer = data; + this.mark= this.pos = offset; + this.limit = offset+size; + } + + public int read() throws IOException { + if( pos < limit ) + return buffer[pos++] & 0xff; + else + return -1; + } + + public int read(byte[] b) throws IOException { + return read(b, 0, b.length); + } + + public int read(byte b[], int off, int len) { + if (pos < limit) { + len = Math.min(len, limit-pos); + if (len > 0) { + System.arraycopy(buffer, pos, b, off, len); + pos += len; + } + return len; + } else { + return -1; + } + } + + public long skip(long len) throws IOException { + if (pos < limit) { + len = Math.min(len, limit-pos); + if (len > 0) { + pos += len; + } + return len; + } else { + return -1; + } + } + + public int available() { + return limit - pos; + } + + public boolean markSupported() { + return true; + } + + public void mark(int markpos) { + mark = pos; + } + + public void reset() { + pos = mark; + } + +} Propchange: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteArrayInputStream.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteArrayInputStream.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteArrayInputStream.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteArrayOutputStream.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteArrayOutputStream.java?view=auto&rev=448152 ============================================================================== --- geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteArrayOutputStream.java (added) +++ geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteArrayOutputStream.java Wed Sep 20 03:41:29 2006 @@ -0,0 +1,86 @@ +/* + * 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.geronimo.gcache.util; + +import java.io.OutputStream; + +/** + * Very similar to the java.io.ByteArrayOutputStream but this version + * is not thread safe and the resulting data is returned in a ByteSequence + * to avoid an extra byte[] allocation. + */ +public class ByteArrayOutputStream extends OutputStream { + + byte buffer[]; + int size; + + public ByteArrayOutputStream() { + this(512); + } + + public ByteArrayOutputStream(int capacity) { + buffer = new byte[capacity]; + } + + public void write(int b) { + int newsize = size + 1; + checkCapacity(newsize); + buffer[size] = (byte) b; + size = newsize; + } + + public void write(byte b[], int off, int len) { + int newsize = size + len; + checkCapacity(newsize); + System.arraycopy(b, off, buffer, size, len); + size = newsize; + } + + /** + * Ensures the the buffer has at least the minimumCapacity specified. + * + * @param minimumCapacity + */ + private void checkCapacity(int minimumCapacity) { + if (minimumCapacity > buffer.length) { + byte b[] = new byte[Math.max(buffer.length << 1, minimumCapacity)]; + System.arraycopy(buffer, 0, b, 0, size); + buffer = b; + } + } + + public void reset() { + size = 0; + } + + public ByteSequence toByteSequence() { + return new ByteSequence(buffer, 0, size); + } + + public byte[] toByteArray() { + byte rc[] = new byte[size]; + System.arraycopy(buffer, 0, rc, 0, size); + return rc; + } + + public int size() { + return size; + } +} + Propchange: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteArrayOutputStream.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteArrayOutputStream.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteArrayOutputStream.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteSequence.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteSequence.java?view=auto&rev=448152 ============================================================================== --- geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteSequence.java (added) +++ geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteSequence.java Wed Sep 20 03:41:29 2006 @@ -0,0 +1,77 @@ +/* + * + * Copyright 2006 The Apache Software Foundation + * + * Licensed 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.geronimo.gcache.util; + +/** + * 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. + */ +public class ByteSequence { + public byte[] data; + public int offset; + public int length; + + public ByteSequence(byte data[]) { + this.data = data; + this.offset = 0; + this.length = data.length; + } + + public ByteSequence(byte data[], int offset, int length) { + this.data = data; + this.offset = offset; + this.length = length; + } + + public byte[] getData() { + return data; + } + + public int getLength() { + return length; + } + + public int getOffset() { + return offset; + } + + public void setData(byte[] data) { + this.data = data; + } + + public void setLength(int length) { + this.length = length; + } + + public void setOffset(int offset) { + this.offset = offset; + } +} Propchange: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteSequence.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteSequence.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteSequence.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteSequenceData.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteSequenceData.java?view=auto&rev=448152 ============================================================================== --- geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteSequenceData.java (added) +++ geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteSequenceData.java Wed Sep 20 03:41:29 2006 @@ -0,0 +1,267 @@ +/* + * 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.geronimo.gcache.util; + +import java.io.IOException; + +/** + * Used to write and read primitives to and from a ByteSequence. + */ +final public class ByteSequenceData { + + + public static byte[] toByteArray(ByteSequence packet) { + if( packet.offset==0 && packet.length == packet.data.length ) + return packet.data; + + byte rc[] = new byte[packet.length]; + System.arraycopy(packet.data, packet.offset, rc, 0, packet.length); + return rc; + } + + private static void spaceNeeded(ByteSequence packet, int i) { + assert packet.offset+i <= packet.length; + } + + public static int remaining(ByteSequence packet) { + return packet.length - packet.offset; + } + + public static int read(ByteSequence packet) { + return packet.data[packet.offset++] & 0xff; + } + + + public static void readFully(ByteSequence packet, byte[] b) throws IOException { + readFully(packet, b, 0, b.length); + } + + public static void readFully(ByteSequence packet, byte[] b, int off, int len) throws IOException { + spaceNeeded(packet, len); + System.arraycopy(packet.data, packet.offset, b, off, len); + packet.offset += len; + } + + public static int skipBytes(ByteSequence packet, int n) throws IOException { + int rc = Math.min(n, remaining(packet)); + packet.offset += rc; + return rc; + } + + public static boolean readBoolean(ByteSequence packet) throws IOException { + spaceNeeded(packet, 1); + return read(packet) != 0; + } + + public static byte readByte(ByteSequence packet) throws IOException { + spaceNeeded(packet, 1); + return (byte) read(packet); + } + + public static int readUnsignedByte(ByteSequence packet) throws IOException { + spaceNeeded(packet, 1); + return read(packet); + } + + public static short readShortBig(ByteSequence packet) throws IOException { + spaceNeeded(packet, 2); + return (short) ((read(packet) << 8) + (read(packet) << 0)); + } + public static short readShortLittle(ByteSequence packet) throws IOException { + spaceNeeded(packet, 2); + return (short) ((read(packet) << 0) + (read(packet) << 8) ); + } + + public static int readUnsignedShortBig(ByteSequence packet) throws IOException { + spaceNeeded(packet, 2); + return ((read(packet) << 8) + (read(packet) << 0)); + } + public static int readUnsignedShortLittle(ByteSequence packet) throws IOException { + spaceNeeded(packet, 2); + return ((read(packet) << 0) + (read(packet) << 8) ); + } + + public static char readCharBig(ByteSequence packet) throws IOException { + spaceNeeded(packet, 2); + return (char) ((read(packet) << 8) + (read(packet) << 0)); + } + public static char readCharLittle(ByteSequence packet) throws IOException { + spaceNeeded(packet, 2); + return (char) ((read(packet) << 0) + (read(packet) << 8) ); + } + + public static int readIntBig(ByteSequence packet) throws IOException { + spaceNeeded(packet, 4); + return ((read(packet) << 24) + + (read(packet) << 16) + + (read(packet) << 8) + + (read(packet) << 0)); + } + public static int readIntLittle(ByteSequence packet) throws IOException { + spaceNeeded(packet, 4); + return ((read(packet) << 0) + + (read(packet) << 8) + + (read(packet) << 16) + + (read(packet) << 24)); + } + + public static long readLongBig(ByteSequence packet) throws IOException { + spaceNeeded(packet, 8); + return (((long) read(packet) << 56) + + ((long) read(packet) << 48) + + ((long) read(packet) << 40) + + ((long) read(packet) << 32) + + ((long) read(packet) << 24) + + ((read(packet)) << 16) + + ((read(packet)) << 8) + + ((read(packet)) << 0)); + } + public static long readLongLittle(ByteSequence packet) throws IOException { + spaceNeeded(packet, 8); + return ((read(packet) << 0) + + (read(packet) << 8) + + (read(packet) << 16) + + ((long) read(packet) << 24) + + ((long) read(packet) << 32) + + ((long) read(packet) << 40) + + ((long) read(packet) << 48) + + ((long) read(packet) << 56)); + } + + public static double readDoubleBig(ByteSequence packet) throws IOException { + return Double.longBitsToDouble(readLongBig(packet)); + } + public static double readDoubleLittle(ByteSequence packet) throws IOException { + return Double.longBitsToDouble(readLongLittle(packet)); + } + + public static float readFloatBig(ByteSequence packet) throws IOException { + return Float.intBitsToFloat(readIntBig(packet)); + } + public static float readFloatLittle(ByteSequence packet) throws IOException { + return Float.intBitsToFloat(readIntLittle(packet)); + } + + public static void write(ByteSequence packet, int b) throws IOException { + spaceNeeded(packet, 1); + packet.data[packet.offset++] = (byte) b; + } + + public static void write(ByteSequence packet, byte[] b) throws IOException { + write(packet, b, 0, b.length); + } + public static void write(ByteSequence packet, byte[] b, int off, int len) throws IOException { + spaceNeeded(packet, len); + System.arraycopy(b, off, packet.data, packet.offset, len); + packet.offset += len; + } + public static void writeBoolean(ByteSequence packet, boolean v) throws IOException { + spaceNeeded(packet, 1); + write(packet,v ? 1 : 0); + } + public static void writeByte(ByteSequence packet, int v) throws IOException { + spaceNeeded(packet, 1); + write(packet,v); + } + public static void writeShortBig(ByteSequence packet, int v) throws IOException { + spaceNeeded(packet, 2); + write(packet,(v >>> 8) & 0xFF); + write(packet,(v >>> 0) & 0xFF); + } + public static void writeShortLittle(ByteSequence packet, int v) throws IOException { + spaceNeeded(packet, 2); + write(packet,(v >>> 0) & 0xFF); + write(packet,(v >>> 8) & 0xFF); + } + public static void writeCharBig(ByteSequence packet, int v) throws IOException { + spaceNeeded(packet, 2); + write(packet,(v >>> 8) & 0xFF); + write(packet,(v >>> 0) & 0xFF); + } + public static void writeCharLittle(ByteSequence packet, int v) throws IOException { + spaceNeeded(packet, 2); + write(packet,(v >>> 0) & 0xFF); + write(packet,(v >>> 8) & 0xFF); + } + public static void writeIntBig(ByteSequence packet, int v) throws IOException { + spaceNeeded(packet, 4); + write(packet,(v >>> 24) & 0xFF); + write(packet,(v >>> 16) & 0xFF); + write(packet,(v >>> 8) & 0xFF); + write(packet,(v >>> 0) & 0xFF); + } + public static void writeIntLittle(ByteSequence packet, int v) throws IOException { + spaceNeeded(packet, 4); + write(packet,(v >>> 0) & 0xFF); + write(packet,(v >>> 8) & 0xFF); + write(packet,(v >>> 16) & 0xFF); + write(packet,(v >>> 24) & 0xFF); + } + public static void writeLongBig(ByteSequence packet, long v) throws IOException { + spaceNeeded(packet, 8); + write(packet,(int) (v >>> 56) & 0xFF); + write(packet,(int) (v >>> 48) & 0xFF); + write(packet,(int) (v >>> 40) & 0xFF); + write(packet,(int) (v >>> 32) & 0xFF); + write(packet,(int) (v >>> 24) & 0xFF); + write(packet,(int) (v >>> 16) & 0xFF); + write(packet,(int) (v >>> 8) & 0xFF); + write(packet,(int) (v >>> 0) & 0xFF); + } + public static void writeLongLittle(ByteSequence packet, long v) throws IOException { + spaceNeeded(packet, 8); + write(packet,(int) (v >>> 0) & 0xFF); + write(packet,(int) (v >>> 8) & 0xFF); + write(packet,(int) (v >>> 16) & 0xFF); + write(packet,(int) (v >>> 24) & 0xFF); + write(packet,(int) (v >>> 32) & 0xFF); + write(packet,(int) (v >>> 40) & 0xFF); + write(packet,(int) (v >>> 48) & 0xFF); + write(packet,(int) (v >>> 56) & 0xFF); + } + + public static void writeDoubleBig(ByteSequence packet, double v) throws IOException { + writeLongBig(packet, Double.doubleToLongBits(v)); + } + public static void writeDoubleLittle(ByteSequence packet, double v) throws IOException { + writeLongLittle(packet, Double.doubleToLongBits(v)); + } + + public static void writeFloatBig(ByteSequence packet, float v) throws IOException { + writeIntBig(packet, Float.floatToIntBits(v)); + } + public static void writeFloatLittle(ByteSequence packet, float v) throws IOException { + writeIntLittle(packet, Float.floatToIntBits(v)); + } + + public static void writeRawDoubleBig(ByteSequence packet, double v) throws IOException { + writeLongBig(packet, Double.doubleToRawLongBits(v)); + } + public static void writeRawDoubleLittle(ByteSequence packet, double v) throws IOException { + writeLongLittle(packet, Double.doubleToRawLongBits(v)); + } + + public static void writeRawFloatBig(ByteSequence packet, float v) throws IOException { + writeIntBig(packet, Float.floatToRawIntBits(v)); + } + public static void writeRawFloatLittle(ByteSequence packet, float v) throws IOException { + writeIntLittle(packet, Float.floatToRawIntBits(v)); + } + +} Propchange: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteSequenceData.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteSequenceData.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: geronimo/sandbox/gcache/server/src/main/java/org/apache/geronimo/gcache/util/ByteSequenceData.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: geronimo/sandbox/gcache/server/src/test/java/org/apache/geronimo/gcache/transports/tcp/TcpSocketServerTest.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/gcache/server/src/test/java/org/apache/geronimo/gcache/transports/tcp/TcpSocketServerTest.java?view=diff&rev=448152&r1=448151&r2=448152 ============================================================================== --- geronimo/sandbox/gcache/server/src/test/java/org/apache/geronimo/gcache/transports/tcp/TcpSocketServerTest.java (original) +++ geronimo/sandbox/gcache/server/src/test/java/org/apache/geronimo/gcache/transports/tcp/TcpSocketServerTest.java Wed Sep 20 03:41:29 2006 @@ -24,8 +24,9 @@ @Test() public void runServer() throws Exception { ThreadPool pool = new DefaultThreadPoolImpl(10); + MockSelectionKeyProcessor mock = new MockSelectionKeyProcessor(); + //TCPSocketServer server = new TCPSocketServer("localhost", 45678, pool, 2000, mock); TCPSocketServer server = new TCPSocketServer("localhost", 45678, pool, 2000); - // TODO: need a way to substitute the MockSelectionKeyProcessor before invoking the server server.start(); Thread.sleep(100000); server.stop();