/*
* eXist Open Source Native XML Database
* Copyright (C) 2001-06 Wolfgang M. Meier
* wolfgang@exist-db.org
* http://exist.sourceforge.net
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id$
*/
package org.exist.storage;
import org.exist.collections.Collection;
import org.exist.dom.SymbolTable;
import org.exist.storage.btree.Value;
import org.exist.util.ByteConversion;
import org.exist.util.UTF8;
/**
* @author wolf
*/
public class ElementValue extends Value {
public static final byte UNKNOWN = -1;
public static final byte ELEMENT = 0;
public static final byte ATTRIBUTE = 1;
public static int LENGTH_TYPE = 1; //sizeof byte
public static int OFFSET_COLLECTION_ID = 0;
public static int OFFSET_TYPE = OFFSET_COLLECTION_ID + Collection.LENGTH_COLLECTION_ID; //2
public static int OFFSET_SYMBOL = OFFSET_TYPE + ElementValue.LENGTH_TYPE; //3
public static int OFFSET_NSSYMBOL = OFFSET_SYMBOL + SymbolTable.LENGTH_LOCAL_NAME; //5
public static int OFFSET_ID_STRING_VALUE = OFFSET_TYPE + LENGTH_TYPE; //3
public static final String[] type = { "element", "attribute", "id" };
ElementValue(int collectionId) {
len = Collection.LENGTH_COLLECTION_ID;
data = new byte[len];
ByteConversion.intToByte(collectionId, data, OFFSET_COLLECTION_ID);
pos = OFFSET_COLLECTION_ID;
}
ElementValue(byte type, int collectionId) {
len = Collection.LENGTH_COLLECTION_ID + ElementValue.LENGTH_TYPE;
data = new byte[len];
ByteConversion.intToByte(collectionId, data, OFFSET_COLLECTION_ID);
data[OFFSET_TYPE] = type;
pos = OFFSET_COLLECTION_ID;
}
ElementValue(byte type, int collectionId, short symbol) {
len = Collection.LENGTH_COLLECTION_ID + ElementValue.LENGTH_TYPE + SymbolTable.LENGTH_LOCAL_NAME;
data = new byte[len];
ByteConversion.intToByte(collectionId, data, OFFSET_COLLECTION_ID);
data[OFFSET_TYPE] = type;
ByteConversion.shortToByte(symbol, data, OFFSET_SYMBOL);
pos = OFFSET_COLLECTION_ID;
}
ElementValue(byte type, int collectionId, short symbol, short nsSymbol) {
len = Collection.LENGTH_COLLECTION_ID + ElementValue.LENGTH_TYPE + SymbolTable.LENGTH_LOCAL_NAME + OFFSET_NSSYMBOL;
data = new byte[len];
ByteConversion.intToByte(collectionId, data, OFFSET_COLLECTION_ID);
data[OFFSET_TYPE] = type;
ByteConversion.shortToByte(symbol, data, OFFSET_SYMBOL);
ByteConversion.shortToByte(nsSymbol, data, OFFSET_NSSYMBOL);
pos = OFFSET_COLLECTION_ID;
}
ElementValue(byte type, int collectionId, String idStringValue) {
//Note that the type expected to be ElementValue.ATTRIBUTE_ID
//TODO : add sanity check for this ?
len = Collection.LENGTH_COLLECTION_ID + ElementValue.LENGTH_TYPE + UTF8.encoded(idStringValue);
data = new byte[len];
ByteConversion.intToByte(collectionId, data, OFFSET_COLLECTION_ID);
data[OFFSET_TYPE] = type;
UTF8.encode(idStringValue, data, OFFSET_ID_STRING_VALUE);
//TODO : reset pos, just like in other contructors ?
}
int getCollectionId() {
return ByteConversion.byteToInt(data, OFFSET_COLLECTION_ID);
}
public String toString() {
StringBuilder buf = new StringBuilder();
buf.append("Collection id : " + ByteConversion.byteToInt(data, OFFSET_COLLECTION_ID));
if (len > OFFSET_COLLECTION_ID) {
buf.append(" Type : " + type[data[OFFSET_TYPE]]);
if (len == Collection.LENGTH_COLLECTION_ID + ElementValue.LENGTH_TYPE + SymbolTable.LENGTH_LOCAL_NAME)
buf.append(" Symbol id : " + ByteConversion.byteToShort(data, OFFSET_SYMBOL));
else if (len == Collection.LENGTH_COLLECTION_ID + ElementValue.LENGTH_TYPE +
SymbolTable.LENGTH_LOCAL_NAME + SymbolTable.LENGTH_NS_URI) {
buf.append(" Symbol id : " + ByteConversion.byteToShort(data, OFFSET_SYMBOL));
buf.append(" NSSymbol id : " + ByteConversion.byteToShort(data, OFFSET_NSSYMBOL));
} else
buf.append("Invalid data length !!!");
}
return buf.toString();
}
}