From: <ga...@us...> - 2009-03-26 15:27:09
|
Revision: 5159 http://jnode.svn.sourceforge.net/jnode/?rev=5159&view=rev Author: galatnm Date: 2009-03-26 15:27:01 +0000 (Thu, 26 Mar 2009) Log Message: ----------- Rewrite Node class and sub-classes Modified Paths: -------------- trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusDirectory.java trunk/fs/src/fs/org/jnode/fs/hfsplus/Superblock.java trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNode.java trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNodeId.java trunk/fs/src/fs/org/jnode/fs/hfsplus/command/FormatHfsPlusCommand.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/Node.java Removed Paths: ------------- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexNode.java trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafNode.java Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusDirectory.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusDirectory.java 2009-03-26 13:46:39 UTC (rev 5158) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/HFSPlusDirectory.java 2009-03-26 15:27:01 UTC (rev 5159) @@ -30,12 +30,14 @@ import org.jnode.fs.FSDirectory; import org.jnode.fs.FSEntry; import org.jnode.fs.ReadOnlyFileSystemException; +import org.jnode.fs.hfsplus.catalog.Catalog; import org.jnode.fs.hfsplus.catalog.CatalogFile; import org.jnode.fs.hfsplus.catalog.CatalogFolder; import org.jnode.fs.hfsplus.catalog.CatalogKey; import org.jnode.fs.hfsplus.catalog.CatalogNodeId; import org.jnode.fs.hfsplus.catalog.CatalogThread; import org.jnode.fs.hfsplus.tree.LeafRecord; +import org.jnode.fs.hfsplus.tree.NodeDescriptor; import org.jnode.fs.spi.FSEntryTable; public class HFSPlusDirectory extends HFSPlusEntry implements FSDirectory { @@ -211,22 +213,11 @@ if (fs.isReadOnly()) { throw new ReadOnlyFileSystemException(); } - + Catalog catalog = fs.getCatalog(); Superblock volumeHeader = ((HfsPlusFileSystem) getFileSystem()).getVolumeHeader(); - HFSUnicodeString dirName = new HFSUnicodeString(name); - CatalogThread thread = - new CatalogThread(CatalogFolder.RECORD_TYPE_FOLDER_THREAD, this.folder - .getFolderId(), dirName); - CatalogFolder newFolder = - new CatalogFolder(0, new CatalogNodeId(volumeHeader.getNextCatalogId())); - log.debug("New catalog folder :\n" + newFolder.toString()); - - CatalogKey key = new CatalogKey(this.folder.getFolderId(), dirName); - log.debug("New catalog key :\n" + key.toString()); - - LeafRecord folderRecord = new LeafRecord(key, newFolder.getBytes()); - log.debug("New record folder :\n" + folderRecord.toString()); - + LeafRecord folderRecord = catalog.createNode(name, this.folder + .getFolderId(), new CatalogNodeId(volumeHeader.getNextCatalogId()), CatalogFolder.RECORD_TYPE_FOLDER_THREAD); + HFSPlusEntry newEntry = new HFSPlusDirectory(fs, this, name, folderRecord); volumeHeader.setFolderCount(volumeHeader.getFolderCount() + 1); log.debug("New volume header :\n" + volumeHeader.toString()); Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/Superblock.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/Superblock.java 2009-03-26 13:46:39 UTC (rev 5158) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/Superblock.java 2009-03-26 15:27:01 UTC (rev 5159) @@ -134,11 +134,8 @@ int macDate = HFSUtils.getNow(); this.setCreateDate(macDate); this.setModifyDate(macDate); - this.setBackupDate(0); this.setCheckedDate(macDate); // --- - this.setFileCount(0); - this.setFolderCount(0); this.setBlockSize(blockSize); this.setTotalBlocks((int) params.getBlockCount()); this.setFreeBlocks((int) params.getBlockCount()); Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java 2009-03-26 13:46:39 UTC (rev 5158) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/Catalog.java 2009-03-26 15:27:01 UTC (rev 5159) @@ -84,7 +84,7 @@ } } - + /** * Create new Catalog * @@ -111,7 +111,7 @@ BTHeaderRecord.BT_BIG_KEYS_MASK); log.debug(bthr.toString()); bufferLength += BTHeaderRecord.BT_HEADER_RECORD_LENGTH; - // Create root node + log.info("Create root node."); int rootNodePosition = bthr.getRootNode() * nodeSize; bufferLength += (rootNodePosition - bufferLength); // Create node descriptor @@ -119,22 +119,21 @@ new NodeDescriptor(0, 0, NodeDescriptor.BT_LEAF_NODE, 1, params .getInitializeNumRecords()); CatalogNode rootNode = new CatalogNode(nd, nodeSize); - int offset = NodeDescriptor.BT_NODE_DESCRIPTOR_LENGTH; // First record (folder) HFSUnicodeString name = new HFSUnicodeString(params.getVolumeName()); CatalogKey ck = new CatalogKey(CatalogNodeId.HFSPLUS_POR_CNID, name); CatalogFolder folder = new CatalogFolder(params.isJournaled() ? 2 : 0, CatalogNodeId.HFSPLUS_ROOT_CNID); LeafRecord record = new LeafRecord(ck, folder.getBytes()); - rootNode.addNodeRecord(0, record, offset); + rootNode.addNodeRecord(record); // Second record (thread) - offset = offset + ck.getKeyLength() + CatalogFolder.CATALOG_FOLDER_SIZE; CatalogKey tck = new CatalogKey(CatalogNodeId.HFSPLUS_ROOT_CNID, name); CatalogThread ct = new CatalogThread(CatalogFolder.RECORD_TYPE_FOLDER_THREAD, CatalogNodeId.HFSPLUS_ROOT_CNID, new HFSUnicodeString("")); record = new LeafRecord(tck, ct.getBytes()); - rootNode.addNodeRecord(1, record, offset); + rootNode.addNodeRecord(record); + log.debug(rootNode.toString()); buffer = ByteBuffer.allocate(bufferLength + bthr.getNodeSize()); buffer.put(btnd.getBytes()); buffer.put(bthr.getBytes()); @@ -144,6 +143,38 @@ } /** + * + * @param filename + * @param parentId + * @param nodeId + * @param nodeType + * @return + */ + public LeafRecord createNode(String filename, CatalogNodeId parentId, CatalogNodeId nodeId, int nodeType) throws IOException { + HFSUnicodeString name = new HFSUnicodeString(filename); + LeafRecord record = this.getRecord(parentId, name); + if(record == null){ + NodeDescriptor nd = new NodeDescriptor(0, 0, NodeDescriptor.BT_LEAF_NODE, 1, 2); + CatalogNode node = new CatalogNode(nd, 4096); + CatalogKey key = new CatalogKey(parentId, name); + CatalogThread thread = + new CatalogThread(nodeType, parentId, name); + record = new LeafRecord(key, thread.getBytes()); + node.addNodeRecord(record); + if(nodeType == CatalogFolder.RECORD_TYPE_FOLDER_THREAD){ + CatalogFolder newFolder = new CatalogFolder(0, nodeId); + key = new CatalogKey(parentId, name); + record = new LeafRecord(key, newFolder.getBytes()); + } else { + //TODO + } + } else { + //TODO + } + return record; + } + + /** * @param parentID * @return the leaf record, or possibly {code null}. * @throws IOException Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNode.java 2009-03-26 13:46:39 UTC (rev 5158) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNode.java 2009-03-26 15:27:01 UTC (rev 5159) @@ -20,6 +20,7 @@ package org.jnode.fs.hfsplus.catalog; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; @@ -29,33 +30,43 @@ 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.BigEndian; public class CatalogNode extends AbstractNode { - + + /** + * Create a new node. + * @param descriptor + * @param nodeSize + */ public CatalogNode(NodeDescriptor descriptor, final int nodeSize) { + this.descriptor = descriptor; this.size = nodeSize; - this.datas = new byte[nodeSize]; - System.arraycopy(descriptor.getBytes(), 0, datas, 0, NodeDescriptor.BT_NODE_DESCRIPTOR_LENGTH); + this.records = new ArrayList<NodeRecord>(this.descriptor.getNumRecords()); + this.offsets = new ArrayList<Integer>(this.descriptor.getNumRecords() + 1); + this.offsets.add(Integer.valueOf(NodeDescriptor.BT_NODE_DESCRIPTOR_LENGTH)); } + /** + * Create node from existing data. + * @param nodeData + * @param nodeSize + */ public CatalogNode(final byte[] nodeData, final int nodeSize) { + this.descriptor = new NodeDescriptor(nodeData, 0); this.size = nodeSize; - this.datas = nodeData; + this.records = new ArrayList<NodeRecord>(this.descriptor.getNumRecords()); + this.offsets = new ArrayList<Integer>(this.descriptor.getNumRecords() + 1); + for(int i = 0; i < this.descriptor.getNumRecords(); i++){ + offsets.add(BigEndian.getInt16(nodeData, size - ((i + 1) * 2))); + //TODO Get record data. + } + } @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; + return records.get(index); } /** @@ -63,8 +74,7 @@ * @return a NodeRecord or {@code null} */ public final NodeRecord find(final CatalogNodeId parentId) { - for (int index = 0; index < this.getNodeDescriptor().getNumRecords(); index++) { - NodeRecord record = this.getNodeRecord(index); + for (NodeRecord record : records) { Key key = record.getKey(); if (key instanceof CatalogKey) { if (((CatalogKey) key).getParentId().getId() == parentId.getId()) { Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNodeId.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNodeId.java 2009-03-26 13:46:39 UTC (rev 5158) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/catalog/CatalogNodeId.java 2009-03-26 15:27:01 UTC (rev 5159) @@ -22,7 +22,7 @@ import org.jnode.util.BigEndian; -public class CatalogNodeId implements Comparable { +public class CatalogNodeId implements Comparable<CatalogNodeId> { private byte[] cnid; public CatalogNodeId(final byte[] src, final int offset) { @@ -65,9 +65,9 @@ } @Override - public int compareTo(Object o) { + public int compareTo(CatalogNodeId o) { Integer currentId = Integer.valueOf(this.getId()); - Integer compareId = Integer.valueOf(((CatalogNodeId) o).getId()); + Integer compareId = Integer.valueOf(o.getId()); return currentId.compareTo(compareId); } } Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/command/FormatHfsPlusCommand.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/command/FormatHfsPlusCommand.java 2009-03-26 13:46:39 UTC (rev 5158) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/command/FormatHfsPlusCommand.java 2009-03-26 15:27:01 UTC (rev 5159) @@ -47,9 +47,9 @@ protected Formatter<HfsPlusFileSystem> getFormatter() { HFSPlusParams params = new HFSPlusParams(); params.setVolumeName((ARG_VOLUME_NAME.isSet()) ? ARG_VOLUME_NAME.getValue() : "untitled"); - params.setBlockSize(params.OPTIMAL_BLOCK_SIZE); + params.setBlockSize(HFSPlusParams.OPTIMAL_BLOCK_SIZE); params.setJournaled(false); - params.setJournalSize(params.DEFAULT_JOURNAL_SIZE); + params.setJournalSize(HFSPlusParams.DEFAULT_JOURNAL_SIZE); return new HfsPlusFileSystemFormatter(params); } } Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentNode.java 2009-03-26 13:46:39 UTC (rev 5158) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/extent/ExtentNode.java 2009-03-26 15:27:01 UTC (rev 5159) @@ -27,14 +27,13 @@ public class ExtentNode extends AbstractNode { public ExtentNode(NodeDescriptor descriptor, final int nodeSize) { + this.descriptor = descriptor; 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.descriptor = new NodeDescriptor(nodeData, 0); this.size = nodeSize; - this.datas = nodeData; } @Override Modified: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractNode.java 2009-03-26 13:46:39 UTC (rev 5158) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/AbstractNode.java 2009-03-26 15:27:01 UTC (rev 5159) @@ -20,16 +20,19 @@ package org.jnode.fs.hfsplus.tree; +import java.util.List; + import org.jnode.util.BigEndian; public abstract class AbstractNode implements Node { - - protected byte[] datas; + protected NodeDescriptor descriptor; + protected List<NodeRecord> records; + protected List<Integer> offsets; protected int size; @Override public NodeDescriptor getNodeDescriptor() { - return new NodeDescriptor(datas, 0); + return descriptor; } public boolean isIndexNode() { @@ -42,26 +45,30 @@ @Override public int getRecordOffset(int index) { - return BigEndian.getInt16(datas, size - ((index + 1) * 2)); + return offsets.get(index); } @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 void addNodeRecord(NodeRecord record) { + Integer lastOffset = offsets.get(offsets.size() - 1); + Integer newOffset = lastOffset + record.getSize(); + offsets.add(newOffset); + records.add(record); } public byte[] getBytes() { + byte[] datas = new byte[size]; return datas; } public String toString() { StringBuffer b = new StringBuffer(); b.append((this.isLeafNode()) ? "Leaf node" : "Index node").append("\n"); - b.append(this.getNodeDescriptor().toString()); + b.append(this.getNodeDescriptor().toString()).append("\n"); + b.append("Offsets : ").append(offsets.toString()); return b.toString(); } Deleted: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexNode.java 2009-03-26 13:46:39 UTC (rev 5158) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/IndexNode.java 2009-03-26 15:27:01 UTC (rev 5159) @@ -1,39 +0,0 @@ -/* - * $Id$ - * - * Copyright (C) 2003-2009 JNode.org - * - * This library 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.1 of the License, or - * (at your option) any later version. - * - * This library 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 library; If not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.jnode.fs.hfsplus.tree; - -public class IndexNode extends AbstractNode { - - /** - * - * @param nodeData - * @param nodeSize - */ - public IndexNode(final byte[] nodeData, final int nodeSize) { - this.size = nodeSize; - this.datas = nodeData; - } - - @Override - public NodeRecord getNodeRecord(int index) { - return null; - } -} Deleted: trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafNode.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafNode.java 2009-03-26 13:46:39 UTC (rev 5158) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/LeafNode.java 2009-03-26 15:27:01 UTC (rev 5159) @@ -1,50 +0,0 @@ -/* - * $Id$ - * - * Copyright (C) 2003-2009 JNode.org - * - * This library 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.1 of the License, or - * (at your option) any later version. - * - * This library 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 library; If not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -package org.jnode.fs.hfsplus.tree; - - -public class LeafNode extends AbstractNode { - - /** - * - * @param nodeData - * @param nodeSize - */ - public LeafNode(final byte[] nodeData, final int nodeSize) { - this.size = nodeSize; - this.datas = nodeData; - } - - /** - * - * @param descriptor - * @param nodeSize - */ - 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/Node.java =================================================================== --- trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Node.java 2009-03-26 13:46:39 UTC (rev 5158) +++ trunk/fs/src/fs/org/jnode/fs/hfsplus/tree/Node.java 2009-03-26 15:27:01 UTC (rev 5159) @@ -28,5 +28,5 @@ public boolean isLeafNode(); public int getRecordOffset(int index); public NodeRecord getNodeRecord(int index); - public void addNodeRecord(int index, NodeRecord record, int offset); + public void addNodeRecord(NodeRecord record); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |