001    /*
002    @license.text@
003     */
004    package biz.hammurapi.ant;
005    
006    import java.io.File;
007    import java.io.IOException;
008    import java.io.InputStream;
009    import java.net.URL;
010    import java.util.ArrayList;
011    import java.util.Collection;
012    import java.util.Iterator;
013    
014    import org.apache.tools.ant.BuildException;
015    import org.apache.tools.ant.Task;
016    
017    import biz.hammurapi.config.Command;
018    import biz.hammurapi.config.ConfigurationException;
019    import biz.hammurapi.config.Context;
020    import biz.hammurapi.config.DomConfigFactory;
021    import biz.hammurapi.config.DomConfigurableContainer;
022    import biz.hammurapi.logging.AntLogger;
023    
024    
025    /**
026     * PV Container wrapped in Ant task.
027     * Instantiates container, mounts /logger and /taks and then
028     * executes nested <command> entries
029     * @author Pavel Vlasov
030     * @revision $Revision$
031     */
032    public class ContainerTask extends Task {
033            private Collection executes=new ArrayList();
034            
035            /**
036             * Context to "execute".
037             * @author Pavel Vlasov
038             * @revision $Revision$
039             */
040            public class Execute extends ObjectEntry {
041                    private String path;
042                    
043                    public void setPath(String path) {
044                            this.path=path;
045                    }
046            }
047            
048            public Execute createExecute() {
049                    Execute ret=new Execute();
050                    executes.add(ret);
051                    return ret;
052            }
053            
054            public ContainerTask() {
055                    super();
056            }
057            
058            private String url;
059            private File file;
060            private String resource;
061            
062            /**
063             * URL to load configuration from. 
064             * One of URL, file or resource is mandatory. 
065             * These attributes are mutually exclusive.
066             * @ant.not-required
067             * @param url
068             */
069            public void setUrl(String url) {
070                    checkAlreadySet();
071                    this.url=url;
072            }
073            
074            /**
075             * File to load configuration from. 
076             * One of URL, file or resource is mandatory. 
077             * These attributes are mutually exclusive.
078             * @ant.not-required
079             * @param url
080             */
081            public void setFile(File file) {
082                    checkAlreadySet();
083                    this.file=file;
084            }
085            
086            /**
087             * Classloader resource to load configuration from. 
088             * One of URL, file or resource is mandatory. 
089             * These attributes are mutually exclusive.
090             * @ant.not-required
091             * @param url
092             */
093            public void setResource(String resource) {
094                    checkAlreadySet();
095                    this.resource=resource;
096            }
097            
098            private void checkAlreadySet() {
099                    if (url!=null) {
100                            throw new BuildException("url already set");
101                    }
102                    
103                    if (file!=null) {
104                            throw new BuildException("file already set");
105                    }
106                    
107                    if (resource!=null) {
108                            throw new BuildException("resource already set");
109                    }
110            }
111            
112            public void execute() throws BuildException {
113                    try {
114                            ClassLoader classLoader = getClass().getClassLoader();
115                            DomConfigFactory factory=new DomConfigFactory(classLoader, (Context) null);
116                            Object o;
117                            if (url!=null) {
118                                    o=factory.create(new URL(url), null);
119                            } else if (file!=null) {
120                                    o=factory.create(file, null);                   
121                            } else if (resource!=null) {
122                                    InputStream in=classLoader.getResourceAsStream(resource);
123                                    if (in==null) {
124                                            throw new BuildException("Resource "+resource+" not found");
125                                    }
126                                    o=factory.create(in, null);                     
127                            } else {
128                                    throw new BuildException("One of url, file or resource attributes must be set");
129                            }
130                            
131                            if (o instanceof DomConfigurableContainer) {
132                                    DomConfigurableContainer container=(DomConfigurableContainer) o;
133                                    if (container.get("logger")==null) {
134                                            container.addComponent("logger", new AntLogger(this)); 
135                                    }
136                                    if (container.get("task")==null) {
137                                            container.addComponent("task", this); 
138                                    }
139                                    
140                                    container.start();
141                                    try {
142                                            Iterator it=executes.iterator();
143                                            while (it.hasNext()) {
144                                                    Execute execute=(Execute) it.next();
145                                                    Object target=container.get(execute.path);
146                                                    if (target instanceof Command) {
147                                                            ((Command) target).execute(execute.getObject(classLoader));
148                                                    }
149                                            }
150                                    } finally {
151                                            container.stop();
152                                    }
153                            }                       
154                    } catch (IOException e) {
155                            throw new BuildException(e.toString(), e);
156                    } catch (ConfigurationException e) {
157                            throw new BuildException(e.toString(), e);
158                    }
159                    
160            }
161            
162            
163    }