1 /** 2 * JDBM LICENSE v1.00 3 * 4 * Redistribution and use of this software and associated documentation 5 * ("Software"), with or without modification, are permitted provided 6 * that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain copyright 9 * statements and notices. Redistributions must also contain a 10 * copy of this document. 11 * 12 * 2. Redistributions in binary form must reproduce the 13 * above copyright notice, this list of conditions and the 14 * following disclaimer in the documentation and/or other 15 * materials provided with the distribution. 16 * 17 * 3. The name "JDBM" must not be used to endorse or promote 18 * products derived from this Software without prior written 19 * permission of Cees de Groot. For written permission, 20 * please contact cg@cdegroot.com. 21 * 22 * 4. Products derived from this Software may not be called "JDBM" 23 * nor may "JDBM" appear in their names without prior written 24 * permission of Cees de Groot. 25 * 26 * 5. Due credit should be given to the JDBM Project 27 * (http://jdbm.sourceforge.net/). 28 * 29 * THIS SOFTWARE IS PROVIDED BY THE JDBM PROJECT AND CONTRIBUTORS 30 * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT 31 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 32 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 33 * CEES DE GROOT OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 34 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 35 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 36 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 37 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 38 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 39 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 40 * OF THE POSSIBILITY OF SUCH DAMAGE. 41 * 42 * Copyright 2000 (C) Cees de Groot. All Rights Reserved. 43 * Contributions are Copyright (C) 2000 by their associated contributors. 44 * 45 * $Id: PageHeader.java,v 1.2 2003/09/21 15:47:01 boisvert Exp $ 46 */ 47 48 package jdbm.recman; 49 50 /** 51 * This class represents a page header. It is the common superclass for 52 * all different page views. 53 */ 54 public class PageHeader implements BlockView { 55 // offsets 56 private static final short O_MAGIC = 0; // short magic 57 private static final short O_NEXT = Magic.SZ_SHORT; // long next 58 private static final short O_PREV = O_NEXT + Magic.SZ_LONG; // long prev 59 protected static final short SIZE = O_PREV + Magic.SZ_LONG; 60 61 // my block 62 protected BlockIo block; 63 64 /** 65 * Constructs a PageHeader object from a block 66 * 67 * @param block The block that contains the file header 68 * @throws IOException if the block is too short to keep the file 69 * header. 70 */ 71 protected PageHeader(BlockIo block) { 72 initialize(block); 73 if (!magicOk()) 74 throw new Error("CRITICAL: page header magic for block " 75 + block.getBlockId() + " not OK " 76 + getMagic()); 77 } 78 79 /** 80 * Constructs a new PageHeader of the indicated type. Used for newly 81 * created pages. 82 */ 83 PageHeader(BlockIo block, short type) { 84 initialize(block); 85 setType(type); 86 } 87 88 /** 89 * Factory method to create or return a page header for the 90 * indicated block. 91 */ 92 static PageHeader getView(BlockIo block) { 93 BlockView view = block.getView(); 94 if (view != null && view instanceof PageHeader) 95 return (PageHeader) view; 96 else 97 return new PageHeader(block); 98 } 99 100 private void initialize(BlockIo block) { 101 this.block = block; 102 block.setView(this); 103 } 104 105 /** 106 * Returns true if the magic corresponds with the fileHeader magic. 107 */ 108 private boolean magicOk() { 109 int magic = getMagic(); 110 return magic >= Magic.BLOCK 111 && magic <= (Magic.BLOCK + Magic.FREEPHYSIDS_PAGE); 112 } 113 114 /** 115 * For paranoia mode 116 */ 117 protected void paranoiaMagicOk() { 118 if (!magicOk()) 119 throw new Error("CRITICAL: page header magic not OK " 120 + getMagic()); 121 } 122 123 /** Returns the magic code */ 124 short getMagic() { 125 return block.readShort(O_MAGIC); 126 } 127 128 /** Returns the next block. */ 129 long getNext() { 130 paranoiaMagicOk(); 131 return block.readLong(O_NEXT); 132 } 133 134 /** Sets the next block. */ 135 void setNext(long next) { 136 paranoiaMagicOk(); 137 block.writeLong(O_NEXT, next); 138 } 139 140 /** Returns the previous block. */ 141 long getPrev() { 142 paranoiaMagicOk(); 143 return block.readLong(O_PREV); 144 } 145 146 /** Sets the previous block. */ 147 void setPrev(long prev) { 148 paranoiaMagicOk(); 149 block.writeLong(O_PREV, prev); 150 } 151 152 /** Sets the type of the page header */ 153 void setType(short type) { 154 block.writeShort(O_MAGIC, (short) (Magic.BLOCK + type)); 155 } 156 }