/***************************************************************************** * Copyright by The HDF Group. * * Copyright by the Board of Trustees of the University of Illinois. * * All rights reserved. * * * * This file is part of the HDF Java Products distribution. * * The full copyright notice, including terms governing use, modification, * * and redistribution, is contained in the files COPYING and Copyright.html. * * COPYING can be found at the root of the source code distribution tree. * * Or, see http://hdfgroup.org/products/hdf-java/doc/Copyright.html. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * ****************************************************************************/ package ncsa.hdf.object; import java.util.*; import javax.swing.tree.DefaultMutableTreeNode; /** * Group is an abstract class. Current implementing classes are the H4Group and * H5Group. This class includes general information of a group object such as * members of a group and common operations on groups. *

* Members of a group may include other groups, datasets or links. *

* @version 1.1 9/4/2007 * @author Peter X. Cao */ public abstract class Group extends HObject { /** * The list of members (Groups and Datasets) of this group in memory. */ private List memberList; /** * The parent group where this group is located. * The parent of the root group is null. */ protected Group parent; /** * Total number of (Groups and Datasets) of this group in file. */ protected int nMembersInFile; /** * Constructs an instance of the group with specific name, path and parent * group. An HDF data object must have a name. The path is the group path starting * from the root. The parent group is the group where this group is located. *

* For example, in H5Group(h5file, "grp", "/groups/", pgroup), "grp" is the * name of the group, "/groups/" is the group path of the group, and pgroup * the group where "grp" is located. * * @param theFile the file which containing the group. * @param name the name of this group, e.g. "grp01". * @param path the full path of this group, e.g. "/groups/". * @param parent the parent of this group. */ public Group(FileFormat theFile, String name, String path, Group parent) { this(theFile, name, path, parent, null); } /** * @deprecated Not for public use in the future.
* Using {@link #Group(FileFormat, String, String, Group)} */ public Group( FileFormat theFile, String name, String path, Group parent, long[] oid) { super (theFile, name, path, oid); this.parent = parent; } /** * Clears up member list and other resources in memory for the group. * Since the destructor will clear memory space, the function is usually * not needed. */ public void clear() { if (memberList != null) { ((Vector)memberList).setSize(0); } } /** * Adds an object to the member list of this group in memory. *

* @param object the HObject (Group or Dataset) to be added to the member list. */ public void addToMemberList(HObject object) { if (memberList == null) { int size = Math.min(getNumberOfMembersInFile(), this.getFileFormat().getMaxMembers()); memberList = new Vector(size+5); } if ( (object != null) && !memberList.contains(object) ) { memberList.add(object); } } /** * Removes an object from the member list of this group in memory. *

* @param object the HObject (Group or Dataset) to be removed from the member list. */ public void removeFromMemberList(HObject object) { if (memberList != null) { memberList.remove(object); } } /** * Returns the list of members of this group. * The list is an java.awt.List containing Groups and Datasets. * * @return the list of members of this group. */ public List getMemberList() { FileFormat theFile = this.getFileFormat(); String thePath = this.getPath(); String theName = this.getName(); if ((memberList == null) && (theFile != null)) { int size = Math.min(getNumberOfMembersInFile(), this.getFileFormat().getMaxMembers()); memberList = new Vector(size + 5); // avoid infinite loop search for groups without member // find the memberList from the file by check the group path and name // group may be created out of the structure tree (H4/5File.loadTree()). try { theFile.open(); } // load the file structure; catch (Exception ex) {;} DefaultMutableTreeNode root = (DefaultMutableTreeNode)theFile.getRootNode(); if (root == null) { return memberList; } Enumeration emu = root.depthFirstEnumeration(); Group g = null; Object uObj = null; while(emu.hasMoreElements()) { uObj = ((DefaultMutableTreeNode)emu.nextElement()).getUserObject(); if (uObj instanceof Group) { g = (Group)uObj; if( g.getPath() != null ) // add this check to get rid of null exception { if ( ( this.isRoot() && g.isRoot() ) || ( thePath.equals(g.getPath()) && g.getName().endsWith( theName ) ) ) { memberList = g.getMemberList(); break; } } } } } return memberList; } /** * Sets the name of the group. *

* setName (String newName) changes the name of the group in memory and file. *

* setName() updates the path in memory for all the objects that are under the * group with the new name. * * @param newName The new name of the group. */ public void setName (String newName) throws Exception { super.setName(newName); if (memberList != null) { int n = memberList.size(); HObject theObj = null; for (int i=0; imax_members number of objects. If the number of objects in file * is larger than max_members, only max_members are loaded in memory. *

* getNumberOfMembersInFile() returns the number of objects in this group. The number * of objects in memory is obtained by getMemberList().size(). * * @return Total number of members of this group in the file. */ public int getNumberOfMembersInFile() { return nMembersInFile; } }