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 }