<%@ jet package="org.eclipse.jst.j2ee.web" 
	imports="org.eclipse.jst.j2ee.internal.web.operations.* java.util.* " 
	class="FilterTemplate" 
%><%@ include file="filterHeader.template" %>

<%if (model.isPublic()) {%>public<%}%> <%if (model.isAbstract()) {%>abstract <%}%><%if (model.isFinal()) {%>final <%}
%>class <%=model.getClassName()%><%
String superClass = model.getSuperclassName();
if (superClass.trim().length() > 0) {%> extends <%=superClass%><%}%>
<%
 List interfaces = model.getInterfaces(); 
 if (interfaces.size()>0) {%> implements <% }
 for (int i=0; i<interfaces.size(); i++) {
   String INTERFACE = (String) interfaces.get(i);
   if (i > 0) { %>, <%}%><%=INTERFACE%><%}%> {
<% if (!model.hasEmptySuperclassConstructor()) { %>

    /**
     * Default constructor. 
     */
    public <%=model.getClassName()%>() {
        // TODO Auto-generated constructor stub
    }
<% } %>
<% if (model.shouldGenSuperclassConstructors()) {
     List<Constructor> constructors = model.getConstructors();
     for (Constructor constructor : constructors) {
       if (constructor.isPublic() || constructor.isProtected()) { %>
       
    /**
     * @see <%=model.getSuperclassName()%>#<%=model.getSuperclassName()%>(<%=constructor.getParamsForJavadoc()%>)
     */
    public <%=model.getClassName()%>(<%=constructor.getParamsForDeclaration()%>) {
        super(<%=constructor.getParamsForCall()%>);
        // TODO Auto-generated constructor stub
    }
<% } } } %>
<% if (model.shouldGenDestroy()) { %>

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}<% } %><% if (model.shouldGenDoFilter()) { %>

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
	}<% } %><% if (model.shouldGenInit()) { %>

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}<% } %>

}
