- Load DocBook CND
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 5 Nov 2015 11:27:31 +0000 (11:27 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 5 Nov 2015 11:27:31 +0000 (11:27 +0000)
- 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
org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeHttp.java

index 8a63ee2a17594fbe7b792bde3437bda49e501dbb..78fba358772926805ca9a4f157cfa14795be3687 100644 (file)
@@ -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,\
index a67900ca69873885e1bd551fbfcbd68c4444a0c5..d16ce555a01e962c2cd5f69e8913048d7c0bcc46 100644 (file)
@@ -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));
        }
index f7feb3106f0057cc977a7d355b7b680c06009046..693794c8220465dfd51e31394cacd5bced71ec59 100644 (file)
@@ -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";
index 5e1f39acb1f7a57d0651a0976a5c0cc786a781a1..1d0f0be446f7591e55f94cb0ba11c2d7d5ffc1cc 100644 (file)
@@ -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 {