You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2015/05/15 20:00:22 UTC
svn commit: r1679612 - in
/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal:
handler/holder/ logger/ whiteboard/
Author: cziegeler
Date: Fri May 15 18:00:22 2015
New Revision: 1679612
URL: http://svn.apache.org/r1679612
Log:
FELIX-4888 : ServletHandler's are not sorted by longest matching path. Split servlet holder from mapping.
Added:
felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/
felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/AbstractHolder.java (with props)
felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/HttpServiceServletHolder.java (with props)
felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/ServletHolder.java (with props)
felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/WhiteboardServletHolder.java (with props)
Modified:
felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/logger/SystemLogger.java
felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardHttpService.java
Added: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/AbstractHolder.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/AbstractHolder.java?rev=1679612&view=auto
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/AbstractHolder.java (added)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/AbstractHolder.java Fri May 15 18:00:22 2015
@@ -0,0 +1,44 @@
+/*
+ * 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.holder;
+
+import javax.servlet.ServletContext;
+
+import org.osgi.service.http.runtime.dto.DTOConstants;
+
+public abstract class AbstractHolder<T extends AbstractHolder<?>> implements Comparable<T>
+{
+ private final ServletContext context;
+
+ public AbstractHolder(final ServletContext context)
+ {
+ this.context = context;
+ }
+
+ public ServletContext getContext()
+ {
+ return this.context;
+ }
+
+ /**
+ * Initialize the object
+ * @return {code -1} on success, a failure reason according to {@link DTOConstants} otherwise.
+ */
+ public abstract int init();
+
+ public abstract void destroy();
+}
Propchange: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/AbstractHolder.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/AbstractHolder.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url
Propchange: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/AbstractHolder.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/HttpServiceServletHolder.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/HttpServiceServletHolder.java?rev=1679612&view=auto
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/HttpServiceServletHolder.java (added)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/HttpServiceServletHolder.java Fri May 15 18:00:22 2015
@@ -0,0 +1,36 @@
+/*
+ * 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.holder;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
+
+import org.apache.felix.http.base.internal.runtime.ServletInfo;
+
+/**
+ * Servlet holder for servlets registered through the http service.
+ */
+public final class HttpServiceServletHolder extends ServletHolder
+{
+ public HttpServiceServletHolder(final ServletContext context,
+ final ServletInfo servletInfo,
+ final Servlet servlet)
+ {
+ super(context, servletInfo);
+ this.setServlet(servlet);
+ }
+}
Propchange: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/HttpServiceServletHolder.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/HttpServiceServletHolder.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url
Propchange: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/HttpServiceServletHolder.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/ServletHolder.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/ServletHolder.java?rev=1679612&view=auto
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/ServletHolder.java (added)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/ServletHolder.java Fri May 15 18:00:22 2015
@@ -0,0 +1,124 @@
+/*
+ * 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.holder;
+
+import java.io.IOException;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+import org.apache.felix.http.base.internal.handler.ServletConfigImpl;
+import org.apache.felix.http.base.internal.logger.SystemLogger;
+import org.apache.felix.http.base.internal.runtime.ServletInfo;
+import org.osgi.service.http.runtime.dto.DTOConstants;
+
+/**
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public abstract class ServletHolder extends AbstractHolder<ServletHolder>
+{
+ private final ServletInfo servletInfo;
+
+ private volatile Servlet servlet;
+
+ public ServletHolder(final ServletContext context,
+ final ServletInfo servletInfo)
+ {
+ super(context);
+
+ this.servletInfo = servletInfo;
+ }
+
+ protected Servlet getServlet()
+ {
+ return servlet;
+ }
+
+ protected void setServlet(final Servlet s)
+ {
+ this.servlet = s;
+ }
+
+ @Override
+ public int compareTo(final ServletHolder other)
+ {
+ return this.servletInfo.compareTo(other.servletInfo);
+ }
+
+ public void handle(final ServletRequest req, final ServletResponse res)
+ throws ServletException, IOException
+ {
+ this.servlet.service(req, res);
+ }
+
+ protected ServletInfo getServletInfo()
+ {
+ return this.servletInfo;
+ }
+
+ protected String getName()
+ {
+ String name = this.servletInfo.getName();
+ if (name == null)
+ {
+ name = servlet.getClass().getName();
+ }
+ return name;
+ }
+
+ @Override
+ public int init()
+ {
+ if (this.servlet == null)
+ {
+ return DTOConstants.FAILURE_REASON_SERVICE_NOT_GETTABLE;
+ }
+
+ try {
+ servlet.init(new ServletConfigImpl(getName(), getContext(), getServletInfo().getInitParameters()));
+ } catch (final ServletException e) {
+ SystemLogger.error(this.getServletInfo().getServiceReference(),
+ "Error during calling init() on servlet " + this.servlet,
+ e);
+ return DTOConstants.FAILURE_REASON_EXCEPTION_ON_INIT;
+ }
+ return -1;
+ }
+
+ @Override
+ public void destroy()
+ {
+ if (this.servlet == null)
+ {
+ return;
+ }
+
+ try {
+ servlet.destroy();
+ } catch ( final Exception ignore ) {
+ // we ignore this
+ SystemLogger.error(this.getServletInfo().getServiceReference(),
+ "Error during calling destroy() on servlet " + this.servlet,
+ ignore);
+ }
+
+ servlet = null;
+ }
+}
Propchange: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/ServletHolder.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/ServletHolder.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url
Propchange: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/ServletHolder.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/WhiteboardServletHolder.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/WhiteboardServletHolder.java?rev=1679612&view=auto
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/WhiteboardServletHolder.java (added)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/WhiteboardServletHolder.java Fri May 15 18:00:22 2015
@@ -0,0 +1,74 @@
+/*
+ * 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.holder;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
+
+import org.apache.felix.http.base.internal.runtime.ServletInfo;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceObjects;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Servlet holder for servlets registered through the http whiteboard.
+ */
+public final class WhiteboardServletHolder extends ServletHolder
+{
+ private final BundleContext bundleContext;
+
+ public WhiteboardServletHolder(final ServletContext context,
+ final ServletInfo servletInfo,
+ final BundleContext bundleContext)
+ {
+ super(context, servletInfo);
+ this.bundleContext = bundleContext;
+ }
+
+ @Override
+ public int init()
+ {
+ final ServiceReference<Servlet> serviceReference = getServletInfo().getServiceReference();
+ final ServiceObjects<Servlet> so = this.bundleContext.getServiceObjects(serviceReference);
+
+ this.setServlet((so == null ? null : so.getService()));
+
+ final int reason = super.init();
+ if ( reason != -1 )
+ {
+ so.ungetService(this.getServlet());
+ this.setServlet(null);
+ }
+ return -reason;
+ }
+
+ @Override
+ public void destroy()
+ {
+ final Servlet s = this.getServlet();
+ if ( s != null )
+ {
+ super.destroy();
+
+ final ServiceObjects<Servlet> so = this.bundleContext.getServiceObjects(getServletInfo().getServiceReference());
+ if (so != null)
+ {
+ so.ungetService(s);
+ }
+ }
+ }
+}
Propchange: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/WhiteboardServletHolder.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/WhiteboardServletHolder.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url
Propchange: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/handler/holder/WhiteboardServletHolder.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/logger/SystemLogger.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/logger/SystemLogger.java?rev=1679612&r1=1679611&r2=1679612&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/logger/SystemLogger.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/logger/SystemLogger.java Fri May 15 18:00:22 2015
@@ -18,6 +18,7 @@
*/
package org.apache.felix.http.base.internal.logger;
+import org.osgi.framework.ServiceReference;
import org.osgi.service.log.LogService;
public final class SystemLogger
@@ -59,4 +60,9 @@ public final class SystemLogger
{
getLogger().log(LogService.LOG_ERROR, message, cause);
}
+
+ public static void error(ServiceReference<?> ref, String message, Throwable cause)
+ {
+ getLogger().log(ref, LogService.LOG_ERROR, message, cause);
+ }
}
Modified: felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardHttpService.java
URL: http://svn.apache.org/viewvc/felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardHttpService.java?rev=1679612&r1=1679611&r2=1679612&view=diff
==============================================================================
--- felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardHttpService.java (original)
+++ felix/trunk/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardHttpService.java Fri May 15 18:00:22 2015
@@ -55,12 +55,19 @@ public final class WhiteboardHttpService
* Register a servlet.
* @param contextInfo The servlet context helper info
* @param servletInfo The servlet info
- * @throws RegistrationFailureException
+ * @throws RegistrationFailureException
*/
public void registerServlet(@Nonnull final ContextHandler contextHandler,
@Nonnull final ServletInfo servletInfo)
throws RegistrationFailureException
{
+ // we need to check each and every pattern individually
+ if ( servletInfo.getPatterns() != null )
+ {
+ for(final String pattern : servletInfo.getPatterns() ) {
+
+ }
+ }
try
{
ServletHandler handler = new WhiteboardServletHandler(contextHandler.getContextInfo(),
@@ -80,7 +87,7 @@ public final class WhiteboardHttpService
* Unregister a servlet
* @param contextInfo The servlet context helper info
* @param servletInfo The servlet info
- * @throws RegistrationFailureException
+ * @throws RegistrationFailureException
*/
public void unregisterServlet(@Nonnull final ContextHandler contextHandler, @Nonnull final ServletInfo servletInfo) throws RegistrationFailureException
{
@@ -92,7 +99,7 @@ public final class WhiteboardHttpService
* Register a filter
* @param contextInfo The servlet context helper info
* @param filterInfo The filter info
- * @throws RegistrationFailureException
+ * @throws RegistrationFailureException
*/
public void registerFilter(@Nonnull final ContextHandler contextHandler,
@Nonnull final FilterInfo filterInfo) throws RegistrationFailureException
@@ -141,7 +148,7 @@ public final class WhiteboardHttpService
* Register a resource.
* @param contextInfo The servlet context helper info
* @param resourceInfo The resource info
- * @throws RegistrationFailureException
+ * @throws RegistrationFailureException
*/
public void registerResource(@Nonnull final ContextHandler contextHandler,
@Nonnull final ResourceInfo resourceInfo) throws RegistrationFailureException
@@ -166,7 +173,7 @@ public final class WhiteboardHttpService
* Unregister a resource.
* @param contextInfo The servlet context helper info
* @param resourceInfo The resource info
- * @throws RegistrationFailureException
+ * @throws RegistrationFailureException
*/
public void unregisterResource(@Nonnull final ContextHandler contextHandler, @Nonnull final ResourceInfo resourceInfo) throws RegistrationFailureException
{