1 17 package org.apache.geronimo.console.util; 18 19 import java.lang.reflect.Array ; 20 import java.util.ArrayList ; 21 import java.util.Arrays ; 22 import java.util.Collections ; 23 import java.util.HashMap ; 24 import java.util.Iterator ; 25 import java.util.List ; 26 import java.util.Map ; 27 import java.util.Set ; 28 import javax.security.auth.Subject ; 29 import javax.security.auth.callback.Callback ; 30 import javax.security.auth.callback.CallbackHandler ; 31 import javax.security.auth.callback.NameCallback ; 32 import javax.security.auth.callback.PasswordCallback ; 33 import javax.security.auth.callback.UnsupportedCallbackException ; 34 import javax.security.auth.login.LoginException ; 35 import javax.security.auth.spi.LoginModule ; 36 37 import org.apache.geronimo.gbean.AbstractName; 38 import org.apache.geronimo.gbean.AbstractNameQuery; 39 import org.apache.geronimo.gbean.GBeanData; 40 import org.apache.geronimo.j2ee.j2eeobjectnames.NameFactory; 41 import org.apache.geronimo.kernel.GBeanNotFoundException; 42 import org.apache.geronimo.kernel.Kernel; 43 import org.apache.geronimo.kernel.Naming; 44 import org.apache.geronimo.kernel.config.Configuration; 45 import org.apache.geronimo.kernel.config.ConfigurationInfo; 46 import org.apache.geronimo.kernel.config.ConfigurationManager; 47 import org.apache.geronimo.kernel.config.ConfigurationModuleType; 48 import org.apache.geronimo.kernel.config.ConfigurationUtil; 49 import org.apache.geronimo.kernel.config.EditableConfigurationManager; 50 import org.apache.geronimo.kernel.config.InvalidConfigException; 51 import org.apache.geronimo.kernel.config.NoSuchStoreException; 52 import org.apache.geronimo.kernel.management.State; 53 import org.apache.geronimo.kernel.proxy.ProxyManager; 54 import org.apache.geronimo.kernel.repository.Artifact; 55 import org.apache.geronimo.management.AppClientModule; 56 import org.apache.geronimo.management.EJB; 57 import org.apache.geronimo.management.EJBModule; 58 import org.apache.geronimo.management.J2EEDeployedObject; 59 import org.apache.geronimo.management.J2EEModule; 60 import org.apache.geronimo.management.J2EEResource; 61 import org.apache.geronimo.management.JDBCDataSource; 62 import org.apache.geronimo.management.JDBCDriver; 63 import org.apache.geronimo.management.JDBCResource; 64 import org.apache.geronimo.management.JMSResource; 65 import org.apache.geronimo.management.Servlet; 66 import org.apache.geronimo.management.geronimo.J2EEApplication; 67 import org.apache.geronimo.management.geronimo.J2EEDomain; 68 import org.apache.geronimo.management.geronimo.J2EEServer; 69 import org.apache.geronimo.management.geronimo.JCAAdminObject; 70 import org.apache.geronimo.management.geronimo.JCAConnectionFactory; 71 import org.apache.geronimo.management.geronimo.JCAManagedConnectionFactory; 72 import org.apache.geronimo.management.geronimo.JCAResource; 73 import org.apache.geronimo.management.geronimo.JVM; 74 import org.apache.geronimo.management.geronimo.ResourceAdapter; 75 import org.apache.geronimo.management.geronimo.ResourceAdapterModule; 76 import org.apache.geronimo.management.geronimo.WebModule; 77 import org.apache.geronimo.security.jaas.JaasLoginModuleUse; 78 import org.apache.geronimo.system.logging.SystemLog; 79 80 86 public class KernelManagementHelper implements ManagementHelper { 87 private final Kernel kernel; 88 89 public KernelManagementHelper(Kernel kernel) { 90 this.kernel = kernel; 91 } 92 93 public J2EEDomain[] getDomains() { 94 Set domainNames = kernel.listGBeans(new AbstractNameQuery(J2EEDomain.class.getName())); 95 J2EEDomain[] result = new J2EEDomain[domainNames.size()]; 96 int i = 0; 97 for (Iterator iterator = domainNames.iterator(); iterator.hasNext();) { 98 AbstractName domainName = (AbstractName) iterator.next(); 99 result[i++] = (J2EEDomain) kernel.getProxyManager().createProxy(domainName, J2EEDomain.class); 100 } 101 return result; 102 } 103 104 public J2EEServer[] getServers(J2EEDomain domain) { 105 return domain.getServerInstances(); 106 } 107 108 public J2EEDeployedObject[] getDeployedObjects(J2EEServer server) { 109 return server.getDeployedObjectInstances(); 110 } 111 112 public J2EEApplication[] getApplications(J2EEServer server) { 113 return server.getApplications(); 114 } 115 116 public AppClientModule[] getAppClients(J2EEServer server) { 117 return server.getAppClients(); 118 } 119 120 public WebModule[] getWebModules(J2EEServer server) { 121 return server.getWebModules(); 122 } 123 124 public EJBModule[] getEJBModules(J2EEServer server) { 125 return server.getEJBModules(); 126 } 127 128 public ResourceAdapterModule[] getRAModules(J2EEServer server) { 129 return server.getResourceAdapterModules(); 130 } 131 132 public JCAManagedConnectionFactory[] getOutboundFactories(J2EEServer server, String connectionFactoryInterface) { 133 List list = new ArrayList (); 134 ResourceAdapterModule[] modules = server.getResourceAdapterModules(); 135 for (int i = 0; i < modules.length; i++) { 136 ResourceAdapterModule module = modules[i]; 137 ResourceAdapter[] adapters = module.getResourceAdapterInstances(); 138 for (int j = 0; j < adapters.length; j++) { 139 ResourceAdapter adapter = adapters[j]; 140 JCAResource[] resources = adapter.getJCAResourceImplementations(); 141 for (int k = 0; k < resources.length; k++) { 142 JCAResource resource = resources[k]; 143 JCAManagedConnectionFactory[] outboundFactories = resource.getOutboundFactories(); 144 list.addAll(Arrays.asList(outboundFactories)); 145 } 146 } 147 148 } 149 return (JCAManagedConnectionFactory[]) list.toArray(new JCAManagedConnectionFactory[list.size()]); 150 } 151 152 public ResourceAdapterModule[] getOutboundRAModules(J2EEServer server, String connectionFactoryInterface) { 153 return getOutboundRAModules(server, new String []{connectionFactoryInterface}); 154 } 155 156 public ResourceAdapterModule[] getOutboundRAModules(J2EEServer server, String [] connectionFactoryInterfaces) { 157 List list = new ArrayList (); 158 159 ResourceAdapterModule[] modules = server.getResourceAdapterModules(); 160 161 outer: 162 for (int i = 0; i < modules.length; i++) { 163 ResourceAdapterModule module = modules[i]; 164 ResourceAdapter[] adapters = module.getResourceAdapterInstances(); 165 for (int j = 0; j < adapters.length; j++) { 166 ResourceAdapter adapter = adapters[j]; 167 JCAResource[] resources = adapter.getJCAResourceImplementations(); 168 for (int k = 0; k < resources.length; k++) { 169 JCAResource resource = resources[k]; 170 JCAManagedConnectionFactory[] outboundFactories = resource.getOutboundFactories(connectionFactoryInterfaces); 171 if (outboundFactories.length > 0) { 172 list.add(module); 173 continue outer; 174 } 175 } 176 } 177 178 } 179 return (ResourceAdapterModule[]) list.toArray(new ResourceAdapterModule[list.size()]); 180 } 181 182 public ResourceAdapterModule[] getAdminObjectModules(J2EEServer server, String [] adminObjectInterfaces) { 183 List list = new ArrayList (); 184 185 ResourceAdapterModule[] modules = server.getResourceAdapterModules(); 186 187 outer: 188 for (int i = 0; i < modules.length; i++) { 189 ResourceAdapterModule module = modules[i]; 190 ResourceAdapter[] adapters = module.getResourceAdapterInstances(); 191 for (int j = 0; j < adapters.length; j++) { 192 ResourceAdapter adapter = adapters[j]; 193 JCAResource[] resources = adapter.getJCAResourceImplementations(); 194 for (int k = 0; k < resources.length; k++) { 195 JCAResource resource = resources[k]; 196 JCAAdminObject[] adminObjects = resource.getAdminObjectInstances(adminObjectInterfaces); 197 if (adminObjects.length > 0) { 198 list.add(module); 199 continue outer; 200 } 201 } 202 } 203 204 } 205 return (ResourceAdapterModule[]) list.toArray(new ResourceAdapterModule[list.size()]); 206 } 207 208 public JCAManagedConnectionFactory[] getOutboundFactories(ResourceAdapterModule module) { 209 return getOutboundFactories(module, (String []) null); 210 } 211 212 public JCAManagedConnectionFactory[] getOutboundFactories(ResourceAdapterModule module, String connectionFactoryInterface) { 213 return getOutboundFactories(module, new String []{connectionFactoryInterface}); 214 } 215 216 public JCAManagedConnectionFactory[] getOutboundFactories(ResourceAdapterModule module, String [] connectionFactoryInterfaces) { 217 List list = new ArrayList (); 218 219 ResourceAdapter[] resourceAdapters = module.getResourceAdapterInstances(); 220 for (int i = 0; i < resourceAdapters.length; i++) { 221 ResourceAdapter resourceAdapter = resourceAdapters[i]; 222 JCAResource[] jcaResources = resourceAdapter.getJCAResourceImplementations(); 223 for (int j = 0; j < jcaResources.length; j++) { 224 JCAResource jcaResource = jcaResources[j]; 225 JCAManagedConnectionFactory[] outboundFactories = jcaResource.getOutboundFactories(connectionFactoryInterfaces); 226 list.addAll(Arrays.asList(outboundFactories)); 227 } 228 } 229 230 return (JCAManagedConnectionFactory[]) list.toArray(new JCAManagedConnectionFactory[list.size()]); 231 } 232 233 public JCAAdminObject[] getAdminObjects(ResourceAdapterModule module, String [] adminObjectInterfaces) { 234 List list = new ArrayList (); 235 ResourceAdapter[] resourceAdapters = module.getResourceAdapterInstances(); 236 for (int i = 0; i < resourceAdapters.length; i++) { 237 ResourceAdapter resourceAdapter = resourceAdapters[i]; 238 JCAResource[] jcaResources = resourceAdapter.getJCAResourceImplementations(); 239 for (int j = 0; j < jcaResources.length; j++) { 240 JCAResource jcaResource = jcaResources[j]; 241 JCAAdminObject[] adminObjects = jcaResource.getAdminObjectInstances(adminObjectInterfaces); 242 list.addAll(Arrays.asList(adminObjects)); 243 } 244 } 245 246 return (JCAAdminObject[]) list.toArray(new JCAAdminObject[list.size()]); 247 } 248 249 public J2EEResource[] getResources(J2EEServer server) { 250 return server.getResourceInstances(); 251 } 252 253 public JCAResource[] getJCAResources(J2EEServer server) { 254 List list = new ArrayList (); 255 ResourceAdapterModule[] modules = server.getResourceAdapterModules(); 256 for (int i = 0; i < modules.length; i++) { 257 ResourceAdapterModule module = modules[i]; 258 ResourceAdapter[] adapters = module.getResourceAdapterInstances(); 259 for (int j = 0; j < adapters.length; j++) { 260 ResourceAdapter adapter = adapters[j]; 261 JCAResource[] resources = adapter.getJCAResourceImplementations(); 262 list.addAll(Arrays.asList(resources)); 263 } 264 265 } 266 return (JCAResource[]) list.toArray(new JCAResource[list.size()]); 267 } 268 269 public JDBCResource[] getJDBCResources(J2EEServer server) { 270 return new JDBCResource[0]; } 272 273 public JMSResource[] getJMSResources(J2EEServer server) { 274 return new JMSResource[0]; } 276 277 public JVM[] getJavaVMs(J2EEServer server) { 278 return server.getJavaVMInstances(); 279 } 280 281 public SystemLog getSystemLog(JVM jvm) { 282 return jvm.getSystemLog(); 283 } 284 285 public J2EEModule[] getModules(J2EEApplication application) { 287 return application.getModulesInstances(); 288 } 289 290 public AppClientModule[] getAppClients(J2EEApplication application) { 291 return application.getClientModules(); 292 } 293 294 public WebModule[] getWebModules(J2EEApplication application) { 295 return application.getWebModules(); 296 } 297 298 public EJBModule[] getEJBModules(J2EEApplication application) { 299 return application.getEJBModules(); 300 } 301 302 public ResourceAdapterModule[] getRAModules(J2EEApplication application) { 303 return application.getRAModules(); 304 } 305 306 307 public JCAResource[] getJCAResources(J2EEApplication application) { 308 List list = new ArrayList (); 309 ResourceAdapterModule[] modules = application.getRAModules(); 310 for (int i = 0; i < modules.length; i++) { 311 ResourceAdapterModule module = modules[i]; 312 ResourceAdapter[] adapters = module.getResourceAdapterInstances(); 313 for (int j = 0; j < adapters.length; j++) { 314 ResourceAdapter adapter = adapters[j]; 315 JCAResource[] resources = adapter.getJCAResourceImplementations(); 316 list.addAll(Arrays.asList(resources)); 317 } 318 319 } 320 return (JCAResource[]) list.toArray(new JCAResource[list.size()]); 321 } 322 323 public JDBCResource[] getJDBCResources(J2EEApplication application) { 324 return new JDBCResource[0]; } 326 327 public JMSResource[] getJMSResources(J2EEApplication application) { 328 return new JMSResource[0]; } 330 331 public EJB[] getEJBs(EJBModule module) { 333 return new EJB[0]; } 335 336 public Servlet[] getServlets(WebModule module) { 337 return new Servlet[0]; } 339 340 public ResourceAdapter[] getResourceAdapters(ResourceAdapterModule module) { 341 return module.getResourceAdapterInstances(); 342 } 343 344 public JCAResource[] getRAResources(ResourceAdapter adapter) { 346 return adapter.getJCAResourceImplementations(); 347 } 348 349 public JDBCDataSource[] getDataSource(JDBCResource resource) { 351 return new JDBCDataSource[0]; } 353 354 public JDBCDriver[] getDriver(JDBCDataSource dataSource) { 355 return new JDBCDriver[0]; } 357 358 public JCAConnectionFactory[] getConnectionFactories(JCAResource resource) { 359 return resource.getConnectionFactoryInstances(); 360 } 361 362 public JCAAdminObject[] getAdminObjects(JCAResource resource) { 363 return resource.getAdminObjectInstances(); 364 } 365 366 public JCAManagedConnectionFactory getManagedConnectionFactory(JCAConnectionFactory factory) { 367 return factory.getManagedConnectionFactoryInstance(); 368 } 369 370 public Object getObject(AbstractName objectName) { 371 ClassLoader cl = null; 372 try { 373 cl = kernel.getClassLoaderFor(objectName); 374 } catch(GBeanNotFoundException e) { 375 cl = KernelManagementHelper.class.getClassLoader(); 376 } 377 return kernel.getProxyManager().createProxy(objectName, cl); 378 } 379 380 public Artifact getConfigurationNameFor(AbstractName abstractName) { 381 return abstractName.getArtifact(); 382 } 383 384 public String getGBeanDescription(AbstractName abstractName) { 385 try { 386 return kernel.getGBeanInfo(abstractName).getName(); 387 } catch (GBeanNotFoundException e) { 388 return null; 389 } 390 } 391 392 public void testLoginModule(J2EEServer server, LoginModule module, Map options) { 393 options.put(JaasLoginModuleUse.KERNEL_NAME_LM_OPTION, kernel.getKernelName()); 394 options.put(JaasLoginModuleUse.SERVERINFO_LM_OPTION, server.getServerInfo()); 395 if (!options.containsKey(JaasLoginModuleUse.CLASSLOADER_LM_OPTION)) { 396 options.put(JaasLoginModuleUse.CLASSLOADER_LM_OPTION, module.getClass().getClassLoader()); 397 } 398 module.initialize(null, null, new HashMap (), options); 399 } 400 401 public Subject testLoginModule(final J2EEServer server, final LoginModule module, final Map options, final String username, final String password) throws LoginException { 402 options.put(JaasLoginModuleUse.KERNEL_NAME_LM_OPTION, kernel.getKernelName()); 403 if (!options.containsKey(JaasLoginModuleUse.CLASSLOADER_LM_OPTION)) { 404 options.put(JaasLoginModuleUse.CLASSLOADER_LM_OPTION, module.getClass().getClassLoader()); 405 } 406 options.put(JaasLoginModuleUse.SERVERINFO_LM_OPTION, server.getServerInfo()); 407 Subject sub = new Subject (); 408 CallbackHandler handler = new CallbackHandler () { 409 public void handle(Callback [] callbacks) throws UnsupportedCallbackException { 410 for (int i = 0; i < callbacks.length; i++) { 411 Callback callback = callbacks[i]; 412 if (callback instanceof PasswordCallback ) { 413 ((PasswordCallback ) callback).setPassword(password.toCharArray()); 414 } else if (callback instanceof NameCallback ) { 415 ((NameCallback ) callback).setName(username); 416 } else { 417 throw new UnsupportedCallbackException (callback); 418 } 419 } 420 } 421 }; 422 module.initialize(sub, handler, new HashMap (), options); 423 if (module.login() && module.commit()) { 424 return sub; 425 } else { 426 module.abort(); 427 } 428 return null; 429 } 430 431 public Object [] findByInterface(Class iface) { 432 Set set = kernel.listGBeans(new AbstractNameQuery(iface.getName())); 433 Object [] result = new Object [set.size()]; 434 int i = 0; 435 for (Iterator it = set.iterator(); it.hasNext();) { 436 AbstractName name = (AbstractName) it.next(); 437 result[i++] = kernel.getProxyManager().createProxy(name, iface.getClassLoader()); 438 } 439 return result; 440 } 441 442 public AbstractName getNameFor(Object component) { 443 return kernel.getAbstractNameFor(component); 444 } 445 446 public ConfigurationData[] getConfigurations(ConfigurationModuleType type, boolean includeChildModules) { 447 ConfigurationManager mgr = ConfigurationUtil.getConfigurationManager(kernel); 448 List stores = mgr.listStores(); 449 List results = new ArrayList (); 450 for (Iterator i = stores.iterator(); i.hasNext();) { 451 AbstractName storeName = (AbstractName) i.next(); 452 try { 453 List infos = mgr.listConfigurations(storeName); 454 for (Iterator j = infos.iterator(); j.hasNext();) { 455 ConfigurationInfo info = (ConfigurationInfo) j.next(); 456 AbstractName configuration = Configuration.getConfigurationAbstractName(info.getConfigID()); 457 if (type == null || type.getValue() == info.getType().getValue()) { 458 J2EEDeployedObject module = getModuleForConfiguration(info.getConfigID()); 459 results.add(new ConfigurationData(info.getConfigID(), configuration, null, info.getState(), info.getType(), module == null ? null : kernel.getAbstractNameFor(module))); 460 } 461 if (includeChildModules && info.getType().getValue() == ConfigurationModuleType.EAR.getValue() && info.getState().toInt() == State.RUNNING_INDEX) 462 { 463 J2EEApplication app = (J2EEApplication) getModuleForConfiguration(info.getConfigID()); 464 if (app == null) { 465 throw new IllegalStateException ("Unable to load children for J2EE Application '" + info.getConfigID() + "' (no J2EEApplication found)"); 466 } 467 Object [] modules = null; 468 if (type == null) { 469 modules = app.getModulesInstances(); 470 } else if (type.equals(ConfigurationModuleType.CAR)) { 471 modules = app.getClientModules(); 472 } else if (type.equals(ConfigurationModuleType.EJB)) { 473 modules = app.getEJBModules(); 474 } else if (type.equals(ConfigurationModuleType.RAR)) { 475 modules = app.getRAModules(); 476 } else if (type.equals(ConfigurationModuleType.WAR)) { 477 modules = app.getWebModules(); 478 } if (modules == null) continue; 480 for (int k = 0; k < modules.length; k++) { 481 Object module = modules[k]; 482 ConfigurationModuleType moduleType = type; 483 if (moduleType == null) { 484 if (module instanceof WebModule) { 485 moduleType = ConfigurationModuleType.WAR; 486 } else if (module instanceof EJBModule) { 487 moduleType = ConfigurationModuleType.EJB; 488 } else if (module instanceof ResourceAdapterModule) { 489 moduleType = ConfigurationModuleType.RAR; 490 } else if (module instanceof AppClientModule) moduleType = ConfigurationModuleType.CAR; 491 } 492 String moduleName; 493 if (type != null && type.equals(ConfigurationModuleType.WAR)) { 494 moduleName = ((WebModule) module).getWARName(); 495 } else { 496 moduleName = (String ) kernel.getAbstractNameFor(module).getName().get(NameFactory.J2EE_NAME); 498 } 499 results.add(new ConfigurationData(info.getConfigID(), configuration, moduleName, info.getState(), moduleType, kernel.getAbstractNameFor(module))); 500 } 501 } 502 } 503 } catch (NoSuchStoreException e) { 504 } catch (InvalidConfigException e) { 507 throw new RuntimeException ("Bad configID; should never happen"); 508 } 509 } 510 Collections.sort(results); 511 return (ConfigurationData[]) results.toArray(new ConfigurationData[results.size()]); 512 } 513 514 520 public J2EEDeployedObject getModuleForConfiguration(Artifact configuration) { 521 ConfigurationManager manager = ConfigurationUtil.getConfigurationManager(kernel); 522 Configuration config = manager.getConfiguration(configuration); 523 if (config == null || !manager.isRunning(configuration)) { 524 return null; } 526 ConfigurationModuleType type = config.getModuleType(); 527 AbstractName result; 528 try { 529 if (type.equals(ConfigurationModuleType.CAR)) { 530 result = config.findGBean(new AbstractNameQuery(AppClientModule.class.getName())); 531 } else if (type.equals(ConfigurationModuleType.EAR)) { 532 result = config.findGBean(new AbstractNameQuery(J2EEApplication.class.getName())); 533 } else if (type.equals(ConfigurationModuleType.EJB)) { 534 result = config.findGBean(new AbstractNameQuery(EJBModule.class.getName())); 535 } else if (type.equals(ConfigurationModuleType.RAR)) { 536 result = config.findGBean(new AbstractNameQuery(ResourceAdapterModule.class.getName())); 537 } else if (type.equals(ConfigurationModuleType.WAR)) { 538 result = config.findGBean(new AbstractNameQuery(WebModule.class.getName())); 539 } else { 540 return null; 541 } 542 return (J2EEDeployedObject) kernel.getProxyManager().createProxy(result, getClass().getClassLoader()); 543 } catch (GBeanNotFoundException e) { 544 throw new IllegalStateException ("Bad config ID: " + e.getMessage()); 545 } 546 } 547 548 public Object [] getGBeansImplementing(Class iface) { 549 Set set = kernel.listGBeans(new AbstractNameQuery(iface.getName())); 550 Object [] result = (Object []) Array.newInstance(iface, set.size()); 551 int index = 0; 552 ProxyManager mgr = kernel.getProxyManager(); 553 for (Iterator it = set.iterator(); it.hasNext();) { 554 AbstractName name = (AbstractName) it.next(); 555 result[index++] = mgr.createProxy(name, iface); 556 } 557 return result; 558 } 559 560 566 public void addGBeanToConfiguration(Artifact configID, GBeanData gbean, boolean start) { 567 EditableConfigurationManager mgr = ConfigurationUtil.getEditableConfigurationManager(kernel); 568 try { 569 mgr.addGBeanToConfiguration(configID, gbean, start); 570 } catch (InvalidConfigException e) { 571 throw new RuntimeException ("Bad configID. configID = "+configID, e); 572 } finally { 573 ConfigurationUtil.releaseConfigurationManager(kernel, mgr); 574 } 575 } 576 577 580 public Naming getNaming() { 581 return kernel.getNaming(); 582 } 583 584 587 public static KernelManagementHelper getRemoteKernelManager(String host, String user, String password) throws java.io.IOException { 588 String uri = "jmx:rmi://" + host + "/jndi/rmi:/JMXConnector"; 589 java.util.Map environment = new java.util.HashMap (); 590 String [] credentials = new String []{user, password}; 591 environment.put(javax.management.remote.JMXConnector.CREDENTIALS, credentials); 592 javax.management.remote.JMXServiceURL address = new javax.management.remote.JMXServiceURL ("service:" + uri); 593 javax.management.remote.JMXConnector jmxConnector = javax.management.remote.JMXConnectorFactory.connect(address, environment); 594 javax.management.MBeanServerConnection mbServerConnection = jmxConnector.getMBeanServerConnection(); 595 Kernel kernel = new org.apache.geronimo.system.jmx.KernelDelegate(mbServerConnection); 596 return new KernelManagementHelper(kernel); 597 } 598 } 599 | Popular Tags |