001/** 002 * 003 * Copyright (c) 2014, the Railo Company Ltd. All rights reserved. 004 * 005 * This library is free software; you can redistribute it and/or 006 * modify it under the terms of the GNU Lesser General Public 007 * License as published by the Free Software Foundation; either 008 * version 2.1 of the License, or (at your option) any later version. 009 * 010 * This library is distributed in the hope that it will be useful, 011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 013 * Lesser General Public License for more details. 014 * 015 * You should have received a copy of the GNU Lesser General Public 016 * License along with this library. If not, see <http://www.gnu.org/licenses/>. 017 * 018 **/ 019package lucee.runtime.listener; 020 021import java.nio.charset.Charset; 022import java.util.HashMap; 023import java.util.Locale; 024import java.util.Map; 025import java.util.TimeZone; 026 027import lucee.commons.io.res.Resource; 028import lucee.commons.lang.StringUtil; 029import lucee.runtime.Mapping; 030import lucee.runtime.PageContext; 031import lucee.runtime.config.ConfigImpl; 032import lucee.runtime.config.ConfigWeb; 033import lucee.runtime.db.DataSource; 034import lucee.runtime.exp.ApplicationException; 035import lucee.runtime.exp.DeprecatedException; 036import lucee.runtime.exp.PageException; 037import lucee.runtime.exp.PageRuntimeException; 038import lucee.runtime.net.s3.Properties; 039import lucee.runtime.net.s3.PropertiesImpl; 040import lucee.runtime.op.Duplicator; 041import lucee.runtime.orm.ORMConfiguration; 042import lucee.runtime.rest.RestSettings; 043import lucee.runtime.type.CustomType; 044import lucee.runtime.type.UDF; 045import lucee.runtime.type.dt.TimeSpan; 046import lucee.runtime.type.scope.FormImpl; 047import lucee.runtime.type.scope.Scope; 048import lucee.runtime.type.scope.URLImpl; 049import lucee.runtime.type.scope.UrlFormImpl; 050import lucee.runtime.type.util.ArrayUtil; 051 052/** 053 * 054 */ 055public class ClassicApplicationContext extends ApplicationContextSupport { 056 057 private static final long serialVersionUID = 940663152793150953L; 058 059 private String name; 060 private boolean setClientCookies; 061 private boolean setDomainCookies; 062 private boolean setSessionManagement; 063 private boolean setClientManagement; 064 private TimeSpan sessionTimeout=null; 065 private TimeSpan requestTimeout=null; 066 private TimeSpan clientTimeout; 067 private TimeSpan applicationTimeout=null; 068 private int loginStorage=-1; 069 private String clientstorage; 070 private String sessionstorage; 071 private int scriptProtect; 072 private boolean typeChecking; 073 private Mapping[] mappings; 074 private Mapping[] ctmappings; 075 private Mapping[] cmappings; 076 private boolean bufferOutput; 077 private boolean secureJson; 078 private String secureJsonPrefix="//"; 079 private boolean isDefault; 080 private Object defaultDataSource; 081 private boolean ormEnabled; 082 private Object ormdatasource; 083 private ORMConfiguration ormConfig; 084 private Properties s3; 085 086 087 private int localMode; 088 private Locale locale; 089 private TimeZone timeZone; 090 private Charset webCharset; 091 private Charset resourceCharset; 092 private short sessionType; 093 private boolean sessionCluster; 094 private boolean clientCluster; 095 private Resource source; 096 private boolean triggerComponentDataMember; 097 private Map<Integer,String> defaultCaches=new HashMap<Integer, String>(); 098 private Map<Integer,Boolean> sameFieldAsArrays=new HashMap<Integer, Boolean>(); 099 private RestSettings restSettings; 100 private Resource[] restCFCLocations; 101 private JavaSettingsImpl javaSettings; 102 private DataSource[] dataSources; 103 private UDF onMissingTemplate; 104 105 private short scopeCascading; 106 private boolean allowCompression; 107 private boolean suppressRemoteComponentContent; 108 109 private short wstype; 110 111 private boolean cgiScopeReadonly; 112 113 /** 114 * constructor of the class 115 * @param config 116 */ 117 public ClassicApplicationContext(ConfigWeb config,String name,boolean isDefault, Resource source) { 118 super(config); 119 this.name=name; 120 setClientCookies=config.isClientCookies(); 121 cgiScopeReadonly = ((ConfigImpl)config).getCGIScopeReadonly(); 122 setDomainCookies=config.isDomainCookies(); 123 setSessionManagement=config.isSessionManagement(); 124 setClientManagement=config.isClientManagement(); 125 sessionTimeout=config.getSessionTimeout(); 126 requestTimeout=config.getRequestTimeout(); 127 clientTimeout=config.getClientTimeout(); 128 applicationTimeout=config.getApplicationTimeout(); 129 loginStorage=Scope.SCOPE_COOKIE; 130 scriptProtect=config.getScriptProtect(); 131 typeChecking=((ConfigImpl)config).getTypeChecking(); 132 allowCompression=((ConfigImpl)config).allowCompression(); 133 this.isDefault=isDefault; 134 this.defaultDataSource=config.getDefaultDataSource(); 135 this.localMode=config.getLocalMode(); 136 this.locale=config.getLocale(); 137 this.timeZone=config.getTimeZone(); 138 this.scopeCascading=config.getScopeCascadingType(); 139 140 this.webCharset=((ConfigImpl)config)._getWebCharset(); 141 this.resourceCharset=((ConfigImpl)config)._getResourceCharset(); 142 this.bufferOutput=((ConfigImpl)config).getBufferOutput(); 143 suppressRemoteComponentContent=((ConfigImpl)config).isSuppressContent(); 144 this.sessionType=config.getSessionType(); 145 this.sessionCluster=config.getSessionCluster(); 146 this.clientCluster=config.getClientCluster(); 147 this.clientstorage=((ConfigImpl)config).getClientStorage(); 148 this.sessionstorage=((ConfigImpl)config).getSessionStorage(); 149 150 this.source=source; 151 this.triggerComponentDataMember=config.getTriggerComponentDataMember(); 152 this.restSettings=config.getRestSetting(); 153 this.javaSettings=new JavaSettingsImpl(); 154 this.wstype=WS_TYPE_AXIS1; 155 } 156 157 /** 158 * Constructor of the class, only used by duplicate method 159 */ 160 private ClassicApplicationContext(ConfigWeb config) { 161 super(config); 162 } 163 164 165 public ApplicationContext duplicate() { 166 ClassicApplicationContext dbl = new ClassicApplicationContext(config); 167 dbl._duplicate(this); 168 169 dbl.name=name; 170 dbl.setClientCookies=setClientCookies; 171 dbl.cgiScopeReadonly=cgiScopeReadonly; 172 dbl.setDomainCookies=setDomainCookies; 173 dbl.setSessionManagement=setSessionManagement; 174 dbl.setClientManagement=setClientManagement; 175 dbl.sessionTimeout=sessionTimeout; 176 dbl.requestTimeout=requestTimeout; 177 dbl.clientTimeout=clientTimeout; 178 dbl.applicationTimeout=applicationTimeout; 179 dbl.loginStorage=loginStorage; 180 dbl.clientstorage=clientstorage; 181 dbl.sessionstorage=sessionstorage; 182 dbl.scriptProtect=scriptProtect; 183 dbl.typeChecking=typeChecking; 184 dbl.mappings=mappings; 185 dbl.dataSources=dataSources; 186 dbl.ctmappings=ctmappings; 187 dbl.cmappings=cmappings; 188 dbl.bufferOutput=bufferOutput; 189 dbl.allowCompression=allowCompression; 190 dbl.suppressRemoteComponentContent=suppressRemoteComponentContent; 191 dbl.wstype=wstype; 192 dbl.secureJson=secureJson; 193 dbl.secureJsonPrefix=secureJsonPrefix; 194 dbl.isDefault=isDefault; 195 dbl.defaultDataSource=defaultDataSource; 196 dbl.applicationtoken=applicationtoken; 197 dbl.cookiedomain=cookiedomain; 198 dbl.idletimeout=idletimeout; 199 dbl.localMode=localMode; 200 dbl.locale=locale; 201 dbl.timeZone=timeZone; 202 dbl.scopeCascading=scopeCascading; 203 dbl.webCharset=webCharset; 204 dbl.resourceCharset=resourceCharset; 205 dbl.sessionType=sessionType; 206 dbl.triggerComponentDataMember=triggerComponentDataMember; 207 dbl.restSettings=restSettings; 208 dbl.defaultCaches=Duplicator.duplicateMap(defaultCaches, new HashMap<Integer, String>(),false ); 209 dbl.sameFieldAsArrays=Duplicator.duplicateMap(sameFieldAsArrays, new HashMap<Integer, Boolean>(),false ); 210 211 dbl.ormEnabled=ormEnabled; 212 dbl.ormConfig=ormConfig; 213 dbl.ormdatasource=ormdatasource; 214 dbl.sessionCluster=sessionCluster; 215 dbl.clientCluster=clientCluster; 216 dbl.source=source; 217 218 return dbl; 219 } 220 221 @Override 222 public TimeSpan getApplicationTimeout() { 223 return applicationTimeout; 224 } 225 /** 226 * @param applicationTimeout The applicationTimeout to set. 227 */ 228 public void setApplicationTimeout(TimeSpan applicationTimeout) { 229 this.applicationTimeout = applicationTimeout; 230 } 231 @Override 232 public int getLoginStorage() { 233 return loginStorage; 234 } 235 /** 236 * @param loginStorage The loginStorage to set. 237 */ 238 public void setLoginStorage(int loginStorage) { 239 this.loginStorage = loginStorage; 240 } 241 242 public void setLoginStorage(String strLoginStorage) throws ApplicationException { 243 setLoginStorage(AppListenerUtil.translateLoginStorage(strLoginStorage)); 244 } 245 246 247 248 @Override 249 public String getName() { 250 return name; 251 } 252 /** 253 * @param name The name to set. 254 */ 255 public void setName(String name) { 256 this.name = name; 257 } 258 @Override 259 public TimeSpan getSessionTimeout() { 260 return sessionTimeout; 261 } 262 263 /** 264 * @param sessionTimeout The sessionTimeout to set. 265 */ 266 public void setSessionTimeout(TimeSpan sessionTimeout) { 267 this.sessionTimeout = sessionTimeout; 268 } 269 270 271 public TimeSpan getClientTimeout() { 272 return clientTimeout; 273 } 274 275 /** 276 * @param sessionTimeout The sessionTimeout to set. 277 */ 278 public void setClientTimeout(TimeSpan clientTimeout) { 279 this.clientTimeout = clientTimeout; 280 } 281 282 @Override 283 public boolean isSetClientCookies() { 284 return setClientCookies; 285 } 286 /** 287 * @param setClientCookies The setClientCookies to set. 288 */ 289 public void setSetClientCookies(boolean setClientCookies) { 290 this.setClientCookies = setClientCookies; 291 } 292 @Override 293 public boolean isSetClientManagement() { 294 return setClientManagement; 295 } 296 /** 297 * @param setClientManagement The setClientManagement to set. 298 */ 299 public void setSetClientManagement(boolean setClientManagement) { 300 this.setClientManagement = setClientManagement; 301 } 302 @Override 303 public boolean isSetDomainCookies() { 304 return setDomainCookies; 305 } 306 /** 307 * @param setDomainCookies The setDomainCookies to set. 308 */ 309 public void setSetDomainCookies(boolean setDomainCookies) { 310 this.setDomainCookies = setDomainCookies; 311 } 312 @Override 313 public boolean isSetSessionManagement() { 314 return setSessionManagement; 315 } 316 /** 317 * @param setSessionManagement The setSessionManagement to set. 318 */ 319 public void setSetSessionManagement(boolean setSessionManagement) { 320 this.setSessionManagement = setSessionManagement; 321 } 322 @Override 323 public String getClientstorage() { 324 return clientstorage; 325 } 326 public String getSessionstorage() { 327 return sessionstorage; 328 } 329 /** 330 * @param clientstorage The clientstorage to set. 331 */ 332 public void setClientstorage(String clientstorage) { 333 if(StringUtil.isEmpty(clientstorage,true)) return; 334 this.clientstorage = clientstorage; 335 } 336 public void setSessionstorage(String sessionstorage) { 337 if(StringUtil.isEmpty(sessionstorage,true)) return; 338 this.sessionstorage = sessionstorage; 339 } 340 341 @Override 342 public boolean hasName() { 343 return name!=null; 344 } 345 346 /** 347 * @param scriptProtect The scriptProtect to set. 348 */ 349 public void setScriptProtect(int scriptProtect) { 350 this.scriptProtect=scriptProtect; 351 } 352 353 @Override 354 public int getScriptProtect() { 355 //if(isDefault)print.err("get:"+scriptProtect); 356 return scriptProtect; 357 } 358 359 /** 360 * @param scriptProtect The scriptProtect to set. 361 */ 362 public void setTypeChecking(boolean typeChecking) { 363 this.typeChecking=typeChecking; 364 } 365 366 @Override 367 public boolean getTypeChecking() { 368 return typeChecking; 369 } 370 371 372 373 374 public void setMappings(Mapping[] mappings) { 375 if(mappings.length>0)this.mappings=mappings; 376 } 377 378 /** 379 * @return the mappings 380 */ 381 public Mapping[] getMappings() { 382 return mappings; 383 } 384 385 public void setCustomTagMappings(Mapping[] ctmappings) { 386 this.ctmappings=ctmappings; 387 } 388 389 public Mapping[] getCustomTagMappings() { 390 return ctmappings; 391 } 392 393 public void setComponentMappings(Mapping[] cmappings) { 394 this.cmappings=cmappings; 395 } 396 397 public Mapping[] getComponentMappings() { 398 return cmappings; 399 } 400 401 public void setSecureJson(boolean secureJson) { 402 this.secureJson=secureJson; 403 } 404 405 /** 406 * @return the secureJson 407 */ 408 public boolean getSecureJson() { 409 return secureJson; 410 } 411 412 public boolean getBufferOutput(){ 413 return bufferOutput; 414 } 415 416 public void setBufferOutput(boolean bufferOutput){ 417 this.bufferOutput= bufferOutput; 418 } 419 420 public void setSecureJsonPrefix(String secureJsonPrefix) { 421 this.secureJsonPrefix=secureJsonPrefix; 422 } 423 424 /** 425 * @return the secureJsonPrefix 426 */ 427 public String getSecureJsonPrefix() { 428 return secureJsonPrefix; 429 } 430 431 @Override 432 public String getDefaultDataSource() { 433 throw new PageRuntimeException(new DeprecatedException("this method is no longer supported!")); 434 } 435 436 @Override 437 public Object getDefDataSource() { 438 return defaultDataSource; 439 } 440 441 @Override 442 public void setDefaultDataSource(String defaultDataSource) { 443 this.defaultDataSource = defaultDataSource; 444 } 445 446 @Override 447 public void setDefDataSource(Object defaultDataSource) { 448 this.defaultDataSource = defaultDataSource; 449 } 450 451 public boolean isORMEnabled() { 452 return ormEnabled; 453 } 454 455 public String getORMDatasource() { 456 throw new PageRuntimeException(new DeprecatedException("this method is no longer supported!")); 457 } 458 459 public Object getORMDataSource() { 460 return ormdatasource; 461 } 462 463 public ORMConfiguration getORMConfiguration() { 464 return ormConfig; 465 } 466 public void setORMConfiguration(ORMConfiguration config) { 467 this.ormConfig= config; 468 } 469 470 public void setORMEnabled(boolean ormEnabled) { 471 this.ormEnabled=ormEnabled; 472 } 473 474 /** 475 * @return the s3 476 */ 477 public Properties getS3() { 478 if(s3==null) s3=new PropertiesImpl(); 479 return s3; 480 } 481 482 @Override 483 public int getLocalMode() { 484 return localMode; 485 } 486 487 @Override 488 public Locale getLocale() { 489 return locale; 490 } 491 492 @Override 493 public TimeZone getTimeZone() { 494 return timeZone; 495 } 496 497 @Override 498 public Charset getWebCharset() { 499 return webCharset; 500 } 501 502 @Override 503 public Charset getResourceCharset() { 504 return resourceCharset; 505 } 506 507 /** 508 * @param localMode the localMode to set 509 */ 510 public void setLocalMode(int localMode) { 511 this.localMode = localMode; 512 } 513 514 @Override 515 public void setLocale(Locale locale) { 516 this.locale = locale; 517 } 518 519 @Override 520 public void setTimeZone(TimeZone timeZone) { 521 this.timeZone = timeZone; 522 } 523 524 @Override 525 public void setWebCharset(Charset webCharset) { 526 this.webCharset= webCharset; 527 } 528 529 @Override 530 public void setResourceCharset(Charset resourceCharset) { 531 this.resourceCharset = resourceCharset; 532 } 533 534 535 536 /** 537 * @return the sessionType 538 */ 539 public short getSessionType() { 540 return sessionType; 541 } 542 543 /** 544 * @return the sessionType 545 */ 546 public void setSessionType(short sessionType) { 547 this.sessionType= sessionType; 548 } 549 550 551 /** 552 * @return the sessionCluster 553 */ 554 public boolean getSessionCluster() { 555 return sessionCluster; 556 } 557 558 559 /** 560 * @param sessionCluster the sessionCluster to set 561 */ 562 public void setSessionCluster(boolean sessionCluster) { 563 this.sessionCluster = sessionCluster; 564 } 565 566 567 /** 568 * @return the clientCluster 569 */ 570 public boolean getClientCluster() { 571 return clientCluster; 572 } 573 574 575 /** 576 * @param clientCluster the clientCluster to set 577 */ 578 public void setClientCluster(boolean clientCluster) { 579 this.clientCluster = clientCluster; 580 } 581 582 583 public void setS3(Properties s3) { 584 this.s3=s3; 585 } 586 587 @Override 588 public void setORMDatasource(String ormdatasource) { 589 this.ormdatasource=ormdatasource; 590 } 591 592 @Override 593 public void setORMDataSource(Object ormdatasource) { 594 this.ormdatasource=ormdatasource; 595 } 596 597 @Override 598 public void reinitORM(PageContext pc) throws PageException { 599 // do nothing 600 } 601 602 @Override 603 public Resource getSource() { 604 return source; 605 } 606 607 @Override 608 public boolean getTriggerComponentDataMember() { 609 return triggerComponentDataMember; 610 } 611 612 @Override 613 public void setTriggerComponentDataMember(boolean triggerComponentDataMember) { 614 this.triggerComponentDataMember=triggerComponentDataMember; 615 } 616 617 @Override 618 public void setDefaultCacheName(int type,String name) { 619 if(StringUtil.isEmpty(name,true)) return; 620 defaultCaches.put(type, name.trim()); 621 } 622 623 @Override 624 public String getDefaultCacheName(int type) { 625 return defaultCaches.get(type); 626 } 627 628 public void setSameFieldAsArray(PageContext pc,int scope, boolean sameFieldAsArray) { 629 630 sameFieldAsArrays.put(scope, sameFieldAsArray); 631 632 if(Scope.SCOPE_URL==scope)reinitScope(pc.urlScope(),this); 633 else reinitScope(pc.formScope(),this); 634 } 635 636 637 public static void reinitScope(Scope scope,ApplicationContext ac) { 638 if(scope instanceof URLImpl ) ((URLImpl)scope).reinitialize(ac); 639 else if(scope instanceof FormImpl ) ((FormImpl)scope).reinitialize(ac); 640 if(scope instanceof UrlFormImpl ) ((UrlFormImpl)scope).reinitialize(ac); 641 } 642 643 @Override 644 public boolean getSameFieldAsArray(int scope) { 645 Boolean b= sameFieldAsArrays.get(scope); 646 if(b==null) return false; 647 return b.booleanValue(); 648 } 649 650 @Override 651 public RestSettings getRestSettings() { 652 return restSettings; 653 } 654 655 public void setRestSettings(RestSettings restSettings) { 656 this.restSettings=restSettings; 657 } 658 659 660 public void setRestCFCLocations(Resource[] restCFCLocations) { 661 this.restCFCLocations = restCFCLocations; 662 } 663 664 @Override 665 public Resource[] getRestCFCLocations() { 666 return restCFCLocations; 667 } 668 669 @Override 670 public JavaSettings getJavaSettings() { 671 return javaSettings; 672 } 673 674 @Override 675 public DataSource[] getDataSources() { 676 return dataSources; 677 } 678 679 @Override 680 public void setDataSources(DataSource[] dataSources) { 681 if(!ArrayUtil.isEmpty(dataSources))this.dataSources=dataSources; 682 } 683 684 public void setOnMissingTemplate(UDF onMissingTemplate) { 685 this.onMissingTemplate=onMissingTemplate; 686 } 687 688 public UDF getOnMissingTemplate() { 689 return onMissingTemplate; 690 } 691 692 @Override 693 public short getScopeCascading() { 694 return scopeCascading; 695 } 696 697 @Override 698 public void setScopeCascading(short scopeCascading) { 699 this.scopeCascading=scopeCascading; 700 } 701 702 @Override 703 public boolean getAllowCompression() { 704 return allowCompression; 705 } 706 707 @Override 708 public void setAllowCompression(boolean allowCompression) { 709 this.allowCompression=allowCompression; 710 } 711 712 @Override 713 public TimeSpan getRequestTimeout() { 714 return requestTimeout; 715 } 716 717 @Override 718 public void setRequestTimeout(TimeSpan requestTimeout) { 719 this.requestTimeout=requestTimeout; 720 } 721 722 @Override 723 public CustomType getCustomType(String strType) { 724 // not supported 725 return null; 726 } 727 728 @Override 729 public boolean getSuppressContent() { 730 return suppressRemoteComponentContent; 731 } 732 733 @Override 734 public void setSuppressContent(boolean suppressContent) { 735 this.suppressRemoteComponentContent=suppressContent; 736 } 737 738 @Override 739 public short getWSType() { 740 return wstype; 741 } 742 743 @Override 744 public void setWSType(short wstype) { 745 this.wstype=wstype; 746 } 747 748 @Override 749 public boolean getCGIScopeReadonly() { 750 return cgiScopeReadonly; 751 } 752 753 @Override 754 public void setCGIScopeReadonly(boolean cgiScopeReadonly) { 755 this.cgiScopeReadonly=cgiScopeReadonly; 756 } 757}