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 }