1 23 24 package com.sun.enterprise.config.impl; 25 26 import java.io.File ; 27 import java.io.FileOutputStream ; 28 import java.io.FileWriter ; 29 import java.io.FileInputStream ; 30 import java.io.FileReader ; 31 import java.io.ObjectInputStream ; 32 import java.io.ObjectOutputStream ; 33 34 import java.util.ArrayList ; 35 import java.io.Serializable ; 36 import java.util.Set ; 37 import java.util.Iterator ; 38 import java.util.Enumeration ; 39 import java.util.Vector ; 40 41 import com.sun.enterprise.config.ConfigContext; 42 import com.sun.enterprise.config.ConfigAdd; 43 import com.sun.enterprise.config.ConfigChange; 44 import com.sun.enterprise.config.ConfigChangeFactory; 45 import com.sun.enterprise.config.ConfigDelete; 46 import com.sun.enterprise.config.ConfigSet; 47 import com.sun.enterprise.config.ConfigUpdate; 48 import com.sun.enterprise.config.ConfigBean; 49 import com.sun.enterprise.config.ConfigException; 50 import com.sun.enterprise.config.ConfigRuntimeException; 51 import com.sun.enterprise.config.StaleWriteConfigException; 52 53 import com.sun.enterprise.config.pluggable.ConfigBeanInterceptor; 54 import com.sun.enterprise.config.pluggable.ConfigEnvironment; 55 import com.sun.enterprise.config.pluggable.EnvironmentFactory; 56 import com.sun.enterprise.config.ConfigContextEventListener; 57 import com.sun.enterprise.config.ConfigContextEvent; 58 import com.sun.enterprise.config.ConfigBeansFactory; 59 import org.xml.sax.helpers.DefaultHandler ; 60 61 import java.io.InputStream ; 62 63 import org.netbeans.modules.schema2beans.BaseBean; 64 65 import java.util.logging.Logger ; 66 import java.util.logging.Level ; 67 69 98 public class ConfigContextImpl implements 99 ConfigContext, 100 DefaultConstants, 101 Serializable , 102 Cloneable { 103 104 transient protected Vector listeners = null; 106 107 private ConfigBean server; 108 protected String xmlUrl; 109 110 transient private long lastModified = UNINITIALIZED_LAST_MODIFIED; 112 113 private boolean readOnly = false; private boolean autoCommit = false; private Class rootClass; 117 private boolean isAdministered = false; private DefaultHandler defaultHandler = null; 119 private boolean resolvePath = true; 120 121 private transient ConfigBeanInterceptor configBeanInterceptor = 122 EnvironmentFactory.getEnvironmentFactory(). 123 getConfigEnvironment().getConfigBeanInterceptor(); 124 125 130 transient private boolean _lastModifiedCheck = false; 131 132 transient private ArrayList configChangeList = new ArrayList (); 133 134 public ArrayList getConfigChangeList() { 135 return configChangeList; 136 } 137 138 public boolean isAdministered() { 139 return isAdministered; 140 } 141 142 public void setIsAdministered(boolean value) { 143 isAdministered = value; 144 } 145 146 public synchronized void resetConfigChangeList() { 148 configChangeList = new ArrayList (); 149 clearPersistentConfigChanges(); 150 151 isAdministered = true; 153 } 154 155 public synchronized ConfigChange addToConfigChangeList(String xpath, String attrName, String oldValue, String newValue) { 156 if(!isAdministered) return null; 158 159 ConfigChange cChange = null; 160 161 try { 162 if(oldValue == null && newValue == null) return null; 163 if(oldValue != null && oldValue.equals(newValue)) return null; 164 165 boolean found = false; 166 for(int i=0;i<configChangeList.size();i++) { 167 if(((ConfigChange)configChangeList.get(i)).getConfigChangeType().equals(ConfigChange.TYPE_UPDATE) 168 && ((ConfigUpdate)configChangeList.get(i)).getXPath().equals(xpath)) { 169 ((ConfigUpdate)configChangeList.get(i)).addChangedAttribute(attrName, oldValue, newValue); 170 persistConfigChanges(); 172 found = true; 173 break; 174 } 175 } 176 if(!found) { 177 cChange = ConfigChangeFactory.createConfigUpdate 178 (xpath, 179 attrName, 180 oldValue, 181 newValue); 182 configChangeList.add(cChange); 183 persistConfigChanges(); 184 } 186 } catch (Throwable t) { 187 } 189 return cChange; 190 } 191 192 199 public ConfigContextImpl(String xmlUrl, boolean readOnly, boolean autoCommit, Class rootClass, DefaultHandler dh) { 201 this.xmlUrl = xmlUrl; 202 this.readOnly = readOnly; 203 208 this.autoCommit = autoCommit; 209 this.rootClass = rootClass; 210 this.defaultHandler = dh; 211 } 212 213 222 public ConfigContextImpl(String xmlUrl, boolean readOnly, boolean autoCommit, 223 Class rootClass, DefaultHandler dh, boolean resolvePath) { 225 this.xmlUrl = xmlUrl; 226 this.readOnly = readOnly; 227 232 this.autoCommit = autoCommit; 233 this.rootClass = rootClass; 234 this.defaultHandler = dh; 235 this.resolvePath = resolvePath; 236 } 237 238 public ConfigContextImpl(ConfigEnvironment ce) { 239 try { 240 this.xmlUrl = ce.getUrl(); 241 this.readOnly = ce.isReadOnly(); 242 247 this.autoCommit = ce.isAutoCommitOn(); 248 this.rootClass = Class.forName(ce.getRootClass()); 249 this.defaultHandler = 250 (DefaultHandler ) Class.forName(ce.getHandler()).newInstance(); 251 this.configBeanInterceptor = ce.getConfigBeanInterceptor(); 252 } catch (Exception e) { 253 throw new ConfigRuntimeException("err_creating_ctx", e); 254 } 255 256 } 257 public synchronized ConfigBean getRootConfigBean() throws ConfigException { 258 if(server == null) { 259 refresh(); 260 } 261 return server; 262 } 263 264 267 String getXmlUrl() { 268 return this.xmlUrl; 269 } 270 271 285 public ConfigBean exactLookup(String xpath) throws ConfigException 286 { 287 if(server == null) { 288 refresh(); 289 } 290 return ConfigBeansFactory.getConfigBeanByXPath(this,xpath); 291 } 292 293 296 public ConfigBean[] lookup(String xpath) throws ConfigException 297 { 298 return null; 300 } 301 302 private void assertReadOnly() throws ConfigException { 303 if(readOnly) { 304 throw new ConfigException("Read only: you cannot write " + toString() ); 305 } 306 } 307 308 315 public synchronized void flush(boolean overwrite) throws ConfigException { 316 if(!overwrite && isFileChangedExternally()) { 317 throw new StaleWriteConfigException 318 ("ConfigContext Flush failed: File Changed Externally"); 319 } 320 321 ConfigContextEvent ccce = new ConfigContextEvent(this,ConfigContextEvent.PRE_FLUSH_CHANGE); 324 preChange(ccce); 325 327 try { 328 FileOutputStream fos = new FileOutputStream (this.xmlUrl); 329 server.write(fos); 330 } catch(Exception e) { 331 throw new ConfigException("Error Flushing ConfigContext " + toString()); 332 } 333 initLastModified(); 334 ccce = new ConfigContextEvent(this,ConfigContextEvent.POST_FLUSH_CHANGE); 337 postChange(ccce); 338 340 } 342 343 346 public void flush() throws ConfigException { 347 flush(true); 348 } 349 350 351 354 public synchronized void refresh(boolean force) throws ConfigException { 355 try { 356 if(!force && isChanged()) { 357 throw new ConfigException 358 ("ConfigContext has changed in Memory. cannot refresh " + toString()); 359 } 360 361 FileInputStream in = new FileInputStream (this.xmlUrl); 362 if(this.defaultHandler != null) { 363 server = (ConfigBean) BaseBean.createGraph( 364 rootClass, 365 in, 366 true, 367 this.defaultHandler, 368 this.defaultHandler); 369 } else { 370 server = (ConfigBean) BaseBean.createGraph(rootClass, in, true); 371 } 372 373 initConfigChanges(); 375 initLastModified(); 376 377 if(INITIALIZE_XPATH) { 379 if(!this.readOnly) { 380 setXPathInAllBeans(); 381 } 382 } 383 setIsAdministered(true); 384 server.setInterceptor(this.configBeanInterceptor); 385 } catch (Exception e) { 386 throw new ConfigException("Error refreshing ConfigContext:" + this.xmlUrl, e); 387 } 388 } 389 390 393 public void setXPathInAllBeans() throws ConfigException { 394 if(this.readOnly) return; 395 396 ConfigBean cb = this.getRootConfigBean(); 397 setXPathInTree(cb,""); 400 } 402 403 406 private void setXPathInTree(ConfigBean cb, String parentXpath) { 407 cb.setConfigContext(this); 408 String xp = cb.getAbsoluteXPath(parentXpath); 409 cb.setXPath(xp); 411 412 ConfigBean[] chChildArr = cb.getAllChildBeans(); 414 if(chChildArr == null || chChildArr.length <= 0) return; 415 for(int i = 0; i<chChildArr.length; i++) { 416 if(chChildArr[i] == null) continue; 417 try { 419 setXPathInTree(chChildArr[i], cb.getXPath()); 420 } catch(Throwable t) { 421 } 427 428 } 429 } 430 431 435 public void cleanup() { 436 if(server != null) 439 cleanup(server); 440 server = null; 442 } 443 444 private void cleanup(ConfigBean cb) { 445 cb.cleanup(); 446 448 ConfigBean[] chChildArr = cb.getAllChildBeans(); 450 if(chChildArr == null || chChildArr.length <= 0) return; 451 for(int i = 0; i<chChildArr.length; i++) { 452 if(chChildArr[i] == null) continue; 453 try { 455 cleanup(chChildArr[i]); 456 } catch(Throwable t) { 457 } 462 } 463 } 464 465 467 public void refresh() throws ConfigException { 468 refresh(true); 469 } 470 471 public Object clone() { 472 ConfigContextImpl ctxClone = 473 new ConfigContextImpl(this.xmlUrl, false, false, this.rootClass, this.defaultHandler); 474 ctxClone.configBeanInterceptor = getConfigBeanInterceptor(); 475 479 if (server != null) { 480 ConfigBean rootClone = (ConfigBean)this.server.clone(); 481 ctxClone.setRootConfigBean(rootClone); 482 rootClone.setConfigContext(ctxClone); 483 rootClone.setInterceptor(ctxClone.configBeanInterceptor); 484 try { 485 ((ConfigContextImpl)ctxClone).setXPathInAllBeans(); 486 } catch (Exception e) { 487 } 489 } 490 ctxClone.setIsAdministered(true); 491 492 return ctxClone; 493 } 494 495 void setRootConfigBean(ConfigBean c) { 496 this.server = c; 497 } 498 499 502 public synchronized ConfigChange addToConfigChangeList( 503 String parentXpath, 504 String childXpath, 505 String name, 506 ConfigBean cb) { 507 if(!isAdministered) return null; 509 510 ConfigChange cChange = ConfigChangeFactory.createConfigAdd 511 (parentXpath, childXpath, name, cb); 512 513 configChangeList.add(cChange); 514 persistConfigChanges(); 515 return cChange; 516 } 517 518 public synchronized ConfigChange addToConfigChangeList(String xpath) { 519 if(!isAdministered) return null; 520 521 ConfigChange cChange = null; 522 if(!removeOtherConfigChanges(xpath)) { 523 cChange = ConfigChangeFactory.createConfigDelete(xpath); 524 configChangeList.add(cChange); 525 } 526 527 persistConfigChanges(); 528 return cChange; 529 } 530 531 535 private boolean removeOtherConfigChanges(String xpath) { 536 boolean ret = false; 537 try { 538 final Iterator it = configChangeList.iterator(); 540 while (it.hasNext()) { 541 final ConfigChange cc = (ConfigChange)it.next(); 542 if(xpath.indexOf(cc.getXPath()) >= 0) { 543 if(cc instanceof ConfigAdd) 544 ret = true; 545 it.remove(); 546 } 547 } 548 } catch (Throwable t) { 550 } 552 return ret; 553 } 554 555 public synchronized ConfigChange addToConfigChangeList(String parentXpath, String name, Object cb, Object [] cbArray) { 556 if(!isAdministered) return null; 557 558 ConfigChange cChange = ConfigChangeFactory.createConfigSet( 559 parentXpath, 560 name, 561 cb, 562 cbArray); 563 configChangeList.add(cChange); 564 persistConfigChanges(); 565 return cChange; 566 } 567 568 public synchronized void removeConfigChange(ConfigChange change) { 569 if (!isAdministered) return; 570 571 int ndx = configChangeList.indexOf(change); 572 if (ndx != -1) { 573 configChangeList.remove(ndx); 574 } 575 persistConfigChanges(); 576 } 577 578 public synchronized void updateFromConfigChange(ConfigChange configChange) throws ConfigException { 579 if(configChange == null) return; 580 581 boolean tmpAdministered = isAdministered; 584 isAdministered = false; 585 586 if(configChange.getConfigChangeType().equals(ConfigChange.TYPE_ADD)) 587 updateFromConfigAdd((ConfigAdd)configChange); 588 else if(configChange.getConfigChangeType().equals(ConfigChange.TYPE_UPDATE)) 589 updateFromConfigUpdate((ConfigUpdate)configChange); 590 else if(configChange.getConfigChangeType().equals(ConfigChange.TYPE_DELETE)) 591 updateFromConfigDelete((ConfigDelete)configChange); 592 else if(configChange.getConfigChangeType().equals(ConfigChange.TYPE_SET)) 593 updateFromConfigSet((ConfigSet)configChange); 594 595 isAdministered = tmpAdministered; 597 } 598 599 private void updateFromConfigAdd(ConfigAdd configChange) throws ConfigException { 600 ConfigBean parent = ConfigBeansFactory.getConfigBeanByXPath(this,configChange.getParentXPath()); 601 if(parent == null) 602 throw new ConfigException("updateFromConfigAdd: Cannot find parent"); 603 604 ConfigBean rootBean = configChange.getConfigBean(); 605 if(rootBean == null) 606 throw new ConfigException("updateFromConfigAdd: Cannot find root bean"); 607 608 ConfigBean childBean = ConfigBeansFactory.getConfigBeanByXPath(rootBean, configChange.getXPath()); 609 610 if(childBean == null) 611 throw new ConfigException("updateFromConfigAdd: Cannot find childBean"); 612 613 if(isLastModifiedCheckEnabled()) { 615 validateLastModified(parent, configChange); 616 } 617 618 childBean = (ConfigBean)childBean.clone(); 619 626 parent.addValue(configChange.getName(), childBean); 627 } 632 633 private void updateFromConfigSet(ConfigSet configChange) throws ConfigException { 634 ConfigBean parent = ConfigBeansFactory.getConfigBeanByXPath(this,configChange.getParentXPath()); 635 636 if(parent == null) 637 throw new ConfigException("updateFromConfigSet: Cannot update. Could not get parent"); 638 Object child = configChange.getConfigBean(); 639 640 if(isLastModifiedCheckEnabled()) { 642 validateLastModified(parent, configChange); 643 } 644 645 if(child != null) { 646 parent.setValue(configChange.getName(), child); 647 } else { Object [] childArray = configChange.getConfigBeanArray(); 649 parent.setValue(configChange.getName(), childArray); 650 } 651 } 652 653 private void updateFromConfigUpdate(ConfigUpdate configChange) throws ConfigException { 654 ConfigBean b = ConfigBeansFactory.getConfigBeanByXPath(this,configChange.getXPath()); 660 if(b == null) 662 throw new ConfigException("updateFromConfigUpdate:Could not find ConfigBean to update"); 663 664 if(isLastModifiedCheckEnabled()) { 666 validateLastModified(b, configChange); 667 } 668 669 Set s = configChange.getAttributeSet(); 670 for (Iterator i = s.iterator();i.hasNext();) { 671 String name = (String ) i.next(); 672 b.setAttributeValue(name, configChange.getNewValue(name)); 673 } 674 } 675 676 private void updateFromConfigDelete(ConfigDelete configChange) throws ConfigException { 677 String xpath = configChange.getXPath(); 679 ConfigBean child = ConfigBeansFactory.getConfigBeanByXPath(this,xpath); 680 if(child != null) { 681 ConfigBean parent = (ConfigBean) child.parent(); 683 684 if(isLastModifiedCheckEnabled()) { 686 validateLastModified(parent, configChange); 687 } 688 689 parent.removeChild(child); 690 } 691 } 692 693 698 public String toString() { 699 return "com.sun.enterprise.config.ConfigContext: Url=" + this.xmlUrl 700 + ", ReadOnly=" + this.readOnly 701 + ", ResolvePath=" + (resolvePath) 702 + ", LastModified Timestamp=" + this.lastModified 703 + ", isChanged=" + this.isChanged() 704 + ", Autocommit=" + this.autoCommit 705 + ", isConfigBeanNull=" + (server==null); 706 } 707 708 714 public String configBeanToString() { 715 if(server == null) return "null bean"; 716 return this.server.dumpBeanNode(); 717 } 718 719 720 726 public String getAttributeValue(String xpath, String attributeName) { 727 ConfigBean c = null; 728 try { 729 c = this.exactLookup(xpath); 730 } catch(Exception e) {} 731 732 if(c!= null) { 733 if(!isResolvingPaths()) { 734 return c.getRawAttributeValue(attributeName); 735 } else { 736 return c.getAttributeValue(attributeName); 737 } 738 } 739 740 return null; 741 } 742 743 746 public boolean getBooleanAttributeValue(String xpath, String attributeName) { 747 String ret = getAttributeValue(xpath, attributeName); 748 if(ret == null) return false; 749 750 if (ret.equals("true")) 751 return true; 752 753 return false; 754 } 755 756 public boolean isChanged() { 757 if(configChangeList == null || configChangeList.size() ==0) 758 return false; 759 return true; 760 } 761 762 765 private long getLastModified() { 766 long ts = INVALID_LAST_MODIFIED; 767 try { 768 File f = new File (this.xmlUrl); 769 ts = f.lastModified(); 770 } catch(Exception e) { 771 } 773 return ts; 774 } 775 776 780 public boolean isFileChangedExternally() { 781 if(getLastModified() == this.lastModified) 782 return false; 783 return true; 784 } 785 786 789 private void initLastModified() { 790 this.lastModified = getLastModified(); 791 } 792 793 public boolean equals(Object obj) { 794 try { 795 if(this.getRootConfigBean().equals(((ConfigContext)obj).getRootConfigBean())) { 796 return true; 797 } 798 } catch(Throwable t) { 799 } 801 return false; 802 } 803 804 public int hashCode() { 805 try { 806 return this.getRootConfigBean().hashCode(); 807 } catch(Throwable t) { 808 } 810 return super.hashCode(); 811 } 812 813 814 private String getConfigChangeUrl() { 815 return this.xmlUrl + ".changes"; 816 } 817 818 private void persistConfigChanges() { 819 820 if(!LOAD_PERSISTENT_CONFIG_CHANGES) return; 823 824 FileOutputStream ostream = null; 825 ObjectOutputStream p = null; 826 try { 827 ostream = new FileOutputStream (getConfigChangeUrl()); 828 p = new ObjectOutputStream (ostream); 829 p.writeObject(this.configChangeList); 830 p.flush(); 831 } catch(Throwable t) { 832 } finally { 834 try { 835 p.close(); 836 ostream.close(); 837 } catch(Exception e){} 838 } 839 840 } 841 842 private void initConfigChanges() { 843 if(!LOAD_PERSISTENT_CONFIG_CHANGES) return; 844 845 FileInputStream istream = null; 846 try { 847 istream = new FileInputStream (getConfigChangeUrl()); 848 ObjectInputStream p = new ObjectInputStream (istream); 849 850 this.configChangeList = (ArrayList )p.readObject(); 851 852 } catch(Throwable t) { 853 } finally { 855 try { 856 istream.close(); 857 } catch(Exception e){} 858 } 859 860 } 861 862 private void clearPersistentConfigChanges() { 863 if(!LOAD_PERSISTENT_CONFIG_CHANGES) return; 864 865 try { 867 File f = new File (getConfigChangeUrl()); 868 f.delete(); 869 } catch(Throwable t) { 870 } 872 } 873 874 877 public void addConfigContextEventListener(ConfigContextEventListener ccel) { 878 if (listeners==null) 879 listeners = new Vector (); 880 listeners.addElement(ccel); 881 } 882 883 886 public void removeConfigContextEventListener(ConfigContextEventListener ccel) { 887 if (listeners==null) 888 listeners = new Vector (); 889 listeners.removeElement(ccel); 890 } 891 892 893 private static final String PRE_CHANGE = "PRE_CHANGE"; 894 private static final String POST_CHANGE = "POST_CHANGE"; 895 896 900 901 public void preChange(ConfigContextEvent ccce) { 904 change(PRE_CHANGE, ccce); 906 } 907 908 public void postChange(ConfigContextEvent ccce) { 910 change(POST_CHANGE, ccce); 912 } 913 914 private void change(String when, ConfigContextEvent ne) { 916 if (listeners==null) 917 return; 918 919 String type = ne.getType(); 921 922 Vector listenersClone = null; 923 synchronized (listeners) { 924 listenersClone = (Vector ) listeners.clone(); 925 } 926 for (Enumeration e = listenersClone.elements(); e.hasMoreElements();) { 927 ConfigContextEventListener nl = (ConfigContextEventListener) e.nextElement(); 928 if(when.equals(PRE_CHANGE)) { 929 934 nl.preChangeNotification(ne); 935 } else { 936 941 nl.postChangeNotification(ne); 942 } 943 } 944 } 945 946 949 public boolean isResolvingPaths() { 950 return this.resolvePath; 951 } 952 953 955 966 public synchronized boolean enableLastModifiedCheck(boolean value) { 967 boolean prev = _lastModifiedCheck; 968 _lastModifiedCheck = value; 969 return prev; 970 } 971 972 public boolean isLastModifiedCheckEnabled() { 973 return _lastModifiedCheck; 974 } 975 976 980 private void validateLastModified(ConfigBean cb, ConfigChange cc) 981 throws StaleWriteConfigException { 982 983 if(cb == null || cc == null) return; 984 985 long beanLM = cb.getThisLastModified(); 986 if(beanLM == -1) return; 988 long ccLM = cc.getGlobalLastModified(); 989 if(ccLM == -1) return; 991 if (beanLM == ccLM) return; 993 throw new StaleWriteConfigException("validateLastModified failed for cb=" + cb); 994 } 995 996 public synchronized ArrayList updateFromConfigChange(ArrayList configChangeList) 997 throws ConfigException { 998 999 ArrayList errList = new ArrayList (); 1000 if (configChangeList == null || configChangeList.size() == 0) return errList; 1001 1002 validateAllLastModified(configChangeList); 1003 1004 boolean prev = enableLastModifiedCheck(false); 1005 try { 1006 for(int i = 0 ; i < configChangeList.size(); i++ ) { 1007 ConfigChange cc = (ConfigChange) configChangeList.get(i); 1008 try { 1009 updateFromConfigChange(cc); 1010 } catch (Exception e) { 1011 errList.add(cc); 1012 } 1013 } 1014 } finally { 1016 enableLastModifiedCheck(prev); 1017 } 1018 return errList; 1019 } 1020 1021 private void validateAllLastModified(ArrayList arr) throws StaleWriteConfigException { 1022 if(arr == null || arr.size() == 0) return; 1023 1024 for(int i = 0 ; i < arr.size(); i++ ) { 1025 ConfigChange cc = (ConfigChange) arr.get(i); 1026 validateLastModified(cc); 1027 } 1028 } 1029 1030 private void validateLastModified(ConfigChange cc) throws StaleWriteConfigException { 1031 ConfigBean bean = getConfigBeanFromConfigChange(cc); 1032 validateLastModified(bean, cc); 1033 } 1034 1035 private ConfigBean getConfigBeanFromConfigChange(ConfigChange configChange) { 1036 ConfigBean result = null; 1037 try { 1038 if(configChange.getConfigChangeType().equals(ConfigChange.TYPE_UPDATE)) { 1039 result = ConfigBeansFactory.getConfigBeanByXPath(this,configChange.getXPath()); 1040 } else if (configChange.getConfigChangeType().equals(ConfigChange.TYPE_DELETE)) { 1041 String xpath = configChange.getXPath(); 1042 ConfigBean child = ConfigBeansFactory.getConfigBeanByXPath(this,xpath); 1043 if(child != null) { 1044 result = (ConfigBean) child.parent(); 1045 } 1046 } else { result = ConfigBeansFactory.getConfigBeanByXPath(this, configChange.getParentXPath()); 1048 } 1049 } catch (ConfigException ce) { 1050 } 1052 return result; 1053 } 1054 1055 public String getUrl() { 1056 return this.xmlUrl; 1057 } 1058 1059 public ConfigBeanInterceptor getConfigBeanInterceptor() { 1060 ConfigBeanInterceptor cbiClone = null; 1061 if (null != configBeanInterceptor) { 1062 cbiClone = (ConfigBeanInterceptor)configBeanInterceptor.clone(); 1063 } 1064 return cbiClone; 1065 } 1066} 1067 | Popular Tags |