Hi Dishara,
The ResourceResolverFactory bundle should not be using any bundle
implementing a ResourceProvider, as that would imply a circular
dependency.
It looks like your service is starting correctly as its listed as
service ID 257, component ID 103.
Looking at the code, I dont think you have defined where the
CassandraResourceProvider is "mounted", you need to set the
provider.roots property.
ie
@Component(immediate=true, metatype=true)
@Service(ResourceProvider.class)
@Properties({
@Property(name="provider.roots", value={ "/content/cassandra"})
})
public class CassandraResourceProvider implements ResourceProvider {
This tells the ResourceResolver where in the resource tree the
CassandraResourceProvider should be registered. IIRC its required for
registration. If you look at the logs carefully you might find the
ResourceResolver reporting a problem with registration.
HTH
Ian
On 11 August 2013 23:22, Dishara Wijewardana <[email protected]> wrote:
> On Sun, Aug 11, 2013 at 2:49 PM, Ian Boston <[email protected]> wrote:
>
>> Hi Dishara,
>> The Resource is not being found.
>>
>> Things to check.
>>
>> 1. Check that the CassandraResourceProvider is registered with the
>> ResourceResolver at the correct path.
>>
>> Got to
>> http://localhost:8080/system/console/services (login admin:admin)
>> Locate the CassandraResourceProvider and take a note of the service ID
>> (first column).
>> Locate the service for
>> org.apache.sling.api.resource.ResourceResolverFactory
>> Click on the bundle link in the left hand column, in my case
>> http://localhost:8080/system/console/bundles/146
>> Check that the the service ID for the CassandraResourceProvider is
>> used by this bundle.
>>
> Hi Ian, ResourceResolverFactory dos not include my bundle under using
> bundles category. Do I need to add a dependency/import to the pom which
> includes ResourceResolverFactory class ?
>
> Refer following for more information
>
> [org.apache.sling.api.resource.ResourceResolverFactory]
> Service Description Apache Sling Resource Resolver Factory
> Service Vendor The Apache Software Foundation
> Using Bundles org.apache.sling.event (52)
> org.apache.sling.jcr.resource (90)
> org.apache.sling.auth.form (91)
> org.apache.sling.servlets.resolver (71)
> org.apache.sling.auth.core (86)
> org.apache.sling.discovery.impl (75)
>
> *and here is my bundle service information.*
>
> 257 [org.apache.sling.api.resource.ResourceProvider]
> component.id 103
> component.name
> org.apache.sling.cassandra.resource.provider.CassandraResourceProvider
> Service PID
> org.apache.sling.cassandra.resource.provider.CassandraResourceProvider
> Using Bundles org.apache.sling.bundleresource.impl (74)
> org.apache.sling.resourceresolver (57)
>
>
>> 2. Put some Log statements in the CassandraResourceProvider to prove
>> that the ResourceResolver is calling it.
>>
>>
>> 3. Make certain that the Resource that the CassandrResourceProvider is
>> returning is properly formed. It has resource metadata with a
>> resourceType and path.
>>
>> You can use http://localhost:8080/system/console/jcrresolver to check
>> how URLs are resolved, or use a curl command.
>>
>> HTH
>> Ian
>>
>> On 11 August 2013 01:08, Dishara Wijewardana <[email protected]>
>> wrote:
>> > On Sat, Aug 10, 2013 at 1:47 PM, Bertrand Delacretaz <
>> [email protected]
>> >> wrote:
>> >
>> >> Hi,
>> >>
>> >> On Sat, Aug 10, 2013 at 7:02 AM, Dishara Wijewardana
>> >> <[email protected]> wrote:
>> >> > ...The integration tests
>> >> > calls to HTTP REST endpoints. So there should be a place that I
>> should be
>> >> > writing something like JAX-RS using sling APIs...
>> >>
>> >> You don't need JAX-RS, Sling provides RESTful HTTP APIs out of the box.
>> >>
>> >> > ...Apparently what I should be
>> >> > writing is something similar to PlanetsResourceProviderTest....
>> >>
>> >> Yeah can be a good starting point - setup a Sling instance with your
>> >> resource provider active and create, retrieve, update and delete
>> >> resources via Sling's HTTP API.
>> >>
>> >> You can also probably test your ResourceProvider without a Sling
>> >> instance, either with unit tests or pax exam integration tests. If you
>> >> can demonstrate there that it works according to the ResourceProvider
>> >> semantics, integration tests can be minimal and just verify that your
>> >> provider hooks up in the right way when activated.
>> >>
>> >
>> > Hi Bertrand
>> > You are quite right. My provider works standalone and wants to make sure
>> > whether my provider picked up by the sling engine. Where should I specify
>> > my provider when calling the HTTP endpoint. Or if I call to a correct
>> > resource path, will it picked it up ?
>> >
>> > I tried writing something similar to PlanetsResourceProviderTest and did
>> a
>> > HTTP GET call to the endpoint "
>> > http://localhost:8080/content/cassandra/movies/foo" and when I remotely
>> > debug the test, the http client of HTTPTestBase receives a 404 for that
>> GET
>> > call..
>> >
>> > NOTE: /content/cassandra/movies/foo is an existing resource node in
>> > cassandra and my provider capable of returning it in standalone mode.
>> >
>> > This is the BE error log..
>> >
>> > unning
>> >
>> org.apache.sling.launchpad.webapp.integrationtest.resourceprovider.CassandraResourceProviderTest
>> > Checking if the required Sling services are started (timeout 62
>> seconds)...
>> > (base URLs=http://localhost:8080 and http://localhost:8080; servlet
>> > context=)
>> > Sling services seem to be started, continuing with integration tests.
>> > Listening for transport dt_socket at address: 5006
>> > Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.472 sec
>> > <<< FAILURE!
>> >
>> testMovieResource(org.apache.sling.launchpad.webapp.integrationtest.resourceprovider.CassandraResourceProviderTest)
>> > Time elapsed: 0.437 sec <<< FAILURE!
>> > junit.framework.AssertionFailedError: Expected status 200 for
>> > http://localhost:8080/content/cassandra/movies/foo (content=<!DOCTYPE
>> HTML
>> > PUBLIC "-//IETF//DTD HTML 2.0//EN">
>> > <html>
>> > <head>
>> > <title>404 No resource found</title>
>> > </head>
>> > <body>
>> > <h1>No resource found (404)</h1>
>> > <p>The requested URL /content/cassandra/movies/foo resulted in an error
>> in
>> >
>> org.apache.sling.servlets.resolver.internal.defaults.DefaultErrorHandlerServlet.</p>
>> > <h3>Request Progress:</h3>
>> > <pre>
>> > 0 (2013-08-11 05:25:39) TIMER_START{Request Processing}
>> > 0 (2013-08-11 05:25:39) COMMENT timer_end format is {<elapsed
>> > msec>,<timer name>} <optional message>
>> > 0 (2013-08-11 05:25:39) LOG Method=GET,
>> > PathInfo=/content/cassandra/movies/foo
>> > 0 (2013-08-11 05:25:39) TIMER_START{ResourceResolution}
>> > 2 (2013-08-11 05:25:39) TIMER_END{2,ResourceResolution}
>> > URI=/content/cassandra/movies/foo resolves to
>> Resource=NonExistingResource,
>> > path=/content/cassandra/movies/foo
>> > 3 (2013-08-11 05:25:39) LOG Resource Path Info:
>> SlingRequestPathInfo:
>> > path='/content/cassandra/movies/foo', selectorString='null',
>> > extension='null', suffix='null'
>> > 3 (2013-08-11 05:25:39) TIMER_START{ServletResolution}
>> > 3 (2013-08-11 05:25:39)
>> > TIMER_START{resolveServlet(NonExistingResource,
>> > path=/content/cassandra/movies/foo)}
>> > 3 (2013-08-11 05:25:39)
>> > TIMER_END{0,resolveServlet(NonExistingResource,
>> > path=/content/cassandra/movies/foo)} Using servlet
>> > org.apache.sling.servlets.get.DefaultGetServlet
>> > 3 (2013-08-11 05:25:39) TIMER_END{0,ServletResolution}
>> > URI=/content/cassandra/movies/foo handled by
>> > Servlet=org.apache.sling.servlets.get.DefaultGetServlet
>> > 3 (2013-08-11 05:25:39) LOG Applying Requestfilters
>> > 3 (2013-08-11 05:25:39) LOG Calling filter:
>> > org.apache.sling.engine.impl.debug.RequestProgressTrackerLogFilter
>> > 3 (2013-08-11 05:25:39)
>> > TIMER_START{org.apache.sling.servlets.get.DefaultGetServlet#0}
>> > 3 (2013-08-11 05:25:39)
>> > TIMER_END{0,org.apache.sling.servlets.get.DefaultGetServlet#0}
>> > 3 (2013-08-11 05:25:39) TIMER_START{handleError:status=404}
>> > 4 (2013-08-11 05:25:39) TIMER_END{1,handleError:status=404} Using
>> > handler
>> >
>> org.apache.sling.servlets.resolver.internal.defaults.DefaultErrorHandlerServlet
>> > 5 (2013-08-11 05:25:39) TIMER_END{5,Request Processing} Dumping
>> > SlingRequestProgressTracker Entries
>> > </pre>
>> > <hr>
>> > <address>ApacheSling/2.2 (jetty/6.1.x, OpenJDK 64-Bit Server VM 1.6.0_27,
>> > Linux 3.0.0-12-generic amd64)</address>
>> > </body>
>> > </html>
>> > ) expected:<200> but was:<404>
>> > at junit.framework.Assert.fail(Assert.java:47)
>> > at junit.framework.Assert.failNotEquals(Assert.java:277)
>> > at junit.framework.Assert.assertEquals(Assert.java:64)
>> > at junit.framework.Assert.assertEquals(Assert.java:195)
>> > at
>> >
>> org.apache.sling.commons.testing.integration.HttpTestBase.getContent(HttpTestBase.java:380)
>> > at
>> >
>> org.apache.sling.commons.testing.integration.HttpTestBase.getContent(HttpTestBase.java:355)
>> > at
>> >
>> org.apache.sling.commons.testing.integration.HttpTestBase.getContent(HttpTestBase.java:347)
>> > at
>> >
>> org.apache.sling.commons.testing.integration.HttpTestBase.getContent(HttpTestBase.java:342)
>> > at
>> >
>> org.apache.sling.launchpad.webapp.integrationtest.resourceprovider.CassandraResourceProviderTest.assertStrings(CassandraResourceProviderTest.java:27)
>> > at
>> >
>> org.apache.sling.launchpad.webapp.integrationtest.resourceprovider.CassandraResourceProviderTest.testMovieResource(CassandraResourceProviderTest.java:64)
>> > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> > at
>> >
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>> > at
>> >
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>> > at java.lang.reflect.Method.invoke(Method.java:597)
>> > at junit.framework.TestCase.runTest(TestCase.java:168)
>> > at junit.framework.TestCase.runBare(TestCase.java:134)
>> > at junit.framework.TestResult$1.protect(TestResult.java:110)
>> > at junit.framework.TestResult.runProtected(TestResult.java:128)
>> > at junit.framework.TestResult.run(TestResult.java:113)
>> > at junit.framework.TestCase.run(TestCase.java:124)
>> > at junit.framework.TestSuite.runTest(TestSuite.java:232)
>> > at junit.framework.TestSuite.run(TestSuite.java:227)
>> > at
>> >
>> org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:81)
>> > at
>> >
>> org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
>> > at
>> >
>> org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
>> > at
>> >
>> org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
>> > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> > at
>> >
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>> > at
>> >
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>> > at java.lang.reflect.Method.invoke(Method.java:597)
>> > at
>> >
>> org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
>> > at
>> >
>> org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
>> > at
>> >
>> org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
>> > at
>> >
>> org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
>> > at
>> org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
>> >
>> >
>> > Results :
>> >
>> > Failed tests:
>> >
>> testMovieResource(org.apache.sling.launchpad.webapp.integrationtest.resourceprovider.CassandraResourceProviderTest):
>> > Expected status 200 for
>> > http://localhost:8080/content/cassandra/movies/foo(content=<!DOCTYPE
>> > HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">(..)
>> >
>> > Tests run: 1, Failures: 1, Errors: 0, Skipped: 0
>> >
>> > [INFO]
>> > ------------------------------------------------------------------------
>> > [INFO] BUILD FAILURE
>> > [
>> >
>> >
>> >
>> >>
>> >> -Bertrand
>> >>
>> >
>> >
>> >
>> > --
>> > Thanks
>> > /Dishara
>>
>
>
>
> --
> Thanks
> /Dishara