001 /***************************************************************************** 002 * Copyright (C) PicoContainer Organization. All rights reserved. * 003 * ------------------------------------------------------------------------- * 004 * The software in this package is published under the terms of the BSD * 005 * style license a copy of which has been included with this distribution in * 006 * the LICENSE.txt file. * 007 * * 008 *****************************************************************************/ 009 package org.picocontainer.script; 010 011 import java.io.IOException; 012 import java.io.InputStream; 013 import java.io.InputStreamReader; 014 import java.io.Reader; 015 import java.net.URL; 016 017 import org.picocontainer.PicoContainer; 018 019 /** 020 * Abstract class for script-based container builders 021 * 022 * @author Aslak Hellesøy 023 * @author Obie Fernandez 024 * @author Mauro Talevi 025 */ 026 public abstract class ScriptedContainerBuilder extends AbstractContainerBuilder { 027 028 private final Reader scriptReader; 029 private final URL scriptURL; 030 private final ClassLoader classLoader; 031 032 public ScriptedContainerBuilder(Reader script, ClassLoader classLoader) { 033 this(script,classLoader, LifecycleMode.AUTO_LIFECYCLE); 034 } 035 036 public ScriptedContainerBuilder(Reader script, ClassLoader classLoader, LifecycleMode lifecycleMode) { 037 super(lifecycleMode); 038 this.scriptReader = script; 039 if (script == null) { 040 throw new NullPointerException("script"); 041 } 042 this.scriptURL = null; 043 this.classLoader = classLoader; 044 if ( classLoader == null) { 045 throw new NullPointerException("classLoader"); 046 } 047 } 048 049 public ScriptedContainerBuilder(URL script, ClassLoader classLoader) { 050 this(script,classLoader, LifecycleMode.AUTO_LIFECYCLE); 051 } 052 053 public ScriptedContainerBuilder(URL script, ClassLoader classLoader, LifecycleMode lifecycleMode) { 054 super(lifecycleMode); 055 this.scriptReader = null; 056 this.scriptURL = script; 057 if (script == null) { 058 throw new NullPointerException("script"); 059 } 060 this.classLoader = classLoader; 061 if ( classLoader == null) { 062 throw new NullPointerException("classLoader"); 063 } 064 } 065 066 @Override 067 protected final PicoContainer createContainer(PicoContainer parentContainer, Object assemblyScope) { 068 try { 069 return createContainerFromScript(parentContainer, assemblyScope); 070 } finally { 071 try { 072 Reader reader = getScriptReader(); 073 if (reader != null) { 074 reader.close(); 075 } 076 } catch (IOException e) { 077 // do nothing. we've given it our best try, now get on with it 078 } 079 } 080 } 081 082 protected final ClassLoader getClassLoader() { 083 return classLoader; 084 } 085 086 @SuppressWarnings("synthetic-access") 087 protected final InputStream getScriptInputStream() throws IOException{ 088 if ( scriptReader != null ){ 089 return new InputStream() { 090 @Override 091 public int read() throws IOException { 092 return scriptReader.read(); 093 } 094 }; 095 } 096 return scriptURL.openStream(); 097 } 098 099 protected final Reader getScriptReader() throws IOException{ 100 if ( scriptReader != null ){ 101 return scriptReader; 102 } 103 return new InputStreamReader(scriptURL.openStream()); 104 } 105 106 protected abstract PicoContainer createContainerFromScript(PicoContainer parentContainer, Object assemblyScope); 107 108 }