From e5c68bdc434baea51c45f16948a615099aaa6c85 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Thu, 5 Nov 2015 11:27:31 +0000 Subject: [PATCH] - Load DocBook CND - Reactivate NodeHttp, with URI redirection git-svn-id: https://svn.argeo.org/commons/trunk@8543 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- org.argeo.cms/bnd.bnd | 1 + .../org/argeo/cms/internal/kernel/Kernel.java | 46 ++++++++++++++++++- .../cms/internal/kernel/KernelConstants.java | 2 +- .../argeo/cms/internal/kernel/NodeHttp.java | 45 ++++++++++++++++-- 4 files changed, 87 insertions(+), 7 deletions(-) diff --git a/org.argeo.cms/bnd.bnd b/org.argeo.cms/bnd.bnd index 8a63ee2a1..78fba3587 100644 --- a/org.argeo.cms/bnd.bnd +++ b/org.argeo.cms/bnd.bnd @@ -3,6 +3,7 @@ Bundle-Activator: org.argeo.cms.internal.kernel.Activator Import-Package: javax.jcr.security,\ org.xml.sax,\ org.argeo.jcr,\ +org.argeo.jcr.docbook,\ org.apache.jackrabbit.api,\ org.apache.jackrabbit.commons,\ org.apache.jackrabbit.core.security.user,\ diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java index a67900ca6..d16ce555a 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java @@ -10,6 +10,8 @@ import static org.argeo.jcr.ArgeoJcrConstants.JCR_REPOSITORY_ALIAS; import static org.argeo.util.LocaleChoice.asLocaleList; import static org.osgi.framework.Constants.FRAMEWORK_UUID; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileFilter; import java.io.IOException; @@ -21,8 +23,11 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import javax.jcr.ImportUUIDBehavior; import javax.jcr.Repository; import javax.jcr.RepositoryFactory; +import javax.jcr.Session; +import javax.jcr.SimpleCredentials; import javax.security.auth.Subject; import javax.transaction.TransactionManager; import javax.transaction.TransactionSynchronizationRegistry; @@ -38,6 +43,7 @@ import org.argeo.ArgeoLogger; import org.argeo.cms.CmsException; import org.argeo.jackrabbit.OsgiJackrabbitRepositoryFactory; import org.argeo.jcr.ArgeoJcrConstants; +import org.argeo.jcr.ArgeoJcrUtils; import org.eclipse.equinox.http.jetty.JettyConfigurator; import org.eclipse.equinox.http.jetty.JettyConstants; import org.eclipse.equinox.http.servlet.ExtendedHttpService; @@ -100,6 +106,7 @@ final class Kernel implements KernelHeader, KernelConstants, ServiceListener { private final BundleContext bc = Activator.getBundleContext(); private final NodeSecurity nodeSecurity; private DataHttp dataHttp; + private NodeHttp nodeHttp; private KernelThread kernelThread; private Locale defaultLocale = null; @@ -146,8 +153,10 @@ final class Kernel implements KernelHeader, KernelConstants, ServiceListener { // Initialise services initTransactionManager(); - repository = new NodeRepository(); - repositoryFactory = new OsgiJackrabbitRepositoryFactory(); + if (repository == null) + repository = new NodeRepository(); + if (repositoryFactory == null) + repositoryFactory = new OsgiJackrabbitRepositoryFactory(); userAdmin = new NodeUserAdmin(transactionManager, repository); // HTTP @@ -190,6 +199,10 @@ final class Kernel implements KernelHeader, KernelConstants, ServiceListener { String nodeInit = getFrameworkProp(NODE_INIT); if (nodeInit == null) nodeInit = "../../init"; + if (nodeInit.startsWith("http")) { + remoteFirstInit(nodeInit); + return; + } File initDir; if (nodeInit.startsWith(".")) initDir = KernelUtils.getExecutionDir(nodeInit); @@ -215,6 +228,32 @@ final class Kernel implements KernelHeader, KernelConstants, ServiceListener { } } + private void remoteFirstInit(String uri) { + try { + repository = new NodeRepository(); + repositoryFactory = new OsgiJackrabbitRepositoryFactory(); + Repository remoteRepository = ArgeoJcrUtils.getRepositoryByUri( + repositoryFactory, uri); + Session remoteSession = remoteRepository + .login(new SimpleCredentials("root", "demo".toCharArray()), + "main"); + Session localSession = this.repository.login(); + // FIXME register node type + // if (false) + // CndImporter.registerNodeTypes(null, localSession); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + remoteSession.exportSystemView("/", out, true, false); + ByteArrayInputStream in = new ByteArrayInputStream( + out.toByteArray()); + localSession.importXML("/", in, + ImportUUIDBehavior.IMPORT_UUID_COLLISION_THROW); + // JcrUtils.copy(remoteSession.getRootNode(), + // localSession.getRootNode()); + } catch (Exception e) { + throw new CmsException("Cannot first init from " + uri, e); + } + } + /** Can be null */ private ConfigurationAdmin findConfigurationAdmin() { configurationAdmin = bc.getServiceReference(ConfigurationAdmin.class); @@ -318,6 +357,8 @@ final class Kernel implements KernelHeader, KernelConstants, ServiceListener { if (dataHttp != null) dataHttp.destroy(); + if (nodeHttp != null) + nodeHttp.destroy(); if (userAdmin != null) userAdmin.destroy(); if (repository != null) @@ -394,6 +435,7 @@ final class Kernel implements KernelHeader, KernelConstants, ServiceListener { Object httpPort = sr.getProperty("http.port"); Object httpsPort = sr.getProperty("https.port"); dataHttp = new DataHttp(httpService, repository); + nodeHttp = new NodeHttp(httpService); if (log.isDebugEnabled()) log.debug(httpPortsMsg(httpPort, httpsPort)); } diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java index f7feb3106..693794c82 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java @@ -28,7 +28,7 @@ public interface KernelConstants { /** URI to an LDIF file or LDAP server used as initialization or backend */ final static String USERADMIN_URIS = "argeo.node.useradmin.uris"; final static String[] DEFAULT_CNDS = { "/org/argeo/jcr/argeo.cnd", - "/org/argeo/cms/cms.cnd" }; + "/org/argeo/cms/cms.cnd","/org/argeo/jcr/docbook/docbook.cnd" }; // Directories final static String DIR_NODE = "node"; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeHttp.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeHttp.java index 5e1f39acb..1d0f0be44 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeHttp.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeHttp.java @@ -6,6 +6,7 @@ import java.util.Enumeration; import javax.servlet.FilterChain; import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; @@ -20,23 +21,23 @@ import org.eclipse.equinox.http.servlet.ExtendedHttpService; * Intercepts and enriches http access, mainly focusing on security and * transactionality. */ -@Deprecated class NodeHttp implements KernelConstants, ArgeoJcrConstants { private final static Log log = LogFactory.getLog(NodeHttp.class); // Filters - private final RootFilter rootFilter; + // private final RootFilter rootFilter; // private final DoSFilter dosFilter; // private final QoSFilter qosFilter; NodeHttp(ExtendedHttpService httpService) { - rootFilter = new RootFilter(); + // rootFilter = new RootFilter(); // dosFilter = new CustomDosFilter(); // qosFilter = new QoSFilter(); try { - httpService.registerFilter("/", rootFilter, null, null); + httpService.registerServlet("/!", new LinkServlet(), null, null); + // httpService.registerFilter("/", rootFilter, null, null); } catch (Exception e) { throw new CmsException("Cannot register filters", e); } @@ -45,6 +46,42 @@ class NodeHttp implements KernelConstants, ArgeoJcrConstants { public void destroy() { } + class LinkServlet extends HttpServlet { + private static final long serialVersionUID = 3749990143146845708L; + + @Override + protected void service(HttpServletRequest request, + HttpServletResponse response) throws ServletException, + IOException { + String path = request.getPathInfo(); + String userAgent = request.getHeader("User-Agent").toLowerCase(); + boolean isBot = false; + boolean isCompatibleBrowser = false; + if (userAgent.contains("bot")) { + isBot = true; + } else if (userAgent.contains("webkit") + || userAgent.contains("gecko") + || userAgent.contains("firefox") + || userAgent.contains("msie") + || userAgent.contains("chrome") + || userAgent.contains("chromium") + || userAgent.contains("opera") + || userAgent.contains("browser")) { + isCompatibleBrowser = true; + } + + if (isCompatibleBrowser) {// redirect + response.setHeader("Location", "/#" + path); + response.setStatus(HttpServletResponse.SC_FOUND); + } else { + if (isBot && log.isDebugEnabled()) + log.debug(request.getHeader("User-Agent") + " is a bot"); + // TODO pure html + throw new UnsupportedOperationException(); + } + } + } + /** Intercepts all requests. Authenticates. */ class RootFilter extends HttpFilter { -- 2.30.2