From: <ga...@us...> - 2009-01-30 23:01:59
|
Revision: 4929 http://jnode.svn.sourceforge.net/jnode/?rev=4929&view=rev Author: galatnm Date: 2009-01-30 23:01:52 +0000 (Fri, 30 Jan 2009) Log Message: ----------- Update HFS+ creation. Modified Paths: -------------- trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusDirectory.java trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusFile.java trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogKey.java trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentKey.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractKey.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexNode.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexRecord.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Key.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafNode.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafRecord.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Node.java Added Paths: ----------- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNode.java trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentNode.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractNode.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractNodeRecord.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/NodeRecord.java Removed Paths: ------------- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogIndexNode.java trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogLeafNode.java trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentIndexNode.java trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentLeafNode.java Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusDirectory.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusDirectory.java 2009-01-29 16:26:33 UTC (rev 4928) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusDirectory.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -27,7 +27,7 @@ public HFSPlusDirectory(final HFSPlusEntry e) { super((HfsPlusFileSystem) e.getFileSystem()); this.record = e.getRecord(); - this.folder = new CatalogFolder(record.getRecordData()); + this.folder = new CatalogFolder(record.getData()); log.debug("Associated record:" + record.toString()); if (record.getType() == HfsPlusConstants.RECORD_TYPE_FOLDER) { log.debug("Associated folder : " + folder.toString()); Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusFile.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusFile.java 2009-01-29 16:26:33 UTC (rev 4928) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusFile.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -15,12 +15,11 @@ public HFSPlusFile(final HFSPlusEntry e) { super((HfsPlusFileSystem) e.getFileSystem()); this.record = e.getRecord(); - this.file = new CatalogFile(record.getRecordData()); + this.file = new CatalogFile(record.getData()); } @Override public void flush() throws IOException { - // TODO Auto-generated method stub } Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java 2009-01-29 16:26:33 UTC (rev 4928) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -16,6 +16,7 @@ import org.jnode.fs.hfsplus.tree.IndexRecord; import org.jnode.fs.hfsplus.tree.LeafRecord; import org.jnode.fs.hfsplus.tree.NodeDescriptor; +import org.jnode.fs.hfsplus.tree.NodeRecord; import org.jnode.util.ByteBufferUtils; public class Catalog { @@ -85,7 +86,7 @@ bthr.setClumpSize(params.getCatalogClumpSize()); // TODO initialize attributes, max key length and key comparaison type. bufferLength += BTHeaderRecord.BT_HEADER_RECORD_LENGTH; - + // Create root node int rootNodePosition = bthr.getRootNode() * bthr.getNodeSize(); bufferLength += (rootNodePosition - bufferLength); //Create node descriptor @@ -93,28 +94,28 @@ nd.setKind(HfsPlusConstants.BT_LEAF_NODE); nd.setHeight(1); nd.setRecordCount(params.isJournaled() ? 6 : 2); - CatalogLeafNode clf = new CatalogLeafNode(nd, bthr.getNodeSize()); + CatalogNode rootNode = new CatalogNode(nd, bthr.getNodeSize()); + int offset = NodeDescriptor.BT_NODE_DESCRIPTOR_LENGTH; // First record (folder) - int offset = rootNodePosition + NodeDescriptor.BT_NODE_DESCRIPTOR_LENGTH; HFSUnicodeString name = new HFSUnicodeString(params.getVolumeName()); CatalogKey ck = new CatalogKey(CatalogNodeId.HFSPLUS_POR_CNID, name); CatalogFolder folder = new CatalogFolder(); folder.setFolderId(CatalogNodeId.HFSPLUS_ROOT_CNID); folder.setValence(params.isJournaled() ? 2 : 0); LeafRecord record = new LeafRecord(ck, folder.getBytes()); - clf.addRecord(record, offset, 0); + rootNode.addNodeRecord(0, record, offset); // Second record (thread) offset = offset + ck.getKeyLength() + CatalogFolder.CATALOG_FOLDER_SIZE; CatalogKey tck = new CatalogKey(CatalogNodeId.HFSPLUS_ROOT_CNID, name); CatalogThread ct = new CatalogThread(HfsPlusConstants.RECORD_TYPE_FOLDER_THREAD, CatalogNodeId.HFSPLUS_ROOT_CNID, new HFSUnicodeString("")); record = new LeafRecord(tck, ct.getBytes()); - clf.addRecord(record, offset, 1); + rootNode.addNodeRecord(1, record, offset); buffer = ByteBuffer.allocate(bufferLength + bthr.getNodeSize()); buffer.put(btnd.getBytes()); buffer.put(bthr.getBytes()); buffer.position(rootNodePosition); - buffer.put(clf.getBytes()); + buffer.put(rootNode.getBytes()); buffer.rewind(); } @@ -126,27 +127,26 @@ */ public final LeafRecord getRecord(final CatalogNodeId parentID) throws IOException { + int currentOffset = 0; + LeafRecord lr = null; int nodeSize = getBTHeaderRecord().getNodeSize(); ByteBuffer nodeData = ByteBuffer.allocate(nodeSize); fs.getApi().read(catalogHeaderNodeOffset + (getBTHeaderRecord().getRootNode() * nodeSize), nodeData); nodeData.rewind(); byte[] data = ByteBufferUtils.toArray(nodeData); - NodeDescriptor currentBtnd = new NodeDescriptor(data, 0); - int currentOffset = 0; - while (currentBtnd.getKind() == HfsPlusConstants.BT_INDEX_NODE) { - CatalogIndexNode currentIndexNode = new CatalogIndexNode(currentBtnd, data, nodeSize); - IndexRecord record = currentIndexNode.find(parentID); + CatalogNode node = new CatalogNode(data, nodeSize); + while (node.isIndexNode()) { + IndexRecord record = (IndexRecord)node.find(parentID); currentOffset = catalogHeaderNodeOffset + (record.getIndex() * nodeSize); nodeData = ByteBuffer.allocate(nodeSize); fs.getApi().read(currentOffset, nodeData); nodeData.rewind(); data = ByteBufferUtils.toArray(nodeData); - currentBtnd = new NodeDescriptor(data, 0); + node = new CatalogNode(data, nodeSize); } - LeafRecord lr = null; - if (currentBtnd.getKind() == HfsPlusConstants.BT_LEAF_NODE) { - CatalogLeafNode leaf = new CatalogLeafNode(currentBtnd, data, nodeSize); - lr = leaf.find(parentID); + + if (node.isLeafNode()) { + lr = (LeafRecord)node.find(parentID); } return lr; } @@ -180,14 +180,12 @@ throws IOException { try { int currentNodeNumber = nodeNumber; - int currentNodeSize = getBTHeaderRecord().getNodeSize(); - ByteBuffer nodeData = ByteBuffer.allocate(currentNodeSize); - fs.getApi().read(catalogHeaderNodeOffset + (currentNodeNumber * currentNodeSize), nodeData); - NodeDescriptor currentBtnd = new NodeDescriptor(nodeData.array(), 0); - if (currentBtnd.getKind() == HfsPlusConstants.BT_INDEX_NODE) { - CatalogIndexNode currentIndexNode = new CatalogIndexNode(currentBtnd, nodeData.array(), - currentNodeSize); - IndexRecord[] records = currentIndexNode.findChilds(parentID); + int nodeSize = getBTHeaderRecord().getNodeSize(); + ByteBuffer nodeData = ByteBuffer.allocate(nodeSize); + fs.getApi().read(catalogHeaderNodeOffset + (currentNodeNumber * nodeSize), nodeData); + CatalogNode node = new CatalogNode(nodeData.array(), nodeSize); + if (node.isIndexNode()) { + IndexRecord[] records = (IndexRecord[])node.findChilds(parentID); List<LeafRecord> lfList = new LinkedList<LeafRecord>(); for (IndexRecord rec : records) { LeafRecord[] lfr = getRecords(parentID, rec.getIndex()); @@ -196,10 +194,8 @@ } } return lfList.toArray(new LeafRecord[lfList.size()]); - } else if (currentBtnd.getKind() == HfsPlusConstants.BT_LEAF_NODE) { - CatalogLeafNode leaf = new CatalogLeafNode(currentBtnd, nodeData.array(), currentNodeSize); - LeafRecord[] lr = leaf.findAll(parentID); - return lr; + } else if (node.isLeafNode()) { + return (LeafRecord[])node.findAll(parentID); } else { return null; } @@ -220,25 +216,23 @@ public final LeafRecord getRecord(final CatalogNodeId parentID, final HFSUnicodeString nodeName) throws IOException { int currentNodeNumber = getBTHeaderRecord().getRootNode(); - int currentNodeSize = getBTHeaderRecord().getNodeSize(); - ByteBuffer buffer = ByteBuffer.allocate(currentNodeSize); - fs.getApi().read(catalogHeaderNodeOffset + (currentNodeNumber * currentNodeSize), buffer); - NodeDescriptor currentBtnd = new NodeDescriptor(buffer.array(), 0); - CatalogKey cKey = new CatalogKey(parentID, nodeName); + int nodeSize = getBTHeaderRecord().getNodeSize(); + ByteBuffer nodeData = ByteBuffer.allocate(nodeSize); + fs.getApi().read(catalogHeaderNodeOffset + (currentNodeNumber * nodeSize), buffer); + CatalogNode node = new CatalogNode(nodeData.array(), nodeSize); int currentOffset = 0; - while (currentBtnd.getKind() == HfsPlusConstants.BT_INDEX_NODE) { - CatalogIndexNode currentIndexNode = new CatalogIndexNode(currentBtnd, buffer.array(), currentNodeSize); - IndexRecord record = currentIndexNode.find(cKey); + CatalogKey cKey = new CatalogKey(parentID, nodeName); + while (node.isIndexNode()) { + IndexRecord record = (IndexRecord)node.find(cKey); currentNodeNumber = record.getIndex(); - currentOffset = catalogHeaderNodeOffset + currentNodeNumber * currentNodeSize; - buffer = ByteBuffer.allocate(currentNodeSize); + currentOffset = catalogHeaderNodeOffset + record.getIndex() * nodeSize; + nodeData = ByteBuffer.allocate(nodeSize); fs.getApi().read(currentOffset, buffer); - currentBtnd = new NodeDescriptor(buffer.array(), 0); + node = new CatalogNode(nodeData.array(), nodeSize); } LeafRecord lr = null; - if (currentBtnd.getKind() == HfsPlusConstants.BT_LEAF_NODE) { - CatalogLeafNode leaf = new CatalogLeafNode(currentBtnd, buffer.array(), currentNodeSize); - lr = leaf.find(parentID); + if (node.isLeafNode()) { + lr = (LeafRecord)node.find(parentID); } return lr; } Deleted: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogIndexNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogIndexNode.java 2009-01-29 16:26:33 UTC (rev 4928) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogIndexNode.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -1,73 +0,0 @@ -package org.jnode.fs.hfsplus.catalog; - -import java.util.LinkedList; - -import org.apache.log4j.Logger; -import org.jnode.fs.hfsplus.tree.IndexNode; -import org.jnode.fs.hfsplus.tree.IndexRecord; -import org.jnode.fs.hfsplus.tree.Key; -import org.jnode.fs.hfsplus.tree.NodeDescriptor; - -public class CatalogIndexNode extends IndexNode { - private final Logger log = Logger.getLogger(getClass()); - - public CatalogIndexNode(final NodeDescriptor descriptor, final byte[] nodeData, final int nodeSize) { - super(descriptor, nodeData, nodeSize); - for (int i = 0; i < records.length; ++i) { - int currentOffset = getOffset(i); - Key currentKey = new CatalogKey(nodeData, currentOffset); - records[i] = new IndexRecord(currentKey, nodeData, currentOffset); - log.debug("Index record key:" + records[i].getKey().toString()); - } - } - - /** - * - * @param parentId - * @return - */ - public final IndexRecord find(final CatalogNodeId parentId) { - for (IndexRecord rec : records) { - Key key = rec.getKey(); - if (key instanceof CatalogKey) { - if (((CatalogKey) key).getParentId().getId() == parentId.getId()) { - return rec; - } - } - } - return null; - } - - public final IndexRecord[] findChilds(final CatalogNodeId parentId) { - LinkedList<IndexRecord> result = new LinkedList<IndexRecord>(); - IndexRecord largestMatchingRecord = null; - CatalogKey largestMatchingKey = null; - for (IndexRecord rec : records) { - CatalogKey key = (CatalogKey) rec.getKey(); - if (key.getParentId().getId() < parentId.getId() - && (largestMatchingKey == null || key.compareTo(largestMatchingKey) > 0)) { - largestMatchingKey = key; - largestMatchingRecord = rec; - } else if (key.getParentId().getId() == parentId.getId()) { - result.addLast(rec); - } - } - - if (largestMatchingKey != null) { - result.addFirst(largestMatchingRecord); - } - return result.toArray(new IndexRecord[result.size()]); - } - - public final IndexRecord find(final CatalogKey key) { - IndexRecord largestMatchingRecord = null; - for (int i = 0; i < records.length; ++i) { - if (records[i].getKey().compareTo(key) <= 0 - && (largestMatchingRecord == null - || records[i].getKey().compareTo(largestMatchingRecord.getKey()) > 0)) { - largestMatchingRecord = records[i]; - } - } - return largestMatchingRecord; - } -} Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogKey.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogKey.java 2009-01-29 16:26:33 UTC (rev 4928) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogKey.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -45,10 +45,6 @@ return keyLength; } - public final int getLength() { - return keyLength; - } - public final CatalogNodeId getParentId() { return parentID; } @@ -91,4 +87,5 @@ .getUnicodeString() : ""); return s.toString(); } + } Deleted: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogLeafNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogLeafNode.java 2009-01-29 16:26:33 UTC (rev 4928) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogLeafNode.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -1,65 +0,0 @@ -package org.jnode.fs.hfsplus.catalog; - -import java.util.LinkedList; -import java.util.List; - -import org.jnode.fs.hfsplus.tree.Key; -import org.jnode.fs.hfsplus.tree.LeafNode; -import org.jnode.fs.hfsplus.tree.LeafRecord; -import org.jnode.fs.hfsplus.tree.NodeDescriptor; - -public class CatalogLeafNode extends LeafNode { - - public CatalogLeafNode(final NodeDescriptor descriptor, final int nodeSize) { - super(descriptor, nodeSize); - } - - public CatalogLeafNode(final NodeDescriptor descriptor, final byte[] nodeData, final int nodeSize) { - super(descriptor, nodeData, nodeSize); - for (int i = 0; i < records.length; ++i) { - int currentOffset = getOffset(i); - int recordDataSize = getOffset(i + 1) - currentOffset; - Key key = new CatalogKey(nodeData, currentOffset); - records[i] = new LeafRecord(key, nodeData, currentOffset, recordDataSize); - } - } - - - - /** - * - * @param parentId - * @return - */ - public final LeafRecord find(final CatalogNodeId parentId) { - for (LeafRecord rec : records) { - Key key = rec.getKey(); - if (key instanceof CatalogKey) { - if (((CatalogKey) key).getParentId().getId() == parentId.getId()) { - return rec; - } - } - } - return null; - } - - /** - * - * @param parentId - * @return - */ - public final LeafRecord[] findAll(final CatalogNodeId parentId) { - List<LeafRecord> list = new LinkedList<LeafRecord>(); - for (LeafRecord rec : records) { - Key key = rec.getKey(); - if (key instanceof CatalogKey && ((CatalogKey) key).getParentId().getId() == parentId.getId()) { - list.add(rec); - } - } - return list.toArray(new LeafRecord[list.size()]); - } - - public byte[] getBytes() { - return nodeData; - } -} Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNode.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNode.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -0,0 +1,120 @@ +package org.jnode.fs.hfsplus.catalog; + +import java.util.LinkedList; +import java.util.List; + +import org.jnode.fs.hfsplus.tree.AbstractNode; +import org.jnode.fs.hfsplus.tree.IndexRecord; +import org.jnode.fs.hfsplus.tree.Key; +import org.jnode.fs.hfsplus.tree.LeafRecord; +import org.jnode.fs.hfsplus.tree.NodeDescriptor; +import org.jnode.fs.hfsplus.tree.NodeRecord; + +public class CatalogNode extends AbstractNode { + + public CatalogNode(NodeDescriptor descriptor, final int nodeSize) { + this.size = nodeSize; + this.datas = new byte[nodeSize]; + System.arraycopy(descriptor.getBytes(), 0, datas, 0, NodeDescriptor.BT_NODE_DESCRIPTOR_LENGTH); + } + + public CatalogNode(final byte[] nodeData, final int nodeSize) { + this.size = nodeSize; + this.datas = nodeData; + } + + @Override + public NodeRecord getNodeRecord(int index) { + int offset = this.getRecordOffset(index); + int offset2 = this.getRecordOffset(index + 1); + int recordSize = offset2 - offset; + NodeRecord record = null; + Key key = new CatalogKey(datas, offset); + if(isIndexNode()){ + record = new IndexRecord(key, datas, offset); + } else { + record = new LeafRecord(key, datas, offset, recordSize); + } + return record; + } + + /** + * + * @param parentId + * @return + */ + public final NodeRecord find(final CatalogNodeId parentId) { + for (int index = 0; index < this.getNodeDescriptor().getNumRecords(); index++) { + NodeRecord record = this.getNodeRecord(index); + Key key = record.getKey(); + if (key instanceof CatalogKey) { + if (((CatalogKey) key).getParentId().getId() == parentId.getId()) { + return record; + } + } + } + return null; + } + + /** + * + * @param key + * @return + */ + public NodeRecord find(final CatalogKey key) { + NodeRecord largestMatchingRecord = null; + for (int index = 0; index < this.getNodeDescriptor().getNumRecords(); index++) { + NodeRecord record = this.getNodeRecord(index); + if ((record.getKey().compareTo(key) <= 0) + && (record.getKey().compareTo(largestMatchingRecord.getKey()) > 0)) { + largestMatchingRecord = record; + } + } + return largestMatchingRecord; + } + + /** + * + * @param parentId + * @return + */ + public final NodeRecord[] findChilds(final CatalogNodeId parentId) { + LinkedList<NodeRecord> result = new LinkedList<NodeRecord>(); + NodeRecord largestMatchingRecord = null; + CatalogKey largestMatchingKey = null; + for (int index = 0; index < this.getNodeDescriptor().getNumRecords(); index++) { + NodeRecord record = this.getNodeRecord(index); + CatalogKey key = (CatalogKey) record.getKey(); + if (key.getParentId().getId() < parentId.getId() + && (largestMatchingKey == null || key.compareTo(largestMatchingKey) > 0)) { + largestMatchingKey = key; + largestMatchingRecord = record; + } else if (key.getParentId().getId() == parentId.getId()) { + result.addLast(record); + } + } + + if (largestMatchingKey != null) { + result.addFirst(largestMatchingRecord); + } + return result.toArray(new NodeRecord[result.size()]); + } + + /** + * + * @param parentId + * @return + */ + public final NodeRecord[] findAll(final CatalogNodeId parentId) { + List<NodeRecord> list = new LinkedList<NodeRecord>(); + for (int index = 0; index < this.getNodeDescriptor().getNumRecords(); index++) { + NodeRecord record = this.getNodeRecord(index); + Key key = record.getKey(); + if (key instanceof CatalogKey && ((CatalogKey) key).getParentId().getId() == parentId.getId()) { + list.add(record); + } + } + return list.toArray(new NodeRecord[list.size()]); + } + +} Deleted: trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentIndexNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentIndexNode.java 2009-01-29 16:26:33 UTC (rev 4928) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentIndexNode.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -1,24 +0,0 @@ -package org.jnode.fs.hfsplus.extent; - -import org.jnode.fs.hfsplus.tree.IndexNode; -import org.jnode.fs.hfsplus.tree.IndexRecord; -import org.jnode.fs.hfsplus.tree.Key; -import org.jnode.fs.hfsplus.tree.NodeDescriptor; - -public class ExtentIndexNode extends IndexNode { - - /** - * - * @param descriptor - * @param nodeData - * @param nodeSize - */ - public ExtentIndexNode(final NodeDescriptor descriptor, final byte[] nodeData, final int nodeSize) { - super(descriptor, nodeData, nodeSize); - for (int i = 0; i < records.length; ++i) { - int currentOffset = getOffset(i); - Key currentKey = new ExtentKey(nodeData, currentOffset); - records[i] = new IndexRecord(currentKey, nodeData, currentOffset); - } - } -} Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentKey.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentKey.java 2009-01-29 16:26:33 UTC (rev 4928) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentKey.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -40,14 +40,14 @@ } @Override - public final int getLength() { - return KEY_LENGTH; + public final int compareTo(final Key key) { + return 0; } @Override - public final int compareTo(final Key key) { + public byte[] getBytes() { // TODO Auto-generated method stub - return 0; + return null; } } Deleted: trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentLeafNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentLeafNode.java 2009-01-29 16:26:33 UTC (rev 4928) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentLeafNode.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -1,25 +0,0 @@ -package org.jnode.fs.hfsplus.extent; - -import org.jnode.fs.hfsplus.tree.Key; -import org.jnode.fs.hfsplus.tree.LeafNode; -import org.jnode.fs.hfsplus.tree.LeafRecord; -import org.jnode.fs.hfsplus.tree.NodeDescriptor; - -public class ExtentLeafNode extends LeafNode { - - /** - * - * @param descriptor - * @param nodeData - * @param nodeSize - */ - public ExtentLeafNode(final NodeDescriptor descriptor, final byte[] nodeData, final int nodeSize) { - super(descriptor, nodeData, nodeSize); - for (int i = 0; i < records.length; ++i) { - int currentOffset = getOffset(i); - int recordDataSize = getOffset(i + 1) - currentOffset; - Key currentKey = new ExtentKey(nodeData, currentOffset); - records[i] = new LeafRecord(currentKey, nodeData, currentOffset, recordDataSize); - } - } -} Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentNode.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentNode.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -0,0 +1,26 @@ +package org.jnode.fs.hfsplus.extent; + +import org.jnode.fs.hfsplus.tree.AbstractNode; +import org.jnode.fs.hfsplus.tree.NodeDescriptor; +import org.jnode.fs.hfsplus.tree.NodeRecord; + +public class ExtentNode extends AbstractNode { + + public ExtentNode(NodeDescriptor descriptor, final int nodeSize) { + this.size = nodeSize; + this.datas = new byte[nodeSize]; + System.arraycopy(descriptor.getBytes(), 0, datas, 0, NodeDescriptor.BT_NODE_DESCRIPTOR_LENGTH); + } + + public ExtentNode(final byte[] nodeData, final int nodeSize) { + this.size = nodeSize; + this.datas = nodeData; + } + + @Override + public NodeRecord getNodeRecord(int index) { + // TODO Auto-generated method stub + return null; + } + +} Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractKey.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractKey.java 2009-01-29 16:26:33 UTC (rev 4928) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractKey.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -1,9 +1,10 @@ package org.jnode.fs.hfsplus.tree; public abstract class AbstractKey implements Key { + public abstract int getKeyLength(); + + public abstract byte[] getBytes(); - public abstract int getLength(); - public abstract int compareTo(Key key); } Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractNode.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractNode.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -0,0 +1,41 @@ +package org.jnode.fs.hfsplus.tree; + +import org.jnode.fs.hfsplus.HfsPlusConstants; +import org.jnode.util.BigEndian; + +public abstract class AbstractNode implements Node { + + protected byte[] datas; + protected int size; + + @Override + public NodeDescriptor getNodeDescriptor() { + return new NodeDescriptor(datas, 0); + } + + public boolean isIndexNode(){ + return this.getNodeDescriptor().getKind() == HfsPlusConstants.BT_INDEX_NODE; + } + + public boolean isLeafNode(){ + return this.getNodeDescriptor().getKind() == HfsPlusConstants.BT_LEAF_NODE; + } + + @Override + public int getRecordOffset(int index) { + return BigEndian.getInt16(datas, size - ((index + 1) * 2)); + } + + @Override + public abstract NodeRecord getNodeRecord(int index); + + @Override + public void addNodeRecord(int index, NodeRecord record, int offset) { + BigEndian.setInt16(datas, size - ((index + 1) * 2), offset); + System.arraycopy(record.getBytes(), 0, datas, offset, record.getSize()); + } + + public byte[] getBytes(){ + return datas; + } +} Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractNodeRecord.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractNodeRecord.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractNodeRecord.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -0,0 +1,21 @@ +package org.jnode.fs.hfsplus.tree; + +public abstract class AbstractNodeRecord implements NodeRecord { + + protected Key key = null; + protected byte[] recordData = null; + + public Key getKey() { + return key; + } + + public byte[] getData() { + return recordData; + } + + public int getSize(){ + return key.getKeyLength() + recordData.length; + } + + public abstract byte[] getBytes(); +} Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexNode.java 2009-01-29 16:26:33 UTC (rev 4928) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexNode.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -1,7 +1,6 @@ package org.jnode.fs.hfsplus.tree; -public class IndexNode extends Node { - protected IndexRecord[] records; +public class IndexNode extends AbstractNode { /** * @@ -9,16 +8,13 @@ * @param nodeData * @param nodeSize */ - public IndexNode(final NodeDescriptor descriptor, final byte[] nodeData, final int nodeSize) { - super(descriptor, nodeData, nodeSize); - records = new IndexRecord[descriptor.getNumRecords()]; + public IndexNode(final byte[] nodeData, final int nodeSize) { + this.size = nodeSize; + this.datas = nodeData; } - /** - * - * @return - */ - public final IndexRecord getRecord(int index) { - return records[index]; + @Override + public NodeRecord getNodeRecord(int index) { + return null; } } Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexRecord.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexRecord.java 2009-01-29 16:26:33 UTC (rev 4928) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexRecord.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -2,9 +2,7 @@ import org.jnode.util.BigEndian; -public class IndexRecord { - private final Key key; - private final byte[] index; +public class IndexRecord extends AbstractNodeRecord { /** * @@ -14,15 +12,18 @@ */ public IndexRecord(final Key key, final byte[] nodeData, final int offset) { this.key = key; - index = new byte[4]; - System.arraycopy(nodeData, offset + key.getLength() + 2, index, 0, 4); + this.recordData = new byte[4]; + System.arraycopy(nodeData, offset + key.getKeyLength() + 2, recordData, 0, 4); } - public final Key getKey() { - return key; + @Override + public byte[] getBytes() { + // TODO Auto-generated method stub + return null; } - + public final int getIndex() { - return BigEndian.getInt32(index, 0); + return BigEndian.getInt32(recordData, 0); } + } Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Key.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Key.java 2009-01-29 16:26:33 UTC (rev 4928) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Key.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -1,7 +1,11 @@ package org.jnode.fs.hfsplus.tree; public interface Key extends Comparable<Key> { - int getKeyLength(); - - int getLength(); + + public int getKeyLength(); + + public byte[] getBytes(); + + public int compareTo(Key key); + } Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafNode.java 2009-01-29 16:26:33 UTC (rev 4928) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafNode.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -1,38 +1,31 @@ package org.jnode.fs.hfsplus.tree; -public class LeafNode extends Node { - protected LeafRecord[] records; +public class LeafNode extends AbstractNode { + /** * * @param descriptor + * @param nodeData * @param nodeSize */ - public LeafNode(final NodeDescriptor descriptor, int nodeSize) { - super(descriptor, nodeSize); - records = new LeafRecord[descriptor.getNumRecords()]; + public LeafNode(final byte[] nodeData, final int nodeSize) { + this.size = nodeSize; + this.datas = nodeData; } - - /** - * - * @param record - * @param offset - * @param index - */ - public void addRecord(LeafRecord record, int offset, int index) { - records[index] = record; - this.setOffset(index, offset); - } /** * * @param descriptor - * @param nodeData * @param nodeSize */ - public LeafNode(final NodeDescriptor descriptor, final byte[] nodeData, final int nodeSize) { - super(descriptor, nodeData, nodeSize); - records = new LeafRecord[descriptor.getNumRecords()]; + public LeafNode(final NodeDescriptor descriptor, int nodeSize) { + this.size = nodeSize; } + + @Override + public NodeRecord getNodeRecord(int index) { + return null; + } } Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafRecord.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafRecord.java 2009-01-29 16:26:33 UTC (rev 4928) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafRecord.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -2,40 +2,34 @@ import org.jnode.util.BigEndian; -public class LeafRecord { - private final Key key; - private final byte[] recordData; +public class LeafRecord extends AbstractNodeRecord { - public LeafRecord(final Key key, final byte[] nodeData, final int offset, final int recordDataSize) { + public LeafRecord(final Key key, final byte[] recordData){ this.key = key; - recordData = new byte[recordDataSize]; - System.arraycopy(nodeData, offset + key.getKeyLength() + 2, recordData, 0, recordDataSize); + this.recordData = new byte[recordData.length]; + System.arraycopy(recordData,0, this.recordData, 0, recordData.length); } - - /** - * - * @param key - * @param recordData - */ - public LeafRecord(final Key key, final byte[] recordData) { + + public LeafRecord(final Key key, final byte[] nodeData, final int offset, final int recordDataSize) { this.key = key; - this.recordData = new byte[recordData.length]; - System.arraycopy(recordData, 0, this.recordData, 0, recordData.length); + this.recordData = new byte[recordDataSize]; + System.arraycopy(nodeData, offset + key.getKeyLength() + 2, this.recordData, 0, recordDataSize); } - public final Key getKey() { - return key; - } - public final int getType() { - return BigEndian.getInt16(recordData, 0); + return BigEndian.getInt16(this.recordData, 0); } - public final byte[] getRecordData() { - return recordData; + @Override + public byte[] getBytes() { + byte[] data = new byte[key.getKeyLength() + this.recordData.length]; + System.arraycopy(data, 0, key.getBytes(), 0, key.getKeyLength()); + System.arraycopy(data, key.getKeyLength(), this.recordData, 0, this.recordData.length); + return data; } - + public final String toString() { return "Type : " + getType() + "\nKey : " + getKey().toString() + "\n"; } + } Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Node.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Node.java 2009-01-29 16:26:33 UTC (rev 4928) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Node.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -1,34 +1,12 @@ package org.jnode.fs.hfsplus.tree; -import org.jnode.util.BigEndian; -public class Node { - protected NodeDescriptor descriptor; - protected byte[] nodeData; - protected int nodeSize; - public Node(NodeDescriptor descriptor, final int nodeSize) { - this.descriptor = descriptor; - this.nodeData = new byte[nodeSize]; - this.nodeSize = nodeSize; - } - - public Node(final NodeDescriptor descriptor, final byte[] nodeData, final int nodeSize) { - this.descriptor = descriptor; - this.nodeData = nodeData; - this.nodeSize = nodeSize; - } - - public NodeDescriptor getDescriptor() { - return descriptor; - } - - public int getOffset(int index) { - return BigEndian.getInt16(nodeData, nodeSize - ((index + 1) * 2)); - } - - public void setOffset(int index, int offsetValue) { - BigEndian.setInt16(nodeData, nodeSize - ((index + 1) * 2), offsetValue); - } - +public interface Node { + public NodeDescriptor getNodeDescriptor(); + public boolean isIndexNode(); + public boolean isLeafNode(); + public int getRecordOffset(int index); + public NodeRecord getNodeRecord(int index); + public void addNodeRecord(int index, NodeRecord record, int offset); } Added: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/NodeRecord.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/NodeRecord.java (rev 0) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/NodeRecord.java 2009-01-30 23:01:52 UTC (rev 4929) @@ -0,0 +1,25 @@ +package org.jnode.fs.hfsplus.tree; + +public interface NodeRecord { + + /** + * Key identify the record + */ + public Key getKey(); + + /** + * Get record data as byte array. + */ + public byte[] getData(); + + /** + * Get node record size + */ + public int getSize(); + + /** + * Get node record as byte array + */ + public byte[] getBytes(); + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |