001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 * 019 */ 020 package org.apache.directory.server.core.partition.impl.btree.gui; 021 022 023 import java.util.ArrayList; 024 import java.util.Collections; 025 import java.util.Enumeration; 026 import java.util.Iterator; 027 import java.util.List; 028 import java.util.Map; 029 030 import javax.swing.tree.TreeNode; 031 032 import org.apache.directory.server.core.partition.impl.btree.BTreePartition; 033 import org.apache.directory.server.xdbm.ForwardIndexEntry; 034 import org.apache.directory.server.xdbm.IndexCursor; 035 import org.apache.directory.server.xdbm.IndexEntry; 036 import org.apache.directory.server.xdbm.search.Evaluator; 037 import org.apache.directory.server.xdbm.search.SearchEngine; 038 import org.apache.directory.shared.ldap.entry.ServerEntry; 039 import org.apache.directory.shared.ldap.filter.ExprNode; 040 import org.apache.directory.shared.ldap.name.DN; 041 042 043 /** 044 * A node representing an entry. 045 * 046 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> 047 * @version $Rev: 927146 $ 048 */ 049 public class EntryNode implements TreeNode 050 { 051 private final BTreePartition partition; 052 private final EntryNode parent; 053 private final ServerEntry entry; 054 private final ArrayList<TreeNode> children; 055 private final Long id; 056 057 058 public EntryNode( Long id, EntryNode parent, BTreePartition partition, ServerEntry entry, Map<Long, EntryNode> map ) 059 { 060 this( id, parent, partition, entry, map, null, null ); 061 } 062 063 064 public EntryNode( Long id, EntryNode parent, BTreePartition db, ServerEntry entry, Map<Long, EntryNode> map, 065 ExprNode exprNode, SearchEngine engine ) 066 { 067 this.partition = db; 068 this.id = id; 069 this.entry = entry; 070 children = new ArrayList<TreeNode>(); 071 072 if ( parent == null ) 073 { 074 this.parent = this; 075 } 076 else 077 { 078 this.parent = parent; 079 } 080 081 try 082 { 083 List<ForwardIndexEntry> recordForwards = new ArrayList<ForwardIndexEntry>(); 084 IndexCursor<Long, ServerEntry, Long> childList = db.list( id ); 085 086 while ( childList.next() ) 087 { 088 IndexEntry old = childList.get(); 089 ForwardIndexEntry newRec = new ForwardIndexEntry(); 090 newRec.copy( old ); 091 recordForwards.add( newRec ); 092 } 093 094 childList.close(); 095 096 Iterator list = recordForwards.iterator(); 097 098 while ( list.hasNext() ) 099 { 100 IndexEntry rec = ( IndexEntry ) list.next(); 101 102 if ( engine != null && exprNode != null ) 103 { 104 if ( db.getChildCount( rec.getId() ) == 0 ) 105 { 106 Evaluator evaluator = engine.evaluator( exprNode ); 107 if ( evaluator.evaluateId( rec.getId() ) ) 108 { 109 ServerEntry newEntry = db.lookup( rec.getId() ); 110 EntryNode child = new EntryNode( ( Long ) rec.getId(), this, db, newEntry, map, exprNode, 111 engine ); 112 children.add( child ); 113 } 114 else 115 { 116 continue; 117 } 118 } 119 else 120 { 121 ServerEntry newEntry = db.lookup( rec.getId() ); 122 EntryNode child = new EntryNode( ( Long ) rec.getId(), this, db, newEntry, map, exprNode, 123 engine ); 124 children.add( child ); 125 } 126 } 127 else 128 { 129 ServerEntry newEntry = db.lookup( ( Long ) rec.getId() ); 130 EntryNode child = new EntryNode( ( Long ) rec.getId(), this, db, newEntry, map ); 131 children.add( child ); 132 } 133 } 134 } 135 catch ( Exception e ) 136 { 137 e.printStackTrace(); 138 } 139 140 map.put( id, this ); 141 } 142 143 144 public Enumeration<TreeNode> children() 145 { 146 return Collections.enumeration( children ); 147 } 148 149 150 public boolean getAllowsChildren() 151 { 152 return true; 153 } 154 155 156 public TreeNode getChildAt( int childIndex ) 157 { 158 return ( TreeNode ) children.get( childIndex ); 159 } 160 161 162 public int getChildCount() 163 { 164 return children.size(); 165 } 166 167 168 public int getIndex( TreeNode child ) 169 { 170 return children.indexOf( child ); 171 } 172 173 174 public TreeNode getParent() 175 { 176 return parent; 177 } 178 179 180 public boolean isLeaf() 181 { 182 return children.size() <= 0; 183 } 184 185 186 public String getEntryDn() throws Exception 187 { 188 return partition.getEntryDn( id ); 189 } 190 191 192 public String toString() 193 { 194 StringBuffer buf = new StringBuffer(); 195 196 try 197 { 198 DN dn = new DN( partition.getEntryDn( id ) ); 199 buf.append( "(" ).append( id ).append( ") " ); 200 buf.append( dn.getRdn() ); 201 } 202 catch ( Exception e ) 203 { 204 buf.append( "ERROR: " + e.getLocalizedMessage() ); 205 } 206 207 if ( children.size() > 0 ) 208 { 209 buf.append( " [" ).append( children.size() ).append( "]" ); 210 } 211 212 return buf.toString(); 213 } 214 215 216 public ServerEntry getLdapEntry() 217 { 218 return entry; 219 } 220 221 222 public Long getEntryId() 223 { 224 return id; 225 } 226 }