001    /*****************************************************************************
002     * Copyright (C) NanoContainer 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    
010    package org.picocontainer.jetty.groovy;
011    
012    import org.picocontainer.MutablePicoContainer;
013    
014    import java.util.Map;
015    import javax.servlet.Servlet;
016    
017    import groovy.util.NodeBuilder;
018    import org.mortbay.jetty.servlet.FilterHolder;
019    import org.mortbay.jetty.servlet.ServletHolder;
020    import org.picocontainer.jetty.PicoContext;
021    import org.picocontainer.jetty.groovy.adapters.NodeBuilderAdapter;
022    import org.picocontainer.jetty.groovy.adapters.WaffleAdapter;
023    
024    public class ContextBuilder extends NodeBuilder {
025        private final MutablePicoContainer parentContainer;
026        private final PicoContext context;
027    
028        public ContextBuilder(MutablePicoContainer parentContainer, PicoContext context) {
029            this.parentContainer = parentContainer;
030            this.context = context;
031        }
032    
033        protected Object createNode(Object name, Map map) {
034            if (name.equals("filter")) {
035                return makeFilter(map);
036            } else if (name.equals("servlet")) {
037                return makeServlet(map);
038            } else if (name.equals("initParam")) {
039                makeInitParam(map);
040                return null;
041            } else if (name.equals("listener")) {
042                return makeListener(map);
043            } else if (name.equals("virtualHost")) {
044                return addVirtualHost(map);
045            } else if (name.equals("staticContent")) {
046                setStaticContent(map);
047                return null;
048            } else if (name.equals("adapter")) {
049                return makeAdapter(map);
050            } else if (name.equals("waffleApp")) {
051                return new WaffleAdapter(context, parentContainer, map).getNodeBuilder();
052            }
053    
054            return null;
055        }
056    
057        private void setStaticContent(Map map) {
058    
059            if (map.containsKey("welcomePage")) {
060                context.setStaticContext((String)map.remove("path"), (String)map.remove("welcomePage"));
061            } else {
062                context.setStaticContext((String)map.remove("path"));
063            }
064    
065        }
066    
067        private Object makeAdapter(Map map) {
068            return new NodeBuilderAdapter((String)map.remove("nodeBuilder"),
069                                          context,
070                                          parentContainer,
071                                          map).getNodeBuilder();
072        }
073    
074        private Object makeListener(Map map) {
075            return context.addListener((Class)map.remove("class"));
076        }
077    
078        private Object addVirtualHost(Map map) {
079            String virtualhost = (String) map.remove("name");
080            context.addVirtualHost(virtualhost);
081            return virtualhost;
082        }
083    
084    
085        private Object makeServlet(Map map) {
086    
087            if (map.containsKey("class")) {
088                ServletHolder servlet = context.addServletWithMapping((Class)map.remove("class"), (String)map
089                    .remove("path"));
090                return new ServletHolderBuilder(servlet);
091            } else {
092                Servlet servlet = (Servlet)map.remove("instance");
093                context.addServletWithMapping(servlet, (String)map.remove("path"));
094                return servlet;
095            }
096    
097        }
098    
099        private void makeInitParam(Map map) {
100            String name = (String) map.remove("name");
101            String value = (String) map.remove("value");
102            context.addInitParam(name, value);
103        }
104    
105        private Object makeFilter(Map map) {
106            FilterHolder filter = context.addFilterWithMappings((Class)map.remove("class"), getPaths(map),
107                                                               extractDispatchers(map));
108            return new FilterHolderBuilder(filter);
109        }
110    
111        private String[] getPaths(Map map) {
112            String[] paths = {};
113            String mapping = (String) map.remove("path");
114            if (mapping != null) {
115                paths = new String[] { mapping };
116            }
117            String mappings = (String) map.remove("paths");
118            if (mappings != null) {
119                paths = mappings.replaceAll(" ", "").split(",");
120            }
121            return paths;
122        }
123    
124        private int extractDispatchers(Map map) {
125            Object dispatchers = map.remove("dispatchers");
126            if (dispatchers != null) {
127                return (Integer)dispatchers;
128            }
129            // default value
130            return 0;
131        }
132    
133    }