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.ldap.handlers.extended; 021 022 023 import java.awt.Dimension; 024 import java.awt.Point; 025 import java.awt.Toolkit; 026 import java.util.Collections; 027 import java.util.HashSet; 028 import java.util.Set; 029 030 import javax.swing.JFrame; 031 032 import org.apache.directory.server.constants.ServerDNConstants; 033 import org.apache.directory.server.core.CoreSession; 034 import org.apache.directory.server.core.DirectoryService; 035 import org.apache.directory.server.core.LdapPrincipal; 036 import org.apache.directory.server.core.interceptor.context.ListSuffixOperationContext; 037 import org.apache.directory.server.core.partition.Partition; 038 import org.apache.directory.server.core.partition.PartitionNexus; 039 import org.apache.directory.server.core.partition.impl.btree.BTreePartition; 040 import org.apache.directory.server.core.partition.impl.btree.gui.PartitionFrame; 041 import org.apache.directory.server.ldap.ExtendedOperationHandler; 042 import org.apache.directory.server.ldap.LdapServer; 043 import org.apache.directory.server.ldap.LdapSession; 044 import org.apache.directory.server.ldap.gui.SessionsFrame; 045 import org.apache.directory.shared.ldap.constants.AuthenticationLevel; 046 import org.apache.directory.shared.ldap.message.ResultCodeEnum; 047 import org.apache.directory.shared.ldap.message.extended.LaunchDiagnosticUiRequest; 048 import org.apache.directory.shared.ldap.message.extended.LaunchDiagnosticUiResponse; 049 import org.apache.directory.shared.ldap.message.internal.InternalExtendedRequest; 050 import org.apache.directory.shared.ldap.name.DN; 051 052 053 /** 054 * @org.apache.xbean.XBean 055 * 056 */ 057 public class LaunchDiagnosticUiHandler implements ExtendedOperationHandler 058 { 059 public static final Set<String> EXTENSION_OIDS; 060 061 static 062 { 063 Set<String> set = new HashSet<String>( 3 ); 064 set.add( LaunchDiagnosticUiRequest.EXTENSION_OID ); 065 set.add( LaunchDiagnosticUiResponse.EXTENSION_OID ); 066 EXTENSION_OIDS = Collections.unmodifiableSet( set ); 067 } 068 069 private LdapServer ldapServer; 070 071 072 public String getOid() 073 { 074 return LaunchDiagnosticUiRequest.EXTENSION_OID; 075 } 076 077 078 public void handleExtendedOperation( LdapSession requestor, InternalExtendedRequest req ) 079 throws Exception 080 { 081 DirectoryService service = requestor.getCoreSession().getDirectoryService(); 082 083 if ( ! requestor.getCoreSession().isAnAdministrator() ) 084 { 085 requestor.getIoSession().write( new LaunchDiagnosticUiResponse( req.getMessageId(), 086 ResultCodeEnum.INSUFFICIENT_ACCESS_RIGHTS ) ); 087 return; 088 } 089 090 requestor.getIoSession().write( new LaunchDiagnosticUiResponse( req.getMessageId() ) ); 091 092 PartitionNexus nexus = service.getPartitionNexus(); 093 DN adminDn = new DN( ServerDNConstants.ADMIN_SYSTEM_DN_NORMALIZED ); 094 adminDn.normalize( service.getSchemaManager().getNormalizerMapping() ); 095 LdapPrincipal principal = new LdapPrincipal( adminDn, AuthenticationLevel.STRONG ); 096 CoreSession session = service.getSession( principal ); 097 Set<String> suffixes = nexus.listSuffixes( new ListSuffixOperationContext( session ) ); 098 int launchedWindowCount = 0; 099 100 for ( String suffix:suffixes ) 101 { 102 DN dn = new DN( suffix ); 103 Partition partition = nexus.getPartition( dn ); 104 105 if ( partition instanceof BTreePartition ) 106 { 107 try 108 { 109 BTreePartition btPartition = ( BTreePartition ) partition; 110 // TODO : If a partition does not have an initial entry associated, we wil: 111 // get a NPE : this has to be fixed. 112 PartitionFrame frame = new PartitionFrame( btPartition, service.getSchemaManager() ); 113 Point pos = getCenteredPosition( frame ); 114 pos.y = launchedWindowCount * 20 + pos.y; 115 double multiplier = getAspectRatio() * 20.0; 116 pos.x = ( int ) ( launchedWindowCount * multiplier ) + pos.x; 117 frame.setLocation( pos ); 118 frame.setVisible( true ); 119 launchedWindowCount++; 120 } 121 catch ( Exception e ) 122 { 123 // Continue 124 } 125 } 126 } 127 128 SessionsFrame sessions = new SessionsFrame( ldapServer ); 129 sessions.setRequestor( requestor.getIoSession() ); 130 sessions.setLdapProvider( ldapServer.getHandler() ); 131 Point pos = getCenteredPosition( sessions ); 132 pos.y = launchedWindowCount * 20 + pos.y; 133 double multiplier = getAspectRatio() * 20.0; 134 pos.x = ( int ) ( launchedWindowCount * multiplier ) + pos.x; 135 sessions.setLocation( pos ); 136 sessions.setVisible( true ); 137 } 138 139 140 public double getAspectRatio() 141 { 142 Toolkit tk = Toolkit.getDefaultToolkit(); 143 Dimension screenSize = tk.getScreenSize(); 144 return screenSize.getWidth() / screenSize.getHeight(); 145 } 146 147 148 public Point getCenteredPosition( JFrame frame ) 149 { 150 Point pt = new Point(); 151 Toolkit tk = Toolkit.getDefaultToolkit(); 152 Dimension screenSize = tk.getScreenSize(); 153 pt.x = ( screenSize.width - frame.getWidth() ) / 2; 154 pt.y = ( screenSize.height - frame.getHeight() ) / 2; 155 return pt; 156 } 157 158 159 public Set<String> getExtensionOids() 160 { 161 return EXTENSION_OIDS; 162 } 163 164 165 public void setLdapServer( LdapServer ldapServer ) 166 { 167 this.ldapServer = ldapServer; 168 } 169 }