1 /* 2 * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package com.oracle.ipack.blobs; 27 28 import java.io.DataOutput; 29 import java.io.IOException; 30 31 public abstract class SuperBlob<T extends Blob> extends Blob { 32 private final SubBlob<T>[] subBlobs; 33 34 protected SuperBlob(final int numberOfSubBlobs) { 35 this.subBlobs = allocateSubBlobs(numberOfSubBlobs); 36 } 37 38 public final T getSubBlob(final int index) { 39 return subBlobs[index].getBlob(); 40 } 41 42 public final void setSubBlob(final int index, final int type, 43 final T blob) { 44 subBlobs[index].setType(type); 45 subBlobs[index].setBlob(blob); 46 } 47 48 @Override 49 protected final int getPayloadSize() { 50 int size = 4 + subBlobs.length * 8; 51 for (int i = 0; i < subBlobs.length; ++i) { 52 size += subBlobs[i].getBlob().getSize(); 53 } 54 55 return size; 56 } 57 58 @Override 59 protected final void writePayload(final DataOutput dataOutput) 60 throws IOException { 61 dataOutput.writeInt(subBlobs.length); 62 int offset = 8 + 4 + subBlobs.length * 8; 63 for (int i = 0; i < subBlobs.length; ++i) { 64 dataOutput.writeInt(subBlobs[i].getType()); 65 dataOutput.writeInt(offset); 66 67 offset += subBlobs[i].getBlob().getSize(); 68 } 69 70 for (int i = 0; i < subBlobs.length; ++i) { 71 subBlobs[i].getBlob().write(dataOutput); 72 } 73 } 74 75 @SuppressWarnings("unchecked") 76 private static <T extends Blob> SubBlob<T>[] allocateSubBlobs( 77 final int numberOfSubBlobs) { 78 final SubBlob<T>[] subBlobs = new SubBlob[numberOfSubBlobs]; 79 for (int i = 0; i < numberOfSubBlobs; ++i) { 80 subBlobs[i] = new SubBlob<T>(); 81 } 82 83 return subBlobs; 84 } 85 86 private static final class SubBlob<T extends Blob> { 87 private int type; 88 private T blob; 89 90 public int getType() { 91 return type; 92 } 93 94 public void setType(final int type) { 95 this.type = type; 96 } 97 98 public T getBlob() { 99 return blob; 100 } 101 102 public void setBlob(final T blob) { 103 this.blob = blob; 104 } 105 } 106 }