You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@sling.apache.org by pub cog <pu...@gmail.com> on 2009/06/03 10:26:10 UTC

Re: Geographical Datastore and Posgis integration

Thanks a lot, that's exactly the information I was looking for :)

I'll dive into this and try to make a first prototype.

Thanks again :)

On Thu, May 28, 2009 at 11:52 PM, Paul Mietz Egli <pa...@obscure.com> wrote:
> Regarding importing KML into JCR:
>
>> If that's what you meant, I didn't thought of this, why not... I need
>> to think about it...
>> search may be easier but that means I need to make some kind of
>> automatic parsing transformation to jcr ,nodes ?
>
> Try using Session.importXML() first and see if that meets your needs:
>
> http://www.day.com/maven/jsr170/javadocs/jcr-1.0/javax/jcr/Session.html#importXML(java.lang.String,%20java.io.InputStream,%20int)
>
> From the javadocs:
>
> "The tree of new items is built in the transient storage of the Session. In
> order to persist the new content, save must be called. The advantage of this
> through-the-session method is that (depending on what constraint checks the
> implementation leaves until save) structures that violate node type
> constraints can be imported, fixed and then saved. The disadvantage is that
> a large import will result in a large cache of pending nodes in the session.
> See Workspace.importXML(java.lang.String, java.io.InputStream, int) for a
> version of this method that does not go through the Session."
>
>> On an architectural point of view, I thought about having a Sling
>> server and a postgis database separate.
>>  - Sling:  will actually store files and properties associated with them
>>  - Postgis: will store only a jcr path and 'geom' informations
>>  - Java: code some java component(s) (osgi bundle ?) to synchronize both
>
>
> In Postgres, I'd suggest using a UUID of the root of the KML doc instead of
> a JCR path since paths can change.  You can then use Session.getNodeByUUID()
> to look up the KML node.
>
>> Step n°1: I was thinking to use some kind of 'hook' on ressource
>> creation/update to compute the geom and store a couple
>> (path_in_jcr/geom) in postgres/postgis
>> Should I do such a hook by "Extending the SlingPostServlet" describe
>> in "Advanced Topic" (5) ?!
>
> Sounds like your KML is arriving in the body of an HTTP POST request.  You
> could extend the SlingPostServlet as described in the docs to handle
> importing the KML (e.g. by passing the servlet input stream into
> Session.importXML).  If your geometry computations take more than a few
> hundred milliseconds, you should consider doing them in a JCR EventListener
> that gets called after your nodes are created rather than in-process with
> the HTTP request.  Rough code would be:
>
>
> /**
>  * @scr.component metatype="false" enabled="true" immediate="true"
>  * @scr.service
> interface="org.apache.sling.servlets.post.SlingPostOperation"
>  * @scr.property name="sling.post.operation" value="myoperation"
>  *
>  * @author Paul Mietz Egli
>  */
> public class MyPostOperation extends AbstractSlingPostOperation {
>    @Override
>    protected void doRun(SlingHttpServletRequest request, HtmlResponse
> response, List<Modification> changes) throws RepositoryException {
>        String basepath = "/content/kml"; // TODO use @scr.property to set
> actual value
>        Session session =
> request.getResourceResolver().adaptTo(Session.class);
>        session.importXML(basepath, request.getInputStream(),
> ImportUUIDBehavior.IMPORT_UUID_CREATE_NEW);
>        // TODO maybe set a custom node type on the root of your KML doc that
> you can use in the event listener
>    }
> }
>
>  * @scr.component metatype="true" enabled="true" immediate="true"
>  * @scr.service interface="javax.jcr.observation.EventListener"
>  *
>  * @author Paul Mietz Egli
>  */
> public class GeometryComputationEventListener implements EventListener {
>    /**
>     * @scr.reference
>     */
>    private SlingRepository     repository;
>
>    protected void activate(ComponentContext context) {
>        try {
>            String path = "/content/kml";
>            String[] nodeTypes = new String[] { "nt:unstructured" };
>            session = repository.loginAdministrative(null);
>            ObservationManager observationManager =
> session.getWorkspace().getObservationManager();
>            observationManager.addEventListener(this, Event.NODE_ADDED, path,
> true, null, nodeTypes, false);
>        }
>        catch (RepositoryException e) {}
>    }
>
>    public void onEvent(EventIterator eventIterator) {
>        while (eventIterator.hasNext()) {
>            Event event = (Event) eventIterator.next();
>            switch (event.getType()) {
>                case Event.NODE_ADDED:
>                    // TODO test node type/location to make sure you're
> seeing the root of the KML tree
>                    // TODO pull placemarks out of KML tree and convert to
> WKT for PostGIS
>                }
>            }
>        }
>    }
> }
>
>
>
>
> p.