1 // 2 // ======================================================================== 3 // Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd. 4 // ------------------------------------------------------------------------ 5 // All rights reserved. This program and the accompanying materials 6 // are made available under the terms of the Eclipse Public License v1.0 7 // and Apache License v2.0 which accompanies this distribution. 8 // 9 // The Eclipse Public License is available at 10 // http://www.eclipse.org/legal/epl-v10.html 11 // 12 // The Apache License v2.0 is available at 13 // http://www.opensource.org/licenses/apache2.0.php 14 // 15 // You may elect to redistribute this code under either of these licenses. 16 // ======================================================================== 17 // 18 19 package org.eclipse.jetty.webapp; 20 21 import java.util.ArrayList; 22 import java.util.Arrays; 23 import java.util.List; 24 import java.util.ListIterator; 25 26 import org.eclipse.jetty.server.Server; 27 import org.eclipse.jetty.util.annotation.Name; 28 29 30 /* ------------------------------------------------------------------------------- */ 31 /** Base Class for WebApplicationContext Configuration. 32 * This class can be extended to customize or extend the configuration 33 * of the WebApplicationContext. 34 */ 35 public interface Configuration 36 { 37 public final static String ATTR="org.eclipse.jetty.webapp.configuration"; 38 39 /* ------------------------------------------------------------------------------- */ 40 /** Set up for configuration. 41 * <p> 42 * Typically this step discovers configuration resources 43 * @param context The context to configure 44 * @throws Exception 45 */ 46 public void preConfigure (WebAppContext context) throws Exception; 47 48 49 /* ------------------------------------------------------------------------------- */ 50 /** Configure WebApp. 51 * <p> 52 * Typically this step applies the discovered configuration resources to 53 * either the {@link WebAppContext} or the associated {@link MetaData}. 54 * @param context The context to configure 55 * @throws Exception 56 */ 57 public void configure (WebAppContext context) throws Exception; 58 59 60 /* ------------------------------------------------------------------------------- */ 61 /** Clear down after configuration. 62 * @param context The context to configure 63 * @throws Exception 64 */ 65 public void postConfigure (WebAppContext context) throws Exception; 66 67 /* ------------------------------------------------------------------------------- */ 68 /** DeConfigure WebApp. 69 * This method is called to undo all configuration done. This is 70 * called to allow the context to work correctly over a stop/start cycle 71 * @param context The context to configure 72 * @throws Exception 73 */ 74 public void deconfigure (WebAppContext context) throws Exception; 75 76 /* ------------------------------------------------------------------------------- */ 77 /** Destroy WebApp. 78 * This method is called to destroy a webappcontext. It is typically called when a context 79 * is removed from a server handler hierarchy by the deployer. 80 * @param context The context to configure 81 * @throws Exception 82 */ 83 public void destroy (WebAppContext context) throws Exception; 84 85 86 /* ------------------------------------------------------------------------------- */ 87 /** Clone configuration instance. 88 * <p> 89 * Configure an instance of a WebAppContext, based on a template WebAppContext that 90 * has previously been configured by this Configuration. 91 * @param template The template context 92 * @param context The context to configure 93 * @throws Exception 94 */ 95 public void cloneConfigure (WebAppContext template, WebAppContext context) throws Exception; 96 97 98 public class ClassList extends ArrayList<String> 99 { 100 /* ------------------------------------------------------------ */ 101 /** Get/Set/Create the server default Configuration ClassList. 102 * <p>Get the class list from: a Server bean; or the attribute (which can 103 * either be a ClassList instance or an String[] of class names); or a new instance 104 * with default configuration classes.</p> 105 * <p>This method also adds the obtained ClassList instance as a dependent bean 106 * on the server and clears the attribute</p> 107 * @param server The server the default is for 108 * @return the server default ClassList instance of the configuration classes for this server. Changes to this list will change the server default instance. 109 */ 110 public static ClassList setServerDefault(Server server) 111 { 112 ClassList cl=server.getBean(ClassList.class); 113 if (cl!=null) 114 return cl; 115 cl=serverDefault(server); 116 server.addBean(cl); 117 server.setAttribute(ATTR,null); 118 return cl; 119 } 120 121 /* ------------------------------------------------------------ */ 122 /** Get/Create the server default Configuration ClassList. 123 * <p>Get the class list from: a Server bean; or the attribute (which can 124 * either be a ClassList instance or an String[] of class names); or a new instance 125 * with default configuration classes. 126 * @param server The server the default is for 127 * @return A copy of the server default ClassList instance of the configuration classes for this server. Changes to the returned list will not change the server default. 128 */ 129 public static ClassList serverDefault(Server server) 130 { 131 ClassList cl=server.getBean(ClassList.class); 132 if (cl!=null) 133 return new ClassList(cl); 134 Object attr = server.getAttribute(ATTR); 135 if (attr instanceof ClassList) 136 return new ClassList((ClassList)attr); 137 if (attr instanceof String[]) 138 return new ClassList((String[])attr); 139 return new ClassList(); 140 } 141 142 public ClassList() 143 { 144 this(WebAppContext.DEFAULT_CONFIGURATION_CLASSES); 145 } 146 147 public ClassList(String[] classes) 148 { 149 addAll(Arrays.asList(classes)); 150 } 151 152 public ClassList(List<String> classes) 153 { 154 addAll(classes); 155 } 156 157 public void addAfter(@Name("afterClass") String afterClass,@Name("configClass")String... configClass) 158 { 159 if (configClass!=null && afterClass!=null) 160 { 161 ListIterator<String> iter = listIterator(); 162 while (iter.hasNext()) 163 { 164 String cc=iter.next(); 165 if (afterClass.equals(cc)) 166 { 167 for (int i=0;i<configClass.length;i++) 168 iter.add(configClass[i]); 169 return; 170 } 171 } 172 } 173 throw new IllegalArgumentException("afterClass '"+afterClass+"' not found in "+this); 174 } 175 176 public void addBefore(@Name("beforeClass") String beforeClass,@Name("configClass")String... configClass) 177 { 178 if (configClass!=null && beforeClass!=null) 179 { 180 ListIterator<String> iter = listIterator(); 181 while (iter.hasNext()) 182 { 183 String cc=iter.next(); 184 if (beforeClass.equals(cc)) 185 { 186 iter.previous(); 187 for (int i=0;i<configClass.length;i++) 188 iter.add(configClass[i]); 189 return; 190 } 191 } 192 } 193 throw new IllegalArgumentException("beforeClass '"+beforeClass+"' not found in "+this); 194 } 195 196 } 197 }