| 1 26 package com.lutris.appserver.server; 27 28 import java.io.IOException ; 29 import java.lang.reflect.Constructor ; 30 import java.lang.reflect.Method ; 31 import java.util.Enumeration ; 32 import java.util.Hashtable ; 33 import java.util.Iterator ; 34 import java.util.List ; 35 import java.util.ListIterator ; 36 import java.util.StringTokenizer ; 37 38 import javax.management.Attribute ; 39 import javax.management.AttributeChangeNotification ; 40 import javax.management.AttributeList ; 41 import javax.management.AttributeNotFoundException ; 42 import javax.management.DynamicMBean ; 43 import javax.management.InvalidAttributeValueException ; 44 import javax.management.MBeanAttributeInfo ; 45 import javax.management.MBeanConstructorInfo ; 46 import javax.management.MBeanException ; 47 import javax.management.MBeanInfo ; 48 import javax.management.MBeanNotificationInfo ; 49 import javax.management.MBeanOperationInfo ; 50 import javax.management.MBeanParameterInfo ; 51 import javax.management.MBeanServer ; 52 import javax.management.MBeanServerFactory ; 53 import javax.management.Notification ; 54 import javax.management.NotificationBroadcasterSupport ; 55 import javax.management.ObjectName ; 56 import javax.management.ReflectionException ; 57 import javax.management.RuntimeOperationsException ; 58 import javax.servlet.Servlet ; 59 import javax.servlet.ServletContext ; 60 import javax.servlet.ServletException ; 61 import javax.servlet.http.HttpServletRequest ; 62 import javax.servlet.http.HttpServletResponse ; 63 64 import org.enhydra.util.ConfigFileInterface; 65 import org.enhydra.util.DOTable; 66 import org.enhydra.util.Utils; 67 import org.enhydra.util.EafConfigMBean; 68 import org.enhydra.util.jivan.JivanFactory; 69 import org.enhydra.xml.xmlc.XMLCFactory; 70 import org.enhydra.xml.xmlc.XMLCStdFactory; 71 import org.enhydra.xml.xmlc.deferredparsing.DocumentLoaderImpl; 72 import org.enhydra.xml.xmlc.deferredparsing.XMLCDeferredParsingFactory; 73 74 import com.lutris.appserver.server.httpPresentation.ClientPageRedirectException; 75 import com.lutris.appserver.server.httpPresentation.HttpPresentationComms; 76 import com.lutris.appserver.server.httpPresentation.HttpPresentationException; 77 import com.lutris.appserver.server.httpPresentation.HttpPresentationManager; 78 import com.lutris.appserver.server.session.MemoryPersistence; 79 import com.lutris.appserver.server.session.Session; 80 import com.lutris.appserver.server.session.SessionException; 81 import com.lutris.appserver.server.session.SessionManager; 82 import com.lutris.appserver.server.sessionEnhydra.StandardSessionManager; 83 import com.lutris.appserver.server.sql.DatabaseManager; 84 import com.lutris.classloader.MultiClassLoader; 85 import com.lutris.logging.EnhydraXMLCLogger; 86 import com.lutris.logging.LogChannel; 87 import com.lutris.logging.Logger; 88 import com.lutris.util.Config; 89 import com.lutris.util.KeywordValueException; 90 91 98 public abstract class StandardApplication 99 implements Application { 100 103 private static final String sysConLoggerName = "SysOut"; 104 private static final String STANDARD_DATABASE_MANAGER_CLASS_NAME = 105 "com.lutris.appserver.server.sql.StandardDatabaseManager"; 106 109 protected boolean sendCookieForNewSession = true; 110 114 protected String appName = null; 115 119 protected int state = STOPPED; 120 125 protected SessionManager sessionManager; 126 130 protected HttpPresentationManager presentationManager; 131 136 protected DatabaseManager databaseManager; 137 143 protected Config config; 144 150 protected String defaultUrl; 151 154 protected LogChannel logChannel; 155 protected Logger logger; 156 159 protected static LogChannel loggerSys; 160 163 protected ApplicationData data = new ApplicationData(); 164 167 protected XMLCFactory xmlcFactory; 168 169 172 protected JivanFactory jivanFactory; 173 174 175 protected MBeanServer server = null; 176 protected ApplicationConfigMBean appConfigMBean; 177 protected DatabaseManagerMBean databaseManagerMBean; 178 protected PresentationManagerMBean presentationManagerMBean; 179 protected SessionManagerMBean sessionManagerMBean; 180 protected DatabaseMBean databaseMBean; 181 protected TableMBean tableMBean; 182 protected ContextMBean contextMBean; 183 184 188 private boolean isMemoryPersistence = false; 189 190 193 public StandardApplication() {} 194 195 202 public int getState() { 203 return state; 204 } 205 206 212 public void setCookieForNewSession(boolean flag) { 213 sendCookieForNewSession = flag; 214 } 215 216 222 public Config getConfig() { 223 return config; 224 } 225 226 231 public void setName(String applName) { 232 appName = applName; 233 } 234 235 243 public String getName() { 244 return appName; 245 } 246 247 252 public void setLogChannel(LogChannel chan) { 253 logChannel = chan; 254 } 255 256 262 public LogChannel getLogChannel() { 263 return logChannel; 264 } 265 266 275 public synchronized void startup(Config appConfig) throws 276 ApplicationException { 277 if (state == RUNNING) { 278 return; } 280 printCopyrightHeader(); 281 284 Config sessionConfig, databaseConfig = null; 285 try { 286 if (appConfig.containsKey("Application")) { 287 defaultUrl = appConfig.getString("Application.DefaultUrl"); 288 } 289 sessionConfig = (Config) appConfig.getSection("SessionManager"); 290 } 293 catch (KeywordValueException except) { 294 throw new ApplicationException(except); 295 } 296 try { 298 databaseConfig = (Config) appConfig.getSection("DatabaseManager"); 299 if (databaseConfig != null && appName != null) { 300 databaseConfig.set("DatabaseManager.AppName", (Object ) appName); 301 } 302 } catch (KeywordValueException except) { 303 logChannel.write(Logger.DEBUG, 304 "Application configured without DatabaseManager."); 305 } 306 307 310 sessionManager = createSessionManager(sessionConfig); 311 312 315 boolean hasDatabaseConfig = databaseConfig != null; 316 317 if (hasDatabaseConfig) { 318 databaseManager = createDatabaseManager(databaseConfig); 319 } 320 321 324 config = appConfig; 325 326 329 registerApplicationMBean(); 330 registerSessionManagerMBean(); 331 registerPresentationManagerMBean(); 332 registerContextMBean(); 333 334 if (hasDatabaseConfig) { 335 registerDatabaseManagerMBean(); 336 registerTableMBeans(); 337 String [] dbNames = databaseManager.getLogicalDatabaseNames(); 338 for (int i=0;i<dbNames.length;i++){ 339 registerDatabaseMBean(dbNames[i]); 340 } 341 } 342 343 state = RUNNING; 344 } 345 346 public void printCopyrightHeader() { 347 351 } 352 353 365 public synchronized void restartup(Config appConfig) throws 366 ApplicationException { 367 throw new ApplicationException("no support for INCOMPLETE state"); 368 } 369 370 374 public synchronized void shutdown() { 375 if (state == STOPPED) { 376 return; } 378 379 try{ 381 unRegisterApplicationMBean(); 382 unRegisterSessionManagerMBean(); 383 unRegisterPresentationManagerMBean(); 384 unRegisterDatabaseManagerMBean(); 385 unRegisterContextMBean(); 386 387 if (databaseManager!=null) { 388 unRegisterTableMBeans(); 389 unRegisterDatabaseManagerMBean(); 390 String [] dbNames = databaseManager.getLogicalDatabaseNames(); 391 for (int i=0;i<dbNames.length;i++){ 392 unRegisterDatabaseMBean(dbNames[i]); 393 } 394 } 395 396 }catch (Exception e) { 397 logChannel.write(Logger.DEBUG, e.toString()); 398 } 399 400 if (sessionManager != null) { 401 sessionManager.shutdown(); 402 sessionManager = null; 403 } 404 if (databaseManager != null) { 405 databaseManager.shutdown(); 406 databaseManager = null; 407 } 408 409 state = STOPPED; 410 } 411 412 413 417 public synchronized void shutdownWithoutMBeanUnRegistration() { 418 if (state == STOPPED) { 419 return; } 421 422 if (sessionManager != null) { 423 sessionManager.shutdown(); 424 sessionManager = null; 425 } 426 if (databaseManager != null) { 427 databaseManager.shutdown(); 428 databaseManager = null; 429 } 430 431 state = STOPPED; 432 } 433 434 448 protected SessionManager createSessionManager(Config sessionMgrConfig) throws 449 ApplicationException { 450 if (sessionMgrConfig == null) { 451 sessionMgrConfig = new Config(); 452 } 453 try { 454 458 String sessionMgr; 459 if (sessionMgrConfig.containsKey("Class")) { 460 sessionMgr = sessionMgrConfig.getString("Class"); 461 } 462 else { 463 sessionMgr = 464 "com.lutris.appserver.server.sessionEnhydra.StandardSessionManager"; 465 } 466 Class sessionMgrClass = Class.forName(sessionMgr); 467 Class [] constructorParameterTypes = new Class [3]; 468 constructorParameterTypes[0] = Class.forName( 469 "com.lutris.appserver.server.Application"); 470 constructorParameterTypes[1] = Class.forName("com.lutris.util.Config"); 471 constructorParameterTypes[2] = Class.forName( 472 "com.lutris.logging.LogChannel"); 473 Constructor sessionMgrConstructor = sessionMgrClass.getConstructor( 474 constructorParameterTypes); 475 if (sessionMgrConfig.containsKey("MemoryPersistence")) { 476 String mp = sessionMgrConfig.getString("MemoryPersistence"); 477 if (mp.equals("true")) { 478 isMemoryPersistence = true; 479 } 480 } 481 SessionManager sm = null; 482 if (this.appName != null) { 483 sm = MemoryPersistence.getSessionManager(this.appName); 484 } 485 if (isMemoryPersistence && (sm != null)) { 486 return sm; 487 } 488 else { 489 Object [] parameters = new Object [3]; 491 parameters[0] = this; 492 parameters[1] = sessionMgrConfig; 493 parameters[2] = logChannel; 494 SessionManager sessionManager = (SessionManager) sessionMgrConstructor. 495 newInstance(parameters); 496 return sessionManager; 497 } 498 } 499 catch (Exception except) { 500 throw new ApplicationException(except); 501 } 502 } 503 504 516 protected DatabaseManager createDatabaseManager(Config databaseMgrConfig) throws 517 ApplicationException { 518 try { 519 String databaseMgr; 520 if (databaseMgrConfig.containsKey("Class")) { 521 databaseMgr = databaseMgrConfig.getString("Class"); 522 } 523 else { 524 databaseMgr = 525 STANDARD_DATABASE_MANAGER_CLASS_NAME; 526 } 527 Class standardDbManagerClass = Class.forName(databaseMgr); 528 Class [] ArgClassArray = new Class [] { 529 Config.class 530 }; 531 Object [] ArgObject = new Object [] { 532 databaseMgrConfig 533 }; 534 Constructor standardDbManager = standardDbManagerClass. 535 getDeclaredConstructor(ArgClassArray); 536 return (DatabaseManager) (standardDbManager.newInstance(ArgObject)); 537 } 538 catch (Exception except) { 539 throw new ApplicationException(except); 540 } 541 } 542 543 557 protected Session createSession(HttpPresentationComms comms) throws 558 ApplicationException { 559 try { 560 return sessionManager.createSession(comms); 561 } 562 catch (Exception exception) { 563 throw new ApplicationException(exception); 564 } 565 } 566 567 586 protected void ensureSession(HttpPresentationComms comms) throws 587 ApplicationException { 588 try { 589 if (presentationManager.isPresentationRequest(comms.request)) { 590 comms.session = StandardAppUtil.getRequestSession(comms); 592 } 593 if (comms.session != null && 594 sessionManager.sessionExists(comms.session.getSessionKey())) { 595 603 comms.sessionData = comms.session.getSessionData(); 604 } 605 else { 606 if (presentationManager.isPresentationRequest(comms.request)) { 607 initializeNewSession(comms); 608 } 609 } 610 } 611 catch (HttpPresentationException except) { 612 throw new ApplicationException(except); 613 } 614 catch (SessionException except) { 615 throw new ApplicationException(except); 616 } 617 } 618 619 629 public void requestPostProcessor(HttpPresentationComms comms) throws 630 ApplicationException { 631 try { 632 if (comms.session != null) { 633 comms.application.getSessionManager().passivateSession(Thread. 634 currentThread(), 635 comms.session.getSessionKey()); 636 } 637 } 638 catch (SessionException e) { 639 throw new ApplicationException(e); 640 } 641 } 642 643 664 protected void initializeNewSession(HttpPresentationComms comms) throws 665 ApplicationException { 666 comms.session = createSession(comms); 667 if (sendCookieForNewSession) { 668 StandardAppUtil.bindSessionToClient(comms); 669 } 670 comms.sessionData = comms.session.getSessionData(); 671 } 672 673 679 public String encodeUrl(String url, String sessionKey) throws 680 ApplicationException { 681 return StandardAppUtil.encodeUrl(url, sessionKey); 682 } 683 684 691 public String encodeUrl(String url, String sessionKey, String appName) throws 692 ApplicationException { 693 return StandardAppUtil.encodeUrl(url, sessionKey); 694 } 695 696 717 public boolean requestPreprocessor(HttpPresentationComms comms) throws 718 Exception { 719 722 if (defaultUrl != null) { 723 String ap = comms.request.getApplicationPath(); 724 if (!ap.endsWith("/")) { 725 ap += "/"; 726 } 727 String page = comms.request.getPresentationObjectPath(); 728 if (!page.endsWith("/")) { 729 page += "/"; 730 } 731 if (page.equals(ap)) { 732 String target = comms.request.getHttpServletRequest().getContextPath(); 734 if (target.equals("/")) { 735 target = ""; 736 } 737 target = ""; 738 if (defaultUrl.startsWith("/")) { 739 target += ap + defaultUrl.substring(1); 740 } 741 else { 742 target += ap + defaultUrl; 743 } 744 String query = comms.request.getQueryString(); 746 if (query != null) { 747 target += "?" + query; 748 } 749 750 753 if (StandardAppUtil.getRequestSession(comms) == null){ 754 initializeNewSession(comms); 755 } 756 757 761 try { 762 if (sessionManager instanceof StandardSessionManager){ 763 if (((StandardSessionManager)sessionManager).getEncodeFirstUrl()){ 764 comms.request.setRequestedSessionIdFromUrl(true); 765 } 766 } 767 } catch (Throwable trowable){} 768 769 throw new ClientPageRedirectException(target); 770 } 771 } 772 ensureSession(comms); 774 return false; } 776 777 784 public SessionManager getSessionManager() { 785 return sessionManager; 786 } 787 788 795 public DatabaseManager getDatabaseManager() { 796 return databaseManager; 797 } 798 799 805 public HttpPresentationManager getHttpPresentationManager() { 806 return presentationManager; 807 } 808 809 816 public void setHttpPresentationManager(HttpPresentationManager pm) { 817 presentationManager = pm; 818 } 819 820 852 public boolean servletRequestPreprocessor(Servlet servlet, 853 ServletContext context, 854 HttpServletRequest request, 855 HttpServletResponse response) throws 856 ServletException , 857 IOException { 858 return false; 859 } 860 861 864 public XMLCFactory getXMLCFactory() { 865 return xmlcFactory; 866 } 867 868 871 public void setXMLCFactory(boolean enableDeferredParsing) { 872 if (enableDeferredParsing) { 873 xmlcFactory = new XMLCDeferredParsingFactory(new DocumentLoaderImpl(), 874 (MultiClassLoader) presentationManager.getAppClassLoader(), 875 new EnhydraXMLCLogger(logChannel)); 876 } 877 else { 878 xmlcFactory = new XMLCStdFactory(presentationManager.getAppClassLoader(), 879 new EnhydraXMLCLogger(logChannel)); 880 } 881 } 882 883 888 public void setJivanFactory(boolean reload) { 889 this.jivanFactory = new JivanFactory(reload, this.logChannel); 890 } 891 892 895 public JivanFactory getJivanFactory() { 896 return this.jivanFactory; 897 } 898 899 900 903 private MBeanServer findMBeanServer() throws com.lutris.appserver.server. 904 session.SessionException { 905 MBeanServer mBeanServer; 906 try { 907 java.util.ArrayList server = MBeanServerFactory.findMBeanServer(null); 908 if (server == null) { 909 return null; 910 } 911 else { 912 mBeanServer = (MBeanServer ) server.get(0); 913 } 914 } 915 catch (Exception e) { 916 throw new com.lutris.appserver.server.session.SessionException(e); 917 } 918 return mBeanServer; 919 } 920 921 924 public String toHtml() { 925 return "No Application Info"; 926 } 927 928 936 937 private void registerApplicationMBean(){ 938 if (appName == null) { 939 return; 940 } 941 942
|