Adapt to Java 11
authorMathieu Baudier <mbaudier@argeo.org>
Tue, 19 Mar 2019 10:15:32 +0000 (11:15 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Tue, 19 Mar 2019 10:15:32 +0000 (11:15 +0100)
47 files changed:
demo/log4j.properties
dep/org.argeo.dep.cms.client/pom.xml
dep/org.argeo.dep.cms.e4.rap/pom.xml
dep/org.argeo.dep.cms.node/pom.xml
dep/org.argeo.dep.cms.platform/pom.xml
org.argeo.cms.e4.rap/OSGI-INF/cms-admin-rap.xml
org.argeo.cms.e4.rap/bnd.bnd
org.argeo.cms.e4.rap/src/org/argeo/cms/e4/rap/CmsE4AdminApp.java
org.argeo.cms.e4/bnd.bnd
org.argeo.cms.ui.workbench.rap/src/org/argeo/cms/ui/workbench/rap/RapWorkbenchLogin.java
org.argeo.cms.ui.workbench.rap/src/org/argeo/cms/ui/workbench/rap/SpnegoWorkbenchLogin.java
org.argeo.cms.ui.workbench/bnd.bnd
org.argeo.cms.ui.workbench/src/org/argeo/cms/spring/AbstractSystemExecution.java [new file with mode: 0644]
org.argeo.cms.ui.workbench/src/org/argeo/cms/spring/AuthenticatedApplicationContextInitialization.java [new file with mode: 0644]
org.argeo.cms.ui.workbench/src/org/argeo/cms/spring/SimpleRoleRegistration.java [new file with mode: 0644]
org.argeo.cms.ui.workbench/src/org/argeo/cms/spring/osgi/OsgiModuleLabel.java [new file with mode: 0644]
org.argeo.cms.ui/src/org/argeo/cms/ui/internal/ImageManagerImpl.java
org.argeo.cms.ui/src/org/argeo/cms/widgets/auth/CmsLogin.java
org.argeo.cms.ui/src/org/argeo/cms/widgets/auth/LocaleChoice.java
org.argeo.cms/bnd.bnd
org.argeo.cms/pom.xml
org.argeo.cms/src/org/argeo/cms/CmsMsg.java
org.argeo.cms/src/org/argeo/cms/LocaleUtils.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/Localized.java [new file with mode: 0644]
org.argeo.cms/src/org/argeo/cms/i18n/LocaleUtils.java
org.argeo.cms/src/org/argeo/cms/i18n/Localized.java
org.argeo.cms/src/org/argeo/cms/internal/jcr/RepositoryBuilder.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsInstance.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsShutdown.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsState.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/HomeRepository.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelThread.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeHttp.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeRepositoryFactory.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeUserAdmin.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/SecurityProfile.java
org.argeo.cms/src/org/argeo/cms/security/ChecksumFactory.java
org.argeo.cms/src/org/argeo/cms/spring/AbstractSystemExecution.java [deleted file]
org.argeo.cms/src/org/argeo/cms/spring/AuthenticatedApplicationContextInitialization.java [deleted file]
org.argeo.cms/src/org/argeo/cms/spring/SimpleRoleRegistration.java [deleted file]
org.argeo.cms/src/org/argeo/cms/spring/osgi/OsgiModuleLabel.java [deleted file]
org.argeo.ext.jackrabbit/bnd.bnd
org.argeo.jcr/src/org/argeo/jcr/fs/BinaryChannel.java
org.argeo.jcr/src/org/argeo/jcr/fs/JcrFileSystemProvider.java
rcp/org.argeo.eclipse.ui.rcp/bnd.bnd

index 05932ba6cd5a9621c575017d161a84f499c8735e..bf3f291a50f4c051eadacb276a3fe903ae0eea24 100644 (file)
@@ -1,13 +1,11 @@
 log4j.rootLogger=WARN, development
 
 log4j.logger.org.argeo=DEBUG
-log4j.logger.org.argeo.cms.internal=TRACE
-log4j.logger.org.argeo.cms.viewers=TRACE
 
 ## Appenders
 log4j.appender.console=org.apache.log4j.ConsoleAppender
 log4j.appender.console.layout=org.apache.log4j.PatternLayout
-log4j.appender.console.layout.ConversionPattern= %-5p %d{ISO8601} %m - %c - [%t]%n
+log4j.appender.console.layout.ConversionPattern= %-5p %d{ISO8601} %m %n
 
 log4j.appender.development=org.apache.log4j.ConsoleAppender
 log4j.appender.development.layout=org.apache.log4j.PatternLayout
index 1df3b1d0bb2e924b593d257f880d4c677543ca8f..5ac0d6f3e9379f03522602bd340ac13101f46694 100644 (file)
@@ -62,6 +62,7 @@
                        <groupId>org.argeo.tp.misc</groupId>
                        <artifactId>org.slf4j.commons.logging</artifactId>
                </dependency>
+               
                <dependency>
                        <groupId>org.argeo.tp.bouncycastle</groupId>
                        <artifactId>bcprov</artifactId>
@@ -74,6 +75,7 @@
                        <groupId>org.argeo.tp.bouncycastle</groupId>
                        <artifactId>bcpg</artifactId>
                </dependency>
+               
                <dependency>
                        <groupId>org.argeo.tp.apache</groupId>
                        <artifactId>org.apache.httpcomponents.httpcore</artifactId>
index 7f2ffcd17b601cc587b16cbfaf15c96284ab19a5..19748d7af6317d3e6bcdc0403a500bafac70355c 100644 (file)
                </dependency>
 
                <!-- Misc Third Parties -->
-               <dependency>
-                       <groupId>org.argeo.tp.bouncycastle</groupId>
-                       <artifactId>bcmail</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.bouncycastle</groupId>
-                       <artifactId>bcpg</artifactId>
-               </dependency>
+<!--           <dependency> -->
+<!--                   <groupId>org.argeo.tp.bouncycastle</groupId> -->
+<!--                   <artifactId>bcmail</artifactId> -->
+<!--           </dependency> -->
+<!--           <dependency> -->
+<!--                   <groupId>org.argeo.tp.bouncycastle</groupId> -->
+<!--                   <artifactId>bcpg</artifactId> -->
+<!--           </dependency> -->
                <dependency>
                        <groupId>org.argeo.tp.apache.ant</groupId>
                        <artifactId>org.apache.ant</artifactId>
                <!-- <groupId>org.argeo.tp.misc</groupId> -->
                <!-- <artifactId>org.quartz-scheduler.quartz.jobs</artifactId> -->
                <!-- </dependency> -->
-               <dependency>
-                       <groupId>org.argeo.tp.javax</groupId>
-                       <artifactId>javax.mail</artifactId>
-               </dependency>
+<!--           <dependency> -->
+<!--                   <groupId>org.argeo.tp.javax</groupId> -->
+<!--                   <artifactId>javax.mail</artifactId> -->
+<!--           </dependency> -->
 
                <!-- Nebula -->
                <dependency>
                        <artifactId>org.eclipse.rap.nebula.jface.gridviewer</artifactId>
                </dependency>
 
-
-               <!-- Spring -->
-               <dependency>
-                       <groupId>org.argeo.tp.spring</groupId>
-                       <artifactId>org.springframework.aspects</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.spring</groupId>
-                       <artifactId>org.springframework.context.support</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.spring</groupId>
-                       <artifactId>org.springframework.jdbc</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.spring</groupId>
-                       <artifactId>org.springframework.tx</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.spring</groupId>
-                       <artifactId>org.springframework.web</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.spring</groupId>
-                       <artifactId>org.springframework.web.servlet</artifactId>
-               </dependency>
-
                <!-- Eclipse Core -->
                <dependency>
                        <groupId>org.argeo.tp.rap.e4</groupId>
index 8e70bb829132a108e9d0fea8ed2d9c8cf18c9c36..e956db9e0d9a49bd438b0dc34154e4f361f6e32b 100644 (file)
@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
                <groupId>org.argeo.commons</groupId>
 
                <!-- CMS Dependencies -->
                <!-- TODO: not bitronix dependent -->
-               <dependency>
-                       <groupId>org.argeo.tp.misc</groupId>
-                       <artifactId>bitronix.tm</artifactId>
-               </dependency>
+               <!-- <dependency> -->
+               <!-- <groupId>org.argeo.tp.misc</groupId> -->
+               <!-- <artifactId>bitronix.tm</artifactId> -->
+               <!-- </dependency> -->
                <!-- <dependency> -->
                <!-- <groupId>org.argeo.tp.misc</groupId> -->
                <!-- <artifactId>org.joda.time</artifactId> -->
                </dependency>
 
 
-               <!-- TODO: remove Spring dependency -->
-               <dependency>
-                       <groupId>org.argeo.tp.spring</groupId>
-                       <artifactId>org.springframework.beans</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.spring</groupId>
-                       <artifactId>org.springframework.core</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.javax</groupId>
-                       <artifactId>javax.el</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.gemini</groupId>
-                       <artifactId>org.eclipse.gemini.blueprint.core</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.gemini</groupId>
-                       <artifactId>org.eclipse.gemini.blueprint.extender</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.gemini</groupId>
-                       <artifactId>org.eclipse.gemini.blueprint.io</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.misc</groupId>
-                       <artifactId>org.aspectj.weaver</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.misc</groupId>
-                       <artifactId>org.aopalliance</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.spring</groupId>
-                       <artifactId>org.springframework.aop</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.spring</groupId>
-                       <artifactId>org.springframework.context</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.spring</groupId>
-                       <artifactId>org.springframework.expression</artifactId>
-               </dependency>
-               <dependency>
-                       <groupId>org.argeo.tp.spring</groupId>
-                       <artifactId>org.springframework.instrument</artifactId>
-               </dependency>
-
                <!-- HTTP Server -->
                <dependency>
                        <groupId>org.argeo.tp.equinox</groupId>
index 093905befed64319bd62cf2c9c03d5ef8e611faf..3664967a5243476b6980dd9cd2a2d0df14dc8d7f 100644 (file)
                        <artifactId>javax.mail</artifactId>
                </dependency>
 
+               <!-- Base Spring dependency -->
+               <dependency>
+                       <groupId>org.argeo.tp.spring</groupId>
+                       <artifactId>org.springframework.beans</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.spring</groupId>
+                       <artifactId>org.springframework.core</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.javax</groupId>
+                       <artifactId>javax.el</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.gemini</groupId>
+                       <artifactId>org.eclipse.gemini.blueprint.core</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.gemini</groupId>
+                       <artifactId>org.eclipse.gemini.blueprint.extender</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.gemini</groupId>
+                       <artifactId>org.eclipse.gemini.blueprint.io</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.misc</groupId>
+                       <artifactId>org.aspectj.weaver</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.misc</groupId>
+                       <artifactId>org.aopalliance</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.spring</groupId>
+                       <artifactId>org.springframework.aop</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.spring</groupId>
+                       <artifactId>org.springframework.context</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.spring</groupId>
+                       <artifactId>org.springframework.expression</artifactId>
+               </dependency>
+               <dependency>
+                       <groupId>org.argeo.tp.spring</groupId>
+                       <artifactId>org.springframework.instrument</artifactId>
+               </dependency>
+
                <!-- Spring -->
                <dependency>
                        <groupId>org.argeo.tp.spring</groupId>
index 26b454a7e3352ab41c7714d0a889708c3e438fa3..1f688baa6f6efab32c8e7aa1391a2b19d0d7c644 100644 (file)
@@ -3,6 +3,6 @@
    <implementation class="org.argeo.cms.e4.rap.CmsE4AdminApp"/>
    <service>
       <provide interface="org.eclipse.rap.rwt.application.ApplicationConfiguration"/>
-      <property name="contextName" type="String" value="cmsXXX"/>
+      <property name="contextName" type="String" value="cms"/>
    </service>
 </scr:component>
index d06e1052b91c38722a4c45ba934fbd53b6eabc2b..da09b3f8bc076dc6851d9111c0bbe54cc990fac9 100644 (file)
@@ -1,14 +1,13 @@
 Bundle-ActivationPolicy: lazy
-#Service-Component: OSGI-INF/cms-admin-rap.xml,\
+Service-Component: OSGI-INF/cms-admin-rap.xml
 #OSGI-INF/cms-demo-rap.xml
 
-Bundle-Activator: org.argeo.cms.script.ScriptAppActivator
+#Bundle-Activator: org.argeo.cms.script.ScriptAppActivator
 
 Import-Package: org.argeo.node,\
 org.eclipse.swt,\
 org.eclipse.swt.graphics,\
 org.eclipse.e4.ui.workbench,\
 org.eclipse.rap.rwt.client,\
-org.argeo.cms.script,\
 org.eclipse.nebula.widgets.richtext;resolution:=optional,\
 *
index 4921680d7eff3ebc774d4a271718f6b3cdb5a13f..0650274c56a2804147840b88f6c10713f4a657b3 100644 (file)
@@ -2,7 +2,7 @@ package org.argeo.cms.e4.rap;
 
 public class CmsE4AdminApp extends AbstractRapE4App {
        public CmsE4AdminApp() {
-               setPageTitle("CMS Admin");
+               setPageTitle("Argeo CMS DevOps");
                setE4Xmi("org.argeo.cms.e4/e4xmi/cms-devops.e4xmi");
                setPath("/devops");
        }
index 78392903c0bc51c928ff83bce17ae552114c8826..4673ba1343020fddd02869a089a83a209808eafc 100644 (file)
@@ -8,9 +8,9 @@ org.eclipse.swt.widgets;version="0.0.0",\
 org.eclipse.e4.ui.model.application.ui,\
 org.eclipse.e4.ui.model.application,\
 javax.jcr.nodetype,\
+org.argeo.cms,\
 org.argeo.jcr.docbook,\
 org.eclipse.core.commands.common,\
 org.eclipse.jface.window,\
 org.argeo.cms.widgets.auth,\
-org.argeo.cms.i18n,\
 *
index 73aac8282b55e80aa572dcfdf81937e3f53367a6..353f3e9297ab46ae1f7f6d46be4dff6b52d85083 100644 (file)
@@ -76,10 +76,10 @@ public class RapWorkbenchLogin extends LoginEntryPoint {
        @Override
        protected void extendsCredentialsBlock(Composite credentialsBlock, Locale selectedLocale,
                        SelectionListener loginSelectionListener) {
-               Button loginButton = new Button(credentialsBlock, SWT.PUSH);
-               loginButton.setText(CmsMsg.login.lead(selectedLocale));
-               loginButton.setLayoutData(CmsUtils.fillWidth());
-               loginButton.addSelectionListener(loginSelectionListener);
+//             Button loginButton = new Button(credentialsBlock, SWT.PUSH);
+//             loginButton.setText(CmsMsg.login.lead(selectedLocale));
+//             loginButton.setLayoutData(CmsUtils.fillWidth());
+//             loginButton.addSelectionListener(loginSelectionListener);
        }
 
        @Override
index 2f4ef095b401761157e522df7905516cadfd6905..412fecfc6664afb988389cb7c28605ebe727d014 100644 (file)
@@ -85,10 +85,10 @@ public class SpnegoWorkbenchLogin extends LoginEntryPoint {
        @Override
        protected void extendsCredentialsBlock(Composite credentialsBlock, Locale selectedLocale,
                        SelectionListener loginSelectionListener) {
-               Button loginButton = new Button(credentialsBlock, SWT.PUSH);
-               loginButton.setText(CmsMsg.login.lead(selectedLocale));
-               loginButton.setLayoutData(CmsUtils.fillWidth());
-               loginButton.addSelectionListener(loginSelectionListener);
+//             Button loginButton = new Button(credentialsBlock, SWT.PUSH);
+//             loginButton.setText(CmsMsg.login.lead(selectedLocale));
+//             loginButton.setLayoutData(CmsUtils.fillWidth());
+//             loginButton.addSelectionListener(loginSelectionListener);
        }
 
        @Override
index 83095b767b8c206c9af189808ac621700389f018..da2875c31ce73ddfb33907c2d5ed2253f8f87183 100644 (file)
@@ -6,8 +6,8 @@ Require-Bundle: org.eclipse.core.runtime,\
 org.eclipse.core.commands
 
 Import-Package:        org.argeo.cms.auth,\
+org.argeo.cms,\
 org.argeo.cms.ui,\
-org.argeo.cms.i18n,\
 org.argeo.eclipse.spring,\
 org.argeo.eclipse.ui.utils,\
 org.eclipse.core.runtime.jobs,\
diff --git a/org.argeo.cms.ui.workbench/src/org/argeo/cms/spring/AbstractSystemExecution.java b/org.argeo.cms.ui.workbench/src/org/argeo/cms/spring/AbstractSystemExecution.java
new file mode 100644 (file)
index 0000000..ce92c46
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2007-2012 Argeo GmbH
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.argeo.cms.spring;
+
+import javax.security.auth.Subject;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.cms.CmsException;
+import org.argeo.node.NodeConstants;
+
+/** Provides base method for executing code with system authorization. */
+abstract class AbstractSystemExecution {
+       private final static Log log = LogFactory.getLog(AbstractSystemExecution.class);
+       private final Subject subject = new Subject();
+
+       /** Authenticate the calling thread */
+       protected void authenticateAsSystem() {
+               ClassLoader origClassLoader = Thread.currentThread().getContextClassLoader();
+               Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+               try {
+                       LoginContext lc = new LoginContext(NodeConstants.LOGIN_CONTEXT_DATA_ADMIN, subject);
+                       lc.login();
+               } catch (LoginException e) {
+                       throw new CmsException("Cannot login as system", e);
+               } finally {
+                       Thread.currentThread().setContextClassLoader(origClassLoader);
+               }
+               if (log.isTraceEnabled())
+                       log.trace("System authenticated");
+       }
+
+       protected void deauthenticateAsSystem() {
+               ClassLoader origClassLoader = Thread.currentThread().getContextClassLoader();
+               Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+               try {
+                       LoginContext lc = new LoginContext(NodeConstants.LOGIN_CONTEXT_DATA_ADMIN, subject);
+                       lc.logout();
+               } catch (LoginException e) {
+                       throw new CmsException("Cannot logout as system", e);
+               } finally {
+                       Thread.currentThread().setContextClassLoader(origClassLoader);
+               }
+       }
+
+       protected Subject getSubject() {
+               return subject;
+       }
+}
diff --git a/org.argeo.cms.ui.workbench/src/org/argeo/cms/spring/AuthenticatedApplicationContextInitialization.java b/org.argeo.cms.ui.workbench/src/org/argeo/cms/spring/AuthenticatedApplicationContextInitialization.java
new file mode 100644 (file)
index 0000000..e1af582
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2007-2012 Argeo GmbH
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *         http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.argeo.cms.spring;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.security.auth.Subject;
+
+import org.eclipse.gemini.blueprint.context.DependencyInitializationAwareBeanPostProcessor;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.support.AbstractBeanFactory;
+import org.springframework.beans.factory.support.SecurityContextProvider;
+import org.springframework.beans.factory.support.SimpleSecurityContextProvider;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+
+/**
+ * Executes with a system authentication the instantiation and initialization
+ * methods of the application context where it has been defined.
+ */
+public class AuthenticatedApplicationContextInitialization extends
+               AbstractSystemExecution implements
+               DependencyInitializationAwareBeanPostProcessor, ApplicationContextAware {
+       /** If non empty, restricts to these beans */
+       private List<String> beanNames = new ArrayList<String>();
+
+       public Object postProcessBeforeInitialization(Object bean, String beanName)
+                       throws BeansException {
+               if (beanNames.size() == 0 || beanNames.contains(beanName))
+                       authenticateAsSystem();
+               return bean;
+       }
+
+       public Object postProcessAfterInitialization(Object bean, String beanName)
+                       throws BeansException {
+               if (beanNames.size() == 0 || beanNames.contains(beanName))
+                       deauthenticateAsSystem();
+               return bean;
+       }
+
+       public void setBeanNames(List<String> beanNames) {
+               this.beanNames = beanNames;
+       }
+
+       @Override
+       public void setApplicationContext(ApplicationContext applicationContext)
+                       throws BeansException {
+               if (applicationContext.getAutowireCapableBeanFactory() instanceof AbstractBeanFactory) {
+                       final AbstractBeanFactory beanFactory = ((AbstractBeanFactory) applicationContext
+                                       .getAutowireCapableBeanFactory());
+                       // retrieve subject's access control context
+                       // and set it as the bean factory security context
+                       Subject.doAs(getSubject(), new PrivilegedAction<Void>() {
+                               @Override
+                               public Void run() {
+                                       SecurityContextProvider scp = new SimpleSecurityContextProvider(
+                                                       AccessController.getContext());
+                                       beanFactory.setSecurityContextProvider(scp);
+                                       return null;
+                               }
+                       });
+               }
+       }
+}
diff --git a/org.argeo.cms.ui.workbench/src/org/argeo/cms/spring/SimpleRoleRegistration.java b/org.argeo.cms.ui.workbench/src/org/argeo/cms/spring/SimpleRoleRegistration.java
new file mode 100644 (file)
index 0000000..255ce11
--- /dev/null
@@ -0,0 +1,89 @@
+package org.argeo.cms.spring;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import javax.naming.InvalidNameException;
+import javax.naming.ldap.LdapName;
+import javax.transaction.UserTransaction;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.cms.CmsException;
+import org.osgi.service.useradmin.Role;
+import org.osgi.service.useradmin.UserAdmin;
+
+/**
+ * Register one or many roles via a user admin service. Does nothing if the role
+ * is already registered.
+ */
+public class SimpleRoleRegistration implements Runnable {
+       private final static Log log = LogFactory
+                       .getLog(SimpleRoleRegistration.class);
+
+       private String role;
+       private List<String> roles = new ArrayList<String>();
+       private UserAdmin userAdmin;
+       private UserTransaction userTransaction;
+
+       @Override
+       public void run() {
+               try {
+                       userTransaction.begin();
+                       if (role != null && !roleExists(role))
+                               newRole(toDn(role));
+
+                       for (String r : roles)
+                               if (!roleExists(r))
+                                       newRole(toDn(r));
+                       userTransaction.commit();
+               } catch (Exception e) {
+                       try {
+                               userTransaction.rollback();
+                       } catch (Exception e1) {
+                               log.error("Cannot rollback", e1);
+                       }
+                       throw new CmsException("Cannot add roles", e);
+               }
+       }
+
+       private boolean roleExists(String role) {
+               return userAdmin.getRole(toDn(role).toString()) != null;
+       }
+
+       protected void newRole(LdapName r) {
+               userAdmin.createRole(r.toString(), Role.GROUP);
+               log.info("Added role " + r + " required by application.");
+       }
+
+       public void register(UserAdmin userAdminService, Map<?, ?> properties) {
+               this.userAdmin = userAdminService;
+               run();
+       }
+
+       protected LdapName toDn(String name) {
+               try {
+                       return new LdapName("cn=" + name + ",ou=roles,ou=node");
+               } catch (InvalidNameException e) {
+                       throw new CmsException("Badly formatted role name " + name, e);
+               }
+       }
+
+       public void setRole(String role) {
+               this.role = role;
+       }
+
+       public void setRoles(List<String> roles) {
+               this.roles = roles;
+       }
+
+       public void setUserAdmin(UserAdmin userAdminService) {
+               this.userAdmin = userAdminService;
+       }
+
+       public void setUserTransaction(UserTransaction userTransaction) {
+               this.userTransaction = userTransaction;
+       }
+
+}
diff --git a/org.argeo.cms.ui.workbench/src/org/argeo/cms/spring/osgi/OsgiModuleLabel.java b/org.argeo.cms.ui.workbench/src/org/argeo/cms/spring/osgi/OsgiModuleLabel.java
new file mode 100644 (file)
index 0000000..f085d6a
--- /dev/null
@@ -0,0 +1,41 @@
+package org.argeo.cms.spring.osgi;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+
+/**
+ * Logs the name and version of an OSGi bundle based on its
+ * {@link BundleContext}.
+ */
+public class OsgiModuleLabel {
+       private final static Log log = LogFactory.getLog(OsgiModuleLabel.class);
+
+       private Bundle bundle;
+
+       public OsgiModuleLabel() {
+       }
+
+       /** Sets without logging. */
+       public OsgiModuleLabel(Bundle bundle) {
+               this.bundle = bundle;
+       }
+
+       /**
+        * Retrieved bundle from a bundle context and logs it. Typically to be set
+        * as a Spring bean.
+        */
+       public void setBundleContext(BundleContext bundleContext) {
+               this.bundle = bundleContext.getBundle();
+               log.info(msg());
+       }
+
+       public String msg() {
+               String name = bundle.getHeaders().get(Constants.BUNDLE_NAME).toString();
+               String symbolicName = bundle.getSymbolicName();
+               String version = bundle.getVersion().toString();
+               return name + " v" + version + " (" + symbolicName + ")";
+       }
+}
index 855446284ba040f894fe4cf3effa1de538b001af..5d786dfdaec2a0395fa8ecca6725c2bfb955cc4f 100644 (file)
@@ -10,8 +10,9 @@ import static org.argeo.cms.ui.CmsConstants.NO_IMAGE_SIZE;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
 
-import javax.activation.MimetypesFileTypeMap;
 import javax.jcr.Binary;
 import javax.jcr.Node;
 import javax.jcr.Property;
@@ -39,10 +40,9 @@ import org.eclipse.swt.widgets.Label;
 /** Manages only public images so far. */
 public class ImageManagerImpl implements CmsImageManager, CmsNames {
        private final static Log log = LogFactory.getLog(ImageManagerImpl.class);
-       private MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap();
+//     private MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap();
 
-       public Boolean load(Node node, Control control, Point preferredSize)
-                       throws RepositoryException {
+       public Boolean load(Node node, Control control, Point preferredSize) throws RepositoryException {
                Point imageSize = getImageSize(node);
                Point size;
                String imgTag = null;
@@ -53,8 +53,7 @@ public class ImageManagerImpl implements CmsImageManager, CmsNames {
                                size = imageSize;
                        } else {
                                // no image if not completely known
-                               size = resizeTo(NO_IMAGE_SIZE,
-                                               preferredSize != null ? preferredSize : imageSize);
+                               size = resizeTo(NO_IMAGE_SIZE, preferredSize != null ? preferredSize : imageSize);
                                imgTag = CmsUtils.noImg(size);
                        }
 
@@ -105,18 +104,15 @@ public class ImageManagerImpl implements CmsImageManager, CmsNames {
                } else if (constraints.x == 0 && constraints.y == 0) {
                        return orig;
                } else if (constraints.y == 0) {// force width
-                       return new Point(constraints.x,
-                                       scale(orig.y, orig.x, constraints.x));
+                       return new Point(constraints.x, scale(orig.y, orig.x, constraints.x));
                } else if (constraints.x == 0) {// force height
-                       return new Point(scale(orig.x, orig.y, constraints.y),
-                                       constraints.y);
+                       return new Point(scale(orig.x, orig.y, constraints.y), constraints.y);
                }
                throw new CmsException("Cannot resize " + orig + " to " + constraints);
        }
 
        private int scale(int origDimension, int otherDimension, int otherConstraint) {
-               return Math.round(origDimension
-                               * divide(otherConstraint, otherDimension));
+               return Math.round(origDimension * divide(otherConstraint, otherDimension));
        }
 
        private float divide(int a, int b) {
@@ -124,10 +120,8 @@ public class ImageManagerImpl implements CmsImageManager, CmsNames {
        }
 
        public Point getImageSize(Node node) throws RepositoryException {
-               return new Point(node.hasProperty(CMS_IMAGE_WIDTH) ? (int) node
-                               .getProperty(CMS_IMAGE_WIDTH).getLong() : 0,
-                               node.hasProperty(CMS_IMAGE_WIDTH) ? (int) node.getProperty(
-                                               CMS_IMAGE_HEIGHT).getLong() : 0);
+               return new Point(node.hasProperty(CMS_IMAGE_WIDTH) ? (int) node.getProperty(CMS_IMAGE_WIDTH).getLong() : 0,
+                               node.hasProperty(CMS_IMAGE_WIDTH) ? (int) node.getProperty(CMS_IMAGE_HEIGHT).getLong() : 0);
        }
 
        /** @return null if not available */
@@ -136,8 +130,7 @@ public class ImageManagerImpl implements CmsImageManager, CmsNames {
                return getImageTag(node, getImageSize(node));
        }
 
-       private String getImageTag(Node node, Point size)
-                       throws RepositoryException {
+       private String getImageTag(Node node, Point size) throws RepositoryException {
                StringBuilder buf = getImageTagBuilder(node, size);
                if (buf == null)
                        return null;
@@ -146,15 +139,12 @@ public class ImageManagerImpl implements CmsImageManager, CmsNames {
 
        /** @return null if not available */
        @Override
-       public StringBuilder getImageTagBuilder(Node node, Point size)
-                       throws RepositoryException {
-               return getImageTagBuilder(node, Integer.toString(size.x),
-                               Integer.toString(size.y));
+       public StringBuilder getImageTagBuilder(Node node, Point size) throws RepositoryException {
+               return getImageTagBuilder(node, Integer.toString(size.x), Integer.toString(size.y));
        }
 
        /** @return null if not available */
-       private StringBuilder getImageTagBuilder(Node node, String width,
-                       String height) throws RepositoryException {
+       private StringBuilder getImageTagBuilder(Node node, String width, String height) throws RepositoryException {
                String url = getImageUrl(node);
                if (url == null)
                        return null;
@@ -218,8 +208,7 @@ public class ImageManagerImpl implements CmsImageManager, CmsNames {
        }
 
        @Override
-       public String uploadImage(Node parentNode, String fileName, InputStream in)
-                       throws RepositoryException {
+       public String uploadImage(Node parentNode, String fileName, InputStream in) throws RepositoryException {
                InputStream inputStream = null;
                try {
                        String previousResourceName = null;
@@ -240,22 +229,20 @@ public class ImageManagerImpl implements CmsImageManager, CmsNames {
                        ImageData id = new ImageData(inputStream);
                        fileNode.setProperty(CMS_IMAGE_WIDTH, id.width);
                        fileNode.setProperty(CMS_IMAGE_HEIGHT, id.height);
-                       fileNode.setProperty(Property.JCR_MIMETYPE,
-                                       fileTypeMap.getContentType(fileName));
+                       String mime = Files.probeContentType(Paths.get(fileName));
+                       fileNode.setProperty(Property.JCR_MIMETYPE, mime);
                        fileNode.getSession().save();
 
                        // reset resource manager
                        ResourceManager resourceManager = RWT.getResourceManager();
-                       if (previousResourceName != null
-                                       && resourceManager.isRegistered(previousResourceName)) {
+                       if (previousResourceName != null && resourceManager.isRegistered(previousResourceName)) {
                                resourceManager.unregister(previousResourceName);
                                if (log.isDebugEnabled())
                                        log.debug("Unregistered image " + previousResourceName);
                        }
                        return getImageUrl(fileNode);
                } catch (IOException e) {
-                       throw new CmsException("Cannot upload image " + fileName + " in "
-                                       + parentNode, e);
+                       throw new CmsException("Cannot upload image " + fileName + " in " + parentNode, e);
                } finally {
                        IOUtils.closeQuietly(inputStream);
                }
index 7560ceb30733faeed948bb189f0cd3e558eb3753..46b3d4f8ba22164e06377148a91a5e46e23e757a 100644 (file)
@@ -20,8 +20,8 @@ import javax.security.auth.login.LoginException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.cms.CmsMsg;
+import org.argeo.cms.LocaleUtils;
 import org.argeo.cms.auth.HttpRequestCallback;
-import org.argeo.cms.i18n.LocaleUtils;
 import org.argeo.cms.ui.CmsStyles;
 import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.ui.internal.Activator;
@@ -184,7 +184,12 @@ public class CmsLogin implements CmsStyles, CallbackHandler {
                passwordT.addTraverseListener(tl);
                parent.setTabList(new Control[] { credentialsBlock });
                credentialsBlock.setTabList(new Control[] { usernameT, passwordT });
-               // credentialsBlock.setFocus();
+
+               // Button
+               Button loginButton = new Button(credentialsBlock, SWT.PUSH);
+               loginButton.setText(CmsMsg.login.lead(locale));
+               loginButton.setLayoutData(CmsUtils.fillWidth());
+               loginButton.addSelectionListener(loginSelectionListener);
 
                extendsCredentialsBlock(credentialsBlock, locale, loginSelectionListener);
                if (localeChoice != null)
index 009c3721aeed0aa7353cadf5469f2f48d9193e7b..b3ae47df5d3e60aa1896c52cdaa8b984f95062e6 100644 (file)
@@ -22,7 +22,7 @@ import java.util.Locale;
 import javax.security.auth.callback.LanguageCallback;
 
 import org.argeo.cms.CmsException;
-import org.argeo.cms.i18n.LocaleUtils;
+import org.argeo.cms.LocaleUtils;
 
 /** Choose in a list of locales. TODO: replace with {@link LanguageCallback} */
 public class LocaleChoice {
index 3061a0e510eb29a1af83deffd0dfa7d2c2032142..4a2da22b90cb9a26756c3df23fef437807c955fc 100644 (file)
@@ -5,10 +5,6 @@ org.h2;resolution:=optional,\
 org.postgresql;resolution:=optional,\
 org.apache.jackrabbit.webdav.server,\
 org.apache.jackrabbit.webdav.jcr,\
-org.springframework.context;resolution:=optional,\
-org.springframework.core.io;resolution:=optional,\
-org.springframework.*;resolution:=optional,\
-org.eclipse.gemini.blueprint.*;resolution:=optional\
 org.apache.commons.httpclient.cookie;resolution:=optional,\
 org.osgi.*;version=0.0.0,\
 *
index 327c58b617ffaeaef787412b38ceffc3373a86cd..6d92a75aea61035fcde79848a1d9f6c4e98b7898 100644 (file)
                        <artifactId>org.argeo.enterprise</artifactId>
                        <version>2.1.77-SNAPSHOT</version>
                </dependency>
+               <dependency>
+                       <groupId>org.argeo.commons</groupId>
+                       <artifactId>org.argeo.core</artifactId>
+                       <version>2.1.77-SNAPSHOT</version>
+               </dependency>
                <dependency>
                        <groupId>org.argeo.commons</groupId>
                        <artifactId>org.argeo.eclipse.ui</artifactId>
index 718bfa48d6c51902c9957068b6b6e6ac4bcb122a..a69b419c516fab6f7c0603789844ca9f193225e6 100644 (file)
@@ -1,7 +1,5 @@
 package org.argeo.cms;
 
-import org.argeo.cms.i18n.Localized;
-
 public enum CmsMsg implements Localized {
        username, password, login, logout, register,
        // password
diff --git a/org.argeo.cms/src/org/argeo/cms/LocaleUtils.java b/org.argeo.cms/src/org/argeo/cms/LocaleUtils.java
new file mode 100644 (file)
index 0000000..c6c932b
--- /dev/null
@@ -0,0 +1,70 @@
+package org.argeo.cms;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+import org.argeo.cms.auth.CurrentUser;
+
+/** Utilities simplifying the development of localization enums. */
+public class LocaleUtils {
+       public static Object local(Enum<?> en) {
+               return local(en, getCurrentLocale(), "/OSGI-INF/l10n/bundle");
+       }
+
+       public static Object local(Enum<?> en, Locale locale) {
+               return local(en, locale, "/OSGI-INF/l10n/bundle");
+       }
+
+       public static Object local(Enum<?> en, Locale locale, String resource) {
+               return local(en, locale, resource, en.getClass().getClassLoader());
+       }
+
+       public static Object local(Enum<?> en, Locale locale, String resource, ClassLoader classLoader) {
+               ResourceBundle rb = ResourceBundle.getBundle(resource, locale, classLoader);
+               return rb.getString(en.name());
+       }
+
+       public static String lead(String raw, Locale locale) {
+               return raw.substring(0, 1).toUpperCase(locale) + raw.substring(1);
+       }
+
+       public static String lead(Localized localized) {
+               return lead(localized, getCurrentLocale());
+       }
+
+       public static String lead(Localized localized, Locale locale) {
+               return lead(localized.local(locale).toString(), locale);
+       }
+
+       static Locale getCurrentLocale() {
+               return CurrentUser.locale();
+               // return UiContext.getLocale();
+               // FIXME look into Subject or settings
+               // return Locale.getDefault();
+       }
+
+       /** Returns null if argument is null. */
+       public static List<Locale> asLocaleList(Object locales) {
+               if (locales == null)
+                       return null;
+               ArrayList<Locale> availableLocales = new ArrayList<Locale>();
+               String[] codes = locales.toString().split(",");
+               for (int i = 0; i < codes.length; i++) {
+                       String code = codes[i];
+                       // variant not supported
+                       int indexUnd = code.indexOf("_");
+                       Locale locale;
+                       if (indexUnd > 0) {
+                               String language = code.substring(0, indexUnd);
+                               String country = code.substring(indexUnd + 1);
+                               locale = new Locale(language, country);
+                       } else {
+                               locale = new Locale(code);
+                       }
+                       availableLocales.add(locale);
+               }
+               return availableLocales;
+       }
+}
diff --git a/org.argeo.cms/src/org/argeo/cms/Localized.java b/org.argeo.cms/src/org/argeo/cms/Localized.java
new file mode 100644 (file)
index 0000000..1c7c8e5
--- /dev/null
@@ -0,0 +1,27 @@
+package org.argeo.cms;
+
+import java.text.MessageFormat;
+import java.util.Locale;
+
+/** Localized object. */
+public interface Localized {
+       /** Default assumes that this is an {@link Enum} */
+       default Object local(Locale locale) {
+               return LocaleUtils.local((Enum<?>) this, locale);
+       }
+
+       default String lead() {
+               return LocaleUtils.lead(this);
+       }
+
+       default String format(Object[] args) {
+               Locale locale = LocaleUtils.getCurrentLocale();
+               MessageFormat format = new MessageFormat(local(locale).toString(), locale);
+               return format.format(args);
+       }
+
+       default String lead(Locale locale) {
+               return LocaleUtils.lead(local(locale).toString(), locale);
+       }
+
+}
index e0a77bcf3bdda1d6abbf401adc7b8378cc1f086a..71a31413efb6086330020b1b7d5a92ee63753aa2 100644 (file)
@@ -1,41 +1,43 @@
 package org.argeo.cms.i18n;
 
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
-import java.util.ResourceBundle;
 
 import org.argeo.cms.auth.CurrentUser;
 
-/** Utilities simplifying the development of localization enums. */
+/**
+ * Utilities simplifying the development of localization enums.
+ * 
+ * @deprecated Use {@link org.argeo.cms.LocaleUtils}
+ */
+@Deprecated
 public class LocaleUtils {
        public static Object local(Enum<?> en) {
-               return local(en, getCurrentLocale(), "/OSGI-INF/l10n/bundle");
+               return org.argeo.cms.LocaleUtils.local(en);
        }
 
        public static Object local(Enum<?> en, Locale locale) {
-               return local(en, locale, "/OSGI-INF/l10n/bundle");
+               return org.argeo.cms.LocaleUtils.local(en, locale);
        }
 
        public static Object local(Enum<?> en, Locale locale, String resource) {
-               return local(en, locale, resource, en.getClass().getClassLoader());
+               return org.argeo.cms.LocaleUtils.local(en, locale, resource);
        }
 
        public static Object local(Enum<?> en, Locale locale, String resource, ClassLoader classLoader) {
-               ResourceBundle rb = ResourceBundle.getBundle(resource, locale, classLoader);
-               return rb.getString(en.name());
+               return org.argeo.cms.LocaleUtils.local(en, locale, resource, classLoader);
        }
 
        public static String lead(String raw, Locale locale) {
-               return raw.substring(0, 1).toUpperCase(locale) + raw.substring(1);
+               return org.argeo.cms.LocaleUtils.lead(raw, locale);
        }
 
        public static String lead(Localized localized) {
-               return lead(localized, getCurrentLocale());
+               return org.argeo.cms.LocaleUtils.lead(localized);
        }
 
        public static String lead(Localized localized, Locale locale) {
-               return lead(localized.local(locale).toString(), locale);
+               return org.argeo.cms.LocaleUtils.lead(localized, locale);
        }
 
        static Locale getCurrentLocale() {
@@ -47,24 +49,6 @@ public class LocaleUtils {
 
        /** Returns null if argument is null. */
        public static List<Locale> asLocaleList(Object locales) {
-               if (locales == null)
-                       return null;
-               ArrayList<Locale> availableLocales = new ArrayList<Locale>();
-               String[] codes = locales.toString().split(",");
-               for (int i = 0; i < codes.length; i++) {
-                       String code = codes[i];
-                       // variant not supported
-                       int indexUnd = code.indexOf("_");
-                       Locale locale;
-                       if (indexUnd > 0) {
-                               String language = code.substring(0, indexUnd);
-                               String country = code.substring(indexUnd + 1);
-                               locale = new Locale(language, country);
-                       } else {
-                               locale = new Locale(code);
-                       }
-                       availableLocales.add(locale);
-               }
-               return availableLocales;
+               return org.argeo.cms.LocaleUtils.asLocaleList(locales);
        }
 }
index 535b5f225d04e7cedaa150faf6a286e57ab49f09..7d32193bf02a68d12015de29c55527bac01a8a3a 100644 (file)
@@ -1,27 +1,10 @@
 package org.argeo.cms.i18n;
 
-import java.text.MessageFormat;
-import java.util.Locale;
-
-/** Localized object. */
-public interface Localized {
-       /** Default assumes that this is an {@link Enum} */
-       default Object local(Locale locale) {
-               return LocaleUtils.local((Enum<?>) this, locale);
-       }
-
-       default String lead() {
-               return LocaleUtils.lead(this);
-       }
-
-       default String format(Object[] args) {
-               Locale locale = LocaleUtils.getCurrentLocale();
-               MessageFormat format = new MessageFormat(local(locale).toString(), locale);
-               return format.format(args);
-       }
-
-       default String lead(Locale locale) {
-               return LocaleUtils.lead(local(locale).toString(), locale);
-       }
-
+/**
+ * Localized object.
+ * 
+ * @deprecated Use {@link org.argeo.cms.Localized} instead.
+ */
+@Deprecated
+public interface Localized extends org.argeo.cms.Localized {
 }
index d5f3a20cd5b6a0c8650d8c0dc999d5cd05fefb52..86ce94bb40884b47c493c1c12e7dfa184c2980f8 100644 (file)
@@ -200,8 +200,8 @@ public class RepositoryBuilder {
                        RepositoryContext repositoryContext = RepositoryContext.create(repositoryConfig);
 
                        double duration = ((double) (System.currentTimeMillis() - begin)) / 1000;
-                       if (log.isTraceEnabled())
-                               log.trace(
+                       if (log.isDebugEnabled())
+                               log.debug(
                                                "Created Jackrabbit repository in " + duration + " s, home: " + repositoryConfig.getHomeDir());
 
                        return repositoryContext;
index 5ef545e6fa49e8cc59880ae9f3dc9b6fb5db14c0..07f3867ce4bbc35babac16ed587ed3fff036b22d 100644 (file)
@@ -62,7 +62,8 @@ public class Activator implements BundleActivator {
 
                        userAdminSt = new ServiceTracker<>(instance.bc, UserAdmin.class, null);
                        userAdminSt.open();
-                       log.debug("Kernel bundle started");
+                       if (log.isTraceEnabled())
+                               log.trace("Kernel bundle started");
                } catch (Throwable e) {
                        log.error("## FATAL: CMS activator failed", e);
                }
index 3d8a389efd13bbe1b3c56765bc3e0aa192bc0db2..0711be2e885674dc4a4cb9fdb05e20720e7cdcfd 100644 (file)
@@ -364,8 +364,8 @@ public class CmsDeployment implements NodeDeployment {
                        properties.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
                LocalRepository localRepository = new LocalRepository(repository, dataModelName);
                bc.registerService(Repository.class, localRepository, properties);
-               if (log.isDebugEnabled())
-                       log.debug("Published data model " + dataModelName);
+               if (log.isTraceEnabled())
+                       log.trace("Published data model " + dataModelName);
        }
 
        @Override
index d040bdb1eddfe0405c8fe115919928efe90621e7..14979711b5dc898ef20d84b54f89f64e93e26216 100644 (file)
@@ -31,8 +31,8 @@ public class CmsInstance implements NodeInstance {
                                Object cn = reference.getProperty(NodeConstants.CN);
                                if (cn != null && cn.equals(NodeConstants.HOME)) {
                                        homeRepository = (HomeRepository) bc.getService(reference);
-                                       if (log.isDebugEnabled())
-                                               log.debug("Home repository is available");
+                                       if (log.isTraceEnabled())
+                                               log.trace("Home repository is available");
                                }
                                return super.addingService(reference);
                        }
index a62ee7f10a541d3ce035bf2003bc0148e8d12a84..43295ae3f2681f47eee52d03c573a7bd68ba5652 100644 (file)
@@ -1,11 +1,8 @@
 package org.argeo.cms.internal.kernel;
 
-import java.io.IOException;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
 import org.osgi.framework.FrameworkEvent;
 import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.launch.Framework;
index 789312625c54219f66d24af46281dfeb1740e36d..2f3bdcefd02185dd6474e47893f79603dc7a99fa 100644 (file)
@@ -1,42 +1,31 @@
 package org.argeo.cms.internal.kernel;
 
-import static bitronix.tm.TransactionManagerServices.getTransactionManager;
-import static bitronix.tm.TransactionManagerServices.getTransactionSynchronizationRegistry;
 import static java.util.Locale.ENGLISH;
 
-import java.io.File;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.nio.file.spi.FileSystemProvider;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
-import java.util.UUID;
 
 import javax.jcr.RepositoryFactory;
 import javax.transaction.TransactionManager;
-import javax.transaction.TransactionSynchronizationRegistry;
 import javax.transaction.UserTransaction;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.cms.CmsException;
-import org.argeo.cms.i18n.LocaleUtils;
+import org.argeo.cms.LocaleUtils;
 import org.argeo.node.NodeConstants;
 import org.argeo.node.NodeState;
 import org.argeo.transaction.simple.SimpleTransactionManager;
 import org.argeo.util.LangUtils;
-import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
 import org.osgi.framework.FrameworkUtil;
-import org.osgi.framework.ServiceReference;
 import org.osgi.service.cm.ManagedServiceFactory;
 
-import bitronix.tm.BitronixTransactionManager;
-import bitronix.tm.BitronixTransactionSynchronizationRegistry;
-import bitronix.tm.TransactionManagerServices;
-
 public class CmsState implements NodeState {
        private final static Log log = LogFactory.getLog(CmsState.class);
        private final BundleContext bc = FrameworkUtil.getBundle(CmsState.class).getBundleContext();
@@ -93,7 +82,9 @@ public class CmsState implements NodeState {
                if (NodeConstants.TRANSACTION_MANAGER_SIMPLE.equals(tmType)) {
                        initSimpleTransactionManager();
                } else if (NodeConstants.TRANSACTION_MANAGER_BITRONIX.equals(tmType)) {
-                       initBitronixTransactionManager();
+//                     initBitronixTransactionManager();
+                       throw new UnsupportedOperationException(
+                                       "Bitronix is not supported anymore, but could be again if there is enough interest.");
                } else {
                        throw new CmsException("Usupported transaction manager type " + tmType);
                }
@@ -150,38 +141,38 @@ public class CmsState implements NodeState {
                // TODO TransactionSynchronizationRegistry
        }
 
-       private void initBitronixTransactionManager() {
-               // TODO manage it in a managed service, as startup could be long
-               ServiceReference<TransactionManager> existingTm = bc.getServiceReference(TransactionManager.class);
-               if (existingTm != null) {
-                       if (log.isDebugEnabled())
-                               log.debug("Using provided transaction manager " + existingTm);
-                       return;
-               }
-
-               if (!TransactionManagerServices.isTransactionManagerRunning()) {
-                       bitronix.tm.Configuration tmConf = TransactionManagerServices.getConfiguration();
-                       tmConf.setServerId(UUID.randomUUID().toString());
-
-                       Bundle bitronixBundle = FrameworkUtil.getBundle(bitronix.tm.Configuration.class);
-                       File tmBaseDir = bitronixBundle.getDataFile(KernelConstants.DIR_TRANSACTIONS);
-                       File tmDir1 = new File(tmBaseDir, "btm1");
-                       tmDir1.mkdirs();
-                       tmConf.setLogPart1Filename(new File(tmDir1, tmDir1.getName() + ".tlog").getAbsolutePath());
-                       File tmDir2 = new File(tmBaseDir, "btm2");
-                       tmDir2.mkdirs();
-                       tmConf.setLogPart2Filename(new File(tmDir2, tmDir2.getName() + ".tlog").getAbsolutePath());
-               }
-               BitronixTransactionManager transactionManager = getTransactionManager();
-               stopHooks.add(() -> transactionManager.shutdown());
-               BitronixTransactionSynchronizationRegistry transactionSynchronizationRegistry = getTransactionSynchronizationRegistry();
-               // register
-               bc.registerService(TransactionManager.class, transactionManager, null);
-               bc.registerService(UserTransaction.class, transactionManager, null);
-               bc.registerService(TransactionSynchronizationRegistry.class, transactionSynchronizationRegistry, null);
-               if (log.isDebugEnabled())
-                       log.debug("Initialised default Bitronix transaction manager");
-       }
+//     private void initBitronixTransactionManager() {
+//             // TODO manage it in a managed service, as startup could be long
+//             ServiceReference<TransactionManager> existingTm = bc.getServiceReference(TransactionManager.class);
+//             if (existingTm != null) {
+//                     if (log.isDebugEnabled())
+//                             log.debug("Using provided transaction manager " + existingTm);
+//                     return;
+//             }
+//
+//             if (!TransactionManagerServices.isTransactionManagerRunning()) {
+//                     bitronix.tm.Configuration tmConf = TransactionManagerServices.getConfiguration();
+//                     tmConf.setServerId(UUID.randomUUID().toString());
+//
+//                     Bundle bitronixBundle = FrameworkUtil.getBundle(bitronix.tm.Configuration.class);
+//                     File tmBaseDir = bitronixBundle.getDataFile(KernelConstants.DIR_TRANSACTIONS);
+//                     File tmDir1 = new File(tmBaseDir, "btm1");
+//                     tmDir1.mkdirs();
+//                     tmConf.setLogPart1Filename(new File(tmDir1, tmDir1.getName() + ".tlog").getAbsolutePath());
+//                     File tmDir2 = new File(tmBaseDir, "btm2");
+//                     tmDir2.mkdirs();
+//                     tmConf.setLogPart2Filename(new File(tmDir2, tmDir2.getName() + ".tlog").getAbsolutePath());
+//             }
+//             BitronixTransactionManager transactionManager = getTransactionManager();
+//             stopHooks.add(() -> transactionManager.shutdown());
+//             BitronixTransactionSynchronizationRegistry transactionSynchronizationRegistry = getTransactionSynchronizationRegistry();
+//             // register
+//             bc.registerService(TransactionManager.class, transactionManager, null);
+//             bc.registerService(UserTransaction.class, transactionManager, null);
+//             bc.registerService(TransactionSynchronizationRegistry.class, transactionSynchronizationRegistry, null);
+//             if (log.isDebugEnabled())
+//                     log.debug("Initialised default Bitronix transaction manager");
+//     }
 
        void shutdown() {
                if (log.isDebugEnabled())
index 1b50023e650359130c656f9c8cbacc888a59467f..fd432d11e4c85304f688e5ce550a4411f1480e6c 100644 (file)
@@ -188,4 +188,8 @@ class HomeRepository extends JcrRepositoryWrapper implements KernelConstants {
 
        }
 
+       public boolean isRemote() {
+               return remote;
+       }
+
 }
index b2b51eb8a9b1b509b0562b80c07c5b520b16cd0f..a127866e3a28c086dc1010911f8879d9b821e1ae 100644 (file)
@@ -91,6 +91,8 @@ class KernelThread extends Thread {
 
        @Override
        public void run() {
+               if (log.isTraceEnabled())
+                       log.trace("Kernel thread started.");
                final long periodNs = PERIOD * m;
                while (running) {
                        long beginNs = System.nanoTime();
index 1e11b7d7f6105358a4dea515dab7a9cf8d9ba39e..9a2177df1be0fad1ee14431ea8c59f8d420a1ae4 100644 (file)
@@ -68,8 +68,8 @@ public class NodeHttp implements KernelConstants {
                        registerRemotingServlet(httpService, alias, repository);
                        if (NodeConstants.HOME.equals(alias))
                                registerFilesServlet(httpService, alias, repository);
-                       if (log.isDebugEnabled())
-                               log.debug("Registered servlets for repository '" + alias + "'");
+                       if (log.isTraceEnabled())
+                               log.trace("Registered servlets for repository '" + alias + "'");
                } catch (Exception e) {
                        throw new CmsException("Could not register servlets for repository '" + alias + "'", e);
                }
@@ -83,8 +83,8 @@ public class NodeHttp implements KernelConstants {
                        httpService.unregister(remotingPath(alias));
                        if (NodeConstants.HOME.equals(alias))
                                httpService.unregister(filesPath(alias));
-                       if (log.isDebugEnabled())
-                               log.debug("Unregistered servlets for repository '" + alias + "'");
+                       if (log.isTraceEnabled())
+                               log.trace("Unregistered servlets for repository '" + alias + "'");
                } catch (Exception e) {
                        log.error("Could not unregister servlets for repository '" + alias + "'", e);
                }
index f83eb9476f6005c725d95817782d4b8ac9911681..ae6623826d21651064bd16c3405b1d2c29cd931d 100644 (file)
@@ -35,7 +35,6 @@ import org.osgi.framework.BundleContext;
 import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
-import org.springframework.core.io.Resource;
 
 /**
  * OSGi-aware Jackrabbit repository factory which can retrieve/publish
@@ -200,9 +199,4 @@ class NodeRepositoryFactory implements RepositoryFactory {
        protected void postInitialization(Repository repository, Map parameters) {
 
        }
-
-       public void setFileRepositoryConfiguration(Resource fileRepositoryConfiguration) {
-               // this.fileRepositoryConfiguration = fileRepositoryConfiguration;
-       }
-
 }
index e8977fa37466858eb32698ae2db94b2e03db3f3f..f00c3c769f5ef00c6a4b37f0518bacb6f9d3b6bb 100644 (file)
@@ -61,9 +61,6 @@ import org.osgi.service.useradmin.Authorization;
 import org.osgi.service.useradmin.UserAdmin;
 import org.osgi.util.tracker.ServiceTracker;
 
-import bitronix.tm.BitronixTransactionManager;
-import bitronix.tm.resource.ehcache.EhCacheXAResourceProducer;
-
 /**
  * Aggregates multiple {@link UserDirectory} and integrates them with system
  * roles.
@@ -79,7 +76,7 @@ class NodeUserAdmin extends AggregatingUserAdmin implements ManagedServiceFactor
 
        // JTA
        private final ServiceTracker<TransactionManager, TransactionManager> tmTracker;
-       private final String cacheName = UserDirectory.class.getName();
+       // private final String cacheName = UserDirectory.class.getName();
 
        // GSS API
        private Path nodeKeyTab = KernelUtils.getOsgiInstancePath(KernelConstants.NODE_KEY_TAB_PATH);
@@ -184,8 +181,8 @@ class NodeUserAdmin extends AggregatingUserAdmin implements ManagedServiceFactor
                if (tm == null)
                        throw new CmsException("A JTA transaction manager must be available.");
                userDirectory.setTransactionManager(tm);
-               if (tmTracker.getService() instanceof BitronixTransactionManager)
-                       EhCacheXAResourceProducer.registerXAResource(cacheName, userDirectory.getXaResource());
+//             if (tmTracker.getService() instanceof BitronixTransactionManager)
+//                     EhCacheXAResourceProducer.registerXAResource(cacheName, userDirectory.getXaResource());
 
                Object realm = userDirectory.getProperties().get(UserAdminConf.realm.name());
                if (realm != null) {
@@ -225,8 +222,8 @@ class NodeUserAdmin extends AggregatingUserAdmin implements ManagedServiceFactor
        }
 
        protected void preDestroy(AbstractUserDirectory userDirectory) {
-               if (tmTracker.getService() instanceof BitronixTransactionManager)
-                       EhCacheXAResourceProducer.unregisterXAResource(cacheName, userDirectory.getXaResource());
+//             if (tmTracker.getService() instanceof BitronixTransactionManager)
+//                     EhCacheXAResourceProducer.unregisterXAResource(cacheName, userDirectory.getXaResource());
 
                Object realm = userDirectory.getProperties().get(UserAdminConf.realm.name());
                if (realm != null) {
index 358b212b1cbaf765690f44afbcfea7df399944b3..7d5242fa268dd026ac264a9f105149700ae776bb 100644 (file)
@@ -6,9 +6,6 @@ import java.net.SocketPermission;
 import java.security.AllPermission;
 import java.util.PropertyPermission;
 
-import javax.management.MBeanPermission;
-import javax.management.MBeanServerPermission;
-import javax.management.MBeanTrustPermission;
 import javax.security.auth.AuthPermission;
 
 import org.osgi.framework.AdminPermission;
@@ -24,8 +21,6 @@ import org.osgi.service.condpermadmin.ConditionalPermissionInfo;
 import org.osgi.service.condpermadmin.ConditionalPermissionUpdate;
 import org.osgi.service.permissionadmin.PermissionInfo;
 
-import bitronix.tm.BitronixTransactionManager;
-
 public interface SecurityProfile {
        BundleContext bc = FrameworkUtil.getBundle(SecurityProfile.class).getBundleContext();
 
@@ -107,15 +102,15 @@ public interface SecurityProfile {
 //                             ConditionalPermissionInfo.ALLOW));
 
                // Bitronix
-               update.getConditionalPermissionInfos().add(permissionAdmin.newConditionalPermissionInfo(null,
-                               new ConditionInfo[] { new ConditionInfo(BundleLocationCondition.class.getName(),
-                                               new String[] { locate(BitronixTransactionManager.class) }) },
-                               new PermissionInfo[] { new PermissionInfo(PropertyPermission.class.getName(), "bitronix.tm.*", "read"),
-                                               new PermissionInfo(RuntimePermission.class.getName(), "getClassLoader", null),
-                                               new PermissionInfo(MBeanServerPermission.class.getName(), "createMBeanServer", null),
-                                               new PermissionInfo(MBeanPermission.class.getName(), "bitronix.tm.*", "registerMBean"),
-                                               new PermissionInfo(MBeanTrustPermission.class.getName(), "register", null) },
-                               ConditionalPermissionInfo.ALLOW));
+//             update.getConditionalPermissionInfos().add(permissionAdmin.newConditionalPermissionInfo(null,
+//                             new ConditionInfo[] { new ConditionInfo(BundleLocationCondition.class.getName(),
+//                                             new String[] { locate(BitronixTransactionManager.class) }) },
+//                             new PermissionInfo[] { new PermissionInfo(PropertyPermission.class.getName(), "bitronix.tm.*", "read"),
+//                                             new PermissionInfo(RuntimePermission.class.getName(), "getClassLoader", null),
+//                                             new PermissionInfo(MBeanServerPermission.class.getName(), "createMBeanServer", null),
+//                                             new PermissionInfo(MBeanPermission.class.getName(), "bitronix.tm.*", "registerMBean"),
+//                                             new PermissionInfo(MBeanTrustPermission.class.getName(), "register", null) },
+//                             ConditionalPermissionInfo.ALLOW));
 
                // DS
                Bundle dsBundle = findBundle("org.eclipse.equinox.ds");
@@ -135,7 +130,7 @@ public interface SecurityProfile {
                                ConditionalPermissionInfo.ALLOW));
 
                // Jetty
-               Bundle jettyUtilBundle = findBundle("org.eclipse.equinox.http.jetty");
+               // Bundle jettyUtilBundle = findBundle("org.eclipse.equinox.http.jetty");
                update.getConditionalPermissionInfos().add(permissionAdmin.newConditionalPermissionInfo(null,
                                new ConditionInfo[] { new ConditionInfo(BundleLocationCondition.class.getName(),
                                                new String[] { "*/org.eclipse.jetty.*" }) },
@@ -257,16 +252,14 @@ public interface SecurityProfile {
                                                                new PermissionInfo(AdminPermission.class.getName(), "*", "*") },
                                                ConditionalPermissionInfo.ALLOW));
                Bundle luceneBundle = findBundle("org.apache.lucene");
-               update.getConditionalPermissionInfos()
-                               .add(permissionAdmin.newConditionalPermissionInfo(null,
-                                               new ConditionInfo[] { new ConditionInfo(BundleLocationCondition.class.getName(),
-                                                               new String[] { luceneBundle.getLocation() }) },
-                                               new PermissionInfo[] {
-                                                               new PermissionInfo(FilePermission.class.getName(), "<<ALL FILES>>",
-                                                                               "read,write,delete"),
-                                                               new PermissionInfo(PropertyPermission.class.getName(), "*", "read"),
-                                                               new PermissionInfo(AdminPermission.class.getName(), "*", "*") },
-                                               ConditionalPermissionInfo.ALLOW));
+               update.getConditionalPermissionInfos().add(permissionAdmin.newConditionalPermissionInfo(null,
+                               new ConditionInfo[] { new ConditionInfo(BundleLocationCondition.class.getName(),
+                                               new String[] { luceneBundle.getLocation() }) },
+                               new PermissionInfo[] {
+                                               new PermissionInfo(FilePermission.class.getName(), "<<ALL FILES>>", "read,write,delete"),
+                                               new PermissionInfo(PropertyPermission.class.getName(), "*", "read"),
+                                               new PermissionInfo(AdminPermission.class.getName(), "*", "*") },
+                               ConditionalPermissionInfo.ALLOW));
 
                // COMMIT
                update.commit();
index c5b4e9ecc65c0437fb1f6f2e44b6667153987a6c..69e8a08fda9b616885d4870e7c37a27530d3733d 100644 (file)
@@ -1,7 +1,5 @@
 package org.argeo.cms.security;
 
-import static javax.xml.bind.DatatypeConverter.printBase64Binary;
-
 import java.io.IOException;
 import java.math.BigInteger;
 import java.nio.MappedByteBuffer;
@@ -13,6 +11,7 @@ import java.nio.file.Paths;
 import java.nio.file.SimpleFileVisitor;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.security.MessageDigest;
+import java.util.Base64;
 import java.util.zip.Checksum;
 
 import org.argeo.cms.CmsException;
@@ -29,8 +28,7 @@ public class ChecksumFactory {
                                Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
 
                                        @Override
-                                       public FileVisitResult visitFile(Path file,
-                                                       BasicFileAttributes attrs) throws IOException {
+                                       public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                                                if (!Files.isDirectory(file)) {
                                                        byte[] digest = digest(file, algo);
                                                        md.update(digest);
@@ -41,25 +39,20 @@ public class ChecksumFactory {
                                });
                                byte[] digest = md.digest();
                                long duration = System.currentTimeMillis() - begin;
-                               System.out.println(printBase64Binary(digest) + " " + path
-                                               + " (" + duration / 1000 + "s)");
+                               System.out.println(printBase64Binary(digest) + " " + path + " (" + duration / 1000 + "s)");
                                return digest;
                        } else {
                                long begin = System.nanoTime();
                                long length = -1;
-                               try (FileChannel channel = (FileChannel) Files
-                                               .newByteChannel(path);) {
+                               try (FileChannel channel = (FileChannel) Files.newByteChannel(path);) {
                                        length = channel.size();
                                        long cursor = 0;
                                        while (cursor < length) {
-                                               long effectiveSize = Math.min(regionSize, length
-                                                               - cursor);
-                                               MappedByteBuffer mb = channel.map(
-                                                               FileChannel.MapMode.READ_ONLY, cursor,
-                                                               effectiveSize);
+                                               long effectiveSize = Math.min(regionSize, length - cursor);
+                                               MappedByteBuffer mb = channel.map(FileChannel.MapMode.READ_ONLY, cursor, effectiveSize);
                                                // md.update(mb);
                                                byte[] buffer = new byte[1024];
-                                               while (mb.hasRemaining()){
+                                               while (mb.hasRemaining()) {
                                                        mb.get(buffer);
                                                        md.update(buffer);
                                                }
@@ -82,11 +75,9 @@ public class ChecksumFactory {
                                        }
                                        byte[] digest = md.digest();
                                        long duration = System.nanoTime() - begin;
-                                       System.out.println(printBase64Binary(digest) + " "
-                                                       + path.getFileName() + " (" + duration / 1000000
-                                                       + "ms, " + (length / 1024) + "kB, "
-                                                       + (length / (duration / 1000000)) * 1000
-                                                       / (1024 * 1024) + " MB/s)");
+                                       System.out.println(printBase64Binary(digest) + " " + path.getFileName() + " (" + duration / 1000000
+                                                       + "ms, " + (length / 1024) + "kB, " + (length / (duration / 1000000)) * 1000 / (1024 * 1024)
+                                                       + " MB/s)");
                                        return digest;
                                }
                        }
@@ -112,8 +103,7 @@ public class ChecksumFactory {
                        long cursor = 0;
                        while (cursor < length) {
                                long effectiveSize = Math.min(regionSize, length - cursor);
-                               MappedByteBuffer mb = channel.map(
-                                               FileChannel.MapMode.READ_ONLY, cursor, effectiveSize);
+                               MappedByteBuffer mb = channel.map(FileChannel.MapMode.READ_ONLY, cursor, effectiveSize);
                                int nGet;
                                while (mb.hasRemaining()) {
                                        nGet = Math.min(mb.remaining(), bufferSize);
@@ -139,9 +129,8 @@ public class ChecksumFactory {
                if (args.length > 0) {
                        path = Paths.get(args[0]);
                } else {
-                       path = Paths
-                                       .get("/home/mbaudier/Downloads/torrents/CentOS-7-x86_64-DVD-1503-01/"
-                                                       + "CentOS-7-x86_64-DVD-1503-01.iso");
+                       path = Paths.get("/home/mbaudier/Downloads/torrents/CentOS-7-x86_64-DVD-1503-01/"
+                                       + "CentOS-7-x86_64-DVD-1503-01.iso");
                }
                // long adler = cf.checksum(path, new Adler32());
                // System.out.format("Adler=%d%n", adler);
@@ -154,4 +143,8 @@ public class ChecksumFactory {
                // String sha1 = printBase64Binary(cf.digest(path, "SHA1"));
                // System.out.format("SHA1=%s%n", sha1);
        }
+
+       private static String printBase64Binary(byte[] arr) {
+               return Base64.getEncoder().encodeToString(arr);
+       }
 }
diff --git a/org.argeo.cms/src/org/argeo/cms/spring/AbstractSystemExecution.java b/org.argeo.cms/src/org/argeo/cms/spring/AbstractSystemExecution.java
deleted file mode 100644 (file)
index ce92c46..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2007-2012 Argeo GmbH
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *         http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.argeo.cms.spring;
-
-import javax.security.auth.Subject;
-import javax.security.auth.login.LoginContext;
-import javax.security.auth.login.LoginException;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.CmsException;
-import org.argeo.node.NodeConstants;
-
-/** Provides base method for executing code with system authorization. */
-abstract class AbstractSystemExecution {
-       private final static Log log = LogFactory.getLog(AbstractSystemExecution.class);
-       private final Subject subject = new Subject();
-
-       /** Authenticate the calling thread */
-       protected void authenticateAsSystem() {
-               ClassLoader origClassLoader = Thread.currentThread().getContextClassLoader();
-               Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
-               try {
-                       LoginContext lc = new LoginContext(NodeConstants.LOGIN_CONTEXT_DATA_ADMIN, subject);
-                       lc.login();
-               } catch (LoginException e) {
-                       throw new CmsException("Cannot login as system", e);
-               } finally {
-                       Thread.currentThread().setContextClassLoader(origClassLoader);
-               }
-               if (log.isTraceEnabled())
-                       log.trace("System authenticated");
-       }
-
-       protected void deauthenticateAsSystem() {
-               ClassLoader origClassLoader = Thread.currentThread().getContextClassLoader();
-               Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
-               try {
-                       LoginContext lc = new LoginContext(NodeConstants.LOGIN_CONTEXT_DATA_ADMIN, subject);
-                       lc.logout();
-               } catch (LoginException e) {
-                       throw new CmsException("Cannot logout as system", e);
-               } finally {
-                       Thread.currentThread().setContextClassLoader(origClassLoader);
-               }
-       }
-
-       protected Subject getSubject() {
-               return subject;
-       }
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/spring/AuthenticatedApplicationContextInitialization.java b/org.argeo.cms/src/org/argeo/cms/spring/AuthenticatedApplicationContextInitialization.java
deleted file mode 100644 (file)
index e1af582..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2007-2012 Argeo GmbH
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *         http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.argeo.cms.spring;
-
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.security.auth.Subject;
-
-import org.eclipse.gemini.blueprint.context.DependencyInitializationAwareBeanPostProcessor;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.support.AbstractBeanFactory;
-import org.springframework.beans.factory.support.SecurityContextProvider;
-import org.springframework.beans.factory.support.SimpleSecurityContextProvider;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-
-/**
- * Executes with a system authentication the instantiation and initialization
- * methods of the application context where it has been defined.
- */
-public class AuthenticatedApplicationContextInitialization extends
-               AbstractSystemExecution implements
-               DependencyInitializationAwareBeanPostProcessor, ApplicationContextAware {
-       /** If non empty, restricts to these beans */
-       private List<String> beanNames = new ArrayList<String>();
-
-       public Object postProcessBeforeInitialization(Object bean, String beanName)
-                       throws BeansException {
-               if (beanNames.size() == 0 || beanNames.contains(beanName))
-                       authenticateAsSystem();
-               return bean;
-       }
-
-       public Object postProcessAfterInitialization(Object bean, String beanName)
-                       throws BeansException {
-               if (beanNames.size() == 0 || beanNames.contains(beanName))
-                       deauthenticateAsSystem();
-               return bean;
-       }
-
-       public void setBeanNames(List<String> beanNames) {
-               this.beanNames = beanNames;
-       }
-
-       @Override
-       public void setApplicationContext(ApplicationContext applicationContext)
-                       throws BeansException {
-               if (applicationContext.getAutowireCapableBeanFactory() instanceof AbstractBeanFactory) {
-                       final AbstractBeanFactory beanFactory = ((AbstractBeanFactory) applicationContext
-                                       .getAutowireCapableBeanFactory());
-                       // retrieve subject's access control context
-                       // and set it as the bean factory security context
-                       Subject.doAs(getSubject(), new PrivilegedAction<Void>() {
-                               @Override
-                               public Void run() {
-                                       SecurityContextProvider scp = new SimpleSecurityContextProvider(
-                                                       AccessController.getContext());
-                                       beanFactory.setSecurityContextProvider(scp);
-                                       return null;
-                               }
-                       });
-               }
-       }
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/spring/SimpleRoleRegistration.java b/org.argeo.cms/src/org/argeo/cms/spring/SimpleRoleRegistration.java
deleted file mode 100644 (file)
index 255ce11..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.argeo.cms.spring;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import javax.naming.InvalidNameException;
-import javax.naming.ldap.LdapName;
-import javax.transaction.UserTransaction;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.CmsException;
-import org.osgi.service.useradmin.Role;
-import org.osgi.service.useradmin.UserAdmin;
-
-/**
- * Register one or many roles via a user admin service. Does nothing if the role
- * is already registered.
- */
-public class SimpleRoleRegistration implements Runnable {
-       private final static Log log = LogFactory
-                       .getLog(SimpleRoleRegistration.class);
-
-       private String role;
-       private List<String> roles = new ArrayList<String>();
-       private UserAdmin userAdmin;
-       private UserTransaction userTransaction;
-
-       @Override
-       public void run() {
-               try {
-                       userTransaction.begin();
-                       if (role != null && !roleExists(role))
-                               newRole(toDn(role));
-
-                       for (String r : roles)
-                               if (!roleExists(r))
-                                       newRole(toDn(r));
-                       userTransaction.commit();
-               } catch (Exception e) {
-                       try {
-                               userTransaction.rollback();
-                       } catch (Exception e1) {
-                               log.error("Cannot rollback", e1);
-                       }
-                       throw new CmsException("Cannot add roles", e);
-               }
-       }
-
-       private boolean roleExists(String role) {
-               return userAdmin.getRole(toDn(role).toString()) != null;
-       }
-
-       protected void newRole(LdapName r) {
-               userAdmin.createRole(r.toString(), Role.GROUP);
-               log.info("Added role " + r + " required by application.");
-       }
-
-       public void register(UserAdmin userAdminService, Map<?, ?> properties) {
-               this.userAdmin = userAdminService;
-               run();
-       }
-
-       protected LdapName toDn(String name) {
-               try {
-                       return new LdapName("cn=" + name + ",ou=roles,ou=node");
-               } catch (InvalidNameException e) {
-                       throw new CmsException("Badly formatted role name " + name, e);
-               }
-       }
-
-       public void setRole(String role) {
-               this.role = role;
-       }
-
-       public void setRoles(List<String> roles) {
-               this.roles = roles;
-       }
-
-       public void setUserAdmin(UserAdmin userAdminService) {
-               this.userAdmin = userAdminService;
-       }
-
-       public void setUserTransaction(UserTransaction userTransaction) {
-               this.userTransaction = userTransaction;
-       }
-
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/spring/osgi/OsgiModuleLabel.java b/org.argeo.cms/src/org/argeo/cms/spring/osgi/OsgiModuleLabel.java
deleted file mode 100644 (file)
index f085d6a..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-package org.argeo.cms.spring.osgi;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-
-/**
- * Logs the name and version of an OSGi bundle based on its
- * {@link BundleContext}.
- */
-public class OsgiModuleLabel {
-       private final static Log log = LogFactory.getLog(OsgiModuleLabel.class);
-
-       private Bundle bundle;
-
-       public OsgiModuleLabel() {
-       }
-
-       /** Sets without logging. */
-       public OsgiModuleLabel(Bundle bundle) {
-               this.bundle = bundle;
-       }
-
-       /**
-        * Retrieved bundle from a bundle context and logs it. Typically to be set
-        * as a Spring bean.
-        */
-       public void setBundleContext(BundleContext bundleContext) {
-               this.bundle = bundleContext.getBundle();
-               log.info(msg());
-       }
-
-       public String msg() {
-               String name = bundle.getHeaders().get(Constants.BUNDLE_NAME).toString();
-               String symbolicName = bundle.getSymbolicName();
-               String version = bundle.getVersion().toString();
-               return name + " v" + version + " (" + symbolicName + ")";
-       }
-}
index 8107e871797ec3280a63be2090f8bc9d52120182..3dbc51f9c9a8ed9874ca03dfe0635b8ee33570a4 100644 (file)
@@ -1,4 +1,3 @@
 Fragment-Host: org.apache.jackrabbit.core
-Import-Package: org.springframework.core,\
-org.argeo.node,\
+Import-Package: org.argeo.node,\
 *
index 94eb70482b6751ba3b7d62b98b138acab37a891f..a5036fb5e95b8390b39cdeea1cd1da37d19be6b5 100644 (file)
@@ -12,8 +12,6 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.StandardOpenOption;
 
-import javax.activation.FileTypeMap;
-import javax.activation.MimetypesFileTypeMap;
 import javax.jcr.Binary;
 import javax.jcr.Node;
 import javax.jcr.Property;
@@ -30,23 +28,10 @@ public class BinaryChannel implements SeekableByteChannel {
 
        private long position = 0;
 
-       // private ByteBuffer toWrite;
        private FileChannel fc = null;
 
-       private static FileTypeMap fileTypeMap;
-
-       static {
-               try {
-                       fileTypeMap = new MimetypesFileTypeMap("/etc/mime.types");
-               } catch (IOException e) {
-                       fileTypeMap = FileTypeMap.getDefaultFileTypeMap();
-               }
-       }
-
-       public BinaryChannel(Node file) throws RepositoryException, IOException {
+       public BinaryChannel(Node file, Path path) throws RepositoryException, IOException {
                this.file = file;
-               // int capacity = 1024 * 1024;
-               // this.toWrite = ByteBuffer.allocate(capacity);
                if (file.isNodeType(NodeType.NT_FILE)) {
                        if (file.hasNode(Property.JCR_CONTENT)) {
                                Node data = file.getNode(Property.JCR_CONTENT);
@@ -59,7 +44,8 @@ public class BinaryChannel implements SeekableByteChannel {
                                data.setProperty(Property.JCR_DATA, this.binary);
 
                                // MIME type
-                               String mime = fileTypeMap.getContentType(file.getName());
+                               String mime = Files.probeContentType(path);
+                               // String mime = fileTypeMap.getContentType(file.getName());
                                data.setProperty(Property.JCR_MIMETYPE, mime);
 
                                data.getSession().save();
@@ -81,9 +67,6 @@ public class BinaryChannel implements SeekableByteChannel {
                        Binary newBinary = null;
                        try {
                                Session session = file.getSession();
-                               // byte[] arr = new byte[(int) position];
-                               // toWrite.flip();
-                               // toWrite.get(arr);
                                fc.position(0);
                                InputStream in = Channels.newInputStream(fc);
                                newBinary = session.getValueFactory().createBinary(in);
@@ -113,20 +96,9 @@ public class BinaryChannel implements SeekableByteChannel {
 
                        try {
                                int read;
-                               // int capacity = dst.capacity();
                                byte[] arr = dst.array();
                                read = binary.read(arr, position);
-                               // dst.put(arr, 0, read);
-
-                               // try {
-                               // byte[] arr = dst.array();
-                               // read = binary.read(arr, position);
-                               // } catch (UnsupportedOperationException e) {
-                               // int capacity = dst.capacity();
-                               // byte[] arr = new byte[capacity];
-                               // read = binary.read(arr, position);
-                               // dst.put(arr);
-                               // }
+
                                if (read != -1)
                                        position = position + read;
                                return read;
@@ -140,15 +112,6 @@ public class BinaryChannel implements SeekableByteChannel {
        public int write(ByteBuffer src) throws IOException {
                int written = getFileChannel().write(src);
                return written;
-               // int byteCount = src.remaining();
-               // if (toWrite.remaining() < byteCount)
-               // throw new JcrFsException("Write buffer is full");
-               // toWrite.put(src);
-               // if (position < binarySize)
-               // position = binarySize + byteCount;
-               // else
-               // position = position + byteCount;
-               // return byteCount;
        }
 
        @Override
@@ -185,9 +148,6 @@ public class BinaryChannel implements SeekableByteChannel {
        @Override
        public SeekableByteChannel truncate(long size) throws IOException {
                getFileChannel().truncate(size);
-               // if (size != size())
-               // throw new UnsupportedOperationException("Cannot truncate JCR
-               // binary");
                return this;
        }
 
index 096546556e00b6d7931ae6ee0e96c65e42e37317..7dbd4e43f88116e96a127b3b305fd1fae8dfe515 100644 (file)
@@ -55,7 +55,7 @@ public abstract class JcrFileSystemProvider extends FileSystemProvider {
                        }
                        if (!node.isNodeType(NodeType.NT_FILE))
                                throw new UnsupportedOperationException(node + " must be a file");
-                       return new BinaryChannel(node);
+                       return new BinaryChannel(node, path);
                } catch (RepositoryException e) {
                        discardChanges(node);
                        throw new IOException("Cannot read file", e);
index bcfde8e1b6301fb9a36cd33dda1fe5f61fc763ca..a51cdbbad82691d550b239f35e1e75e80660b591 100644 (file)
@@ -1,7 +1,5 @@
 Import-Package: org.apache.commons.io,\
                                org.eclipse.core.commands,\
-                               org.springframework.beans.factory,\
-                               org.springframework.core.io.support,\
                                org.argeo.eclipse.ui.utils,\
                                !org.eclipse.core.runtime,\
                                !org.eclipse.ui.plugin,\