/* * eXist Open Source Native XML Database * Copyright (C) 2001-06 The eXist Project * http://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.dom; import org.exist.storage.BrokerPool; import org.exist.storage.io.VariableByteInput; import org.exist.storage.io.VariableByteOutputStream; import org.exist.util.MimeType; import org.w3c.dom.DocumentType; import java.io.IOException; public class DocumentMetadata { public final static byte NO_DOCTYPE = 0; public final static byte HAS_DOCTYPE = 1; public final static byte NO_LOCKTOKEN = 0; public final static byte HAS_LOCKTOKEN = 2; /** the mimeType of the document */ private String mimeType = MimeType.XML_TYPE.getName(); /** the creation time of this document */ private long created = 0; /** time of the last modification */ private long lastModified = 0; /** the number of data pages occupied by this document */ private int pageCount = 0; /** contains the user id if a user lock is held on this resource */ private int userLock = 0; /** the document's doctype declaration - if specified. */ private DocumentType docType = null; /** TODO associated locktoken - if available */ private LockToken lockToken = null; private transient NodeIndexListener listener = NullNodeIndexListener.INSTANCE; protected transient int splitCount = 0; private boolean isReferenced = false; public DocumentMetadata() { } public DocumentMetadata(DocumentMetadata other) { this.mimeType = other.mimeType; this.created = other.created; this.lastModified = other.lastModified; } /** * Copy all relevant fields from other */ public void copyOf(DocumentMetadata other) { setCreated(other.getCreated()); setLastModified(other.getLastModified()); setMimeType(other.getMimeType()); setDocType(other.getDocType()); } public long getCreated() { return created; } public void setCreated(long created) { this.created = created; if(lastModified == 0) lastModified = created; } public long getLastModified() { return lastModified; } public void setLastModified(long lastModified) { this.lastModified = lastModified; } public String getMimeType() { return mimeType; } public void setMimeType(String mimeType) { this.mimeType = mimeType; } /** * Returns the number of pages currently occupied by this document. * */ public int getPageCount() { return pageCount; } /** * Set the number of pages currently occupied by this document. * @param pageCount */ public void setPageCount(int pageCount) { this.pageCount = pageCount; } public void incPageCount() { ++pageCount; } public void decPageCount() { --pageCount; } public void write(BrokerPool pool, VariableByteOutputStream ostream) throws IOException { ostream.writeLong(created); ostream.writeLong(lastModified); ostream.writeInt(pool.getSymbols().getMimeTypeId(mimeType)); ostream.writeInt(pageCount); ostream.writeInt(userLock); if (docType != null) { ostream.writeByte(HAS_DOCTYPE); ((DocumentTypeImpl) docType).write(ostream); } else { ostream.writeByte(NO_DOCTYPE); } // TODO added by dwes if (lockToken != null) { ostream.writeByte(HAS_LOCKTOKEN); lockToken.write(ostream); } else { ostream.writeByte(NO_LOCKTOKEN); } } public void read(BrokerPool pool, VariableByteInput istream) throws IOException { created = istream.readLong(); lastModified = istream.readLong(); mimeType = pool.getSymbols().getMimeType(istream.readInt()); pageCount = istream.readInt(); userLock = istream.readInt(); if (istream.readByte() == HAS_DOCTYPE) { docType = new DocumentTypeImpl(); ((DocumentTypeImpl) docType).read(istream); } else { docType = null; } // TODO added by dwes if(istream.readByte() == HAS_LOCKTOKEN){ lockToken = new LockToken(); lockToken.read(istream); } else { lockToken = null; } } public int getUserLock() { return userLock; } public void setUserLock(int userLock) { this.userLock = userLock; } public LockToken getLockToken(){ return lockToken; } public void setLockToken(LockToken token){ lockToken=token; } public DocumentType getDocType() { return docType; } public void setDocType(DocumentType docType) { this.docType = docType; } public NodeIndexListener getIndexListener() { return listener; } public void clearIndexListener() { listener = NullNodeIndexListener.INSTANCE; } public void setIndexListener(NodeIndexListener listener) { this.listener = listener; } /** * Increase the page split count of this document. The number * of pages that have been split during inserts serves as an * indicator for the fragmentation * */ public void incSplitCount() { splitCount++; } public int getSplitCount() { return splitCount; } public void setSplitCount(int count) { splitCount = count; } public boolean isReferenced() { return isReferenced; } public void setReferenced(boolean referenced) { isReferenced = referenced; } }