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.nanocontainer.webcontainer.groovy;
011
012 import groovy.util.NodeBuilder;
013
014 import java.util.Map;
015
016 import javax.servlet.Servlet;
017
018 import org.mortbay.jetty.servlet.FilterHolder;
019 import org.mortbay.jetty.servlet.ServletHolder;
020 import org.nanocontainer.webcontainer.PicoContext;
021 import org.nanocontainer.webcontainer.groovy.adapters.NodeBuilderAdapter;
022 import org.nanocontainer.webcontainer.groovy.adapters.WaffleAdapter;
023 import org.picocontainer.MutablePicoContainer;
024
025 public class ContextBuilder extends NodeBuilder {
026 private final MutablePicoContainer parentContainer;
027 private final PicoContext context;
028
029 public ContextBuilder(MutablePicoContainer parentContainer, PicoContext context) {
030 this.parentContainer = parentContainer;
031 this.context = context;
032 }
033
034 protected Object createNode(Object name, Map map) {
035 if (name.equals("filter")) {
036 return makeFilter(map);
037 } else if (name.equals("servlet")) {
038 return makeServlet(map);
039 } else if (name.equals("listener")) {
040 return makeListener(map);
041 } else if (name.equals("staticContent")) {
042 setStaticContent(map);
043 return null;
044 } else if (name.equals("adapter")) {
045 return makeAdapter(map);
046 } else if (name.equals("waffleApp")) {
047 return new WaffleAdapter(context, parentContainer, map).getNodeBuilder();
048 }
049
050 return null;
051 }
052
053 private void setStaticContent(Map map) {
054
055 if (map.containsKey("welcomePage")) {
056 context.setStaticContext((String) map.remove("path"), (String) map.remove("welcomePage"));
057 } else {
058 context.setStaticContext((String) map.remove("path"));
059 }
060
061 }
062
063 private Object makeAdapter(Map map) {
064 return new NodeBuilderAdapter((String) map.remove("nodeBuilder"), context, parentContainer, map).getNodeBuilder();
065 }
066
067 private Object makeListener(Map map) {
068 return context.addListener((Class) map.remove("class"));
069 }
070
071 private Object makeServlet(Map map) {
072
073 if (map.containsKey("class")) {
074 ServletHolder servlet = context.addServletWithMapping((Class) map.remove("class"), (String) map
075 .remove("path"));
076 return new ServletHolderBuilder(servlet);
077 } else {
078 Servlet servlet = (Servlet) map.remove("instance");
079 context.addServletWithMapping(servlet, (String) map.remove("path"));
080 return servlet;
081 }
082
083 }
084
085 private Object makeFilter(Map map) {
086 FilterHolder filter = context.addFilterWithMapping((Class) map.remove("class"), (String) map.remove("path"),
087 extractDispatchers(map));
088 FilterHolderBuilder builder = new FilterHolderBuilder(filter);
089 return builder;
090 }
091
092 private int extractDispatchers(Map map) {
093 Object dispatchers = map.remove("dispatchers");
094 if (dispatchers != null) {
095 return ((Integer) dispatchers).intValue();
096 }
097 // default value
098 return 0;
099 }
100
101 }