/* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for Additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ /* ================================================================ * About NPOI * Author: Tony Qu * Author's email: tonyqus (at) gmail.com * Author's Blog: tonyqus.wordpress.com.cn (wp.tonyqus.cn) * HomePage: http://www.codeplex.com/npoi * Contributors: * * ==============================================================*/ using System; using System.Collections.Generic; using System.Text; using HH.WMS.Utils.NPOI.POIFS.Properties; namespace HH.WMS.Utils.NPOI.POIFS.FileSystem { /// /// Abstract implementation of Entry /// Extending classes should override isDocument() or isDirectory(), as /// appropriate /// Extending classes must override isDeleteOK() /// @author Marc Johnson (mjohnson at apache dot org) /// [Serializable] public abstract class EntryNode : Entry { // the DocumentProperty backing this object protected Property _property; // this object's parent Entry protected DirectoryNode _parent; protected EntryNode() : this(null, null) { } /// /// Create a DocumentNode. ThIs method Is not public by design; it /// Is intended strictly for the internal use of extending classes /// /// the Property for this Entry /// the parent of this entry protected EntryNode(Property property, DirectoryNode parent) { _property = property; _parent = parent; } /// /// grant access to the property /// /// the property backing this entry public Property Property { get { return _property; } } /// /// Is this the root of the tree? /// /// true if this instance is root; otherwise, false. protected bool IsRoot { get { // only the root Entry has no parent ... return (_parent == null); } } /// /// extensions use this method to verify internal rules regarding /// deletion of the underlying store. /// /// /// true if it's ok to Delete the underlying store; otherwise, false. /// protected abstract bool IsDeleteOK { get; } /// /// Get the name of the Entry /// /// The name. /// Get the name of the Entry /// @return name public String Name { get { return _property.Name; } } /// /// Is this a DirectoryEntry? /// /// /// true if the Entry Is a DirectoryEntry; otherwise, false. /// public virtual bool IsDirectoryEntry { get { return false; } } /// /// Is this a DocumentEntry? /// /// /// true if the Entry Is a DocumentEntry; otherwise, false. /// public virtual bool IsDocumentEntry { get { return false; } } /// /// Get this Entry's parent (the DocumentEntry that owns this /// Entry). All Entry objects, except the root Entry, has a parent. /// /// this Entry's parent; null iff this Is the root Entry public DirectoryEntry Parent { get { return _parent; } } /// /// Delete this Entry. ThIs operation should succeed, but there are /// special circumstances when it will not: /// If this Entry Is the root of the Entry tree, it cannot be /// deleted, as there Is no way to Create another one. /// If this Entry Is a directory, it cannot be deleted unless it Is /// empty. /// /// /// true if the Entry was successfully deleted, else false /// public bool Delete() { bool rval = false; if ((!IsRoot) && IsDeleteOK) { rval = _parent.DeleteEntry(this); } return rval; } /// /// Rename this Entry. ThIs operation will fail if: /// There Is a sibling Entry (i.e., an Entry whose parent Is the /// same as this Entry's parent) with the same name. /// ThIs Entry Is the root of the Entry tree. Its name Is dictated /// by the Filesystem and many not be Changed. /// /// the new name for this Entry /// /// true if the operation succeeded, else false /// public bool RenameTo(String newName) { bool rval = false; if (!IsRoot) { rval = _parent.ChangeName(Name, newName); } return rval; } public override string ToString() { return this.Name; } } }