/* * © Copyright FOCONIS AG, 2014 * * Licensed 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. * */ package org.openntf.domino.helpers; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.SortedSet; import java.util.TreeMap; import org.openntf.domino.Database; import org.openntf.domino.Session; /** * This class is for simple navigation in the directory structure of a DominoServer (and is still experimental) * * @author Roland Praml, FOCONIS AG * */ public class DbDirectoryTree { private DbDirectoryTree parent_; private Session session_; private Map<String, DbDirectoryTree> subDirs = new TreeMap<String, DbDirectoryTree>(); private Map<String, DatabaseMetaData> files = new TreeMap<String, DatabaseMetaData>(); private String directory_ = ""; public DbDirectoryTree(final SortedSet<DatabaseMetaData> metaDataSet, final Session session) { session_ = session; for (DatabaseMetaData metaData : metaDataSet) { String fileName = metaData.getFilePath().replace('\\', '/'); String[] components = fileName.split("/"); add(components, metaData, 0); } } public DbDirectoryTree(final DbDirectoryTree parent, final Session session, final String dirName) { session_ = session; parent_ = parent; directory_ = dirName; } private void add(final String[] components, final DatabaseMetaData metaData, final int level) { if (components.length == level + 1) { files.put(components[level], metaData); } else { String dir = components[level]; DbDirectoryTree subDir = subDirs.get(dir); if (subDir == null) { subDir = new DbDirectoryTree(this, session_, dir); subDirs.put(dir, subDir); } subDir.add(components, metaData, level + 1); } } /** * Print Dir structure in a "tree style" */ @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("Directory listing for: "); if (getParent() == null) { sb.append("<ROOT>\n"); } else { sb.append(getDirPath()); sb.append('\n'); } toString(sb, ""); return sb.toString(); } /** * Return the parent directory * */ public DbDirectoryTree getParent() { return parent_; } /** * Return the complete dir layout of this node * */ public String getDirPath() { if (getParent() == null) return directory_; String parentDir = getParent().getDirPath(); if (!parentDir.isEmpty()) { return parentDir + "/" + directory_; } return directory_; } private void toString(final StringBuilder sb, final String indent) { for (Entry<String, DbDirectoryTree> e : subDirs.entrySet()) { sb.append(indent); sb.append('['); sb.append(e.getKey()); sb.append("]\n"); e.getValue().toString(sb, indent.concat(" ")); } for (Entry<String, DatabaseMetaData> e : files.entrySet()) { sb.append(indent); sb.append(e.getKey()); sb.append('\n'); } } /** * Return a list of DatabaseMetaData in this directory and optional in this subdirectories * */ public List<DatabaseMetaData> getDatabaseMetaDatas(final boolean recursive) { return getDatabaseMetaDatas(null, recursive); } public List<DatabaseMetaData> getDatabaseMetaDatas(List<DatabaseMetaData> ret, final boolean recursive) { if (ret == null) ret = new ArrayList<DatabaseMetaData>(); for (DatabaseMetaData f : files.values()) { ret.add(f); } if (recursive) { for (DbDirectoryTree subDir : subDirs.values()) { subDir.getDatabaseMetaDatas(ret, recursive); } } return ret; } /** * Returns an iterarable over all databases in this directory * */ public Iterable<Database> getDatabases(final boolean recursive) { final Iterator<DatabaseMetaData> metaIter = getDatabaseMetaDatas(recursive).iterator(); return new Iterable<Database>() { @Override public Iterator<Database> iterator() { return new Iterator<Database>() { @Override public boolean hasNext() { return metaIter.hasNext(); } @Override public Database next() { return session_.getFactory().create(Database.SCHEMA, session_, metaIter.next()); } @Override public void remove() { metaIter.remove(); } }; } }; } }