From 1a0d5ca243bc86a5f54448186178e5fb04c623e9 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sun, 5 Dec 2021 10:42:44 +0100 Subject: [PATCH] Remove all JCR related components from CMS. --- demo/cms-e4-rap.properties | 3 + org.argeo.api/bnd.bnd | 1 - org.argeo.cms.jcr/.project | 5 + .../OSGI-INF/dataServletContext.xml | 0 .../OSGI-INF/filesServlet.xml | 4 +- .../OSGI-INF/filesServletContext.xml | 0 org.argeo.cms.jcr/OSGI-INF/jcrDeployment.xml | 5 + .../OSGI-INF/jcrServletContext.xml | 0 org.argeo.cms.jcr/bnd.bnd | 26 +- org.argeo.cms.jcr/build.properties | 8 +- .../org/argeo/cms/tabular/JcrTabularTest.java | 0 org.argeo.cms.jcr/pom.xml | 5 + .../src/org/argeo/cms/fs/CmsFsUtils.java | 0 .../CustomRepositoryConfigurationParser.java | 0 .../cms/internal/jcr/JackrabbitType.java | 0 .../argeo/cms/internal/jcr/JcrInitUtils.java | 0 .../cms/internal/jcr/LocalFsDataStore.java | 0 .../org/argeo/cms/internal/jcr/RepoConf.java | 0 .../cms/internal/jcr/RepositoryBuilder.java | 2 +- .../argeo/cms/internal/jcr/repository-h2.xml | 0 .../internal/jcr/repository-h2_postgresql.xml | 0 .../cms/internal/jcr/repository-localfs.xml | 0 .../cms/internal/jcr/repository-memory.xml | 0 .../internal/jcr/repository-postgresql.xml | 0 .../jcr/repository-postgresql_cluster.xml | 0 .../jcr/repository-postgresql_cluster_ds.xml | 0 .../internal/jcr/repository-postgresql_ds.xml | 0 .../src/org/argeo/cms/jcr}/argeo.cnd | 0 .../src/org/argeo/cms/jcr}/dn.cnd | 0 .../cms/jcr/internal}/CmsFsProvider.java | 2 +- .../org/argeo/cms/jcr/internal}/CmsPaths.java | 2 +- .../jcr/internal}/CmsWorkspaceIndexer.java | 2 +- .../argeo/cms/jcr/internal}/DataModels.java | 2 +- .../cms/jcr/internal}/EgoRepository.java | 2 +- .../internal}/JackrabbitLocalRepository.java | 2 +- .../argeo/cms/jcr/internal/JcrDeployment.java | 482 ++++++++++++++++++ .../argeo/cms/jcr/internal}/JcrKeyring.java | 3 +- .../cms/jcr/internal/KernelConstants.java | 53 ++ .../argeo/cms/jcr/internal/KernelUtils.java | 262 ++++++++++ .../cms/jcr/internal}/LocalRepository.java | 2 +- .../argeo/cms/jcr/internal}/NodeKeyRing.java | 3 +- .../jcr/internal}/NodeRepositoryFactory.java | 8 +- .../internal}/RepositoryServiceFactory.java | 13 +- .../cms/jcr/internal/StatisticsThread.java | 16 +- .../jcr/internal/osgi/CmsJcrActivator.java | 108 ++++ .../internal/servlet}/CmsRemotingServlet.java | 2 +- .../internal/servlet}/CmsSessionProvider.java | 7 +- .../internal/servlet}/CmsWebDavServlet.java | 2 +- .../jcr/internal/servlet/JcrHttpUtils.java | 73 +++ .../jcr/internal/servlet}/LinkServlet.java | 2 +- .../internal/servlet}/protectedHandlers.xml | 0 .../jcr/internal/servlet}/webdav-config.xml | 0 .../src/org/argeo/cms/jcr}/ldap.cnd | 0 .../src/org/argeo/cms/jcr}/node.cnd | 0 .../argeo/cms/tabular/CsvTabularWriter.java | 0 .../cms/tabular/JcrTabularRowIterator.java | 0 .../argeo/cms/tabular/JcrTabularWriter.java | 0 .../org/argeo/cms/tabular/package-info.java | 0 .../JackrabbitDataModelMigration.java | 1 - .../ArgeoAccessControlProvider.java | 0 .../jackrabbit/ArgeoAccessManager.java | 0 .../security/jackrabbit/ArgeoAuthContext.java | 0 .../jackrabbit/ArgeoSecurityManager.java | 0 .../SystemJackrabbitLoginModule.java | 0 .../security/jackrabbit/package-info.java | 0 .../.settings/org.eclipse.jdt.core.prefs | 102 ---- org.argeo.cms/OSGI-INF/nodeDeployment.xml | 7 - org.argeo.cms/OSGI-INF/nodeInstance.xml | 7 - org.argeo.cms/OSGI-INF/nodeState.xml | 7 - org.argeo.cms/bnd.bnd | 19 +- org.argeo.cms/build.properties | 3 +- org.argeo.cms/pom.xml | 5 - .../argeo/cms/internal/http/HttpUtils.java | 3 - .../argeo/cms/internal/kernel/Activator.java | 2 +- .../cms/internal/kernel/CmsDeployment.java | 400 +-------------- .../cms/internal/kernel/CmsInstance.java | 54 +- .../argeo/cms/internal/kernel/CmsState.java | 39 +- .../cms/internal/kernel/DeployConfig.java | 10 +- .../argeo/cms/internal/kernel/InitUtils.java | 12 - .../cms/internal/kernel/KernelUtils.java | 131 +++-- org.argeo.jcr/.classpath | 7 - org.argeo.jcr/.project | 28 - org.argeo.jcr/META-INF/.gitignore | 1 - org.argeo.jcr/bnd.bnd | 5 - org.argeo.jcr/build.properties | 5 - org.argeo.jcr/pom.xml | 11 - org.argeo.maintenance/.classpath | 7 - org.argeo.maintenance/.project | 28 - .../.settings/org.eclipse.jdt.core.prefs | 101 ---- org.argeo.maintenance/META-INF/.gitignore | 1 - org.argeo.maintenance/bnd.bnd | 1 - org.argeo.maintenance/build.properties | 6 - org.argeo.maintenance/pom.xml | 35 -- 93 files changed, 1170 insertions(+), 975 deletions(-) rename {org.argeo.cms => org.argeo.cms.jcr}/OSGI-INF/dataServletContext.xml (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/OSGI-INF/filesServlet.xml (83%) rename {org.argeo.cms => org.argeo.cms.jcr}/OSGI-INF/filesServletContext.xml (100%) create mode 100644 org.argeo.cms.jcr/OSGI-INF/jcrDeployment.xml rename {org.argeo.cms => org.argeo.cms.jcr}/OSGI-INF/jcrServletContext.xml (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/ext/test/org/argeo/cms/tabular/JcrTabularTest.java (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/cms/fs/CmsFsUtils.java (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/cms/internal/jcr/CustomRepositoryConfigurationParser.java (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/cms/internal/jcr/JackrabbitType.java (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/cms/internal/jcr/JcrInitUtils.java (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/cms/internal/jcr/LocalFsDataStore.java (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/cms/internal/jcr/RepoConf.java (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/cms/internal/jcr/RepositoryBuilder.java (99%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/cms/internal/jcr/repository-h2.xml (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/cms/internal/jcr/repository-h2_postgresql.xml (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/cms/internal/jcr/repository-localfs.xml (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/cms/internal/jcr/repository-memory.xml (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/cms/internal/jcr/repository-postgresql.xml (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster.xml (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster_ds.xml (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/cms/internal/jcr/repository-postgresql_ds.xml (100%) rename {org.argeo.cms/src/org/argeo/cms => org.argeo.cms.jcr/src/org/argeo/cms/jcr}/argeo.cnd (100%) rename {org.argeo.cms/src/org/argeo/cms => org.argeo.cms.jcr/src/org/argeo/cms/jcr}/dn.cnd (100%) rename {org.argeo.cms/src/org/argeo/cms/internal/kernel => org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal}/CmsFsProvider.java (99%) rename {org.argeo.cms/src/org/argeo/cms/internal/kernel => org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal}/CmsPaths.java (91%) rename {org.argeo.cms/src/org/argeo/cms/internal/kernel => org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal}/CmsWorkspaceIndexer.java (99%) rename {org.argeo.cms/src/org/argeo/cms/internal/kernel => org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal}/DataModels.java (99%) rename {org.argeo.cms/src/org/argeo/cms/internal/kernel => org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal}/EgoRepository.java (99%) rename {org.argeo.cms/src/org/argeo/cms/internal/kernel => org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal}/JackrabbitLocalRepository.java (98%) create mode 100644 org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/JcrDeployment.java rename {org.argeo.cms/src/org/argeo/cms/security => org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal}/JcrKeyring.java (99%) create mode 100644 org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/KernelConstants.java create mode 100644 org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/KernelUtils.java rename {org.argeo.cms/src/org/argeo/cms/internal/kernel => org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal}/LocalRepository.java (92%) rename {org.argeo.cms/src/org/argeo/cms/internal/kernel => org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal}/NodeKeyRing.java (82%) rename {org.argeo.cms/src/org/argeo/cms/internal/kernel => org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal}/NodeRepositoryFactory.java (96%) rename {org.argeo.cms/src/org/argeo/cms/internal/kernel => org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal}/RepositoryServiceFactory.java (90%) rename org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelThread.java => org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/StatisticsThread.java (90%) create mode 100644 org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/osgi/CmsJcrActivator.java rename {org.argeo.cms/src/org/argeo/cms/internal/http => org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet}/CmsRemotingServlet.java (96%) rename {org.argeo.cms/src/org/argeo/cms/internal/http => org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet}/CmsSessionProvider.java (96%) rename {org.argeo.cms/src/org/argeo/cms/internal/http => org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet}/CmsWebDavServlet.java (95%) create mode 100644 org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/JcrHttpUtils.java rename {org.argeo.cms/src/org/argeo/cms/internal/http => org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet}/LinkServlet.java (99%) rename {org.argeo.cms/src/org/argeo/cms/internal/http => org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet}/protectedHandlers.xml (100%) rename {org.argeo.cms/src/org/argeo/cms/internal/http => org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet}/webdav-config.xml (100%) rename {org.argeo.api/src/org/argeo/api => org.argeo.cms.jcr/src/org/argeo/cms/jcr}/ldap.cnd (100%) rename {org.argeo.api/src/org/argeo/api => org.argeo.cms.jcr/src/org/argeo/cms/jcr}/node.cnd (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/cms/tabular/CsvTabularWriter.java (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/cms/tabular/JcrTabularRowIterator.java (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/cms/tabular/JcrTabularWriter.java (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/cms/tabular/package-info.java (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/security/jackrabbit/ArgeoAccessControlProvider.java (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/security/jackrabbit/ArgeoAccessManager.java (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/security/jackrabbit/ArgeoAuthContext.java (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/security/jackrabbit/ArgeoSecurityManager.java (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/security/jackrabbit/SystemJackrabbitLoginModule.java (100%) rename {org.argeo.cms => org.argeo.cms.jcr}/src/org/argeo/security/jackrabbit/package-info.java (100%) delete mode 100644 org.argeo.cms/.settings/org.eclipse.jdt.core.prefs delete mode 100644 org.argeo.cms/OSGI-INF/nodeDeployment.xml delete mode 100644 org.argeo.cms/OSGI-INF/nodeInstance.xml delete mode 100644 org.argeo.cms/OSGI-INF/nodeState.xml delete mode 100644 org.argeo.jcr/.classpath delete mode 100644 org.argeo.jcr/.project delete mode 100644 org.argeo.jcr/META-INF/.gitignore delete mode 100644 org.argeo.jcr/bnd.bnd delete mode 100644 org.argeo.jcr/build.properties delete mode 100644 org.argeo.jcr/pom.xml delete mode 100644 org.argeo.maintenance/.classpath delete mode 100644 org.argeo.maintenance/.project delete mode 100644 org.argeo.maintenance/.settings/org.eclipse.jdt.core.prefs delete mode 100644 org.argeo.maintenance/META-INF/.gitignore delete mode 100644 org.argeo.maintenance/bnd.bnd delete mode 100644 org.argeo.maintenance/build.properties delete mode 100644 org.argeo.maintenance/pom.xml diff --git a/demo/cms-e4-rap.properties b/demo/cms-e4-rap.properties index 1497d7cc9..feeab0748 100644 --- a/demo/cms-e4-rap.properties +++ b/demo/cms-e4-rap.properties @@ -8,6 +8,9 @@ org.eclipse.rap.rwt.osgi argeo.osgi.start.3.node=\ org.argeo.cms +argeo.osgi.start.4.node=\ +org.argeo.cms.jcr + argeo.osgi.start.5.node=\ org.argeo.cms.e4.rap diff --git a/org.argeo.api/bnd.bnd b/org.argeo.api/bnd.bnd index dfa245084..e69de29bb 100644 --- a/org.argeo.api/bnd.bnd +++ b/org.argeo.api/bnd.bnd @@ -1 +0,0 @@ -Provide-Capability: cms.datamodel;name=ldap;cnd=/org/argeo/api/ldap.cnd;abstract=true diff --git a/org.argeo.cms.jcr/.project b/org.argeo.cms.jcr/.project index 9b33a445c..3e470f829 100644 --- a/org.argeo.cms.jcr/.project +++ b/org.argeo.cms.jcr/.project @@ -20,6 +20,11 @@ + + org.eclipse.pde.ds.core.builder + + + org.eclipse.pde.PluginNature diff --git a/org.argeo.cms/OSGI-INF/dataServletContext.xml b/org.argeo.cms.jcr/OSGI-INF/dataServletContext.xml similarity index 100% rename from org.argeo.cms/OSGI-INF/dataServletContext.xml rename to org.argeo.cms.jcr/OSGI-INF/dataServletContext.xml diff --git a/org.argeo.cms/OSGI-INF/filesServlet.xml b/org.argeo.cms.jcr/OSGI-INF/filesServlet.xml similarity index 83% rename from org.argeo.cms/OSGI-INF/filesServlet.xml rename to org.argeo.cms.jcr/OSGI-INF/filesServlet.xml index ec161faa6..a283ef075 100644 --- a/org.argeo.cms/OSGI-INF/filesServlet.xml +++ b/org.argeo.cms.jcr/OSGI-INF/filesServlet.xml @@ -1,12 +1,12 @@ - + - + diff --git a/org.argeo.cms/OSGI-INF/filesServletContext.xml b/org.argeo.cms.jcr/OSGI-INF/filesServletContext.xml similarity index 100% rename from org.argeo.cms/OSGI-INF/filesServletContext.xml rename to org.argeo.cms.jcr/OSGI-INF/filesServletContext.xml diff --git a/org.argeo.cms.jcr/OSGI-INF/jcrDeployment.xml b/org.argeo.cms.jcr/OSGI-INF/jcrDeployment.xml new file mode 100644 index 000000000..4ca86d31c --- /dev/null +++ b/org.argeo.cms.jcr/OSGI-INF/jcrDeployment.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/org.argeo.cms/OSGI-INF/jcrServletContext.xml b/org.argeo.cms.jcr/OSGI-INF/jcrServletContext.xml similarity index 100% rename from org.argeo.cms/OSGI-INF/jcrServletContext.xml rename to org.argeo.cms.jcr/OSGI-INF/jcrServletContext.xml diff --git a/org.argeo.cms.jcr/bnd.bnd b/org.argeo.cms.jcr/bnd.bnd index 5a8e8ab0b..6bb15aba5 100644 --- a/org.argeo.cms.jcr/bnd.bnd +++ b/org.argeo.cms.jcr/bnd.bnd @@ -1,7 +1,22 @@ +Bundle-Activator: org.argeo.cms.jcr.internal.osgi.CmsJcrActivator + Provide-Capability:\ -cms.datamodel; name=jcrx; cnd=/org/argeo/jcr/jcrx.cnd; abstract=true +cms.datamodel; name=jcrx; cnd=/org/argeo/jcr/jcrx.cnd; abstract=true,\ +cms.datamodel; name=argeo; cnd=/org/argeo/cms/jcr/argeo.cnd; abstract=true,\ +cms.datamodel;name=ldap; cnd=/org/argeo/cms/jcr/ldap.cnd; abstract=true,\ +osgi.service;objectClass="javax.jcr.Repository" Import-Package:\ +org.argeo.cms.servlet,\ +javax.jcr.security,\ +org.h2;resolution:=optional,\ +org.postgresql;resolution:=optional,\ +org.apache.jackrabbit.webdav.server,\ +org.apache.jackrabbit.webdav.jcr,\ +org.apache.commons.httpclient.cookie;resolution:=optional,\ +org.osgi.framework.namespace;version=0.0.0,\ +org.osgi.*;version=0.0.0,\ +org.osgi.service.http.whiteboard,\ org.apache.jackrabbit.api,\ org.apache.jackrabbit.commons,\ org.apache.jackrabbit.spi,\ @@ -9,4 +24,11 @@ org.apache.jackrabbit.spi2dav,\ org.apache.jackrabbit.spi2davex,\ org.apache.jackrabbit.webdav,\ junit.*;resolution:=optional,\ -* \ No newline at end of file +* + +Service-Component:\ +OSGI-INF/jcrDeployment.xml,\ +OSGI-INF/jcrServletContext.xml,\ +OSGI-INF/dataServletContext.xml,\ +OSGI-INF/filesServletContext.xml,\ +OSGI-INF/filesServlet.xml diff --git a/org.argeo.cms.jcr/build.properties b/org.argeo.cms.jcr/build.properties index 8667a0edf..fc636406c 100644 --- a/org.argeo.cms.jcr/build.properties +++ b/org.argeo.cms.jcr/build.properties @@ -1,8 +1,9 @@ -source.. = src/,\ - ext/test/ output.. = bin/ bin.includes = META-INF/,\ - . + .,\ + OSGI-INF/jcrDeployment.xml +source.. = src/,\ + ext/test/ additional.bundles = org.junit,\ org.hamcrest,\ org.apache.jackrabbit.core,\ @@ -27,4 +28,3 @@ additional.bundles = org.junit,\ org.apache.httpcomponents.httpclient,\ org.apache.httpcomponents.httpcore,\ org.apache.tika.parsers - \ No newline at end of file diff --git a/org.argeo.cms/ext/test/org/argeo/cms/tabular/JcrTabularTest.java b/org.argeo.cms.jcr/ext/test/org/argeo/cms/tabular/JcrTabularTest.java similarity index 100% rename from org.argeo.cms/ext/test/org/argeo/cms/tabular/JcrTabularTest.java rename to org.argeo.cms.jcr/ext/test/org/argeo/cms/tabular/JcrTabularTest.java diff --git a/org.argeo.cms.jcr/pom.xml b/org.argeo.cms.jcr/pom.xml index 396cabecb..70c106a30 100644 --- a/org.argeo.cms.jcr/pom.xml +++ b/org.argeo.cms.jcr/pom.xml @@ -25,5 +25,10 @@ org.argeo.core 2.3-SNAPSHOT + + org.argeo.commons + org.argeo.cms + 2.3-SNAPSHOT + \ No newline at end of file diff --git a/org.argeo.cms/src/org/argeo/cms/fs/CmsFsUtils.java b/org.argeo.cms.jcr/src/org/argeo/cms/fs/CmsFsUtils.java similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/fs/CmsFsUtils.java rename to org.argeo.cms.jcr/src/org/argeo/cms/fs/CmsFsUtils.java diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/CustomRepositoryConfigurationParser.java b/org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/CustomRepositoryConfigurationParser.java similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/internal/jcr/CustomRepositoryConfigurationParser.java rename to org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/CustomRepositoryConfigurationParser.java diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/JackrabbitType.java b/org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/JackrabbitType.java similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/internal/jcr/JackrabbitType.java rename to org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/JackrabbitType.java diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/JcrInitUtils.java b/org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/JcrInitUtils.java similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/internal/jcr/JcrInitUtils.java rename to org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/JcrInitUtils.java diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/LocalFsDataStore.java b/org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/LocalFsDataStore.java similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/internal/jcr/LocalFsDataStore.java rename to org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/LocalFsDataStore.java diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/RepoConf.java b/org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/RepoConf.java similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/internal/jcr/RepoConf.java rename to org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/RepoConf.java diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/RepositoryBuilder.java b/org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/RepositoryBuilder.java similarity index 99% rename from org.argeo.cms/src/org/argeo/cms/internal/jcr/RepositoryBuilder.java rename to org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/RepositoryBuilder.java index fbb1e4f7a..22d763a79 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/jcr/RepositoryBuilder.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/RepositoryBuilder.java @@ -22,7 +22,7 @@ import org.apache.jackrabbit.core.cache.CacheManager; import org.apache.jackrabbit.core.config.RepositoryConfig; import org.apache.jackrabbit.core.config.RepositoryConfigurationParser; import org.argeo.api.NodeConstants; -import org.argeo.cms.internal.kernel.CmsPaths; +import org.argeo.cms.jcr.internal.CmsPaths; import org.xml.sax.InputSource; /** Can interpret properties in order to create an actual JCR repository. */ diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-h2.xml b/org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/repository-h2.xml similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-h2.xml rename to org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/repository-h2.xml diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-h2_postgresql.xml b/org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/repository-h2_postgresql.xml similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-h2_postgresql.xml rename to org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/repository-h2_postgresql.xml diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-localfs.xml b/org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/repository-localfs.xml similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-localfs.xml rename to org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/repository-localfs.xml diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-memory.xml b/org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/repository-memory.xml similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-memory.xml rename to org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/repository-memory.xml diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql.xml b/org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/repository-postgresql.xml similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql.xml rename to org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/repository-postgresql.xml diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster.xml b/org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster.xml similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster.xml rename to org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster.xml diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster_ds.xml b/org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster_ds.xml similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster_ds.xml rename to org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/repository-postgresql_cluster_ds.xml diff --git a/org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_ds.xml b/org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/repository-postgresql_ds.xml similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/internal/jcr/repository-postgresql_ds.xml rename to org.argeo.cms.jcr/src/org/argeo/cms/internal/jcr/repository-postgresql_ds.xml diff --git a/org.argeo.cms/src/org/argeo/cms/argeo.cnd b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/argeo.cnd similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/argeo.cnd rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/argeo.cnd diff --git a/org.argeo.cms/src/org/argeo/cms/dn.cnd b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/dn.cnd similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/dn.cnd rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/dn.cnd diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsFsProvider.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsFsProvider.java similarity index 99% rename from org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsFsProvider.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsFsProvider.java index 6cd0bf874..704adf15f 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsFsProvider.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsFsProvider.java @@ -1,4 +1,4 @@ -package org.argeo.cms.internal.kernel; +package org.argeo.cms.jcr.internal; import java.io.IOException; import java.net.URI; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsPaths.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsPaths.java similarity index 91% rename from org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsPaths.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsPaths.java index ebdb92593..e7f5a55af 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsPaths.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsPaths.java @@ -1,4 +1,4 @@ -package org.argeo.cms.internal.kernel; +package org.argeo.cms.jcr.internal; import java.nio.file.Path; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsWorkspaceIndexer.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsWorkspaceIndexer.java similarity index 99% rename from org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsWorkspaceIndexer.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsWorkspaceIndexer.java index bb38d6a63..7afa1d8d2 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsWorkspaceIndexer.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsWorkspaceIndexer.java @@ -1,4 +1,4 @@ -package org.argeo.cms.internal.kernel; +package org.argeo.cms.jcr.internal; import java.util.GregorianCalendar; import java.util.concurrent.LinkedBlockingDeque; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/DataModels.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/DataModels.java similarity index 99% rename from org.argeo.cms/src/org/argeo/cms/internal/kernel/DataModels.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/DataModels.java index acf0dbf7c..a1b500816 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/DataModels.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/DataModels.java @@ -1,4 +1,4 @@ -package org.argeo.cms.internal.kernel; +package org.argeo.cms.jcr.internal; import static org.argeo.api.DataModelNamespace.CMS_DATA_MODEL_NAMESPACE; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/EgoRepository.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/EgoRepository.java similarity index 99% rename from org.argeo.cms/src/org/argeo/cms/internal/kernel/EgoRepository.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/EgoRepository.java index c866eaaa2..68bfce8d8 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/EgoRepository.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/EgoRepository.java @@ -1,4 +1,4 @@ -package org.argeo.cms.internal.kernel; +package org.argeo.cms.jcr.internal; import java.security.PrivilegedAction; import java.text.SimpleDateFormat; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitLocalRepository.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/JackrabbitLocalRepository.java similarity index 98% rename from org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitLocalRepository.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/JackrabbitLocalRepository.java index 61cf11dfd..71e25cf8b 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/JackrabbitLocalRepository.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/JackrabbitLocalRepository.java @@ -1,4 +1,4 @@ -package org.argeo.cms.internal.kernel; +package org.argeo.cms.jcr.internal; import java.util.Map; import java.util.TreeMap; diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/JcrDeployment.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/JcrDeployment.java new file mode 100644 index 000000000..d0fa841e0 --- /dev/null +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/JcrDeployment.java @@ -0,0 +1,482 @@ +package org.argeo.cms.jcr.internal; + +import static org.argeo.api.DataModelNamespace.CMS_DATA_MODEL_NAMESPACE; +import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX; + +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.security.auth.callback.CallbackHandler; +import javax.servlet.Servlet; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.jackrabbit.commons.cnd.CndImporter; +import org.apache.jackrabbit.core.RepositoryContext; +import org.apache.jackrabbit.core.RepositoryImpl; +import org.argeo.api.DataModelNamespace; +import org.argeo.api.NodeConstants; +import org.argeo.api.NodeDeployment; +import org.argeo.api.NodeUtils; +import org.argeo.api.security.CryptoKeyring; +import org.argeo.api.security.Keyring; +import org.argeo.cms.ArgeoNames; +import org.argeo.cms.internal.jcr.JcrInitUtils; +import org.argeo.cms.jcr.internal.servlet.CmsRemotingServlet; +import org.argeo.cms.jcr.internal.servlet.CmsWebDavServlet; +import org.argeo.cms.jcr.internal.servlet.JcrHttpUtils; +import org.argeo.jcr.Jcr; +import org.argeo.jcr.JcrException; +import org.argeo.jcr.JcrUtils; +import org.argeo.naming.LdapAttrs; +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.InvalidSyntaxException; +import org.osgi.framework.ServiceReference; +import org.osgi.framework.wiring.BundleCapability; +import org.osgi.framework.wiring.BundleWire; +import org.osgi.framework.wiring.BundleWiring; +import org.osgi.service.cm.ManagedService; +import org.osgi.service.http.whiteboard.HttpWhiteboardConstants; +import org.osgi.util.tracker.ServiceTracker; + +/** Implementation of a CMS deployment. */ +public class JcrDeployment { + private final Log log = LogFactory.getLog(getClass()); + private final BundleContext bc = FrameworkUtil.getBundle(getClass()).getBundleContext(); + + private DataModels dataModels; + private String webDavConfig = JcrHttpUtils.WEBDAV_CONFIG; + + private boolean argeoDataModelExtensionsAvailable = false; + + // Readiness + private boolean nodeAvailable = false; + + NodeDeployment nodeDeployment; + + public JcrDeployment() { + dataModels = new DataModels(bc); +// initTrackers(); + } + + public void init() { + + ServiceTracker repoContextSt = new RepositoryContextStc(); + // repoContextSt.open(); + KernelUtils.asyncOpen(repoContextSt); + +// nodeDeployment = CmsJcrActivator.getService(NodeDeployment.class); + + JcrInitUtils.addToDeployment(nodeDeployment); + + } + + public void destroy() { +// if (nodeHttp != null) +// nodeHttp.destroy(); + + try { + for (ServiceReference sr : bc + .getServiceReferences(JackrabbitLocalRepository.class, null)) { + bc.getService(sr).destroy(); + } + } catch (InvalidSyntaxException e1) { + log.error("Cannot clean repositories", e1); + } + + } + + public void setNodeDeployment(NodeDeployment nodeDeployment) { + this.nodeDeployment = nodeDeployment; + } + + /** + * Checks whether the deployment is available according to expectations, and + * mark it as available. + */ +// private synchronized void checkReadiness() { +// if (isAvailable()) +// return; +// if (nodeAvailable && userAdminAvailable && (httpExpected ? httpAvailable : true)) { +// String data = KernelUtils.getFrameworkProp(KernelUtils.OSGI_INSTANCE_AREA); +// String state = KernelUtils.getFrameworkProp(KernelUtils.OSGI_CONFIGURATION_AREA); +// availableSince = System.currentTimeMillis(); +// long jvmUptime = ManagementFactory.getRuntimeMXBean().getUptime(); +// String jvmUptimeStr = " in " + (jvmUptime / 1000) + "." + (jvmUptime % 1000) + "s"; +// log.info("## ARGEO NODE AVAILABLE" + (log.isDebugEnabled() ? jvmUptimeStr : "") + " ##"); +// if (log.isDebugEnabled()) { +// log.debug("## state: " + state); +// if (data != null) +// log.debug("## data: " + data); +// } +// long begin = bc.getService(bc.getServiceReference(NodeState.class)).getAvailableSince(); +// long initDuration = System.currentTimeMillis() - begin; +// if (log.isTraceEnabled()) +// log.trace("Kernel initialization took " + initDuration + "ms"); +// tributeToFreeSoftware(initDuration); +// } +// } + + private void prepareNodeRepository(Repository deployedNodeRepository, List publishAsLocalRepo) { +// if (availableSince != null) { +// throw new IllegalStateException("Deployment is already available"); +// } + + // home + prepareDataModel(NodeConstants.NODE_REPOSITORY, deployedNodeRepository, publishAsLocalRepo); + + // init from backup +// if (deployConfig.isFirstInit()) { +// Path restorePath = Paths.get(System.getProperty("user.dir"), "restore"); +// if (Files.exists(restorePath)) { +// if (log.isDebugEnabled()) +// log.debug("Found backup " + restorePath + ", restoring it..."); +// LogicalRestore logicalRestore = new LogicalRestore(bc, deployedNodeRepository, restorePath); +// KernelUtils.doAsDataAdmin(logicalRestore); +// log.info("Restored backup from " + restorePath); +// } +// } + + // init from repository + Collection> initRepositorySr; + try { + initRepositorySr = bc.getServiceReferences(Repository.class, + "(" + NodeConstants.CN + "=" + NodeConstants.NODE_INIT + ")"); + } catch (InvalidSyntaxException e1) { + throw new IllegalArgumentException(e1); + } + Iterator> it = initRepositorySr.iterator(); + while (it.hasNext()) { + ServiceReference sr = it.next(); + Object labeledUri = sr.getProperties().get(LdapAttrs.labeledURI.name()); + Repository initRepository = bc.getService(sr); + if (log.isDebugEnabled()) + log.debug("Found init repository " + labeledUri + ", copying it..."); + initFromRepository(deployedNodeRepository, initRepository); + log.info("Node repository initialised from " + labeledUri); + } + } + + /** Init from a (typically remote) repository. */ + private void initFromRepository(Repository deployedNodeRepository, Repository initRepository) { + Session initSession = null; + try { + initSession = initRepository.login(); + workspaces: for (String workspaceName : initSession.getWorkspace().getAccessibleWorkspaceNames()) { + if ("security".equals(workspaceName)) + continue workspaces; + if (log.isDebugEnabled()) + log.debug("Copying workspace " + workspaceName + " from init repository..."); + long begin = System.currentTimeMillis(); + Session targetSession = null; + Session sourceSession = null; + try { + try { + targetSession = NodeUtils.openDataAdminSession(deployedNodeRepository, workspaceName); + } catch (IllegalArgumentException e) {// no such workspace + Session adminSession = NodeUtils.openDataAdminSession(deployedNodeRepository, null); + try { + adminSession.getWorkspace().createWorkspace(workspaceName); + } finally { + Jcr.logout(adminSession); + } + targetSession = NodeUtils.openDataAdminSession(deployedNodeRepository, workspaceName); + } + sourceSession = initRepository.login(workspaceName); +// JcrUtils.copyWorkspaceXml(sourceSession, targetSession); + // TODO deal with referenceable nodes + JcrUtils.copy(sourceSession.getRootNode(), targetSession.getRootNode()); + targetSession.save(); + long duration = System.currentTimeMillis() - begin; + if (log.isDebugEnabled()) + log.debug("Copied workspace " + workspaceName + " from init repository in " + (duration / 1000) + + " s"); + } catch (Exception e) { + log.error("Cannot copy workspace " + workspaceName + " from init repository.", e); + } finally { + Jcr.logout(sourceSession); + Jcr.logout(targetSession); + } + } + } catch (RepositoryException e) { + throw new JcrException(e); + } finally { + Jcr.logout(initSession); + } + } + + private void prepareHomeRepository(RepositoryImpl deployedRepository) { + Session adminSession = KernelUtils.openAdminSession(deployedRepository); + try { + argeoDataModelExtensionsAvailable = Arrays + .asList(adminSession.getWorkspace().getNamespaceRegistry().getURIs()) + .contains(ArgeoNames.ARGEO_NAMESPACE); + } catch (RepositoryException e) { + log.warn("Cannot check whether Argeo namespace is registered assuming it isn't.", e); + argeoDataModelExtensionsAvailable = false; + } finally { + JcrUtils.logoutQuietly(adminSession); + } + + // Publish home with the highest service ranking + Hashtable regProps = new Hashtable<>(); + regProps.put(NodeConstants.CN, NodeConstants.EGO_REPOSITORY); + regProps.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE); + Repository egoRepository = new EgoRepository(deployedRepository, false); + bc.registerService(Repository.class, egoRepository, regProps); + registerRepositoryServlets(NodeConstants.EGO_REPOSITORY, egoRepository); + + // Keyring only if Argeo extensions are available + if (argeoDataModelExtensionsAvailable) { + new ServiceTracker(bc, CallbackHandler.class, null) { + + @Override + public CallbackHandler addingService(ServiceReference reference) { + NodeKeyRing nodeKeyring = new NodeKeyRing(egoRepository); + CallbackHandler callbackHandler = bc.getService(reference); + nodeKeyring.setDefaultCallbackHandler(callbackHandler); + bc.registerService(LangUtils.names(Keyring.class, CryptoKeyring.class, ManagedService.class), + nodeKeyring, LangUtils.dict(Constants.SERVICE_PID, NodeConstants.NODE_KEYRING_PID)); + return callbackHandler; + } + + }.open(); + } + } + + /** Session is logged out. */ + private void prepareDataModel(String cn, Repository repository, List publishAsLocalRepo) { + Session adminSession = KernelUtils.openAdminSession(repository); + try { + Set processed = new HashSet(); + bundles: for (Bundle bundle : bc.getBundles()) { + BundleWiring wiring = bundle.adapt(BundleWiring.class); + if (wiring == null) + continue bundles; + if (NodeConstants.NODE_REPOSITORY.equals(cn))// process all data models + processWiring(cn, adminSession, wiring, processed, false, publishAsLocalRepo); + else { + List capabilities = wiring.getCapabilities(CMS_DATA_MODEL_NAMESPACE); + for (BundleCapability capability : capabilities) { + String dataModelName = (String) capability.getAttributes().get(DataModelNamespace.NAME); + if (dataModelName.equals(cn))// process only own data model + processWiring(cn, adminSession, wiring, processed, false, publishAsLocalRepo); + } + } + } + } finally { + JcrUtils.logoutQuietly(adminSession); + } + } + + private void processWiring(String cn, Session adminSession, BundleWiring wiring, Set processed, + boolean importListedAbstractModels, List publishAsLocalRepo) { + // recursively process requirements first + List requiredWires = wiring.getRequiredWires(CMS_DATA_MODEL_NAMESPACE); + for (BundleWire wire : requiredWires) { + processWiring(cn, adminSession, wire.getProviderWiring(), processed, true, publishAsLocalRepo); + } + + List capabilities = wiring.getCapabilities(CMS_DATA_MODEL_NAMESPACE); + capabilities: for (BundleCapability capability : capabilities) { + if (!importListedAbstractModels + && KernelUtils.asBoolean((String) capability.getAttributes().get(DataModelNamespace.ABSTRACT))) { + continue capabilities; + } + boolean publish = registerDataModelCapability(cn, adminSession, capability, processed); + if (publish) + publishAsLocalRepo.add((String) capability.getAttributes().get(DataModelNamespace.NAME)); + } + } + + private boolean registerDataModelCapability(String cn, Session adminSession, BundleCapability capability, + Set processed) { + Map attrs = capability.getAttributes(); + String name = (String) attrs.get(DataModelNamespace.NAME); + if (processed.contains(name)) { + if (log.isTraceEnabled()) + log.trace("Data model " + name + " has already been processed"); + return false; + } + + // CND + String path = (String) attrs.get(DataModelNamespace.CND); + if (path != null) { + File dataModel = bc.getBundle().getDataFile("dataModels/" + path); + if (!dataModel.exists()) { + URL url = capability.getRevision().getBundle().getResource(path); + if (url == null) + throw new IllegalArgumentException("No data model '" + name + "' found under path " + path); + try (Reader reader = new InputStreamReader(url.openStream())) { + CndImporter.registerNodeTypes(reader, adminSession, true); + processed.add(name); + dataModel.getParentFile().mkdirs(); + dataModel.createNewFile(); + if (log.isDebugEnabled()) + log.debug("Registered CND " + url); + } catch (Exception e) { + log.error("Cannot import CND " + url, e); + } + } + } + + if (KernelUtils.asBoolean((String) attrs.get(DataModelNamespace.ABSTRACT))) + return false; + // Non abstract + boolean isStandalone = isStandalone(name); + boolean publishLocalRepo; + if (isStandalone && name.equals(cn))// includes the node itself + publishLocalRepo = true; + else if (!isStandalone && cn.equals(NodeConstants.NODE_REPOSITORY)) + publishLocalRepo = true; + else + publishLocalRepo = false; + + return publishLocalRepo; + } + + boolean isStandalone(String dataModelName) { + return nodeDeployment.getProps(NodeConstants.NODE_REPOS_FACTORY_PID, dataModelName) != null; + } + + private void publishLocalRepo(String dataModelName, Repository repository) { + Hashtable properties = new Hashtable<>(); + properties.put(NodeConstants.CN, dataModelName); + LocalRepository localRepository; + String[] classes; + if (repository instanceof RepositoryImpl) { + localRepository = new JackrabbitLocalRepository((RepositoryImpl) repository, dataModelName); + classes = new String[] { Repository.class.getName(), LocalRepository.class.getName(), + JackrabbitLocalRepository.class.getName() }; + } else { + localRepository = new LocalRepository(repository, dataModelName); + classes = new String[] { Repository.class.getName(), LocalRepository.class.getName() }; + } + bc.registerService(classes, localRepository, properties); + + // TODO make it configurable + registerRepositoryServlets(dataModelName, localRepository); + if (log.isTraceEnabled()) + log.trace("Published data model " + dataModelName); + } + +// @Override +// public synchronized Long getAvailableSince() { +// return availableSince; +// } +// +// public synchronized boolean isAvailable() { +// return availableSince != null; +// } + + protected void registerRepositoryServlets(String alias, Repository repository) { + // FIXME re-enable it with a proper class loader +// registerRemotingServlet(alias, repository); +// registerWebdavServlet(alias, repository); + } + + protected void registerWebdavServlet(String alias, Repository repository) { + CmsWebDavServlet webdavServlet = new CmsWebDavServlet(alias, repository); + Hashtable ip = new Hashtable<>(); + ip.put(HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + CmsWebDavServlet.INIT_PARAM_RESOURCE_CONFIG, webDavConfig); + ip.put(HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + CmsWebDavServlet.INIT_PARAM_RESOURCE_PATH_PREFIX, + "/" + alias); + + ip.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/" + alias + "/*"); + ip.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, + "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH + "=" + NodeConstants.PATH_DATA + ")"); + bc.registerService(Servlet.class, webdavServlet, ip); + } + + protected void registerRemotingServlet(String alias, Repository repository) { + CmsRemotingServlet remotingServlet = new CmsRemotingServlet(alias, repository); + Hashtable ip = new Hashtable<>(); + ip.put(NodeConstants.CN, alias); + // Properties ip = new Properties(); + ip.put(HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + CmsRemotingServlet.INIT_PARAM_RESOURCE_PATH_PREFIX, + "/" + alias); + ip.put(HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + CmsRemotingServlet.INIT_PARAM_AUTHENTICATE_HEADER, + "Negotiate"); + + // Looks like a bug in Jackrabbit remoting init + Path tmpDir; + try { + tmpDir = Files.createTempDirectory("remoting_" + alias); + } catch (IOException e) { + throw new RuntimeException("Cannot create temp directory for remoting servlet", e); + } + ip.put(HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + CmsRemotingServlet.INIT_PARAM_HOME, tmpDir.toString()); + ip.put(HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + CmsRemotingServlet.INIT_PARAM_TMP_DIRECTORY, + "remoting_" + alias); + ip.put(HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + CmsRemotingServlet.INIT_PARAM_PROTECTED_HANDLERS_CONFIG, + JcrHttpUtils.DEFAULT_PROTECTED_HANDLERS); + ip.put(HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + CmsRemotingServlet.INIT_PARAM_CREATE_ABSOLUTE_URI, "false"); + + ip.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/" + alias + "/*"); + ip.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, + "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH + "=" + NodeConstants.PATH_JCR + ")"); + bc.registerService(Servlet.class, remotingServlet, ip); + } + + private class RepositoryContextStc extends ServiceTracker { + + public RepositoryContextStc() { + super(bc, RepositoryContext.class, null); + } + + @Override + public RepositoryContext addingService(ServiceReference reference) { + RepositoryContext repoContext = bc.getService(reference); + String cn = (String) reference.getProperty(NodeConstants.CN); + if (cn != null) { + List publishAsLocalRepo = new ArrayList<>(); + if (cn.equals(NodeConstants.NODE_REPOSITORY)) { +// JackrabbitDataModelMigration.clearRepositoryCaches(repoContext.getRepositoryConfig()); + prepareNodeRepository(repoContext.getRepository(), publishAsLocalRepo); + // TODO separate home repository + prepareHomeRepository(repoContext.getRepository()); + registerRepositoryServlets(cn, repoContext.getRepository()); + nodeAvailable = true; +// checkReadiness(); + } else { + prepareDataModel(cn, repoContext.getRepository(), publishAsLocalRepo); + } + // Publish all at once, so that bundles with multiple CNDs are consistent + for (String dataModelName : publishAsLocalRepo) + publishLocalRepo(dataModelName, repoContext.getRepository()); + } + return repoContext; + } + + @Override + public void modifiedService(ServiceReference reference, RepositoryContext service) { + } + + @Override + public void removedService(ServiceReference reference, RepositoryContext service) { + } + + } + +} diff --git a/org.argeo.cms/src/org/argeo/cms/security/JcrKeyring.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/JcrKeyring.java similarity index 99% rename from org.argeo.cms/src/org/argeo/cms/security/JcrKeyring.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/JcrKeyring.java index c23db194d..ce658b8f8 100644 --- a/org.argeo.cms/src/org/argeo/cms/security/JcrKeyring.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/JcrKeyring.java @@ -1,4 +1,4 @@ -package org.argeo.cms.security; +package org.argeo.cms.jcr.internal; import java.io.ByteArrayInputStream; import java.io.CharArrayReader; @@ -33,6 +33,7 @@ import org.argeo.api.NodeUtils; import org.argeo.api.security.PBEKeySpecCallback; import org.argeo.cms.ArgeoNames; import org.argeo.cms.ArgeoTypes; +import org.argeo.cms.security.AbstractKeyring; import org.argeo.jcr.JcrException; import org.argeo.jcr.JcrUtils; diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/KernelConstants.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/KernelConstants.java new file mode 100644 index 000000000..201f3ab28 --- /dev/null +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/KernelConstants.java @@ -0,0 +1,53 @@ +package org.argeo.cms.jcr.internal; + +import org.argeo.api.NodeConstants; + +/** Internal CMS constants. */ +@Deprecated +public interface KernelConstants { + // Directories + String DIR_NODE = "node"; + String DIR_REPOS = "repos"; + String DIR_INDEXES = "indexes"; + String DIR_TRANSACTIONS = "transactions"; + + // Files + String DEPLOY_CONFIG_PATH = DIR_NODE + '/' + NodeConstants.DEPLOY_BASEDN + ".ldif"; + String DEFAULT_KEYSTORE_PATH = DIR_NODE + '/' + NodeConstants.NODE + ".p12"; + String DEFAULT_PEM_KEY_PATH = DIR_NODE + '/' + NodeConstants.NODE + ".key"; + String DEFAULT_PEM_CERT_PATH = DIR_NODE + '/' + NodeConstants.NODE + ".crt"; + String NODE_KEY_TAB_PATH = DIR_NODE + "/krb5.keytab"; + + // Security + String JAAS_CONFIG = "/org/argeo/cms/internal/kernel/jaas.cfg"; + String JAAS_CONFIG_IPA = "/org/argeo/cms/internal/kernel/jaas-ipa.cfg"; + + // Java + String JAAS_CONFIG_PROP = "java.security.auth.login.config"; + + // DEFAULTS JCR PATH + String DEFAULT_HOME_BASE_PATH = "/home"; + String DEFAULT_USERS_BASE_PATH = "/users"; + String DEFAULT_GROUPS_BASE_PATH = "/groups"; + + // KERBEROS + String DEFAULT_KERBEROS_SERVICE = "HTTP"; + + // HTTP client + String COOKIE_POLICY_BROWSER_COMPATIBILITY = "compatibility"; + + // RWT / RAP + // String PATH_WORKBENCH = "/ui"; + // String PATH_WORKBENCH_PUBLIC = PATH_WORKBENCH + "/public"; + + String JETTY_FACTORY_PID = "org.eclipse.equinox.http.jetty.config"; + String WHITEBOARD_PATTERN_PROP = "osgi.http.whiteboard.servlet.pattern"; + // default Jetty server configured via JettyConfigurator + String DEFAULT_JETTY_SERVER = "default"; + String CMS_JETTY_CUSTOMIZER_CLASS = "org.argeo.equinox.jetty.CmsJettyCustomizer"; + + // avoid dependencies + String CONTEXT_NAME_PROP = "contextName"; + String JACKRABBIT_REPOSITORY_URI = "org.apache.jackrabbit.repository.uri"; + String JACKRABBIT_REMOTE_DEFAULT_WORKSPACE = "org.apache.jackrabbit.spi2davex.WorkspaceNameDefault"; +} diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/KernelUtils.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/KernelUtils.java new file mode 100644 index 000000000..98749cf43 --- /dev/null +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/KernelUtils.java @@ -0,0 +1,262 @@ +package org.argeo.cms.jcr.internal; + +import java.io.File; +import java.io.IOException; +import java.io.PrintStream; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.PrivilegedAction; +import java.security.URIParameter; +import java.util.Dictionary; +import java.util.Hashtable; +import java.util.Properties; +import java.util.TreeMap; +import java.util.TreeSet; + +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +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.argeo.api.DataModelNamespace; +import org.argeo.api.NodeConstants; +import org.argeo.cms.jcr.internal.osgi.CmsJcrActivator; +import org.osgi.framework.BundleContext; +import org.osgi.util.tracker.ServiceTracker; + +/** Package utilities */ +class KernelUtils implements KernelConstants { + final static String OSGI_INSTANCE_AREA = "osgi.instance.area"; + final static String OSGI_CONFIGURATION_AREA = "osgi.configuration.area"; + + static void setJaasConfiguration(URL jaasConfigurationUrl) { + try { + URIParameter uriParameter = new URIParameter(jaasConfigurationUrl.toURI()); + javax.security.auth.login.Configuration jaasConfiguration = javax.security.auth.login.Configuration + .getInstance("JavaLoginConfig", uriParameter); + javax.security.auth.login.Configuration.setConfiguration(jaasConfiguration); + } catch (Exception e) { + throw new IllegalArgumentException("Cannot set configuration " + jaasConfigurationUrl, e); + } + } + + static Dictionary asDictionary(Properties props) { + Hashtable hashtable = new Hashtable(); + for (Object key : props.keySet()) { + hashtable.put(key.toString(), props.get(key)); + } + return hashtable; + } + + static Dictionary asDictionary(ClassLoader cl, String resource) { + Properties props = new Properties(); + try { + props.load(cl.getResourceAsStream(resource)); + } catch (IOException e) { + throw new IllegalArgumentException("Cannot load " + resource + " from classpath", e); + } + return asDictionary(props); + } + + static File getExecutionDir(String relativePath) { + File executionDir = new File(getFrameworkProp("user.dir")); + if (relativePath == null) + return executionDir; + try { + return new File(executionDir, relativePath).getCanonicalFile(); + } catch (IOException e) { + throw new IllegalArgumentException("Cannot get canonical file", e); + } + } + + static File getOsgiInstanceDir() { + return new File(getBundleContext().getProperty(OSGI_INSTANCE_AREA).substring("file:".length())) + .getAbsoluteFile(); + } + + static Path getOsgiInstancePath(String relativePath) { + return Paths.get(getOsgiInstanceUri(relativePath)); + } + + static URI getOsgiInstanceUri(String relativePath) { + String osgiInstanceBaseUri = getFrameworkProp(OSGI_INSTANCE_AREA); + if (osgiInstanceBaseUri != null) + return safeUri(osgiInstanceBaseUri + (relativePath != null ? relativePath : "")); + else + return Paths.get(System.getProperty("user.dir")).toUri(); + } + + static File getOsgiConfigurationFile(String relativePath) { + try { + return new File(new URI(getBundleContext().getProperty(OSGI_CONFIGURATION_AREA) + relativePath)) + .getCanonicalFile(); + } catch (Exception e) { + throw new IllegalArgumentException("Cannot get configuration file for " + relativePath, e); + } + } + + static String getFrameworkProp(String key, String def) { + BundleContext bundleContext = CmsJcrActivator.getBundleContext(); + String value; + if (bundleContext != null) + value = bundleContext.getProperty(key); + else + value = System.getProperty(key); + if (value == null) + return def; + return value; + } + + static String getFrameworkProp(String key) { + return getFrameworkProp(key, null); + } + + // Security + // static Subject anonymousLogin() { + // Subject subject = new Subject(); + // LoginContext lc; + // try { + // lc = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER, subject); + // lc.login(); + // return subject; + // } catch (LoginException e) { + // throw new CmsException("Cannot login as anonymous", e); + // } + // } + + static void logFrameworkProperties(Log log) { + BundleContext bc = getBundleContext(); + for (Object sysProp : new TreeSet(System.getProperties().keySet())) { + log.debug(sysProp + "=" + bc.getProperty(sysProp.toString())); + } + // String[] keys = { Constants.FRAMEWORK_STORAGE, + // Constants.FRAMEWORK_OS_NAME, Constants.FRAMEWORK_OS_VERSION, + // Constants.FRAMEWORK_PROCESSOR, Constants.FRAMEWORK_SECURITY, + // Constants.FRAMEWORK_TRUST_REPOSITORIES, + // Constants.FRAMEWORK_WINDOWSYSTEM, Constants.FRAMEWORK_VENDOR, + // Constants.FRAMEWORK_VERSION, Constants.FRAMEWORK_STORAGE_CLEAN, + // Constants.FRAMEWORK_LANGUAGE, Constants.FRAMEWORK_UUID }; + // for (String key : keys) + // log.debug(key + "=" + bc.getProperty(key)); + } + + static void printSystemProperties(PrintStream out) { + TreeMap display = new TreeMap<>(); + for (Object key : System.getProperties().keySet()) + display.put(key.toString(), System.getProperty(key.toString())); + for (String key : display.keySet()) + out.println(key + "=" + display.get(key)); + } + + static Session openAdminSession(Repository repository) { + return openAdminSession(repository, null); + } + + static Session openAdminSession(final Repository repository, final String workspaceName) { + LoginContext loginContext = loginAsDataAdmin(); + return Subject.doAs(loginContext.getSubject(), new PrivilegedAction() { + + @Override + public Session run() { + try { + return repository.login(workspaceName); + } catch (RepositoryException e) { + throw new IllegalStateException("Cannot open admin session", e); + } finally { + try { + loginContext.logout(); + } catch (LoginException e) { + throw new IllegalStateException(e); + } + } + } + + }); + } + + static LoginContext loginAsDataAdmin() { + ClassLoader currentCl = Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(KernelUtils.class.getClassLoader()); + LoginContext loginContext; + try { + loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_DATA_ADMIN); + loginContext.login(); + } catch (LoginException e1) { + throw new IllegalStateException("Could not login as data admin", e1); + } finally { + Thread.currentThread().setContextClassLoader(currentCl); + } + return loginContext; + } + + static void doAsDataAdmin(Runnable action) { + LoginContext loginContext = loginAsDataAdmin(); + Subject.doAs(loginContext.getSubject(), new PrivilegedAction() { + + @Override + public Void run() { + try { + action.run(); + return null; + } finally { + try { + loginContext.logout(); + } catch (LoginException e) { + throw new IllegalStateException(e); + } + } + } + + }); + } + + static void asyncOpen(ServiceTracker st) { + Runnable run = new Runnable() { + + @Override + public void run() { + st.open(); + } + }; +// Activator.getInternalExecutorService().execute(run); + new Thread(run, "Open service tracker " + st).start(); + } + + static BundleContext getBundleContext() { + return CmsJcrActivator.getBundleContext(); + } + + static boolean asBoolean(String value) { + if (value == null) + return false; + switch (value) { + case "true": + return true; + case "false": + return false; + default: + throw new IllegalArgumentException( + "Unsupported value for attribute " + DataModelNamespace.ABSTRACT + ": " + value); + } + } + + private static URI safeUri(String uri) { + if (uri == null) + throw new IllegalArgumentException("URI cannot be null"); + try { + return new URI(uri); + } catch (URISyntaxException e) { + throw new IllegalArgumentException("Badly formatted URI " + uri, e); + } + } + + private KernelUtils() { + + } +} diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/LocalRepository.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/LocalRepository.java similarity index 92% rename from org.argeo.cms/src/org/argeo/cms/internal/kernel/LocalRepository.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/LocalRepository.java index fd085e214..0f95b09d9 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/LocalRepository.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/LocalRepository.java @@ -1,4 +1,4 @@ -package org.argeo.cms.internal.kernel; +package org.argeo.cms.jcr.internal; import javax.jcr.Repository; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeKeyRing.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/NodeKeyRing.java similarity index 82% rename from org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeKeyRing.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/NodeKeyRing.java index 0b774d934..9cd1f7269 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeKeyRing.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/NodeKeyRing.java @@ -1,10 +1,9 @@ -package org.argeo.cms.internal.kernel; +package org.argeo.cms.jcr.internal; import java.util.Dictionary; import javax.jcr.Repository; -import org.argeo.cms.security.JcrKeyring; import org.osgi.service.cm.ConfigurationException; import org.osgi.service.cm.ManagedService; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeRepositoryFactory.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/NodeRepositoryFactory.java similarity index 96% rename from org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeRepositoryFactory.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/NodeRepositoryFactory.java index efbb724ff..f4feabb09 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeRepositoryFactory.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/NodeRepositoryFactory.java @@ -1,4 +1,4 @@ -package org.argeo.cms.internal.kernel; +package org.argeo.cms.jcr.internal; import java.net.URI; import java.net.URISyntaxException; @@ -15,8 +15,8 @@ import org.apache.commons.logging.LogFactory; import org.apache.jackrabbit.jcr2dav.Jcr2davRepositoryFactory; import org.argeo.api.NodeConstants; import org.argeo.cms.internal.jcr.RepoConf; +import org.argeo.cms.jcr.internal.osgi.CmsJcrActivator; import org.osgi.framework.BundleContext; -import org.osgi.framework.FrameworkUtil; import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; @@ -24,7 +24,7 @@ import org.osgi.framework.ServiceReference; * OSGi-aware Jackrabbit repository factory which can retrieve/publish * {@link Repository} as OSGi services. */ -class NodeRepositoryFactory implements RepositoryFactory { +public class NodeRepositoryFactory implements RepositoryFactory { private final Log log = LogFactory.getLog(getClass()); // private final BundleContext bundleContext = FrameworkUtil.getBundle(getClass()).getBundleContext(); @@ -32,7 +32,7 @@ class NodeRepositoryFactory implements RepositoryFactory { // "/org/argeo/cms/internal/kernel/repository-localfs.xml"); protected Repository getRepositoryByAlias(String alias) { - BundleContext bundleContext = Activator.getBundleContext(); + BundleContext bundleContext = CmsJcrActivator.getBundleContext(); if (bundleContext != null) { try { Collection> srs = bundleContext.getServiceReferences(Repository.class, diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryServiceFactory.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/RepositoryServiceFactory.java similarity index 90% rename from org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryServiceFactory.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/RepositoryServiceFactory.java index 630a453c2..2a47d120c 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/RepositoryServiceFactory.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/RepositoryServiceFactory.java @@ -1,4 +1,4 @@ -package org.argeo.cms.internal.kernel; +package org.argeo.cms.jcr.internal; import java.net.URI; import java.util.Dictionary; @@ -14,13 +14,14 @@ import org.apache.jackrabbit.core.RepositoryContext; import org.argeo.api.NodeConstants; import org.argeo.cms.internal.jcr.RepoConf; import org.argeo.cms.internal.jcr.RepositoryBuilder; +import org.argeo.cms.jcr.internal.osgi.CmsJcrActivator; import org.argeo.util.LangUtils; import org.osgi.framework.Constants; import org.osgi.service.cm.ConfigurationException; import org.osgi.service.cm.ManagedServiceFactory; /** A {@link ManagedServiceFactory} creating or referencing JCR repositories. */ -class RepositoryServiceFactory implements ManagedServiceFactory { +public class RepositoryServiceFactory implements ManagedServiceFactory { private final static Log log = LogFactory.getLog(RepositoryServiceFactory.class); // private final BundleContext bc = FrameworkUtil.getBundle(RepositoryServiceFactory.class).getBundleContext(); @@ -60,7 +61,7 @@ class RepositoryServiceFactory implements ManagedServiceFactory { // props.put(NodeConstants.JCR_REPOSITORY_ALIAS, cn); pidToCn.put(pid, cn); } - Activator.registerService(RepositoryContext.class, repositoryContext, props); + CmsJcrActivator.registerService(RepositoryContext.class, repositoryContext, props); } else { try { Object cn = properties.get(NodeConstants.CN); @@ -70,7 +71,7 @@ class RepositoryServiceFactory implements ManagedServiceFactory { URI uri = new URI(labeledUri.toString()); // RepositoryFactory repositoryFactory = bc // .getService(bc.getServiceReference(RepositoryFactory.class)); - RepositoryFactory repositoryFactory = Activator.getService(RepositoryFactory.class); + RepositoryFactory repositoryFactory = CmsJcrActivator.getService(RepositoryFactory.class); Map parameters = new HashMap(); parameters.put(RepoConf.labeledUri.name(), uri.toString()); parameters.put(RepoConf.defaultWorkspace.name(), defaultWorkspace.toString()); @@ -86,14 +87,14 @@ class RepositoryServiceFactory implements ManagedServiceFactory { // props.put(NodeConstants.JCR_REPOSITORY_ALIAS, cn); pidToCn.put(pid, cn); } - Activator.registerService(Repository.class, repository, props); + CmsJcrActivator.registerService(Repository.class, repository, props); // home if (cn.equals(NodeConstants.NODE_REPOSITORY)) { Dictionary homeProps = LangUtils.dict(NodeConstants.CN, NodeConstants.EGO_REPOSITORY); EgoRepository homeRepository = new EgoRepository(repository, true); - Activator.registerService(Repository.class, homeRepository, homeProps); + CmsJcrActivator.registerService(Repository.class, homeRepository, homeProps); } } catch (Exception e) { // TODO Auto-generated catch block diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelThread.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/StatisticsThread.java similarity index 90% rename from org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelThread.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/StatisticsThread.java index a0f9c5b71..b5ec05005 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelThread.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/StatisticsThread.java @@ -1,4 +1,4 @@ -package org.argeo.cms.internal.kernel; +package org.argeo.cms.jcr.internal; import java.io.File; import java.lang.management.ManagementFactory; @@ -7,14 +7,13 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.jackrabbit.api.stats.RepositoryStatistics; import org.apache.jackrabbit.stats.RepositoryStatisticsImpl; -import org.argeo.cms.internal.auth.CmsSessionImpl; /** * Background thread started by the kernel, which gather statistics and * monitor/control other processes. */ -class KernelThread extends Thread { - private final static Log log = LogFactory.getLog(KernelThread.class); +public class StatisticsThread extends Thread { + private final static Log log = LogFactory.getLog(StatisticsThread.class); private RepositoryStatisticsImpl repoStats; @@ -32,13 +31,14 @@ class KernelThread extends Thread { @SuppressWarnings("unused") private long cycle = 0l; - public KernelThread(ThreadGroup threadGroup, String name) { - super(threadGroup, name); + public StatisticsThread(String name) { + super(name); } private void doSmallestPeriod() { // Clean expired sessions - CmsSessionImpl.closeInvalidSessions(); + // FIXME re-enable it in CMS + //CmsSessionImpl.closeInvalidSessions(); if (kernelStatsLog.isDebugEnabled()) { StringBuilder line = new StringBuilder(64); @@ -110,7 +110,7 @@ class KernelThread extends Thread { } } - synchronized void destroyAndJoin() { + public synchronized void destroyAndJoin() { running = false; notifyAll(); // interrupt(); diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/osgi/CmsJcrActivator.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/osgi/CmsJcrActivator.java new file mode 100644 index 000000000..1fb81b717 --- /dev/null +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/osgi/CmsJcrActivator.java @@ -0,0 +1,108 @@ +package org.argeo.cms.jcr.internal.osgi; + +import java.nio.file.spi.FileSystemProvider; +import java.util.ArrayList; +import java.util.Dictionary; +import java.util.List; + +import javax.jcr.RepositoryFactory; + +import org.argeo.api.NodeConstants; +import org.argeo.cms.jcr.internal.CmsFsProvider; +import org.argeo.cms.jcr.internal.StatisticsThread; +import org.argeo.cms.jcr.internal.NodeRepositoryFactory; +import org.argeo.cms.jcr.internal.RepositoryServiceFactory; +import org.argeo.util.LangUtils; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleActivator; +import org.osgi.framework.BundleContext; +import org.osgi.framework.Constants; +import org.osgi.framework.FrameworkUtil; +import org.osgi.service.cm.ManagedServiceFactory; + +public class CmsJcrActivator implements BundleActivator { + private static BundleContext bundleContext; + static { + Bundle bundle = FrameworkUtil.getBundle(CmsJcrActivator.class); + if (bundle != null) { + bundleContext = bundle.getBundleContext(); + } + } + +// private List stopHooks = new ArrayList<>(); + private StatisticsThread kernelThread; + + private RepositoryServiceFactory repositoryServiceFactory; +// private JcrDeployment jcrDeployment; + + @Override + public void start(BundleContext context) throws Exception { + // kernel thread + kernelThread = new StatisticsThread("Kernel Thread"); + kernelThread.setContextClassLoader(getClass().getClassLoader()); + kernelThread.start(); + + // JCR + repositoryServiceFactory = new RepositoryServiceFactory(); +// stopHooks.add(() -> repositoryServiceFactory.shutdown()); + registerService(ManagedServiceFactory.class, repositoryServiceFactory, + LangUtils.dict(Constants.SERVICE_PID, NodeConstants.NODE_REPOS_FACTORY_PID)); + + NodeRepositoryFactory repositoryFactory = new NodeRepositoryFactory(); + registerService(RepositoryFactory.class, repositoryFactory, null); + + // File System + CmsFsProvider cmsFsProvider = new CmsFsProvider(); +// ServiceLoader fspSl = ServiceLoader.load(FileSystemProvider.class); +// for (FileSystemProvider fsp : fspSl) { +// log.debug("FileSystemProvider " + fsp); +// if (fsp instanceof CmsFsProvider) { +// cmsFsProvider = (CmsFsProvider) fsp; +// } +// } +// for (FileSystemProvider fsp : FileSystemProvider.installedProviders()) { +// log.debug("Installed FileSystemProvider " + fsp); +// } + registerService(FileSystemProvider.class, cmsFsProvider, + LangUtils.dict(Constants.SERVICE_PID, NodeConstants.NODE_FS_PROVIDER_PID)); + +// jcrDeployment = new JcrDeployment(); +// jcrDeployment.init(); + } + + @Override + public void stop(BundleContext context) throws Exception { +// if (jcrDeployment != null) +// jcrDeployment.destroy(); + + if (repositoryServiceFactory != null) + repositoryServiceFactory.shutdown(); + + if (kernelThread != null) + kernelThread.destroyAndJoin(); + + } + + @Deprecated + public static void registerService(Class clss, T service, Dictionary properties) { + if (bundleContext != null) { + bundleContext.registerService(clss, service, properties); + } + + } + + @Deprecated + public static BundleContext getBundleContext() { + return bundleContext; + } + + @Deprecated + public static T getService(Class clss) { + if (bundleContext != null) { + return bundleContext.getService(bundleContext.getServiceReference(clss)); + } else { + return null; + } + } + +} diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/CmsRemotingServlet.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/CmsRemotingServlet.java similarity index 96% rename from org.argeo.cms/src/org/argeo/cms/internal/http/CmsRemotingServlet.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/CmsRemotingServlet.java index 1bda6c7ee..929620315 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/http/CmsRemotingServlet.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/CmsRemotingServlet.java @@ -1,4 +1,4 @@ -package org.argeo.cms.internal.http; +package org.argeo.cms.jcr.internal.servlet; import java.util.Map; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/CmsSessionProvider.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/CmsSessionProvider.java similarity index 96% rename from org.argeo.cms/src/org/argeo/cms/internal/http/CmsSessionProvider.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/CmsSessionProvider.java index 5dd98d2c7..8ec2f45b3 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/http/CmsSessionProvider.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/CmsSessionProvider.java @@ -1,4 +1,4 @@ -package org.argeo.cms.internal.http; +package org.argeo.cms.jcr.internal.servlet; import java.io.Serializable; import java.security.PrivilegedActionException; @@ -21,7 +21,6 @@ import org.apache.commons.logging.LogFactory; import org.apache.jackrabbit.server.SessionProvider; import org.argeo.api.NodeConstants; import org.argeo.cms.auth.CmsSession; -import org.argeo.cms.internal.auth.CmsSessionImpl; import org.argeo.jcr.JcrUtils; /** @@ -48,7 +47,9 @@ public class CmsSessionProvider implements SessionProvider, Serializable { // if (workspace == null) // return null; - CmsSessionImpl cmsSession = WebCmsSessionImpl.getCmsSession(request); +// CmsSessionImpl cmsSession = WebCmsSessionImpl.getCmsSession(request); + // FIXME retrieve CMS session + CmsSession cmsSession = null; if (log.isTraceEnabled()) { log.trace("Get JCR session from " + cmsSession); } diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/CmsWebDavServlet.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/CmsWebDavServlet.java similarity index 95% rename from org.argeo.cms/src/org/argeo/cms/internal/http/CmsWebDavServlet.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/CmsWebDavServlet.java index d61e5f494..1557c4bc1 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/http/CmsWebDavServlet.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/CmsWebDavServlet.java @@ -1,4 +1,4 @@ -package org.argeo.cms.internal.http; +package org.argeo.cms.jcr.internal.servlet; import java.util.Map; diff --git a/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/JcrHttpUtils.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/JcrHttpUtils.java new file mode 100644 index 000000000..c2746126a --- /dev/null +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/JcrHttpUtils.java @@ -0,0 +1,73 @@ +package org.argeo.cms.jcr.internal.servlet; + +import java.util.Enumeration; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.logging.Log; + +public class JcrHttpUtils { + public final static String HEADER_AUTHORIZATION = "Authorization"; + public final static String HEADER_WWW_AUTHENTICATE = "WWW-Authenticate"; + + public final static String DEFAULT_PROTECTED_HANDLERS = "/org/argeo/cms/jcr/internal/servlet/protectedHandlers.xml"; + public final static String WEBDAV_CONFIG = "/org/argeo/cms/jcr/internal/servlet/webdav-config.xml"; + + static boolean isBrowser(String userAgent) { + return userAgent.contains("webkit") || userAgent.contains("gecko") || userAgent.contains("firefox") + || userAgent.contains("msie") || userAgent.contains("chrome") || userAgent.contains("chromium") + || userAgent.contains("opera") || userAgent.contains("browser"); + } + + public static void logResponseHeaders(Log log, HttpServletResponse response) { + if (!log.isDebugEnabled()) + return; + for (String headerName : response.getHeaderNames()) { + Object headerValue = response.getHeader(headerName); + log.debug(headerName + ": " + headerValue); + } + } + + public static void logRequestHeaders(Log log, HttpServletRequest request) { + if (!log.isDebugEnabled()) + return; + for (Enumeration headerNames = request.getHeaderNames(); headerNames.hasMoreElements();) { + String headerName = headerNames.nextElement(); + Object headerValue = request.getHeader(headerName); + log.debug(headerName + ": " + headerValue); + } + log.debug(request.getRequestURI() + "\n"); + } + + public static void logRequest(Log log, HttpServletRequest request) { + log.debug("contextPath=" + request.getContextPath()); + log.debug("servletPath=" + request.getServletPath()); + log.debug("requestURI=" + request.getRequestURI()); + log.debug("queryString=" + request.getQueryString()); + StringBuilder buf = new StringBuilder(); + // headers + Enumeration en = request.getHeaderNames(); + while (en.hasMoreElements()) { + String header = en.nextElement(); + Enumeration values = request.getHeaders(header); + while (values.hasMoreElements()) + buf.append(" " + header + ": " + values.nextElement()); + buf.append('\n'); + } + + // attributed + Enumeration an = request.getAttributeNames(); + while (an.hasMoreElements()) { + String attr = an.nextElement(); + Object value = request.getAttribute(attr); + buf.append(" " + attr + ": " + value); + buf.append('\n'); + } + log.debug("\n" + buf); + } + + private JcrHttpUtils() { + + } +} diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/LinkServlet.java b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/LinkServlet.java similarity index 99% rename from org.argeo.cms/src/org/argeo/cms/internal/http/LinkServlet.java rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/LinkServlet.java index 574b09a8f..1ddfc34e4 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/http/LinkServlet.java +++ b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/LinkServlet.java @@ -1,4 +1,4 @@ -package org.argeo.cms.internal.http; +package org.argeo.cms.jcr.internal.servlet; import static javax.jcr.Property.JCR_DESCRIPTION; import static javax.jcr.Property.JCR_LAST_MODIFIED; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/protectedHandlers.xml b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/protectedHandlers.xml similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/internal/http/protectedHandlers.xml rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/protectedHandlers.xml diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/webdav-config.xml b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/webdav-config.xml similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/internal/http/webdav-config.xml rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/webdav-config.xml diff --git a/org.argeo.api/src/org/argeo/api/ldap.cnd b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/ldap.cnd similarity index 100% rename from org.argeo.api/src/org/argeo/api/ldap.cnd rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/ldap.cnd diff --git a/org.argeo.api/src/org/argeo/api/node.cnd b/org.argeo.cms.jcr/src/org/argeo/cms/jcr/node.cnd similarity index 100% rename from org.argeo.api/src/org/argeo/api/node.cnd rename to org.argeo.cms.jcr/src/org/argeo/cms/jcr/node.cnd diff --git a/org.argeo.cms/src/org/argeo/cms/tabular/CsvTabularWriter.java b/org.argeo.cms.jcr/src/org/argeo/cms/tabular/CsvTabularWriter.java similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/tabular/CsvTabularWriter.java rename to org.argeo.cms.jcr/src/org/argeo/cms/tabular/CsvTabularWriter.java diff --git a/org.argeo.cms/src/org/argeo/cms/tabular/JcrTabularRowIterator.java b/org.argeo.cms.jcr/src/org/argeo/cms/tabular/JcrTabularRowIterator.java similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/tabular/JcrTabularRowIterator.java rename to org.argeo.cms.jcr/src/org/argeo/cms/tabular/JcrTabularRowIterator.java diff --git a/org.argeo.cms/src/org/argeo/cms/tabular/JcrTabularWriter.java b/org.argeo.cms.jcr/src/org/argeo/cms/tabular/JcrTabularWriter.java similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/tabular/JcrTabularWriter.java rename to org.argeo.cms.jcr/src/org/argeo/cms/tabular/JcrTabularWriter.java diff --git a/org.argeo.cms/src/org/argeo/cms/tabular/package-info.java b/org.argeo.cms.jcr/src/org/argeo/cms/tabular/package-info.java similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/tabular/package-info.java rename to org.argeo.cms.jcr/src/org/argeo/cms/tabular/package-info.java diff --git a/org.argeo.cms.jcr/src/org/argeo/jackrabbit/JackrabbitDataModelMigration.java b/org.argeo.cms.jcr/src/org/argeo/jackrabbit/JackrabbitDataModelMigration.java index 9a49a063f..1a4c8a3ca 100644 --- a/org.argeo.cms.jcr/src/org/argeo/jackrabbit/JackrabbitDataModelMigration.java +++ b/org.argeo.cms.jcr/src/org/argeo/jackrabbit/JackrabbitDataModelMigration.java @@ -1,6 +1,5 @@ package org.argeo.jackrabbit; -import java.awt.geom.CubicCurve2D; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; diff --git a/org.argeo.cms/src/org/argeo/security/jackrabbit/ArgeoAccessControlProvider.java b/org.argeo.cms.jcr/src/org/argeo/security/jackrabbit/ArgeoAccessControlProvider.java similarity index 100% rename from org.argeo.cms/src/org/argeo/security/jackrabbit/ArgeoAccessControlProvider.java rename to org.argeo.cms.jcr/src/org/argeo/security/jackrabbit/ArgeoAccessControlProvider.java diff --git a/org.argeo.cms/src/org/argeo/security/jackrabbit/ArgeoAccessManager.java b/org.argeo.cms.jcr/src/org/argeo/security/jackrabbit/ArgeoAccessManager.java similarity index 100% rename from org.argeo.cms/src/org/argeo/security/jackrabbit/ArgeoAccessManager.java rename to org.argeo.cms.jcr/src/org/argeo/security/jackrabbit/ArgeoAccessManager.java diff --git a/org.argeo.cms/src/org/argeo/security/jackrabbit/ArgeoAuthContext.java b/org.argeo.cms.jcr/src/org/argeo/security/jackrabbit/ArgeoAuthContext.java similarity index 100% rename from org.argeo.cms/src/org/argeo/security/jackrabbit/ArgeoAuthContext.java rename to org.argeo.cms.jcr/src/org/argeo/security/jackrabbit/ArgeoAuthContext.java diff --git a/org.argeo.cms/src/org/argeo/security/jackrabbit/ArgeoSecurityManager.java b/org.argeo.cms.jcr/src/org/argeo/security/jackrabbit/ArgeoSecurityManager.java similarity index 100% rename from org.argeo.cms/src/org/argeo/security/jackrabbit/ArgeoSecurityManager.java rename to org.argeo.cms.jcr/src/org/argeo/security/jackrabbit/ArgeoSecurityManager.java diff --git a/org.argeo.cms/src/org/argeo/security/jackrabbit/SystemJackrabbitLoginModule.java b/org.argeo.cms.jcr/src/org/argeo/security/jackrabbit/SystemJackrabbitLoginModule.java similarity index 100% rename from org.argeo.cms/src/org/argeo/security/jackrabbit/SystemJackrabbitLoginModule.java rename to org.argeo.cms.jcr/src/org/argeo/security/jackrabbit/SystemJackrabbitLoginModule.java diff --git a/org.argeo.cms/src/org/argeo/security/jackrabbit/package-info.java b/org.argeo.cms.jcr/src/org/argeo/security/jackrabbit/package-info.java similarity index 100% rename from org.argeo.cms/src/org/argeo/security/jackrabbit/package-info.java rename to org.argeo.cms.jcr/src/org/argeo/security/jackrabbit/package-info.java diff --git a/org.argeo.cms/.settings/org.eclipse.jdt.core.prefs b/org.argeo.cms/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index ce5f46480..000000000 --- a/org.argeo.cms/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,102 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullable.secondary= -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.problem.APILeak=warning -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore -org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning -org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore -org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.suppressWarningsNotFullyAnalysed=info -org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore -org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled -org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore -org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning diff --git a/org.argeo.cms/OSGI-INF/nodeDeployment.xml b/org.argeo.cms/OSGI-INF/nodeDeployment.xml deleted file mode 100644 index 065f09a63..000000000 --- a/org.argeo.cms/OSGI-INF/nodeDeployment.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/org.argeo.cms/OSGI-INF/nodeInstance.xml b/org.argeo.cms/OSGI-INF/nodeInstance.xml deleted file mode 100644 index cb7023178..000000000 --- a/org.argeo.cms/OSGI-INF/nodeInstance.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/org.argeo.cms/OSGI-INF/nodeState.xml b/org.argeo.cms/OSGI-INF/nodeState.xml deleted file mode 100644 index 565c442b5..000000000 --- a/org.argeo.cms/OSGI-INF/nodeState.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/org.argeo.cms/bnd.bnd b/org.argeo.cms/bnd.bnd index 5af544206..e5046d308 100644 --- a/org.argeo.cms/bnd.bnd +++ b/org.argeo.cms/bnd.bnd @@ -1,25 +1,14 @@ Bundle-Activator: org.argeo.cms.internal.kernel.Activator -Import-Package: javax.jcr.security,\ -org.h2;resolution:=optional,\ -org.postgresql;resolution:=optional,\ -org.apache.jackrabbit.webdav.server,\ -org.apache.jackrabbit.webdav.jcr,\ -org.apache.commons.httpclient.cookie;resolution:=optional,\ +Import-Package: org.apache.commons.httpclient.cookie;resolution:=optional,\ !com.sun.security.jgss,\ -org.osgi.framework.namespace;version=0.0.0,\ org.osgi.*;version=0.0.0,\ -org.osgi.service.http.whiteboard,\ +org.osgi.service.http.whiteboard;version=0.0.0,\ +org.osgi.framework.namespace;version=0.0.0,\ * Service-Component:\ OSGI-INF/cmsUserManager.xml,\ OSGI-INF/pkgServletContext.xml,\ -OSGI-INF/pkgServlet.xml,\ -OSGI-INF/jcrServletContext.xml,\ -OSGI-INF/dataServletContext.xml,\ -OSGI-INF/filesServletContext.xml,\ -OSGI-INF/filesServlet.xml +OSGI-INF/pkgServlet.xml -Provide-Capability: cms.datamodel;name=argeo;cnd=/org/argeo/cms/argeo.cnd;abstract=true,\ -osgi.service;objectClass="javax.jcr.Repository" diff --git a/org.argeo.cms/build.properties b/org.argeo.cms/build.properties index c5d6b5045..8c88cc87b 100644 --- a/org.argeo.cms/build.properties +++ b/org.argeo.cms/build.properties @@ -5,5 +5,4 @@ bin.includes = META-INF/,\ OSGI-INF/ source.. = src/,\ ext/test/ -additional.bundles = org.apache.jackrabbit.data,\ - org.junit +additional.bundles = org.junit diff --git a/org.argeo.cms/pom.xml b/org.argeo.cms/pom.xml index 0a313033b..0d85713dd 100644 --- a/org.argeo.cms/pom.xml +++ b/org.argeo.cms/pom.xml @@ -16,11 +16,6 @@ org.argeo.api 2.3-SNAPSHOT - - org.argeo.commons - org.argeo.cms.jcr - 2.3-SNAPSHOT - org.argeo.commons org.argeo.enterprise diff --git a/org.argeo.cms/src/org/argeo/cms/internal/http/HttpUtils.java b/org.argeo.cms/src/org/argeo/cms/internal/http/HttpUtils.java index 70998ea1a..b5d355387 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/http/HttpUtils.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/http/HttpUtils.java @@ -11,9 +11,6 @@ public class HttpUtils { public final static String HEADER_AUTHORIZATION = "Authorization"; public final static String HEADER_WWW_AUTHENTICATE = "WWW-Authenticate"; - public final static String DEFAULT_PROTECTED_HANDLERS = "/org/argeo/cms/internal/http/protectedHandlers.xml"; - public final static String WEBDAV_CONFIG = "/org/argeo/cms/internal/http/webdav-config.xml"; - static boolean isBrowser(String userAgent) { return userAgent.contains("webkit") || userAgent.contains("gecko") || userAgent.contains("firefox") || userAgent.contains("msie") || userAgent.contains("chrome") || userAgent.contains("chromium") diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java index 6d50f3dab..3fbed28f4 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Activator.java @@ -167,7 +167,7 @@ public class Activator implements BundleActivator { // Node deployment nodeDeployment = new CmsDeployment(); - registerService(NodeDeployment.class, nodeDeployment, null); +// registerService(NodeDeployment.class, nodeDeployment, null); // Node instance nodeInstance = new CmsInstance(); diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java index 026f9186b..cb4d55273 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java @@ -1,74 +1,25 @@ package org.argeo.cms.internal.kernel; -import static org.argeo.api.DataModelNamespace.CMS_DATA_MODEL_NAMESPACE; -import static org.osgi.service.http.whiteboard.HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX; - -import java.io.File; import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Reader; import java.lang.management.ManagementFactory; import java.net.URL; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; import java.util.Dictionary; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.jcr.Repository; -import javax.jcr.RepositoryException; -import javax.jcr.Session; -import javax.security.auth.callback.CallbackHandler; -import javax.servlet.Servlet; + import javax.transaction.UserTransaction; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.jackrabbit.commons.cnd.CndImporter; -import org.apache.jackrabbit.core.RepositoryContext; -import org.apache.jackrabbit.core.RepositoryImpl; -import org.argeo.api.DataModelNamespace; import org.argeo.api.NodeConstants; import org.argeo.api.NodeDeployment; import org.argeo.api.NodeState; -import org.argeo.api.NodeUtils; -import org.argeo.api.security.CryptoKeyring; -import org.argeo.api.security.Keyring; -import org.argeo.cms.ArgeoNames; -import org.argeo.cms.internal.http.CmsRemotingServlet; -import org.argeo.cms.internal.http.CmsWebDavServlet; -import org.argeo.cms.internal.http.HttpUtils; -import org.argeo.cms.internal.jcr.JcrInitUtils; -import org.argeo.jcr.Jcr; -import org.argeo.jcr.JcrException; -import org.argeo.jcr.JcrUtils; -import org.argeo.maintenance.backup.LogicalRestore; -import org.argeo.naming.LdapAttrs; import org.argeo.osgi.useradmin.UserAdminConf; -import org.argeo.util.LangUtils; import org.eclipse.equinox.http.jetty.JettyConfigurator; -import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; -import org.osgi.framework.Constants; import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.InvalidSyntaxException; import org.osgi.framework.ServiceReference; -import org.osgi.framework.wiring.BundleCapability; -import org.osgi.framework.wiring.BundleWire; -import org.osgi.framework.wiring.BundleWiring; import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; -import org.osgi.service.cm.ManagedService; import org.osgi.service.http.HttpService; -import org.osgi.service.http.whiteboard.HttpWhiteboardConstants; import org.osgi.service.useradmin.Group; import org.osgi.service.useradmin.Role; import org.osgi.service.useradmin.UserAdmin; @@ -79,17 +30,10 @@ public class CmsDeployment implements NodeDeployment { private final Log log = LogFactory.getLog(getClass()); private final BundleContext bc = FrameworkUtil.getBundle(getClass()).getBundleContext(); - private DataModels dataModels; private DeployConfig deployConfig; private Long availableSince; -// private final boolean cleanState; - -// private NodeHttp nodeHttp; - private String webDavConfig = HttpUtils.WEBDAV_CONFIG; - - private boolean argeoDataModelExtensionsAvailable = false; // Readiness private boolean nodeAvailable = false; @@ -106,7 +50,6 @@ public class CmsDeployment implements NodeDeployment { // cleanState = nodeState.isClean(); // nodeHttp = new NodeHttp(); - dataModels = new DataModels(bc); initTrackers(); } @@ -126,9 +69,6 @@ public class CmsDeployment implements NodeDeployment { // httpSt.open(); KernelUtils.asyncOpen(httpSt); - ServiceTracker repoContextSt = new RepositoryContextStc(); - // repoContextSt.open(); - KernelUtils.asyncOpen(repoContextSt); ServiceTracker userAdminSt = new ServiceTracker(bc, UserAdmin.class, null) { @Override @@ -156,8 +96,9 @@ public class CmsDeployment implements NodeDeployment { } catch (Exception e) { throw new IllegalStateException("Cannot analyse clean state", e); } - deployConfig = new DeployConfig(configurationAdmin, dataModels, isClean); - JcrInitUtils.addToDeployment(CmsDeployment.this); + deployConfig = new DeployConfig(configurationAdmin, isClean); + Activator.registerService(NodeDeployment.class, CmsDeployment.this, null); +// JcrInitUtils.addToDeployment(CmsDeployment.this); httpExpected = deployConfig.getProps(KernelConstants.JETTY_FACTORY_PID, "default") != null; try { Configuration[] configs = configurationAdmin @@ -239,14 +180,6 @@ public class CmsDeployment implements NodeDeployment { // if (nodeHttp != null) // nodeHttp.destroy(); - try { - for (ServiceReference sr : bc - .getServiceReferences(JackrabbitLocalRepository.class, null)) { - bc.getService(sr).destroy(); - } - } catch (InvalidSyntaxException e1) { - log.error("Cannot sclean repsoitories", e1); - } try { JettyConfigurator.stopServer(KernelConstants.DEFAULT_JETTY_SERVER); @@ -303,244 +236,6 @@ public class CmsDeployment implements NodeDeployment { } } - private void prepareNodeRepository(Repository deployedNodeRepository, List publishAsLocalRepo) { - if (availableSince != null) { - throw new IllegalStateException("Deployment is already available"); - } - - // home - prepareDataModel(NodeConstants.NODE_REPOSITORY, deployedNodeRepository, publishAsLocalRepo); - - // init from backup - if (deployConfig.isFirstInit()) { - Path restorePath = Paths.get(System.getProperty("user.dir"), "restore"); - if (Files.exists(restorePath)) { - if (log.isDebugEnabled()) - log.debug("Found backup " + restorePath + ", restoring it..."); - LogicalRestore logicalRestore = new LogicalRestore(bc, deployedNodeRepository, restorePath); - KernelUtils.doAsDataAdmin(logicalRestore); - log.info("Restored backup from " + restorePath); - } - } - - // init from repository - Collection> initRepositorySr; - try { - initRepositorySr = bc.getServiceReferences(Repository.class, - "(" + NodeConstants.CN + "=" + NodeConstants.NODE_INIT + ")"); - } catch (InvalidSyntaxException e1) { - throw new IllegalArgumentException(e1); - } - Iterator> it = initRepositorySr.iterator(); - while (it.hasNext()) { - ServiceReference sr = it.next(); - Object labeledUri = sr.getProperties().get(LdapAttrs.labeledURI.name()); - Repository initRepository = bc.getService(sr); - if (log.isDebugEnabled()) - log.debug("Found init repository " + labeledUri + ", copying it..."); - initFromRepository(deployedNodeRepository, initRepository); - log.info("Node repository initialised from " + labeledUri); - } - } - - /** Init from a (typically remote) repository. */ - private void initFromRepository(Repository deployedNodeRepository, Repository initRepository) { - Session initSession = null; - try { - initSession = initRepository.login(); - workspaces: for (String workspaceName : initSession.getWorkspace().getAccessibleWorkspaceNames()) { - if ("security".equals(workspaceName)) - continue workspaces; - if (log.isDebugEnabled()) - log.debug("Copying workspace " + workspaceName + " from init repository..."); - long begin = System.currentTimeMillis(); - Session targetSession = null; - Session sourceSession = null; - try { - try { - targetSession = NodeUtils.openDataAdminSession(deployedNodeRepository, workspaceName); - } catch (IllegalArgumentException e) {// no such workspace - Session adminSession = NodeUtils.openDataAdminSession(deployedNodeRepository, null); - try { - adminSession.getWorkspace().createWorkspace(workspaceName); - } finally { - Jcr.logout(adminSession); - } - targetSession = NodeUtils.openDataAdminSession(deployedNodeRepository, workspaceName); - } - sourceSession = initRepository.login(workspaceName); -// JcrUtils.copyWorkspaceXml(sourceSession, targetSession); - // TODO deal with referenceable nodes - JcrUtils.copy(sourceSession.getRootNode(), targetSession.getRootNode()); - targetSession.save(); - long duration = System.currentTimeMillis() - begin; - if (log.isDebugEnabled()) - log.debug("Copied workspace " + workspaceName + " from init repository in " + (duration / 1000) - + " s"); - } catch (Exception e) { - log.error("Cannot copy workspace " + workspaceName + " from init repository.", e); - } finally { - Jcr.logout(sourceSession); - Jcr.logout(targetSession); - } - } - } catch (RepositoryException e) { - throw new JcrException(e); - } finally { - Jcr.logout(initSession); - } - } - - private void prepareHomeRepository(RepositoryImpl deployedRepository) { - Session adminSession = KernelUtils.openAdminSession(deployedRepository); - try { - argeoDataModelExtensionsAvailable = Arrays - .asList(adminSession.getWorkspace().getNamespaceRegistry().getURIs()) - .contains(ArgeoNames.ARGEO_NAMESPACE); - } catch (RepositoryException e) { - log.warn("Cannot check whether Argeo namespace is registered assuming it isn't.", e); - argeoDataModelExtensionsAvailable = false; - } finally { - JcrUtils.logoutQuietly(adminSession); - } - - // Publish home with the highest service ranking - Hashtable regProps = new Hashtable<>(); - regProps.put(NodeConstants.CN, NodeConstants.EGO_REPOSITORY); - regProps.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE); - Repository egoRepository = new EgoRepository(deployedRepository, false); - bc.registerService(Repository.class, egoRepository, regProps); - registerRepositoryServlets(NodeConstants.EGO_REPOSITORY, egoRepository); - - // Keyring only if Argeo extensions are available - if (argeoDataModelExtensionsAvailable) { - new ServiceTracker(bc, CallbackHandler.class, null) { - - @Override - public CallbackHandler addingService(ServiceReference reference) { - NodeKeyRing nodeKeyring = new NodeKeyRing(egoRepository); - CallbackHandler callbackHandler = bc.getService(reference); - nodeKeyring.setDefaultCallbackHandler(callbackHandler); - bc.registerService(LangUtils.names(Keyring.class, CryptoKeyring.class, ManagedService.class), - nodeKeyring, LangUtils.dict(Constants.SERVICE_PID, NodeConstants.NODE_KEYRING_PID)); - return callbackHandler; - } - - }.open(); - } - } - - /** Session is logged out. */ - private void prepareDataModel(String cn, Repository repository, List publishAsLocalRepo) { - Session adminSession = KernelUtils.openAdminSession(repository); - try { - Set processed = new HashSet(); - bundles: for (Bundle bundle : bc.getBundles()) { - BundleWiring wiring = bundle.adapt(BundleWiring.class); - if (wiring == null) - continue bundles; - if (NodeConstants.NODE_REPOSITORY.equals(cn))// process all data models - processWiring(cn, adminSession, wiring, processed, false, publishAsLocalRepo); - else { - List capabilities = wiring.getCapabilities(CMS_DATA_MODEL_NAMESPACE); - for (BundleCapability capability : capabilities) { - String dataModelName = (String) capability.getAttributes().get(DataModelNamespace.NAME); - if (dataModelName.equals(cn))// process only own data model - processWiring(cn, adminSession, wiring, processed, false, publishAsLocalRepo); - } - } - } - } finally { - JcrUtils.logoutQuietly(adminSession); - } - } - - private void processWiring(String cn, Session adminSession, BundleWiring wiring, Set processed, - boolean importListedAbstractModels, List publishAsLocalRepo) { - // recursively process requirements first - List requiredWires = wiring.getRequiredWires(CMS_DATA_MODEL_NAMESPACE); - for (BundleWire wire : requiredWires) { - processWiring(cn, adminSession, wire.getProviderWiring(), processed, true, publishAsLocalRepo); - } - - List capabilities = wiring.getCapabilities(CMS_DATA_MODEL_NAMESPACE); - capabilities: for (BundleCapability capability : capabilities) { - if (!importListedAbstractModels - && KernelUtils.asBoolean((String) capability.getAttributes().get(DataModelNamespace.ABSTRACT))) { - continue capabilities; - } - boolean publish = registerDataModelCapability(cn, adminSession, capability, processed); - if (publish) - publishAsLocalRepo.add((String) capability.getAttributes().get(DataModelNamespace.NAME)); - } - } - - private boolean registerDataModelCapability(String cn, Session adminSession, BundleCapability capability, - Set processed) { - Map attrs = capability.getAttributes(); - String name = (String) attrs.get(DataModelNamespace.NAME); - if (processed.contains(name)) { - if (log.isTraceEnabled()) - log.trace("Data model " + name + " has already been processed"); - return false; - } - - // CND - String path = (String) attrs.get(DataModelNamespace.CND); - if (path != null) { - File dataModel = bc.getBundle().getDataFile("dataModels/" + path); - if (!dataModel.exists()) { - URL url = capability.getRevision().getBundle().getResource(path); - if (url == null) - throw new IllegalArgumentException("No data model '" + name + "' found under path " + path); - try (Reader reader = new InputStreamReader(url.openStream())) { - CndImporter.registerNodeTypes(reader, adminSession, true); - processed.add(name); - dataModel.getParentFile().mkdirs(); - dataModel.createNewFile(); - if (log.isDebugEnabled()) - log.debug("Registered CND " + url); - } catch (Exception e) { - log.error("Cannot import CND " + url, e); - } - } - } - - if (KernelUtils.asBoolean((String) attrs.get(DataModelNamespace.ABSTRACT))) - return false; - // Non abstract - boolean isStandalone = deployConfig.isStandalone(name); - boolean publishLocalRepo; - if (isStandalone && name.equals(cn))// includes the node itself - publishLocalRepo = true; - else if (!isStandalone && cn.equals(NodeConstants.NODE_REPOSITORY)) - publishLocalRepo = true; - else - publishLocalRepo = false; - - return publishLocalRepo; - } - - private void publishLocalRepo(String dataModelName, Repository repository) { - Hashtable properties = new Hashtable<>(); - properties.put(NodeConstants.CN, dataModelName); - LocalRepository localRepository; - String[] classes; - if (repository instanceof RepositoryImpl) { - localRepository = new JackrabbitLocalRepository((RepositoryImpl) repository, dataModelName); - classes = new String[] { Repository.class.getName(), LocalRepository.class.getName(), - JackrabbitLocalRepository.class.getName() }; - } else { - localRepository = new LocalRepository(repository, dataModelName); - classes = new String[] { Repository.class.getName(), LocalRepository.class.getName() }; - } - bc.registerService(classes, localRepository, properties); - - // TODO make it configurable - registerRepositoryServlets(dataModelName, localRepository); - if (log.isTraceEnabled()) - log.trace("Published data model " + dataModelName); - } @Override public synchronized Long getAvailableSince() { @@ -551,92 +246,5 @@ public class CmsDeployment implements NodeDeployment { return availableSince != null; } - protected void registerRepositoryServlets(String alias, Repository repository) { - registerRemotingServlet(alias, repository); - registerWebdavServlet(alias, repository); - } - - protected void registerWebdavServlet(String alias, Repository repository) { - CmsWebDavServlet webdavServlet = new CmsWebDavServlet(alias, repository); - Hashtable ip = new Hashtable<>(); - ip.put(HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + CmsWebDavServlet.INIT_PARAM_RESOURCE_CONFIG, webDavConfig); - ip.put(HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + CmsWebDavServlet.INIT_PARAM_RESOURCE_PATH_PREFIX, - "/" + alias); - - ip.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/" + alias + "/*"); - ip.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, - "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH + "=" + NodeConstants.PATH_DATA + ")"); - bc.registerService(Servlet.class, webdavServlet, ip); - } - - protected void registerRemotingServlet(String alias, Repository repository) { - CmsRemotingServlet remotingServlet = new CmsRemotingServlet(alias, repository); - Hashtable ip = new Hashtable<>(); - ip.put(NodeConstants.CN, alias); - // Properties ip = new Properties(); - ip.put(HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + CmsRemotingServlet.INIT_PARAM_RESOURCE_PATH_PREFIX, - "/" + alias); - ip.put(HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + CmsRemotingServlet.INIT_PARAM_AUTHENTICATE_HEADER, - "Negotiate"); - - // Looks like a bug in Jackrabbit remoting init - Path tmpDir; - try { - tmpDir = Files.createTempDirectory("remoting_" + alias); - } catch (IOException e) { - throw new RuntimeException("Cannot create temp directory for remoting servlet", e); - } - ip.put(HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + CmsRemotingServlet.INIT_PARAM_HOME, tmpDir.toString()); - ip.put(HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + CmsRemotingServlet.INIT_PARAM_TMP_DIRECTORY, - "remoting_" + alias); - ip.put(HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + CmsRemotingServlet.INIT_PARAM_PROTECTED_HANDLERS_CONFIG, - HttpUtils.DEFAULT_PROTECTED_HANDLERS); - ip.put(HTTP_WHITEBOARD_SERVLET_INIT_PARAM_PREFIX + CmsRemotingServlet.INIT_PARAM_CREATE_ABSOLUTE_URI, "false"); - - ip.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/" + alias + "/*"); - ip.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, - "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_PATH + "=" + NodeConstants.PATH_JCR + ")"); - bc.registerService(Servlet.class, remotingServlet, ip); - } - - private class RepositoryContextStc extends ServiceTracker { - - public RepositoryContextStc() { - super(bc, RepositoryContext.class, null); - } - - @Override - public RepositoryContext addingService(ServiceReference reference) { - RepositoryContext repoContext = bc.getService(reference); - String cn = (String) reference.getProperty(NodeConstants.CN); - if (cn != null) { - List publishAsLocalRepo = new ArrayList<>(); - if (cn.equals(NodeConstants.NODE_REPOSITORY)) { -// JackrabbitDataModelMigration.clearRepositoryCaches(repoContext.getRepositoryConfig()); - prepareNodeRepository(repoContext.getRepository(), publishAsLocalRepo); - // TODO separate home repository - prepareHomeRepository(repoContext.getRepository()); - registerRepositoryServlets(cn, repoContext.getRepository()); - nodeAvailable = true; - checkReadiness(); - } else { - prepareDataModel(cn, repoContext.getRepository(), publishAsLocalRepo); - } - // Publish all at once, so that bundles with multiple CNDs are consistent - for (String dataModelName : publishAsLocalRepo) - publishLocalRepo(dataModelName, repoContext.getRepository()); - } - return repoContext; - } - - @Override - public void modifiedService(ServiceReference reference, RepositoryContext service) { - } - - @Override - public void removedService(ServiceReference reference, RepositoryContext service) { - } - - } } diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsInstance.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsInstance.java index eef8d925e..0d65a6c0b 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsInstance.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsInstance.java @@ -1,23 +1,18 @@ package org.argeo.cms.internal.kernel; -import javax.jcr.Repository; import javax.naming.ldap.LdapName; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.argeo.api.NodeConstants; import org.argeo.api.NodeInstance; -import org.argeo.cms.CmsException; import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; -import org.osgi.framework.ServiceReference; -import org.osgi.util.tracker.ServiceTracker; public class CmsInstance implements NodeInstance { private final Log log = LogFactory.getLog(getClass()); private final BundleContext bc = FrameworkUtil.getBundle(getClass()).getBundleContext(); - private EgoRepository egoRepository; +// private EgoRepository egoRepository; public CmsInstance() { initTrackers(); @@ -25,25 +20,25 @@ public class CmsInstance implements NodeInstance { private void initTrackers() { // node repository - new ServiceTracker(bc, Repository.class, null) { - @Override - public Repository addingService(ServiceReference reference) { - Object cn = reference.getProperty(NodeConstants.CN); - if (cn != null && cn.equals(NodeConstants.EGO_REPOSITORY)) { -// egoRepository = (EgoRepository) bc.getService(reference); - if (log.isTraceEnabled()) - log.trace("Home repository is available"); - } - return super.addingService(reference); - } - - @Override - public void removedService(ServiceReference reference, Repository service) { - super.removedService(reference, service); -// egoRepository = null; - } - - }.open(); +// new ServiceTracker(bc, Repository.class, null) { +// @Override +// public Repository addingService(ServiceReference reference) { +// Object cn = reference.getProperty(NodeConstants.CN); +// if (cn != null && cn.equals(NodeConstants.EGO_REPOSITORY)) { +//// egoRepository = (EgoRepository) bc.getService(reference); +// if (log.isTraceEnabled()) +// log.trace("Home repository is available"); +// } +// return super.addingService(reference); +// } +// +// @Override +// public void removedService(ServiceReference reference, Repository service) { +// super.removedService(reference, service); +//// egoRepository = null; +// } +// +// }.open(); } public void shutdown() { @@ -52,10 +47,11 @@ public class CmsInstance implements NodeInstance { @Override public void createWorkgroup(LdapName dn) { - if (egoRepository == null) - throw new CmsException("Ego repository is not available"); - // TODO add check that the group exists - egoRepository.createWorkgroup(dn); +// if (egoRepository == null) +// throw new CmsException("Ego repository is not available"); +// // TODO add check that the group exists +// egoRepository.createWorkgroup(dn); + throw new UnsupportedOperationException(); } } diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsState.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsState.java index b794d088e..fc9ea7dd7 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsState.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsState.java @@ -4,12 +4,10 @@ import static java.util.Locale.ENGLISH; 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 javax.jcr.RepositoryFactory; import javax.transaction.TransactionManager; import javax.transaction.UserTransaction; @@ -38,7 +36,6 @@ public class CmsState implements NodeState { private List locales = null; private ThreadGroup threadGroup = new ThreadGroup("CMS"); - private KernelThread kernelThread; private List stopHooks = new ArrayList<>(); private final String stateUuid; @@ -64,10 +61,6 @@ public class CmsState implements NodeState { initI18n(); initServices(); - // kernel thread - kernelThread = new KernelThread(threadGroup, "Kernel Thread"); - kernelThread.setContextClassLoader(getClass().getClassLoader()); - kernelThread.start(); } private void initI18n() { @@ -105,14 +98,14 @@ public class CmsState implements NodeState { // ocrParser.setLanguage("ara"); // bc.registerService(Parser.class, ocrParser, new Hashtable()); - // JCR - RepositoryServiceFactory repositoryServiceFactory = new RepositoryServiceFactory(); - stopHooks.add(() -> repositoryServiceFactory.shutdown()); - Activator.registerService(ManagedServiceFactory.class, repositoryServiceFactory, - LangUtils.dict(Constants.SERVICE_PID, NodeConstants.NODE_REPOS_FACTORY_PID)); - - NodeRepositoryFactory repositoryFactory = new NodeRepositoryFactory(); - Activator.registerService(RepositoryFactory.class, repositoryFactory, null); +// // JCR +// RepositoryServiceFactory repositoryServiceFactory = new RepositoryServiceFactory(); +// stopHooks.add(() -> repositoryServiceFactory.shutdown()); +// Activator.registerService(ManagedServiceFactory.class, repositoryServiceFactory, +// LangUtils.dict(Constants.SERVICE_PID, NodeConstants.NODE_REPOS_FACTORY_PID)); +// +// NodeRepositoryFactory repositoryFactory = new NodeRepositoryFactory(); +// Activator.registerService(RepositoryFactory.class, repositoryFactory, null); // Security NodeUserAdmin userAdmin = new NodeUserAdmin(NodeConstants.ROLES_BASEDN, NodeConstants.TOKENS_BASEDN); @@ -120,20 +113,6 @@ public class CmsState implements NodeState { Activator.registerService(ManagedServiceFactory.class, userAdmin, LangUtils.dict(Constants.SERVICE_PID, NodeConstants.NODE_USER_ADMIN_PID)); - // File System - CmsFsProvider cmsFsProvider = new CmsFsProvider(); -// ServiceLoader fspSl = ServiceLoader.load(FileSystemProvider.class); -// for (FileSystemProvider fsp : fspSl) { -// log.debug("FileSystemProvider " + fsp); -// if (fsp instanceof CmsFsProvider) { -// cmsFsProvider = (CmsFsProvider) fsp; -// } -// } -// for (FileSystemProvider fsp : FileSystemProvider.installedProviders()) { -// log.debug("Installed FileSystemProvider " + fsp); -// } - Activator.registerService(FileSystemProvider.class, cmsFsProvider, - LangUtils.dict(Constants.SERVICE_PID, NodeConstants.NODE_FS_PROVIDER_PID)); } private void initSimpleTransactionManager() { @@ -180,8 +159,6 @@ public class CmsState implements NodeState { if (log.isDebugEnabled()) log.debug("CMS stopping... (" + this.stateUuid + ")"); - if (kernelThread != null) - kernelThread.destroyAndJoin(); // In a different thread in order to avoid interruptions Thread stopHookThread = new Thread(() -> applyStopHooks(), "Apply Argeo Stop Hooks"); stopHookThread.start(); diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/DeployConfig.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/DeployConfig.java index 036aa93d2..2f60b7337 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/DeployConfig.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/DeployConfig.java @@ -40,7 +40,7 @@ class DeployConfig implements ConfigurationListener { private static Path deployConfigPath = KernelUtils.getOsgiInstancePath(KernelConstants.DEPLOY_CONFIG_PATH); private SortedMap deployConfigs = new TreeMap<>(); - private final DataModels dataModels; +// private final DataModels dataModels; private boolean isFirstInit = false; @@ -48,8 +48,8 @@ class DeployConfig implements ConfigurationListener { private ConfigurationAdmin configurationAdmin; - public DeployConfig(ConfigurationAdmin configurationAdmin, DataModels dataModels, boolean isClean) { - this.dataModels = dataModels; + public DeployConfig(ConfigurationAdmin configurationAdmin, boolean isClean) { +// this.dataModels = dataModels; // ConfigurationAdmin configurationAdmin = // bc.getService(bc.getServiceReference(ConfigurationAdmin.class)); try { @@ -327,10 +327,6 @@ class DeployConfig implements ConfigurationListener { } } - boolean isStandalone(String dataModelName) { - return getProps(NodeConstants.NODE_REPOS_FACTORY_PID, dataModelName) != null; - } - /* * UTILITIES */ diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/InitUtils.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/InitUtils.java index 3c40a389b..98b625a98 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/InitUtils.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/InitUtils.java @@ -8,7 +8,6 @@ import java.io.IOException; import java.io.Reader; import java.net.InetAddress; import java.net.URI; -import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; @@ -16,14 +15,9 @@ import java.security.KeyStore; import java.util.ArrayList; import java.util.Arrays; import java.util.Dictionary; -import java.util.HashMap; import java.util.Hashtable; import java.util.List; -import java.util.Map; -import javax.jcr.Repository; -import javax.jcr.RepositoryException; -import javax.jcr.RepositoryFactory; import javax.security.auth.x500.X500Principal; import org.apache.commons.io.FileUtils; @@ -31,13 +25,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.api.NodeConstants; import org.argeo.cms.internal.http.InternalHttpConstants; -import org.argeo.cms.internal.jcr.RepoConf; -import org.argeo.jackrabbit.client.ClientDavexRepositoryFactory; -import org.argeo.jcr.JcrException; -import org.argeo.naming.LdapAttrs; import org.argeo.osgi.useradmin.UserAdminConf; -import org.osgi.framework.BundleContext; -import org.osgi.framework.Constants; /** * Interprets framework properties in order to generate the initial deploy diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelUtils.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelUtils.java index 7d296ae0e..8c9e4ba6c 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelUtils.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelUtils.java @@ -8,7 +8,6 @@ import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Path; import java.nio.file.Paths; -import java.security.PrivilegedAction; import java.security.URIParameter; import java.util.Dictionary; import java.util.Hashtable; @@ -16,16 +15,8 @@ import java.util.Properties; import java.util.TreeMap; import java.util.TreeSet; -import javax.jcr.Repository; -import javax.jcr.RepositoryException; -import javax.jcr.Session; -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.argeo.api.DataModelNamespace; -import org.argeo.api.NodeConstants; import org.osgi.framework.BundleContext; import org.osgi.util.tracker.ServiceTracker; @@ -153,67 +144,67 @@ class KernelUtils implements KernelConstants { out.println(key + "=" + display.get(key)); } - static Session openAdminSession(Repository repository) { - return openAdminSession(repository, null); - } - - static Session openAdminSession(final Repository repository, final String workspaceName) { - LoginContext loginContext = loginAsDataAdmin(); - return Subject.doAs(loginContext.getSubject(), new PrivilegedAction() { - - @Override - public Session run() { - try { - return repository.login(workspaceName); - } catch (RepositoryException e) { - throw new IllegalStateException("Cannot open admin session", e); - } finally { - try { - loginContext.logout(); - } catch (LoginException e) { - throw new IllegalStateException(e); - } - } - } - - }); - } - - static LoginContext loginAsDataAdmin() { - ClassLoader currentCl = Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(KernelUtils.class.getClassLoader()); - LoginContext loginContext; - try { - loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_DATA_ADMIN); - loginContext.login(); - } catch (LoginException e1) { - throw new IllegalStateException("Could not login as data admin", e1); - } finally { - Thread.currentThread().setContextClassLoader(currentCl); - } - return loginContext; - } - - static void doAsDataAdmin(Runnable action) { - LoginContext loginContext = loginAsDataAdmin(); - Subject.doAs(loginContext.getSubject(), new PrivilegedAction() { - - @Override - public Void run() { - try { - action.run(); - return null; - } finally { - try { - loginContext.logout(); - } catch (LoginException e) { - throw new IllegalStateException(e); - } - } - } - - }); - } +// static Session openAdminSession(Repository repository) { +// return openAdminSession(repository, null); +// } +// +// static Session openAdminSession(final Repository repository, final String workspaceName) { +// LoginContext loginContext = loginAsDataAdmin(); +// return Subject.doAs(loginContext.getSubject(), new PrivilegedAction() { +// +// @Override +// public Session run() { +// try { +// return repository.login(workspaceName); +// } catch (RepositoryException e) { +// throw new IllegalStateException("Cannot open admin session", e); +// } finally { +// try { +// loginContext.logout(); +// } catch (LoginException e) { +// throw new IllegalStateException(e); +// } +// } +// } +// +// }); +// } +// +// static LoginContext loginAsDataAdmin() { +// ClassLoader currentCl = Thread.currentThread().getContextClassLoader(); +// Thread.currentThread().setContextClassLoader(KernelUtils.class.getClassLoader()); +// LoginContext loginContext; +// try { +// loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_DATA_ADMIN); +// loginContext.login(); +// } catch (LoginException e1) { +// throw new IllegalStateException("Could not login as data admin", e1); +// } finally { +// Thread.currentThread().setContextClassLoader(currentCl); +// } +// return loginContext; +// } + +// static void doAsDataAdmin(Runnable action) { +// LoginContext loginContext = loginAsDataAdmin(); +// Subject.doAs(loginContext.getSubject(), new PrivilegedAction() { +// +// @Override +// public Void run() { +// try { +// action.run(); +// return null; +// } finally { +// try { +// loginContext.logout(); +// } catch (LoginException e) { +// throw new IllegalStateException(e); +// } +// } +// } +// +// }); +// } static void asyncOpen(ServiceTracker st) { Runnable run = new Runnable() { diff --git a/org.argeo.jcr/.classpath b/org.argeo.jcr/.classpath deleted file mode 100644 index d499d3059..000000000 --- a/org.argeo.jcr/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/org.argeo.jcr/.project b/org.argeo.jcr/.project deleted file mode 100644 index e432547c7..000000000 --- a/org.argeo.jcr/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - org.argeo.jcr - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/org.argeo.jcr/META-INF/.gitignore b/org.argeo.jcr/META-INF/.gitignore deleted file mode 100644 index 4854a41b9..000000000 --- a/org.argeo.jcr/META-INF/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/MANIFEST.MF diff --git a/org.argeo.jcr/bnd.bnd b/org.argeo.jcr/bnd.bnd deleted file mode 100644 index 4df501710..000000000 --- a/org.argeo.jcr/bnd.bnd +++ /dev/null @@ -1,5 +0,0 @@ -Provide-Capability:\ -cms.datamodel; name=jcrx; cnd=/org/argeo/jcr/jcrx.cnd; abstract=true - -Import-Package:\ -* diff --git a/org.argeo.jcr/build.properties b/org.argeo.jcr/build.properties deleted file mode 100644 index acb5245c8..000000000 --- a/org.argeo.jcr/build.properties +++ /dev/null @@ -1,5 +0,0 @@ -source.. = src/,\ - ext/test/ -output.. = bin/ -bin.includes = META-INF/,\ - . diff --git a/org.argeo.jcr/pom.xml b/org.argeo.jcr/pom.xml deleted file mode 100644 index d8d74920f..000000000 --- a/org.argeo.jcr/pom.xml +++ /dev/null @@ -1,11 +0,0 @@ - - 4.0.0 - - org.argeo.commons - argeo-commons - 2.3-SNAPSHOT - .. - - org.argeo.jcr - Commons JCR - \ No newline at end of file diff --git a/org.argeo.maintenance/.classpath b/org.argeo.maintenance/.classpath deleted file mode 100644 index e801ebfb4..000000000 --- a/org.argeo.maintenance/.classpath +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/org.argeo.maintenance/.project b/org.argeo.maintenance/.project deleted file mode 100644 index d1c87c7b3..000000000 --- a/org.argeo.maintenance/.project +++ /dev/null @@ -1,28 +0,0 @@ - - - org.argeo.maintenance - - - - - - org.eclipse.jdt.core.javabuilder - - - - - org.eclipse.pde.ManifestBuilder - - - - - org.eclipse.pde.SchemaBuilder - - - - - - org.eclipse.pde.PluginNature - org.eclipse.jdt.core.javanature - - diff --git a/org.argeo.maintenance/.settings/org.eclipse.jdt.core.prefs b/org.argeo.maintenance/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 7e2e11935..000000000 --- a/org.argeo.maintenance/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,101 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled -org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore -org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull -org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault -org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= -org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable -org.eclipse.jdt.core.compiler.annotation.nullable.secondary= -org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled -org.eclipse.jdt.core.compiler.problem.APILeak=warning -org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning -org.eclipse.jdt.core.compiler.problem.autoboxing=ignore -org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning -org.eclipse.jdt.core.compiler.problem.deadCode=warning -org.eclipse.jdt.core.compiler.problem.deprecation=warning -org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled -org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled -org.eclipse.jdt.core.compiler.problem.discouragedReference=warning -org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore -org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore -org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore -org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled -org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore -org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning -org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning -org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning -org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled -org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning -org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore -org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore -org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning -org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore -org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore -org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled -org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore -org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled -org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning -org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore -org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning -org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning -org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore -org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning -org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning -org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error -org.eclipse.jdt.core.compiler.problem.nullReference=warning -org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error -org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning -org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning -org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore -org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning -org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore -org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore -org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore -org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning -org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning -org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore -org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore -org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore -org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore -org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore -org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning -org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled -org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled -org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled -org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore -org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning -org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning -org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning -org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore -org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning -org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled -org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info -org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore -org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore -org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore -org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled -org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore -org.eclipse.jdt.core.compiler.problem.unusedImport=warning -org.eclipse.jdt.core.compiler.problem.unusedLabel=warning -org.eclipse.jdt.core.compiler.problem.unusedLocal=warning -org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore -org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore -org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled -org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled -org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning -org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore -org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning -org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning diff --git a/org.argeo.maintenance/META-INF/.gitignore b/org.argeo.maintenance/META-INF/.gitignore deleted file mode 100644 index 4854a41b9..000000000 --- a/org.argeo.maintenance/META-INF/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/MANIFEST.MF diff --git a/org.argeo.maintenance/bnd.bnd b/org.argeo.maintenance/bnd.bnd deleted file mode 100644 index f0c70aa45..000000000 --- a/org.argeo.maintenance/bnd.bnd +++ /dev/null @@ -1 +0,0 @@ -Bundle-Activator: org.argeo.maintenance.internal.Activator diff --git a/org.argeo.maintenance/build.properties b/org.argeo.maintenance/build.properties deleted file mode 100644 index ad08d9e7e..000000000 --- a/org.argeo.maintenance/build.properties +++ /dev/null @@ -1,6 +0,0 @@ -source.. = src/ -output.. = bin/ -bin.includes = META-INF/,\ - . -additional.bundles = org.slf4j.log4j12,\ - org.slf4j.api diff --git a/org.argeo.maintenance/pom.xml b/org.argeo.maintenance/pom.xml deleted file mode 100644 index b33e47dfc..000000000 --- a/org.argeo.maintenance/pom.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - 4.0.0 - - org.argeo.commons - argeo-commons - 2.3-SNAPSHOT - .. - - org.argeo.maintenance - Maintenance - jar - - - org.argeo.commons - org.argeo.jcr - 2.3-SNAPSHOT - - - org.argeo.commons - org.argeo.enterprise - 2.3-SNAPSHOT - - - org.argeo.commons - org.argeo.core - 2.3-SNAPSHOT - - - org.argeo.commons - org.argeo.api - 2.3-SNAPSHOT - - - \ No newline at end of file -- 2.30.2