1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 * 19 */ 20 package org.apache.mina.util.byteaccess; 21 22 23 import java.nio.ByteOrder; 24 25 import org.apache.mina.util.byteaccess.ByteArray.Cursor; 26 import org.apache.mina.util.byteaccess.CompositeByteArray.CursorListener; 27 28 29 /** 30 * Provides common functionality between the 31 * <code>CompositeByteArrayRelativeReader</code> and 32 * <code>CompositeByteArrayRelativeWriter</code>. 33 * 34 * @author The Apache MINA Project (dev@mina.apache.org) 35 */ 36 abstract class CompositeByteArrayRelativeBase 37 { 38 39 /** 40 * The underlying <code>CompositeByteArray</code>. 41 */ 42 protected final CompositeByteArray cba; 43 44 /** 45 * A cursor of the underlying <code>CompositeByteArray</code>. This 46 * cursor is never moved directly; its position only changes through calls 47 * to relative read or write methods. 48 */ 49 protected final Cursor cursor; 50 51 /** 52 * 53 * Creates a new instance of CompositeByteArrayRelativeBase. 54 * 55 * @param cba 56 * The {@link CompositeByteArray} that will be the base for this class 57 */ 58 public CompositeByteArrayRelativeBase( CompositeByteArray cba ) 59 { 60 this.cba = cba; 61 cursor = cba.cursor( cba.first(), new CursorListener() 62 { 63 64 public void enteredFirstComponent( int componentIndex, ByteArray component ) 65 { 66 // Do nothing. 67 } 68 69 70 public void enteredLastComponent( int componentIndex, ByteArray component ) 71 { 72 assert false; 73 } 74 75 76 public void enteredNextComponent( int componentIndex, ByteArray component ) 77 { 78 cursorPassedFirstComponent(); 79 } 80 81 82 public void enteredPreviousComponent( int componentIndex, ByteArray component ) 83 { 84 assert false; 85 } 86 87 } ); 88 } 89 90 91 /** 92 * @inheritDoc 93 */ 94 public final int getRemaining() 95 { 96 return cursor.getRemaining(); 97 } 98 99 100 /** 101 * @inheritDoc 102 */ 103 public final boolean hasRemaining() 104 { 105 return cursor.hasRemaining(); 106 } 107 108 109 /** 110 * @inheritDoc 111 */ 112 public ByteOrder order() 113 { 114 return cba.order(); 115 } 116 117 118 /** 119 * Make a <code>ByteArray</code> available for access at the end of this object. 120 */ 121 public final void append( ByteArray ba ) 122 { 123 cba.addLast( ba ); 124 } 125 126 127 /** 128 * Free all resources associated with this object. 129 */ 130 public final void free() 131 { 132 cba.free(); 133 } 134 135 136 /** 137 * Get the index that will be used for the next access. 138 */ 139 public final int getIndex() 140 { 141 return cursor.getIndex(); 142 } 143 144 145 /** 146 * Get the index after the last byte that can be accessed. 147 */ 148 public final int last() 149 { 150 return cba.last(); 151 } 152 153 154 /** 155 * Called whenever the cursor has passed from the <code>cba</code>'s 156 * first component. As the first component is no longer used, this provides 157 * a good opportunity for subclasses to perform some action on it (such as 158 * freeing it). 159 */ 160 protected abstract void cursorPassedFirstComponent(); 161 162 }