/** * OLAT - Online Learning and Training<br> * http://www.olat.org * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br> * University of Zurich, Switzerland. * <hr> * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * This file has been modified by the OpenOLAT community. Changes are licensed * under the Apache 2.0 license as the original file. */ package org.olat.core.gui.control.generic.folder; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.modules.bc.meta.MetaInfo; import org.olat.core.commons.modules.bc.meta.MetaInfoFactory; import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl; import org.olat.core.gui.components.tree.GenericTreeModel; import org.olat.core.util.StringHelper; import org.olat.core.util.vfs.OlatRelPathImpl; import org.olat.core.util.vfs.VFSItem; import org.olat.core.util.vfs.filters.VFSItemFilter; /** * This TreeModel is intended for OlatRootFolderImpl and OlatRootFileImpl. * Instances of these classes have usually a MetaInfo object attached, whose * title string is used to set the tree node's title (filename if title is * empty).<br/> * No CSS classes are added. * * <P> * Initial Date: Jul 9, 2009 <br> * * @author gwassmann */ public class OlatRootFolderTreeModel extends GenericTreeModel { /** * used during deserialization to verify that the sender and receiver of a * serialized object have loaded classes for that object that are compatible * with respect to serialization * * @see http://java.sun.com/j2se/1.5.0/docs/api/java/io/Serializable.html */ static final long serialVersionUID = 1L; private VFSItemFilter filter; private Comparator<VFSItem> comparator; private final MetaInfoFactory metaInfoFactory; public OlatRootFolderTreeModel(OlatRootFolderImpl root) { metaInfoFactory = CoreSpringFactory.getImpl(MetaInfoFactory.class); setRootNode(createNode(root)); getRootNode().getChildCount(); } public OlatRootFolderTreeModel(OlatRootFolderImpl root, VFSItemFilter filter) { this.filter = filter; metaInfoFactory = CoreSpringFactory.getImpl(MetaInfoFactory.class); setRootNode(createNode(root)); getRootNode().getChildCount(); } public OlatRootFolderTreeModel(OlatRootFolderImpl root, VFSItemFilter filter, Comparator<VFSItem> comparator) { this.filter = filter; this.comparator = comparator; metaInfoFactory = CoreSpringFactory.getImpl(MetaInfoFactory.class); setRootNode(createNode(root)); getRootNode().getChildCount(); } /** * Add children to the node * * @param node * @param root */ protected void makeChildren(OlatRootFolderTreeNode node, OlatRootFolderImpl root) { List<VFSItem> children = root.getItems(filter); if (comparator != null) { Collections.sort(children, comparator); } for (VFSItem child : children) { // create a node for each child and add it if(child instanceof OlatRelPathImpl) { OlatRootFolderTreeNode childNode = createNode((OlatRelPathImpl)child); node.addChild(childNode); if (child instanceof OlatRootFolderImpl) { // add the child's children recursively makeChildren(childNode, (OlatRootFolderImpl) child); } } } } /** * Create a node out of a relative path vfs item. The user object is set to * the relative path. * * @param item */ private OlatRootFolderTreeNode createNode(OlatRelPathImpl item) { OlatRootFolderTreeNode node = new OlatRootFolderTreeNode(item, this); MetaInfo meta = metaInfoFactory.createMetaInfoFor(item); if (meta != null) { String title = meta.getTitle(); if (StringHelper.containsNonWhitespace(title)) { node.setTitle(title); } else { node.setTitle(meta.getName()); } } else { // TODO:GW log warning that // "metadate couldn't be loaded for folder relpath: " + // folder.getRelPath(); } node.setUserObject(item.getRelPath()); return node; } /** * @see org.olat.core.gui.components.tree.GenericTreeModel#getRootNode() */ @Override public OlatRootFolderTreeNode getRootNode() { return (OlatRootFolderTreeNode) super.getRootNode(); } }