📄 directoryproperty.java
字号:
/* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" and * "Apache POI" must not be used to endorse or promote products * derived from this software without prior written permission. For * written permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", * "Apache POI", nor may "Apache" appear in their name, without * prior written permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */package org.apache.poi.poifs.property;import java.util.*;import java.io.IOException;import org.apache.poi.poifs.storage.SmallDocumentBlock;/** * Directory property * * @author Marc Johnson (mjohnson at apache dot org) */public class DirectoryProperty extends Property implements Parent{ // List of Property instances private List _children; // set of children's names private Set _children_names; /** * Default constructor * * @param name the name of the directory */ public DirectoryProperty(String name) { super(); _children = new ArrayList(); _children_names = new HashSet(); setName(name); setSize(0); setPropertyType(PropertyConstants.DIRECTORY_TYPE); setStartBlock(0); setNodeColor(_NODE_BLACK); // simplification } /** * reader constructor * * @param index index number * @param array byte data * @param offset offset into byte data */ protected DirectoryProperty(final int index, final byte [] array, final int offset) { super(index, array, offset); _children = new ArrayList(); _children_names = new HashSet(); } /** * Change a Property's name * * @param property the Property whose name is being changed * @param newName the new name for the Property * * @return true if the name change could be made, else false */ public boolean changeName(final Property property, final String newName) { boolean result; String oldName = property.getName(); property.setName(newName); String cleanNewName = property.getName(); if (_children_names.contains(cleanNewName)) { // revert the change property.setName(oldName); result = false; } else { _children_names.add(cleanNewName); _children_names.remove(oldName); result = true; } return result; } /** * Delete a Property * * @param property the Property being deleted * * @return true if the Property could be deleted, else false */ public boolean deleteChild(final Property property) { boolean result = _children.remove(property); if (result) { _children_names.remove(property.getName()); } return result; } private class PropertyComparator implements Comparator { /** * Object equality, implemented as object identity * * @param o Object we're being compared to * * @return true if identical, else false */ public boolean equals(Object o) { return this == o; } /** * compare method. Assumes both parameters are non-null * instances of Property. One property is less than another if * its name is shorter than the other property's name. If the * names are the same length, the property whose name comes * before the other property's name, alphabetically, is less * than the other property. * * @param o1 first object to compare, better be a Property * @param o2 second object to compare, better be a Property * * @return negative value if o1 < o2, * zero if o1 == o2, * positive value if o1 > o2. */ public int compare(Object o1, Object o2) { String name1 = (( Property ) o1).getName(); String name2 = (( Property ) o2).getName(); int result = name1.length() - name2.length(); if (result == 0) { result = name1.compareTo(name2); } return result; } } // end private class PropertyComparator /* ********** START extension of Property ********** */ /** * @return true if a directory type Property */ public boolean isDirectory() { return true; } /** * Perform whatever activities need to be performed prior to * writing */ protected void preWrite() { if (_children.size() > 0) { Property[] children = ( Property [] ) _children.toArray(new Property[ 0 ]); Arrays.sort(children, new PropertyComparator()); int midpoint = children.length / 2; setChildProperty(children[ midpoint ].getIndex()); children[ 0 ].setPreviousChild(null); children[ 0 ].setNextChild(null); for (int j = 1; j < midpoint; j++) { children[ j ].setPreviousChild(children[ j - 1 ]); children[ j ].setNextChild(null); } if (midpoint != 0) { children[ midpoint ] .setPreviousChild(children[ midpoint - 1 ]); } if (midpoint != (children.length - 1)) { children[ midpoint ].setNextChild(children[ midpoint + 1 ]); for (int j = midpoint + 1; j < children.length - 1; j++) { children[ j ].setPreviousChild(null); children[ j ].setNextChild(children[ j + 1 ]); } children[ children.length - 1 ].setPreviousChild(null); children[ children.length - 1 ].setNextChild(null); } else { children[ midpoint ].setNextChild(null); } } } /* ********** END extension of Property ********** */ /* ********** START implementation of Parent ********** */ /** * Get an iterator over the children of this Parent; all elements * are instances of Property. * * @return Iterator of children; may refer to an empty collection */ public Iterator getChildren() { return _children.iterator(); } /** * Add a new child to the collection of children * * @param property the new child to be added; must not be null * * @exception IOException if we already have a child with the same * name */ public void addChild(final Property property) throws IOException { String name = property.getName(); if (_children_names.contains(name)) { throw new IOException("Duplicate name \"" + name + "\""); } _children_names.add(name); _children.add(property); } /* ********** END implementation of Parent ********** */} // end public class DirectoryProperty
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -