blob: 6e6c5039f9840244c9b98b29aa039f0ab0329c7d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.felix.http.base.internal.handler;
import org.osgi.service.http.NamespaceException;
import javax.servlet.ServletException;
import javax.servlet.Servlet;
import javax.servlet.Filter;
import java.util.HashMap;
import java.util.Map;
import java.util.Arrays;
public final class HandlerRegistry
{
private final Map<Servlet, ServletHandler> servletMap;
private final Map<Filter, FilterHandler> filterMap;
private final Map<String, Servlet> aliasMap;
private ServletHandler[] servlets;
private FilterHandler[] filters;
public HandlerRegistry()
{
this.servletMap = new HashMap<Servlet, ServletHandler>();
this.filterMap = new HashMap<Filter, FilterHandler>();
this.aliasMap = new HashMap<String, Servlet>();
this.servlets = new ServletHandler[0];
this.filters = new FilterHandler[0];
}
public ServletHandler[] getServlets()
{
return this.servlets;
}
public FilterHandler[] getFilters()
{
return this.filters;
}
public synchronized void addServlet(ServletHandler handler)
throws ServletException, NamespaceException
{
if (this.servletMap.containsKey(handler.getServlet())) {
throw new ServletException("Servlet instance already registered");
}
if (this.aliasMap.containsKey(handler.getAlias())) {
throw new NamespaceException("Servlet with alias already registered");
}
handler.init();
this.servletMap.put(handler.getServlet(), handler);
this.aliasMap.put(handler.getAlias(), handler.getServlet());
updateServletArray();
}
public synchronized void addFilter(FilterHandler handler)
throws ServletException
{
if (this.filterMap.containsKey(handler.getFilter())) {
throw new ServletException("Filter instance already registered");
}
handler.init();
this.filterMap.put(handler.getFilter(), handler);
updateFilterArray();
}
public synchronized void removeServlet(Servlet servlet, final boolean destroy)
{
ServletHandler handler = this.servletMap.remove(servlet);
if (handler != null) {
updateServletArray();
this.aliasMap.remove(handler.getAlias());
if (destroy)
{
handler.destroy();
}
}
}
public synchronized void removeFilter(Filter filter, final boolean destroy)
{
FilterHandler handler = this.filterMap.remove(filter);
if (handler != null) {
updateFilterArray();
if (destroy)
{
handler.destroy();
}
}
}
public synchronized Servlet getServletByAlias(String alias)
{
return this.aliasMap.get(alias);
}
public synchronized void removeAll()
{
for (ServletHandler handler : this.servletMap.values()) {
handler.destroy();
}
for (FilterHandler handler : this.filterMap.values()) {
handler.destroy();
}
this.servletMap.clear();
this.filterMap.clear();
this.aliasMap.clear();
updateServletArray();
updateFilterArray();
}
private void updateServletArray()
{
ServletHandler[] tmp = this.servletMap.values().toArray(new ServletHandler[this.servletMap.size()]);
Arrays.sort(tmp);
this.servlets = tmp;
}
private void updateFilterArray()
{
FilterHandler[] tmp = this.filterMap.values().toArray(new FilterHandler[this.filterMap.size()]);
Arrays.sort(tmp);
this.filters = tmp;
}
}