blob: c477bdeeb5aedd73ddb569d8ab66358783b632b9 [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.runtime;
import java.util.Collections;
import java.util.Map;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import org.apache.felix.http.base.internal.util.PatternUtil;
import org.osgi.dto.DTO;
import org.osgi.framework.ServiceReference;
import org.osgi.service.http.runtime.dto.FilterDTO;
import org.osgi.service.http.whiteboard.HttpWhiteboardConstants;
/**
* Provides registration information for a {@link Filter}, and is used to programmatically register {@link Filter}s.
* <p>
* This class only provides information used at registration time, and as such differs slightly from {@link DTO}s like, {@link FilterDTO}.
* </p>
*/
public final class FilterInfo extends WhiteboardServiceInfo<Filter>
{
/**
* The name of the filter.
*/
private final String name;
/**
* The request mappings for the servlet.
* <p>
* The specified patterns are used to determine whether a request is mapped to the servlet filter.<br>
* Note that these patterns should conform to the Servlet specification.
* </p>
*/
private final String[] patterns;
/**
* The servlet names for the servlet filter.
* <p>
* The specified names are used to determine the servlets whose requests are mapped to the servlet filter.
* </p>
*/
private final String[] servletNames;
/**
* The request mappings for the servlet filter.
* <p>
* The specified regular expressions are used to determine whether a request is mapped to the servlet filter.<br>
* These regular expressions are a convenience extension allowing one to specify filters that match paths that are difficult to match with plain Servlet patterns alone.
* </p>
*/
private final String[] regexs;
/**
* Specifies whether the servlet filter supports asynchronous processing.
*/
private final boolean asyncSupported;
/**
* The dispatcher associations for the servlet filter.
* <p>
* The specified names are used to determine in what occasions the servlet filter is called.
* See {@link DispatcherType} and Servlet 3.0 specification, section 6.2.5.
* </p>
*/
private final DispatcherType[] dispatcher;
/**
* The filter initialization parameters as provided during registration of the filter.
*/
private final Map<String, String> initParams;
public FilterInfo(final ServiceReference<Filter> ref)
{
super(ref);
this.name = getStringProperty(ref, HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_NAME);
this.asyncSupported = getBooleanProperty(ref, HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_ASYNC_SUPPORTED);
this.servletNames = getStringArrayProperty(ref, HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_SERVLET);
this.patterns = getStringArrayProperty(ref, HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_PATTERN);
this.regexs = getStringArrayProperty(ref, HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_REGEX);
this.initParams = getInitParams(ref, HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_INIT_PARAM_PREFIX);
String[] dispatcherNames = getStringArrayProperty(ref, HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_DISPATCHER);
if (dispatcherNames != null && dispatcherNames.length > 0)
{
DispatcherType[] dispatchers = new DispatcherType[dispatcherNames.length];
for (int i = 0; i < dispatchers.length; i++)
{
try
{
dispatchers[i] = DispatcherType.valueOf(dispatcherNames[i].toUpperCase());
}
catch ( final IllegalArgumentException iae)
{
dispatchers = null;
break;
}
}
this.dispatcher = dispatchers;
}
else
{
this.dispatcher = new DispatcherType[] {DispatcherType.REQUEST};
}
}
/**
* Constructor for Http Service
*/
public FilterInfo(final String name,
final String regex,
final int serviceRanking,
final Map<String, String> initParams)
{
super(serviceRanking);
this.name = name;
this.patterns = null;
this.servletNames = null;
this.regexs = new String[] {regex};
this.initParams = Collections.unmodifiableMap(initParams);
this.asyncSupported = false;
this.dispatcher = new DispatcherType[] {DispatcherType.REQUEST};
}
@Override
public boolean isValid()
{
boolean valid = super.isValid() && (!isEmpty(this.patterns) || !isEmpty(this.regexs) || !isEmpty(this.servletNames));
if ( valid )
{
if ( this.patterns != null )
{
for(final String p : this.patterns)
{
if ( !PatternUtil.isValidPattern(p) )
{
valid = false;
break;
}
}
}
if ( valid && this.regexs != null )
{
for(final String p : this.regexs)
{
try
{
Pattern.compile(p);
}
catch ( final PatternSyntaxException pse)
{
valid = false;
break;
}
}
}
}
if ( valid )
{
if ( this.dispatcher == null || this.dispatcher.length == 0 )
{
valid = false;
}
}
return valid;
}
public String getName()
{
return name;
}
public String[] getPatterns()
{
return patterns;
}
public String[] getServletNames()
{
return servletNames;
}
public String[] getRegexs()
{
return regexs;
}
public boolean isAsyncSupported()
{
return asyncSupported;
}
public DispatcherType[] getDispatcher()
{
return dispatcher;
}
/**
* Returns an immutable map of the init parameters.
*/
public Map<String, String> getInitParameters()
{
return initParams;
}
}