Hi, servlets resolver needs to depend on the latest api in order to get the correct imports of the api.resource package as it implements the resource provider interface. Otherwise this doesn't resolve.
Carsten 2012/9/28 Justin Edelson <[email protected]>: > Argh. I forgot to remove my changes to the pom.xml before committing... the > environment I was testing this in didn't have the latest API jar. > > But question... is there a reason servlets.resolver should depend upon the > latest API? It works OK with a dependency on 2.1.0. > > Also, the JCR API isn't used as all. > > I'm inclined to keep my pom.xml changes unless there's a good reason for > these extra dependencies. If they are required, I'll roll back my changes. > > Regards, > Justin > > On Fri, Sep 28, 2012 at 1:17 PM, <[email protected]> wrote: > >> Author: justin >> Date: Fri Sep 28 12:17:34 2012 >> New Revision: 1391420 >> >> URL: http://svn.apache.org/viewvc?rev=1391420&view=rev >> Log: >> SLING-2562 - adding initial implementation of a servlet web console test >> tool based on work done by Konrad Windszus >> >> Added: >> sling/trunk/bundles/servlets/resolver/src/main/resources/res/ >> sling/trunk/bundles/servlets/resolver/src/main/resources/res/ui/ >> >> sling/trunk/bundles/servlets/resolver/src/main/resources/res/ui/styles.css >> (with props) >> Modified: >> sling/trunk/bundles/servlets/resolver/pom.xml >> >> sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java >> >> sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java >> >> sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java >> >> Modified: sling/trunk/bundles/servlets/resolver/pom.xml >> URL: >> http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/pom.xml?rev=1391420&r1=1391419&r2=1391420&view=diff >> >> ============================================================================== >> --- sling/trunk/bundles/servlets/resolver/pom.xml (original) >> +++ sling/trunk/bundles/servlets/resolver/pom.xml Fri Sep 28 12:17:34 2012 >> @@ -59,7 +59,6 @@ >> <configuration> >> <instructions> >> <Import-Package> >> - javax.jcr;resolution:=optional, >> org.apache.sling.api.resource;provide:=true, >> * >> </Import-Package> >> @@ -77,13 +76,9 @@ >> <artifactId>servlet-api</artifactId> >> </dependency> >> <dependency> >> - <groupId>javax.jcr</groupId> >> - <artifactId>jcr</artifactId> >> - </dependency> >> - <dependency> >> <groupId>org.apache.sling</groupId> >> <artifactId>org.apache.sling.api</artifactId> >> - <version>2.2.5-SNAPSHOT</version> >> + <version>2.2.4</version> >> <scope>provided</scope> >> </dependency> >> <dependency> >> @@ -126,7 +121,7 @@ >> <dependency> >> <groupId>org.apache.sling</groupId> >> <artifactId>org.apache.sling.commons.testing</artifactId> >> - <version>2.0.2-incubator</version> >> + <version>2.0.11-SNAPSHOT</version> >> <scope>test</scope> >> </dependency> >> <dependency> >> >> Modified: >> sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java >> URL: >> http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java?rev=1391420&r1=1391419&r2=1391420&view=diff >> >> ============================================================================== >> --- >> sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java >> (original) >> +++ >> sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java >> Fri Sep 28 12:17:34 2012 >> @@ -28,12 +28,17 @@ import static org.osgi.framework.Constan >> import static >> org.osgi.service.component.ComponentConstants.COMPONENT_NAME; >> >> import java.io.IOException; >> +import java.io.InputStream; >> +import java.io.PrintWriter; >> +import java.net.URL; >> import java.util.ArrayList; >> import java.util.Arrays; >> import java.util.Collection; >> +import java.util.Collections; >> import java.util.Dictionary; >> import java.util.HashMap; >> import java.util.Hashtable; >> +import java.util.Iterator; >> import java.util.List; >> import java.util.Map; >> import java.util.concurrent.ConcurrentHashMap; >> @@ -41,9 +46,12 @@ import java.util.concurrent.ConcurrentHa >> import javax.servlet.Servlet; >> import javax.servlet.ServletContext; >> import javax.servlet.ServletException; >> +import javax.servlet.http.HttpServlet; >> import javax.servlet.http.HttpServletRequest; >> import javax.servlet.http.HttpServletResponse; >> >> +import org.apache.commons.io.IOUtils; >> +import org.apache.commons.lang.StringUtils; >> import org.apache.felix.scr.annotations.Component; >> import org.apache.felix.scr.annotations.Properties; >> import org.apache.felix.scr.annotations.Property; >> @@ -81,6 +89,7 @@ import org.apache.sling.servlets.resolve >> import >> org.apache.sling.servlets.resolver.internal.helper.SlingServletConfig; >> import >> org.apache.sling.servlets.resolver.internal.resource.ServletResourceProvider; >> import >> org.apache.sling.servlets.resolver.internal.resource.ServletResourceProviderFactory; >> +import org.osgi.framework.BundleContext; >> import org.osgi.framework.Constants; >> import org.osgi.framework.ServiceReference; >> import org.osgi.framework.ServiceRegistration; >> @@ -232,6 +241,8 @@ public class SlingServletResolver >> */ >> private String[] defaultExtensions; >> >> + private ServletResolverWebConsolePlugin plugin; >> + >> // ---------- ServletResolver interface >> ----------------------------------- >> >> /** >> @@ -877,6 +888,8 @@ public class SlingServletResolver >> // and finally register as event listener >> this.eventHandlerReg = >> context.getBundleContext().registerService(EventHandler.class.getName(), >> this, >> properties); >> + >> + this.plugin = new >> ServletResolverWebConsolePlugin(context.getBundleContext()); >> } >> >> /** >> @@ -886,6 +899,10 @@ public class SlingServletResolver >> // stop registering of servlets immediately >> this.context = null; >> >> + if (this.plugin != null) { >> + this.plugin.dispose(); >> + } >> + >> // unregister event handler >> if (this.eventHandlerReg != null) { >> this.eventHandlerReg.unregister(); >> @@ -1139,4 +1156,243 @@ public class SlingServletResolver >> // this is deprecated, but we just delegate anyway >> return this.decorate(resource); >> } >> + >> + @SuppressWarnings("serial") >> + class ServletResolverWebConsolePlugin extends HttpServlet { >> + private static final String PARAMETER_URL = "url"; >> + private static final String PARAMETER_METHOD = "method"; >> + >> + private ServiceRegistration service; >> + >> + public ServletResolverWebConsolePlugin(BundleContext context) { >> + Dictionary<String, Object> props = new Hashtable<String, >> Object>(); >> + props.put(Constants.SERVICE_DESCRIPTION, >> + "Sling Servlet Resolver Web Console Plugin"); >> + props.put(Constants.SERVICE_VENDOR, "The Apache Software >> Foundation"); >> + props.put(Constants.SERVICE_PID, getClass().getName()); >> + props.put("felix.webconsole.label", "servletresolver"); >> + props.put("felix.webconsole.title", "Sling Servlet Resolver"); >> + props.put("felix.webconsole.css", >> "/servletresolver/res/ui/styles.css"); >> + >> + service = context.registerService( >> + new String[] { "javax.servlet.Servlet" }, this, >> props); >> + } >> + >> + public void dispose() { >> + if (service != null) { >> + service.unregister(); >> + service = null; >> + } >> + } >> + >> + class DecomposedURL { >> + final String extension; >> + final String path; >> + final String[] selectors; >> + >> + DecomposedURL(String url) { >> + if (url != null) { >> + final int lastDot = url.lastIndexOf('.'); >> + final int firstDot = url.indexOf('.'); >> + if (lastDot > 0) { >> + final int slashInExtension = url.indexOf('/', >> lastDot); >> + // strip suffix, if any >> + if (slashInExtension > 0) { >> + extension = url.substring(lastDot + 1, >> slashInExtension); >> + } else { >> + extension = url.substring(lastDot + 1); >> + } >> + >> + path = url.substring(0, firstDot); >> + if (lastDot != firstDot) { >> + // has selectors >> + final String selectorString = >> url.substring(firstDot + 1, lastDot); >> + selectors = selectorString.split("\\."); >> + } else { >> + selectors = new String[0]; >> + } >> + } else { >> + extension = ""; >> + path = url; >> + selectors = new String[0]; >> + } >> + } else { >> + extension = ""; >> + path = ""; >> + selectors = new String[0]; >> + } >> + } >> + } >> + >> + @Override >> + protected void service(HttpServletRequest request, >> HttpServletResponse response) throws ServletException, IOException { >> + final String url = request.getParameter(PARAMETER_URL); >> + final DecomposedURL decomposed = new DecomposedURL(url); >> + String method = request.getParameter(PARAMETER_METHOD); >> + if (StringUtils.isBlank(method)) { >> + method = "GET"; >> + } >> + >> + ResourceResolver resourceResolver = null; >> + try { >> + resourceResolver = >> resourceResolverFactory.getAdministrativeResourceResolver(null); >> + >> + final PrintWriter pw = response.getWriter(); >> + >> + pw.print("<form method='get'>"); >> + pw.println("<table class='content' cellpadding='0' >> cellspacing='0' width='100%'>"); >> + >> + titleHtml( >> + pw, >> + "Servlet Resolver Test", >> + "To check which servlet is responsible for >> rendering a response, enter a request path into " + >> + "the field and click 'Resolve' to >> resolve it."); >> + >> + tr(pw); >> + tdLabel(pw, "URL"); >> + tdContent(pw); >> + >> + pw.println("<input type='text' name='" + PARAMETER_URL + >> "' value='" + >> + (url != null ? url : "") + "' class='input' >> size='50'>"); >> + closeTd(pw); >> + closeTr(pw); >> + closeTr(pw); >> + >> + tr(pw); >> + tdLabel(pw, "Method"); >> + tdContent(pw); >> + pw.println("<select name='" + PARAMETER_METHOD + "'>"); >> + pw.println("<option value='GET'>GET</option>"); >> + pw.println("<option value='POST'>POST</option>"); >> + pw.println("</select>"); >> + pw.println(" <input type='submit'" + >> + "' value='Resolve' class='submit'>"); >> + >> + closeTd(pw); >> + closeTr(pw); >> + >> + if (StringUtils.isNotBlank(url)) { >> + tr(pw); >> + tdLabel(pw, "Decomposed URL"); >> + tdContent(pw); >> + pw.println("<dl>"); >> + pw.println("<dt>Path</dt>"); >> + pw.println("<dd>" + decomposed.path + "</dd>"); >> + pw.println("<dt>Selectors</dt>"); >> + pw.print("<dd>"); >> + if (decomposed.selectors.length == 0) { >> + pw.print("<none>"); >> + } else { >> + pw.print("["); >> + pw.print(StringUtils.join(decomposed.selectors, >> ", ")); >> + pw.print("]"); >> + } >> + pw.println("</dd>"); >> + pw.println("<dt>Extension</dt>"); >> + pw.println("<dd>" + decomposed.extension + "</dd>"); >> + pw.println("</dl>"); >> + closeTd(pw); >> + closeTr(pw); >> + } >> + >> + if (StringUtils.isNotBlank(decomposed.path)) { >> + final Collection<Resource> servlets; >> + Resource resource = >> resourceResolver.resolve(decomposed.path); >> + if (resource.adaptTo(Servlet.class) != null) { >> + servlets = Collections.singleton(resource); >> + } else { >> + final ResourceCollector locationUtil = >> ResourceCollector.create(resource, defaultWorkspaceName, >> decomposed.extension, executionPaths, defaultExtensions, method, >> decomposed.selectors); >> + servlets = >> locationUtil.getServlets(resourceResolver); >> + } >> + tr(pw); >> + tdLabel(pw, " "); >> + tdContent(pw); >> + >> + if (servlets == null || servlets.isEmpty()) { >> + pw.println("Could not find a suitable servlet for >> this request!"); >> + } else { >> + pw.println("Candidate servlets and scripts in >> order of preference:<br/>"); >> + pw.println("<ol class='servlets'>"); >> + Iterator<Resource> iterator = servlets.iterator(); >> + outputServlets(pw, iterator); >> + pw.println("</ol>"); >> + } >> + pw.println("</td>"); >> + closeTr(pw); >> + } >> + >> + pw.println("</table>"); >> + pw.print("</form>"); >> + } catch (LoginException e) { >> + throw new ServletException(e); >> + } finally { >> + if (resourceResolver != null) { >> + resourceResolver.close(); >> + } >> + } >> + } >> + >> + private void tdContent(final PrintWriter pw) { >> + pw.print("<td class='content' colspan='2'>"); >> + } >> + >> + private void closeTd(final PrintWriter pw) { >> + pw.print("</td>"); >> + } >> + >> + @SuppressWarnings("unused") >> + private URL getResource(final String path) { >> + if (path.startsWith("/servletresolver/res/ui")) { >> + return this.getClass().getResource(path.substring(16)); >> + } else { >> + return null; >> + } >> + } >> + >> + private void closeTr(final PrintWriter pw) { >> + pw.println("</tr>"); >> + } >> + >> + private void tdLabel(final PrintWriter pw, final String label) { >> + pw.println("<td class='content'>" + label + "</td>"); >> + } >> + >> + private void tr(final PrintWriter pw) { >> + pw.println("<tr class='content'>"); >> + } >> + >> + private void outputServlets(PrintWriter pw, Iterator<Resource> >> iterator) { >> + while (iterator.hasNext()) { >> + Resource candidateResource = iterator.next(); >> + Servlet candidate = >> candidateResource.adaptTo(Servlet.class); >> + if (candidate != null) { >> + boolean isOptingServlet = false; >> + >> + if (candidate instanceof SlingScript) { >> + pw.println("<li>" + candidateResource.getPath() + >> "</li>"); >> + } else { >> + if (candidate instanceof OptingServlet) { >> + isOptingServlet = true; >> + } >> + pw.println("<li>" + >> candidate.getClass().getName() + (isOptingServlet ? " (OptingServlet)" : >> "") + "</li>"); >> + } >> + } >> + } >> + } >> + >> + private void titleHtml(PrintWriter pw, String title, String >> description) { >> + tr(pw); >> + pw.println("<th colspan='3' class='content container'>" + >> title + >> + "</th>"); >> + closeTr(pw); >> + >> + if (description != null) { >> + tr(pw); >> + pw.println("<td colspan='3' class='content'>" + >> description + >> + "</th>"); >> + closeTr(pw); >> + } >> + } >> + >> + } >> } >> >> Modified: >> sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java >> URL: >> http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java?rev=1391420&r1=1391419&r2=1391420&view=diff >> >> ============================================================================== >> --- >> sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java >> (original) >> +++ >> sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/helper/ResourceCollector.java >> Fri Sep 28 12:17:34 2012 >> @@ -18,10 +18,12 @@ >> */ >> package org.apache.sling.servlets.resolver.internal.helper; >> >> +import java.util.Arrays; >> import java.util.Iterator; >> import java.util.Set; >> >> import org.apache.commons.lang.ArrayUtils; >> +import org.apache.commons.lang.StringUtils; >> import org.apache.sling.api.SlingHttpServletRequest; >> import org.apache.sling.api.request.RequestPathInfo; >> import org.apache.sling.api.resource.Resource; >> @@ -86,8 +88,20 @@ public class ResourceCollector extends A >> public static ResourceCollector create( >> final SlingHttpServletRequest request, final String >> workspaceName, >> final String[] executionPaths, final String[] >> defaultExtensions) { >> - boolean isDefaultExtension = >> ArrayUtils.contains(defaultExtensions, >> request.getRequestPathInfo().getExtension()); >> - return new ResourceCollector(request, workspaceName, >> executionPaths, isDefaultExtension); >> + final RequestPathInfo requestPathInfo = >> request.getRequestPathInfo(); >> + final boolean isDefaultExtension = >> ArrayUtils.contains(defaultExtensions, requestPathInfo.getExtension()); >> + return new ResourceCollector(request.getResource(), >> workspaceName, requestPathInfo.getExtension(), executionPaths, >> isDefaultExtension, >> + request.getMethod(), requestPathInfo.getSelectors()); >> + } >> + >> + public static ResourceCollector create(final Resource resource, >> + final String workspaceName, >> + final String extension, >> + final String[] executionPaths, final String[] >> defaultExtensions, >> + final String methodName, final String[] selectors >> + ) { >> + boolean isDefaultExtension = >> ArrayUtils.contains(defaultExtensions, extension); >> + return new ResourceCollector(resource, workspaceName, extension, >> executionPaths, isDefaultExtension, methodName, selectors); >> } >> >> /** >> @@ -133,7 +147,7 @@ public class ResourceCollector extends A >> >> /** >> * Creates a <code>ResourceCollector</code> finding servlets and >> scripts for >> - * the given <code>methodName</code>. >> + * the given <code>resource</code>. >> * >> * @param methodName The <code>methodName</code> used to find scripts >> for. >> * This must not be <code>null</code>. >> @@ -144,34 +158,35 @@ public class ResourceCollector extends A >> * {@link >> org.apache.sling.servlets.resolver.internal.ServletResolverConstants#DEFAULT_SERVLET_NAME} >> * is assumed. >> */ >> - private ResourceCollector(final SlingHttpServletRequest request, >> - final String workspaceName, final String[] executionPaths, >> - final boolean isDefaultExtension) { >> + private ResourceCollector(final Resource resource, >> + final String workspaceName, final String extension, >> + final String[] executionPaths, >> + final boolean isDefaultExtension, >> + final String methodName, >> + final String[] selectors) { >> super(ServletResolverConstants.DEFAULT_SERVLET_NAME, >> - request.getResource().getResourceType(), >> - request.getResource().getResourceSuperType(), workspaceName, >> - request.getRequestPathInfo().getExtension(), executionPaths); >> - this.methodName = request.getMethod(); >> - >> - this.suffExt = "." + extension; >> - this.suffMethod = "." + methodName; >> - this.suffExtMethod = suffExt + suffMethod; >> - >> - RequestPathInfo requestpaInfo = request.getRequestPathInfo(); >> - >> - this.requestSelectors = requestpaInfo.getSelectors(); >> - this.numRequestSelectors = requestSelectors.length; >> - >> - this.isGet = "GET".equals(methodName) || >> "HEAD".equals(methodName); >> - this.isDefaultExtension = isDefaultExtension; >> - >> - // create the hash code once >> - final String key = methodName + ':' + baseResourceType + ':' >> - + extension + ':' + requestpaInfo.getSelectorString() + ':' >> - + (this.resourceType == null ? "" : this.resourceType) + ':' >> - + (this.resourceSuperType == null ? "" : >> this.resourceSuperType) >> - + ':' + (this.workspaceName == null ? "" : >> this.workspaceName); >> - this.hashCode = key.hashCode(); >> + resource.getResourceType(), >> + resource.getResourceSuperType(), workspaceName, >> + extension, executionPaths); >> + this.methodName = methodName; >> + >> + this.suffExt = "." + extension; >> + this.suffMethod = "." + methodName; >> + this.suffExtMethod = suffExt + suffMethod; >> + >> + this.requestSelectors = selectors; >> + this.numRequestSelectors = requestSelectors.length; >> + >> + this.isGet = "GET".equals(methodName) || >> "HEAD".equals(methodName); >> + this.isDefaultExtension = isDefaultExtension; >> + >> + // create the hash code once >> + final String key = methodName + ':' + baseResourceType + ':' >> + + extension + ':' + StringUtils.join(requestSelectors, >> '.') + ':' >> + + (this.resourceType == null ? "" : this.resourceType) + >> ':' >> + + (this.resourceSuperType == null ? "" : >> this.resourceSuperType) >> + + ':' + (this.workspaceName == null ? "" : >> this.workspaceName); >> + this.hashCode = key.hashCode(); >> } >> >> protected void getWeightedResources(final Set<Resource> resources, >> >> Added: >> sling/trunk/bundles/servlets/resolver/src/main/resources/res/ui/styles.css >> URL: >> http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/resources/res/ui/styles.css?rev=1391420&view=auto >> >> ============================================================================== >> --- >> sling/trunk/bundles/servlets/resolver/src/main/resources/res/ui/styles.css >> (added) >> +++ >> sling/trunk/bundles/servlets/resolver/src/main/resources/res/ui/styles.css >> Fri Sep 28 12:17:34 2012 >> @@ -0,0 +1,30 @@ >> +/* >> + * 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. >> + */ >> +ol.servlets { >> + margin-top: 10px; >> +} >> +ol.servlets li { >> + list-style: decimal; >> + margin-left: 20px; >> +} >> + >> +.content dt { >> + font-weight: bold; >> +} >> +.content dd { >> + margin-left: 10px; >> +} >> \ No newline at end of file >> >> Propchange: >> sling/trunk/bundles/servlets/resolver/src/main/resources/res/ui/styles.css >> >> ------------------------------------------------------------------------------ >> svn:eol-style = native >> >> Propchange: >> sling/trunk/bundles/servlets/resolver/src/main/resources/res/ui/styles.css >> >> ------------------------------------------------------------------------------ >> svn:keywords = Author Date Id Revision Rev URL >> >> Modified: >> sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java >> URL: >> http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java?rev=1391420&r1=1391419&r2=1391420&view=diff >> >> ============================================================================== >> --- >> sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java >> (original) >> +++ >> sling/trunk/bundles/servlets/resolver/src/test/java/org/apache/sling/servlets/resolver/internal/SlingServletResolverTest.java >> Fri Sep 28 12:17:34 2012 >> @@ -24,6 +24,7 @@ import static org.junit.Assert.assertTru >> >> import java.lang.reflect.Field; >> import java.util.ArrayList; >> +import java.util.Dictionary; >> import java.util.List; >> import java.util.Map; >> >> @@ -38,6 +39,7 @@ import org.apache.sling.api.resource.Res >> import org.apache.sling.api.resource.ResourceUtil; >> import org.apache.sling.api.servlets.OptingServlet; >> import org.apache.sling.commons.testing.osgi.MockBundle; >> +import org.apache.sling.commons.testing.osgi.MockBundleContext; >> import org.apache.sling.commons.testing.osgi.MockComponentContext; >> import org.apache.sling.commons.testing.osgi.MockServiceReference; >> import org.apache.sling.commons.testing.sling.MockResource; >> @@ -51,6 +53,7 @@ import org.junit.Before; >> import org.junit.Test; >> import org.junit.runner.RunWith; >> import org.osgi.framework.Constants; >> +import org.osgi.framework.ServiceRegistration; >> >> @RunWith(JMock.class) >> public class SlingServletResolverTest { >> @@ -115,8 +118,19 @@ public class SlingServletResolverTest { >> resolverField.set(servletResolver, factory); >> >> MockBundle bundle = new MockBundle(1L); >> + MockBundleContext bundleContext = new MockBundleContext(bundle) { >> + @Override >> + public ServiceRegistration registerService(String s, Object >> o, Dictionary dictionary) { >> + return null; >> + } >> + >> + @Override >> + public ServiceRegistration registerService(String[] strings, >> Object o, Dictionary dictionary) { >> + return null; >> + } >> + }; >> MockComponentContext mockComponentContext = new >> MockComponentContext( >> - bundle, SlingServletResolverTest.this.servlet); >> + bundleContext, SlingServletResolverTest.this.servlet); >> MockServiceReference serviceReference = new >> MockServiceReference(bundle); >> serviceReference.setProperty(Constants.SERVICE_ID, 1L); >> serviceReference.setProperty(SLING_SERLVET_NAME, >> >> >> -- Carsten Ziegeler [email protected]
