1 22 package org.jboss.web.tomcat.tc6.deployers; 23 24 import java.io.File ; 25 import java.net.URL ; 26 import java.net.URLClassLoader ; 27 import java.util.ArrayList ; 28 import java.util.Iterator ; 29 import java.util.Properties ; 30 31 import javax.management.Attribute ; 32 import javax.management.MBeanServer ; 33 import javax.management.Notification ; 34 import javax.management.NotificationListener ; 35 import javax.management.ObjectInstance ; 36 import javax.management.ObjectName ; 37 import javax.naming.InitialContext ; 38 import javax.naming.NamingException ; 39 import javax.security.jacc.PolicyContext ; 40 41 import org.apache.catalina.Lifecycle; 42 import org.apache.catalina.connector.Connector; 43 import org.apache.tomcat.util.modeler.Registry; 44 import org.jboss.deployers.spi.deployer.DeploymentUnit; 45 import org.jboss.metadata.WebMetaData; 46 import org.jboss.mx.util.MBeanServerLocator; 47 import org.jboss.security.plugins.JaasSecurityManagerServiceMBean; 48 import org.jboss.system.server.Server; 49 import org.jboss.system.server.ServerImplMBean; 50 import org.jboss.virtual.VirtualFile; 51 import org.jboss.web.deployers.AbstractWarDeployer; 52 import org.jboss.web.deployers.AbstractWarDeployment; 53 import org.jboss.web.tomcat.security.HttpServletRequestPolicyContextHandler; 54 import org.jboss.web.tomcat.tc6.TomcatInjectionContainer; 55 import org.jboss.web.tomcat.tc6.session.SessionIDGenerator; 56 57 58 72 public class TomcatDeployer extends AbstractWarDeployer 73 implements NotificationListener , TomcatDeployerMBean 74 { 75 public static final String NAME = "TomcatDeployer"; 77 78 82 public static final String DEFAULT_CACHE_NAME = 83 "jboss.cache:service=TomcatClusteringCache"; 84 85 86 private String contextClassName = 87 "org.apache.catalina.core.StandardContext"; 88 89 94 private Properties authenticators = null; 95 96 99 private String catalinaDomain = "Catalina"; 100 101 105 private String cacheName = DEFAULT_CACHE_NAME; 106 107 111 protected String managerClass = "org.jboss.web.tomcat.tc6.session.JBossCacheManager"; 112 113 117 private int snapshotInterval = 1000; 118 119 123 private String snapshotMode = "instant"; 125 128 private boolean useLocalCache = true; 129 130 133 private boolean useJK = false; 134 135 138 private boolean useJBossWebLoader = true; 139 140 143 private boolean deleteWorkDirOnContextDestroy = false; 144 145 148 private String httpHeaderForSSOAuth = null; 149 private String sessionCookieForSSOAuth = null; 150 151 152 155 private String serverConfigFile = "server.xml"; 156 157 160 private String subjectAttributeName = null; 161 162 165 private boolean allowSelfPrivilegedWebApps = false; 166 167 168 private JaasSecurityManagerServiceMBean secMgrService; 169 170 171 private String [] filteredPackages; 172 173 public TomcatDeployer() 174 { 175 } 176 177 public String getName() 178 { 179 return NAME; 180 } 181 182 183 public String getManagerClass() 184 { 185 return managerClass; 186 } 187 188 public void setManagerClass(String managerClass) 189 { 190 this.managerClass = managerClass; 191 } 192 193 194 public String getDomain() 195 { 196 return this.catalinaDomain; 197 } 198 199 public Properties getAuthenticators() 200 { 201 return this.authenticators; 202 } 203 204 public void setAuthenticators(Properties prop) 205 { 206 this.authenticators = prop; 207 log.debug("Passed set of authenticators=" + prop); 208 } 209 210 217 public void setDomain(String catalinaDomain) 218 { 219 this.catalinaDomain = catalinaDomain; 220 } 221 222 public void setContextMBeanCode(String className) 223 { 224 this.contextClassName = className; 225 } 226 227 public String getContextMBeanCode() 228 { 229 return contextClassName; 230 } 231 232 235 public void setSnapshotInterval(int interval) 236 { 237 this.snapshotInterval = interval; 238 } 239 240 243 public int getSnapshotInterval() 244 { 245 return this.snapshotInterval; 246 } 247 248 251 public void setSnapshotMode(String mode) 252 { 253 this.snapshotMode = mode; 254 } 255 256 259 public String getSnapshotMode() 260 { 261 return this.snapshotMode; 262 } 263 264 271 public String getCacheName() 272 { 273 return cacheName; 274 } 275 276 285 public void setCacheName(String cacheName) 286 { 287 this.cacheName = cacheName; 288 } 289 290 public boolean isUseLocalCache() 291 { 292 return useLocalCache; 293 } 294 295 public void setUseLocalCache(boolean useLocalCache) 296 { 297 this.useLocalCache = useLocalCache; 298 } 299 300 public boolean isUseJK() 301 { 302 return useJK; 303 } 304 305 public void setUseJK(boolean useJK) 306 { 307 this.useJK = useJK; 308 } 309 310 public boolean getDeleteWorkDirOnContextDestroy() 311 { 312 return deleteWorkDirOnContextDestroy; 313 } 314 315 public void setDeleteWorkDirOnContextDestroy(boolean deleteFlag) 316 { 317 this.deleteWorkDirOnContextDestroy = deleteFlag; 318 } 319 320 public String getHttpHeaderForSSOAuth() 321 { 322 return httpHeaderForSSOAuth; 323 } 324 325 public void setHttpHeaderForSSOAuth(String httpHeader) 326 { 327 this.httpHeaderForSSOAuth = httpHeader; 328 } 329 330 public String getSessionCookieForSSOAuth() 331 { 332 return sessionCookieForSSOAuth; 333 } 334 335 public void setSessionCookieForSSOAuth(String sessionC) 336 { 337 this.sessionCookieForSSOAuth = sessionC; 338 } 339 340 343 public void setSessionIdAlphabet(String sessionIdAlphabet) 344 { 345 SessionIDGenerator.getInstance().setSessionIdAlphabet(sessionIdAlphabet); 346 } 347 348 351 public String getSessionIdAlphabet() 352 { 353 return SessionIDGenerator.getInstance().getSessionIdAlphabet(); 354 } 355 356 public boolean getUseJBossWebLoader() 357 { 358 return useJBossWebLoader; 359 } 360 361 public void setUseJBossWebLoader(boolean flag) 362 { 363 this.useJBossWebLoader = flag; 364 } 365 366 public String getConfigFile() 367 { 368 return serverConfigFile; 369 } 370 371 public void setConfigFile(String configFile) 372 { 373 this.serverConfigFile = configFile; 374 } 375 376 public String getSubjectAttributeName() 377 { 378 return this.subjectAttributeName; 379 } 380 381 public void setSubjectAttributeName(String name) 382 { 383 this.subjectAttributeName = name; 384 } 385 386 public boolean isAllowSelfPrivilegedWebApps() 387 { 388 return allowSelfPrivilegedWebApps; 389 } 390 391 public void setAllowSelfPrivilegedWebApps(boolean allowSelfPrivilegedWebApps) 392 { 393 this.allowSelfPrivilegedWebApps = allowSelfPrivilegedWebApps; 394 } 395 396 public void setSecurityManagerService(JaasSecurityManagerServiceMBean mgr) 397 { 398 this.secMgrService = mgr; 399 } 400 401 public String [] getFilteredPackages() 402 { 403 return filteredPackages; 404 } 405 public void setFilteredPackages(String [] pkgs) 406 { 407 this.filteredPackages = pkgs; 408 } 409 410 413 public void start() 414 throws Exception 415 { 416 super.start(); 417 418 log.debug("Starting tomcat deployer"); 419 MBeanServer server = super.getServer(); 420 System.setProperty("catalina.ext.dirs", 421 (System.getProperty("jboss.server.home.dir") 422 + File.separator + "lib")); 423 424 String objectNameS = catalinaDomain + ":type=server"; 425 ObjectName objectName = new ObjectName (objectNameS); 426 427 Registry.getRegistry().setMBeanServer(server); 429 430 Registry.getRegistry().registerComponent(Class.forName("org.apache.catalina.startup.Catalina").newInstance(), 431 objectName, "org.apache.catalina.startup.Catalina"); 432 438 439 server.setAttribute(objectName, new Attribute 440 ("catalinaHome", 441 System.getProperty("jboss.server.home.dir"))); 442 server.setAttribute(objectName, new Attribute 443 ("configFile", serverConfigFile)); 444 server.setAttribute(objectName, new Attribute 445 ("useNaming", new Boolean (false))); 446 server.setAttribute(objectName, new Attribute 447 ("useShutdownHook", new Boolean (false))); 448 server.setAttribute(objectName, new Attribute 449 ("await", new Boolean (false))); 450 server.setAttribute(objectName, new Attribute 451 ("redirectStreams", new Boolean (false))); 452 453 server.invoke(objectName, "create", new Object []{}, 454 new String []{}); 455 456 server.invoke(objectName, "start", new Object []{}, 457 new String []{}); 458 459 461 ObjectName ssoQuery = new ObjectName (catalinaDomain + ":type=Valve,*"); 462 Iterator iterator = server.queryMBeans(ssoQuery, null).iterator(); 463 while (iterator.hasNext()) 464 { 465 ObjectName ssoObjectName = 466 ((ObjectInstance ) iterator.next()).getObjectName(); 467 String name = ssoObjectName.getKeyProperty("name"); 468 469 480 481 if (cacheName != null && "ClusteredSingleSignOn".equals(name)) 484 { 485 String tcName = (String ) server.getAttribute(ssoObjectName, 486 "treeCacheName"); 487 tcName = (tcName != null ? tcName : DEFAULT_CACHE_NAME); 488 ObjectName ssoCacheName = new ObjectName (tcName); 489 if (ssoCacheName.equals(new ObjectName (DEFAULT_CACHE_NAME))) 492 { 493 log.info("Setting the cache name to " + cacheName + 494 " on " + ssoObjectName); 495 server.setAttribute(ssoObjectName, 496 new Attribute ("treeCacheName", cacheName)); 497 } 498 } 499 } 500 501 InitialContext ic = new InitialContext (); 503 try 504 { 505 ic.bind("TomcatAuthenticators", this.authenticators); 506 } 507 catch(NamingException ne) 508 { 509 if(log.isTraceEnabled()) 510 log.trace("Binding Authenticators to JNDI failed",ne); 511 } 512 finally 513 { 514 try{ ic.close();}catch(NamingException nee){} 515 } 516 517 HttpServletRequestPolicyContextHandler handler = new HttpServletRequestPolicyContextHandler(); 519 PolicyContext.registerHandler(HttpServletRequestPolicyContextHandler.WEB_REQUEST_KEY, 520 handler, true); 521 522 Boolean started = (Boolean )server.getAttribute(ServerImplMBean.OBJECT_NAME, "Started"); 527 if (started.booleanValue() == true) 528 { 529 log.debug("Server '" + ServerImplMBean.OBJECT_NAME + 530 "' already started, starting connectors now"); 531 532 startConnectors(); 533 } 534 else 535 { 536 log.debug("Server '" + ServerImplMBean.OBJECT_NAME + 538 "' not started, registering for start-up notification"); 539 540 server.addNotificationListener(ServerImplMBean.OBJECT_NAME, this, null, null); 541 } 542 } 543 544 545 public void stop() 546 throws Exception 547 { 548 MBeanServer server = super.getServer(); 549 String objectNameS = catalinaDomain + ":type=server"; 550 ObjectName objectName = new ObjectName (objectNameS); 551 552 server.invoke(objectName, "stop", new Object []{}, 553 new String []{}); 554 555 server.invoke(objectName, "destroy", new Object []{}, 556 new String []{}); 557 558 server.unregisterMBean(objectName); 559 560 MBeanServer server2 = server; 561 562 ObjectName queryObjectName = new ObjectName 564 (catalinaDomain + ":*"); 565 Iterator iterator = 566 server2.queryMBeans(queryObjectName, null).iterator(); 567 while (iterator.hasNext()) 568 { 569 ObjectInstance oi = (ObjectInstance ) iterator.next(); 570 ObjectName toRemove = oi.getObjectName(); 571 if (!"WebServer".equals(toRemove.getKeyProperty("service"))) 573 { 574 if (server2.isRegistered(toRemove)) 575 { 576 server2.unregisterMBean(toRemove); 577 } 578 } 579 } 580 queryObjectName = new ObjectName ("Catalina:*"); 581 iterator = server2.queryMBeans(queryObjectName, null).iterator(); 582 while (iterator.hasNext()) 583 { 584 ObjectInstance oi = (ObjectInstance ) iterator.next(); 585 ObjectName name = oi.getObjectName(); 586 server2.unregisterMBean(name); 587 } 588 super.stop(); 589 } 590 591 594 public void startConnectors() throws Exception 595 { 596 MBeanServer server = super.getServer(); 597 ObjectName service = new ObjectName (catalinaDomain + ":type=Service,serviceName=jboss.web"); 598 Object [] args = {}; 599 String [] sig = {}; 600 Connector[] connectors = (Connector[]) server.invoke(service, 601 "findConnectors", args, sig); 602 for (int n = 0; n < connectors.length; n++) 603 { 604 Lifecycle lc = (Lifecycle) connectors[n]; 605 lc.start(); 606 } 607 612 } 613 614 617 public void stopConnectors() throws Exception 618 { 619 MBeanServer server = super.getServer(); 620 ObjectName service = new ObjectName (catalinaDomain + ":type=Service,serviceName=jboss.web"); 621 Object [] args = {}; 622 String [] sig = {}; 623 Connector[] connectors = (Connector[]) server.invoke(service, 624 "findConnectors", args, sig); 625 for (int n = 0; n < connectors.length; n++) 626 { 627 Lifecycle lc = (Lifecycle) connectors[n]; 628 lc.stop(); 629 } 630 } 631 632 636 public void handleNotification(Notification msg, Object handback) 637 { 638 String type = msg.getType(); 639 if (type.equals(Server.START_NOTIFICATION_TYPE)) 640 { 641 log.debug("Saw " + type + " notification, starting connectors"); 642 try 643 { 644 startConnectors(); 645 } 646 catch (Exception e) 647 { 648 log.warn("Failed to startConnectors", e); 649 } 650 } 651 } 652 653 657 static class ENCLoader extends URLClassLoader 658 { 659 private boolean parentFirst; 660 661 ENCLoader(URL [] urls, ClassLoader parent, boolean parentFirst) 662 { 663 super(urls, parent); 664 this.parentFirst = parentFirst; 665 } 666 667 protected synchronized Class <?> loadClass(String name, boolean resolve) throws ClassNotFoundException 668 { 669 if (parentFirst) return super.loadClass(name, resolve); 670 try 671 { 672 Class clazz = findClass(name); 673 if (resolve) { 674 resolveClass(clazz); 675 } 676 return clazz; 677 } 678 catch (ClassNotFoundException e) 679 { 680 return getParent().loadClass(name); 681 } 682 } 683 684 } 685 686 public static ClassLoader getTmpLoader(URL warURL, ClassLoader parent, boolean parentFirst) throws Exception 687 { 688 689 String path = warURL.getFile(); 690 ArrayList <URL > list = new ArrayList <URL >(); 691 File classesDir = new File (path, "WEB-INF/classes"); 692 if (classesDir.exists()) 693 { 694 list.add(classesDir.toURL()); 695 } 696 File libDir = new File (path, "WEB-INF/lib"); 697 if (libDir.exists()) 698 { 699 File [] jars = libDir.listFiles(); 700 int length = jars != null ? jars.length : 0; 701 for (int j = 0; j < length; j++) 702 { 703 File jar = jars[j]; 704 if(jar.getAbsolutePath().endsWith(".jar")) 705 { 706 list.add(jar.toURL()); 707 } 708 } 709 } 710 ENCLoader loader = new ENCLoader(list.toArray(new URL [list.size()]), parent, parentFirst); 711 return loader; 712 713 } 714 715 721 @Override 722 public AbstractWarDeployment getDeployment(DeploymentUnit unit, WebMetaData metaData) 723 throws Exception 724 { 725 TomcatDeployment deployment = new TomcatDeployment(); 726 DeployerConfig config = new DeployerConfig(); 727 config.setDefaultSecurityDomain(this.defaultSecurityDomain); 728 config.setSubjectAttributeName(this.subjectAttributeName); 729 config.setServiceClassLoader(getClass().getClassLoader()); 730 config.setManagerClass(this.managerClass); 731 config.setJava2ClassLoadingCompliance(this.java2ClassLoadingCompliance); 732 config.setUnpackWars(this.unpackWars); 733 config.setLenientEjbLink(this.lenientEjbLink); 734 config.setCatalinaDomain(catalinaDomain); 735 config.setContextClassName(contextClassName); 736 config.setServiceName(null); 737 config.setSnapshotInterval(this.snapshotInterval); 738 config.setSnapshotMode(this.snapshotMode); 739 config.setUseLocalCache(this.useLocalCache); 740 config.setUseJK(this.useJK); 741 config.setSubjectAttributeName(this.subjectAttributeName); 742 config.setUseJBossWebLoader(this.useJBossWebLoader); 743 config.setAllowSelfPrivilegedWebApps(this.allowSelfPrivilegedWebApps); 744 config.setSecurityManagerService(this.secMgrService); 745 config.setFilteredPackages(filteredPackages); 746 747 VirtualFile vf = unit.getMetaDataFile("jboss-xacml-policy.xml"); 749 if(vf != null) 750 config.setXacmlPolicyURL(vf.toURL()); 751 752 deployment.setServer(super.getServer()); 753 deployment.init(config); 754 755 return deployment; 756 } 757 758 public void create() throws Exception 759 { 760 MBeanServer server = MBeanServerLocator.locateJBoss(); 761 if (server != null) 762 server.registerMBean(this, OBJECT_NAME); 763 } 764 765 public void destroy() throws Exception 766 { 767 MBeanServer server = MBeanServerLocator.locateJBoss(); 768 if (server != null) 769 server.unregisterMBean(OBJECT_NAME); 770 } 771 } | Popular Tags |