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.