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