You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jackrabbit.apache.org by "Andreas Schaefer Sr." <sc...@me.com> on 2016/05/09 15:16:58 UTC

WebDav Listener

Hi

I am trying to listen for node creation events and use WebDav connection:

session.getWorkspace().getObservationManager().addEventListener()

Unfortunately I cannot make this work neither in AEM 6.1 nor in Sling 8.

What I see is that I get a DavException: (200) OK which is cause by XML parsing error.

Looking at the content that is returned from the SlingDavExServlet is containing “<jcr:primaryType/>” which is not defined in the XML header as namespace and therefore the parsing fails (see DavMethodBase.getResponseBodyAsDocument()).

This is the content I receive from the server:

[                Change Polling] content                        DEBUG << "<dcr:eventdiscovery xmlns:dcr="http://www.day.com/jcr/webdav/1.0 <http://www.day.com/jcr/webdav/1.0>"><dcr:eventbundle><dcr:event><D:href xmlns:D="DAV:">http://localhost:4502/crx/server/crx.default/jcr%3aroot/var/discovery/impl/clusterInstances/2c6fc55d-ef6c-42be-b9ec-e90febf7e6de/lastHeartbeat</D:href><dcr:eventtype><dcr:propertychanged/></dcr:eventtype><dcr:eventuserid>admin</dcr:eventuserid> <http://localhost:4502/crx/server/crx.default/jcr%3aroot/var/discovery/impl/clusterInstances/2c6fc55d-ef6c-42be-b9ec-e90febf7e6de/lastHeartbeat%3C/D:href%3E%3Cdcr:eventtype%3E%3Cdcr:propertychanged/%3E%3C/dcr:eventtype%3E%3Cdcr:eventuserid%3Eadmin%3C/dcr:eventuserid%3E><dcr:eventuserdata/><dcr:eventdate>1462220040858</dcr:eventdate><dcr:eventidentifier>/var/discovery/impl/clusterInstances/2c6fc55d-ef6c-42be-b9ec-e90febf7e6de</dcr:eventidentifier><dcr:eventinfo><jcr:primaryType>sling:Folder</jcr:primaryType><beforeValue>2016-05-02T13:13:30.856-07:00</beforeValue><afterValue>2016-05-02T13:14:00.858-07:00</afterValue></dcr:eventinfo></dcr:event></dcr:eventbundle></dcr:eventdiscovery>”

This is an exception I see:

java.io.IOException: XML parsing error
	at org.apache.jackrabbit.webdav.client.methods.DavMethodBase.getResponseBodyAsDocument(DavMethodBase.java:130)
	at org.apache.jackrabbit.webdav.client.methods.DavMethodBase.getRootElement(DavMethodBase.java:150)
	at org.apache.jackrabbit.webdav.client.methods.PollMethod.processResponseBody(PollMethod.java:101)
	at org.apache.commons.httpclient.HttpMethodBase.readResponse(HttpMethodBase.java:1749)
	at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1098)
	at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
	at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
	at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
	at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
	at org.apache.jackrabbit.spi2dav.RepositoryServiceImpl.poll(RepositoryServiceImpl.java:2378)
	at org.apache.jackrabbit.spi2dav.RepositoryServiceImpl.getEvents(RepositoryServiceImpl.java:2179)
	at org.apache.jackrabbit.jcr2spi.WorkspaceManager$ChangePolling.run(WorkspaceManager.java:1240)
	at java.lang.Thread.run(Thread.java:745)
Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 628; The prefix "jcr" for element "jcr:primaryType" is not bound.
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
	at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:441)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368)
	at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:325)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:289)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2786)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
	at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
	at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:348)
	at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121)
	at org.apache.jackrabbit.webdav.xml.DomUtil.parseDocument(DomUtil.java:127)
	at org.apache.jackrabbit.webdav.client.methods.DavMethodBase.getResponseBodyAsDocument(DavMethodBase.java:121)
	... 12 more


I use Jackrabbit 2.10.0 to connect to the server.

This is my test code:

import org.apache.jackrabbit.commons.JcrUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.jcr.LoginException;
import javax.jcr.NoSuchWorkspaceException;
import javax.jcr.Node;
import javax.jcr.Repository;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import javax.jcr.observation.EventIterator;
import javax.jcr.observation.EventListener;

public class TestCamelMain {

    private final Logger LOG = LoggerFactory.getLogger(TestCamelMain.class);

//    public static final String URL = "http://localhost:8080/server <http://localhost:8080/server>";
    public static final String URL = "http://localhost:4502/crx/server <http://localhost:4502/crx/server>";
//    public static final String URL = "http://localhost:4502/crx/repository <http://localhost:4502/crx/repository>";
    public static final String user = "admin";
    public static final String path = "/etc/framemaker/inbox";
    private static final String WORKSPACE = "crx.default";
//    private static final String WORKSPACE = "default";

    private TestCamelMain main;
 
    public static void main(String[] args) throws Exception {
        TestCamelMain example = new TestCamelMain();
        example.boot();
    }
 
    public void boot() throws Exception {
        Session session = null;
        try
        {
            LOG.info <http://log.info/>("Getting repository.");
            final Repository repository = JcrUtils.getRepository(URL);

            LOG.info <http://log.info/>("Getting Session.");
            session = repository.login(
                new SimpleCredentials(user, user.toCharArray()),
                WORKSPACE);

            LOG.info <http://log.info/>("Getting parent node.");
            Node parent = session.getNode(path);
            if (null == parent)
            {
                LOG.error("Node not found at {}", path);
                return;
            }

	        String[] uuid = null;
//	        String uuids = getJcrEndpoint().getUuids();
//
//	        if (uuids != null) {
//	            uuids = uuids.trim();
//
//	            if (!"".equals(uuids)) {
//	                uuid = uuids.split(",");
//	            }
//	        }

	        String[] nodeTypeName = null;
//	        String nodeTypeNames = getJcrEndpoint().getNodeTypeNames();
//
//	        if (nodeTypeNames != null) {
//	            nodeTypeNames = nodeTypeNames.trim();
//
//	            if (!"".equals(nodeTypeNames)) {
//	                nodeTypeName = nodeTypeNames.split(",");
//	            }
//	        }

            session.getWorkspace().getObservationManager().addEventListener(
                new MyEventListener(),
                3,
                path,
                true,
                uuid,
                nodeTypeName,
                false
            );

            Thread.sleep(3600 * 1000);
        } catch (LoginException e)
        {
            LOG.error("Cannot login.", e);
        } catch (NoSuchWorkspaceException e)
        {
            LOG.error("No such workspace.", e);
        } catch (RepositoryException e)
        {
            LOG.error("Cannot connect to repository.", e);
        } finally {
            if (null != session) {
                session.logout();
                LOG.info <http://log.info/>("Closing session.");
            }
        }
    }

    public class MyEventListener
        implements EventListener
    {

        @Override
        public void onEvent(EventIterator events) {
            if(events != null) {
                while(events.hasNext()) {
                    LOG.info <http://log.info/>("Got Event: " + events.next());
                }
            } else {
                LOG.info <http://log.info/>("Events Iterator is null");
            }
        }
    }

}