{
  "bundles": [
    {
      "@type": "NXBundle",
      "artifactId": "nuxeo-elasticsearch-audit",
      "artifactVersion": "2021.54.6",
      "bundleGroup": {
        "@type": "NXBundleGroup",
        "bundleIds": [
          "org.nuxeo.elasticsearch.audit",
          "org.nuxeo.elasticsearch.automation",
          "org.nuxeo.elasticsearch.core",
          "org.nuxeo.elasticsearch.http.readonly",
          "org.nuxeo.elasticsearch.rest",
          "org.nuxeo.elasticsearch.seqgen",
          "org.nuxeo.elasticsearch.web"
        ],
        "hierarchyPath": "/grp:org.nuxeo.elasticsearch",
        "id": "grp:org.nuxeo.elasticsearch",
        "name": "org.nuxeo.elasticsearch",
        "parentIds": [],
        "readmes": [
          {
            "blobProviderId": "default",
            "content": "nuxeo-elasticsearch\n===================\n\n## About\n\nThis project aims at providing Nuxeo bundles to integrate\nElasticsearch with the Nuxeo Platform.\n\nThe idea is to index/query Nuxeo Documents to/from Elasticsearch.\n\n## Building\n\nTo build and run the tests, simply start the Maven build:\n\n    mvn clean install\n\n## Running tests\n\n### Using the embedded Elasticsearch\n\nWith the default `RestClient`:\n```bash\nmvn -nsu test\n# -Dnuxeo.test.elasticsearch.client=RestClient is set by default\n```\n\nOr with the `TransportClient`\n\n```bash\nmvn -nsu test -Dnuxeo.test.elasticsearch.client=TransportClient\n```\n\n### Using an external Elasticsearch\n\n1. Start an Elasticsearch using docker:\n```bash\ndocker run -p 9400:9200 -p 9600:9300 docker.elastic.co/elasticsearch/elasticsearch-oss:6.5.3\n```\n\n2.a Run the test with `RestClient`:\n```bash\nmvn -nsu test -Dnuxeo.test.elasticsearch.addressList=http://localhost:9400\n```\n\n2.b Or run the test with `TransportClient`:\n```bash\nmvn -nsu test -Dnuxeo.test.elasticsearch.client=TransportClient -Dnuxeo.test.elasticsearch.clusterName=docker-cluster -Dnuxeo.test.elasticsearch.addressList=localhost:9600\n```\n\n## Links\n\n- Administration: http://doc.nuxeo.com/x/UBY5AQ\n- Configuring mapping: http://doc.nuxeo.com/x/WxI5AQ\n- Overview: http://doc.nuxeo.com/x/iYElAQ\n- [Open jira tikets](https://jira.nuxeo.com/issues/?jql=project%20%3D%20NXP%20AND%20component%20%3D%20Elasticsearch%20AND%20Status%20!%3D%20%22Resolved%22%20ORDER%20BY%20updated%20DESC%2C%20priority%20DESC%2C%20created%20ASC)\n",
            "digest": "39fe49f5b0c4b24c62cb008ba470a7c5",
            "encoding": "UTF-8",
            "length": 1513,
            "mimeType": "text/plain",
            "name": "README.md"
          }
        ],
        "version": "2021.54"
      },
      "bundleId": "org.nuxeo.elasticsearch.audit",
      "components": [
        {
          "@type": "NXComponent",
          "documentation": "Contribute the search event to the Audit configuration :\n\t\tthis is only safe to do so when the ES backend if used for Audit\n\t\n",
          "documentationHtml": "<p>\nContribute the search event to the Audit configuration :\nthis is only safe to do so when the ES backend if used for Audit\n</p><p></p>",
          "extensionPoints": [],
          "extensions": [
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.platform.audit.service.NXAuditEventsService--event",
              "hierarchyPath": "/grp:org.nuxeo.elasticsearch/org.nuxeo.elasticsearch.audit/org.nuxeo.ecm.platform.audit.search.contrib/Contributions/org.nuxeo.ecm.platform.audit.search.contrib--event",
              "id": "org.nuxeo.ecm.platform.audit.search.contrib--event",
              "registrationOrder": 3,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.platform.audit.service.NXAuditEventsService",
                "name": "org.nuxeo.ecm.platform.audit.service.NXAuditEventsService",
                "type": "service"
              },
              "version": "2021.54.6",
              "xml": "<extension point=\"event\" target=\"org.nuxeo.ecm.platform.audit.service.NXAuditEventsService\">\n\t\t<event name=\"search\">\n\t\t\t<extendedInfos>\n\t\t\t\t<extendedInfo expression=\"${message.properties.searchDocumentModelAsJson}\" key=\"searchDocumentModel\"/>\n\t\t\t\t<extendedInfo expression=\"${message.properties.aggregates}\" key=\"aggregates\"/>\n\t\t\t\t<extendedInfo expression=\"${message.properties.aggregatesMatches}\" key=\"aggregatesMatches\"/>\n\t\t\t\t<extendedInfo expression=\"${message.properties.effectiveQuery}\" key=\"effectiveQuery\"/>\n\t\t\t\t<extendedInfo expression=\"${message.properties.pageIndex}\" key=\"pageIndex\"/>\n\t\t\t\t<extendedInfo expression=\"${message.properties.resultsCountInPage}\" key=\"resultsCountInPage\"/>\n\t\t\t\t<extendedInfo expression=\"${message.properties.resultsCount}\" key=\"resultsCount\"/>\n\t\t\t\t<extendedInfo expression=\"${message.properties.pageProviderName}\" key=\"pageProviderName\"/>\n\t\t\t\t<extendedInfo expression=\"${message.properties.queryParams}\" key=\"queryParams\"/>\n\t\t\t\t<extendedInfo expression=\"${message.properties.params}\" key=\"params\"/>\n\t\t\t\t<extendedInfo expression=\"${message.properties.executionTimeMs}\" key=\"executionTimeMs\"/>\n\t\t\t\t<extendedInfo expression=\"${message.properties.searchFields}\" key=\"searchFields\"/>\n\t\t\t</extendedInfos>\n\t\t</event>\n\t</extension>"
            }
          ],
          "hierarchyPath": "/grp:org.nuxeo.elasticsearch/org.nuxeo.elasticsearch.audit/org.nuxeo.ecm.platform.audit.search.contrib",
          "name": "org.nuxeo.ecm.platform.audit.search.contrib",
          "requirements": [],
          "resolutionOrder": 203,
          "services": [],
          "startOrder": 277,
          "version": "2021.54.6",
          "xmlFileContent": "<component name=\"org.nuxeo.ecm.platform.audit.search.contrib\"\n\tversion=\"1.0\">\n\n\t<documentation>Contribute the search event to the Audit configuration :\n\t\tthis is only safe to do so when the ES backend if used for Audit\n\t</documentation>\n\n\t<extension target=\"org.nuxeo.ecm.platform.audit.service.NXAuditEventsService\"\n\t\tpoint=\"event\">\n\t\t<event name=\"search\">\n\t\t\t<extendedInfos>\n\t\t\t\t<extendedInfo expression=\"${message.properties.searchDocumentModelAsJson}\"\n\t\t\t\t\tkey=\"searchDocumentModel\" />\n\t\t\t\t<extendedInfo expression=\"${message.properties.aggregates}\"\n\t\t\t\t\tkey=\"aggregates\" />\n\t\t\t\t<extendedInfo expression=\"${message.properties.aggregatesMatches}\"\n\t\t\t\t\tkey=\"aggregatesMatches\" />\n\t\t\t\t<extendedInfo expression=\"${message.properties.effectiveQuery}\"\n\t\t\t\t\tkey=\"effectiveQuery\" />\n\t\t\t\t<extendedInfo expression=\"${message.properties.pageIndex}\"\n\t\t\t\t\tkey=\"pageIndex\" />\n\t\t\t\t<extendedInfo expression=\"${message.properties.resultsCountInPage}\"\n\t\t\t\t\tkey=\"resultsCountInPage\" />\n\t\t\t\t<extendedInfo expression=\"${message.properties.resultsCount}\"\n\t\t\t\t\tkey=\"resultsCount\" />\n\t\t\t\t<extendedInfo expression=\"${message.properties.pageProviderName}\"\n\t\t\t\t\tkey=\"pageProviderName\" />\n\t\t\t\t<extendedInfo expression=\"${message.properties.queryParams}\"\n\t\t\t\t\tkey=\"queryParams\" />\n\t\t\t\t<extendedInfo expression=\"${message.properties.params}\"\n\t\t\t\t\tkey=\"params\" />\n\t\t\t\t<extendedInfo expression=\"${message.properties.executionTimeMs}\"\n\t\t\t\t\tkey=\"executionTimeMs\" />\n\t\t\t\t<extendedInfo expression=\"${message.properties.searchFields}\"\n\t\t\t\t\tkey=\"searchFields\" />\n\t\t\t</extendedInfos>\n\t\t</event>\n\t</extension>\n</component>",
          "xmlFileName": "/OSGI-INF/es-audit-search-contrib.xml",
          "xmlPureComponent": true
        },
        {
          "@type": "NXComponent",
          "documentationHtml": "",
          "extensionPoints": [],
          "extensions": [
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.platform.query.api.PageProviderService--providers",
              "hierarchyPath": "/grp:org.nuxeo.elasticsearch/org.nuxeo.elasticsearch.audit/org.nuxeo.ecm.platform.audit.PageProviderservice.es.contrib/Contributions/org.nuxeo.ecm.platform.audit.PageProviderservice.es.contrib--providers",
              "id": "org.nuxeo.ecm.platform.audit.PageProviderservice.es.contrib--providers",
              "registrationOrder": 10,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.platform.query.api.PageProviderService",
                "name": "org.nuxeo.ecm.platform.query.api.PageProviderService",
                "type": "service"
              },
              "version": "2021.54.6",
              "xml": "<extension point=\"providers\" target=\"org.nuxeo.ecm.platform.query.api.PageProviderService\">\n\n    <genericPageProvider class=\"org.nuxeo.elasticsearch.audit.pageprovider.ESAuditPageProvider\" name=\"EVENTS_VIEW\">\n      <property name=\"coreSession\">#{documentManager}</property>\n      <property name=\"generateUIComments\">false</property>\n      <whereClause docType=\"BasicAuditSearch\">\n        <predicate operator=\"BETWEEN\" parameter=\"eventDate\">\n          <field name=\"startDate\" schema=\"basicauditsearch\"/>\n          <field name=\"endDate\" schema=\"basicauditsearch\"/>\n        </predicate>\n        <predicate operator=\"=\" parameter=\"category\">\n          <field name=\"eventCategory\" schema=\"basicauditsearch\"/>\n        </predicate>\n        <predicate operator=\"IN\" parameter=\"eventId\">\n          <field name=\"eventIds\" schema=\"basicauditsearch\"/>\n        </predicate>\n        <predicate operator=\"=\" parameter=\"principalName\">\n          <field name=\"principalName\" schema=\"basicauditsearch\"/>\n        </predicate>\n      </whereClause>\n      <sort ascending=\"false\" column=\"eventDate\"/>\n      <pageSize>10</pageSize>\n      <maxPageSize>1000</maxPageSize>\n    </genericPageProvider>\n\n    <genericPageProvider class=\"org.nuxeo.elasticsearch.audit.pageprovider.ESAuditPageProvider\" name=\"DOCUMENT_HISTORY_PROVIDER_OLD\">\n      <whereClause docType=\"BasicAuditSearch\">\n        <fixedPart>\n            {\n\t\t        \"bool\" : {\n\t\t          \"must\" : {\n\t\t            \"match\" : {\n\t\t              \"docUUID\" : {\n\t\t                \"query\" : \"?\"\n\t\t              }\n\t\t            }\n\t\t          }\n\t\t        }\n\t\t\t  }\n        </fixedPart>\n        <predicate operator=\"BETWEEN\" parameter=\"eventDate\">\n          <field name=\"startDate\" schema=\"basicauditsearch\"/>\n          <field name=\"endDate\" schema=\"basicauditsearch\"/>\n        </predicate>\n        <predicate operator=\"IN\" parameter=\"category\">\n          <field name=\"eventCategories\" schema=\"basicauditsearch\"/>\n        </predicate>\n        <predicate operator=\"IN\" parameter=\"eventId\">\n          <field name=\"eventIds\" schema=\"basicauditsearch\"/>\n        </predicate>\n        <predicate operator=\"IN\" parameter=\"principalName\">\n          <field name=\"principalNames\" schema=\"basicauditsearch\"/>\n        </predicate>\n      </whereClause>\n      <sort ascending=\"true\" column=\"id\"/>\n      <pageSize>5</pageSize>\n    </genericPageProvider>\n\n\n    <genericPageProvider class=\"org.nuxeo.elasticsearch.audit.pageprovider.ESDocumentHistoryPageProvider\" name=\"DOCUMENT_HISTORY_PROVIDER\">\n      <whereClause docType=\"BasicAuditSearch\">\n        <predicate operator=\"BETWEEN\" parameter=\"eventDate\">\n          <field name=\"startDate\" schema=\"basicauditsearch\"/>\n          <field name=\"endDate\" schema=\"basicauditsearch\"/>\n        </predicate>\n        <predicate operator=\"IN\" parameter=\"category\">\n          <field name=\"eventCategories\" schema=\"basicauditsearch\"/>\n        </predicate>\n        <predicate operator=\"IN\" parameter=\"eventId\">\n          <field name=\"eventIds\" schema=\"basicauditsearch\"/>\n        </predicate>\n        <predicate operator=\"IN\" parameter=\"principalName\">\n          <field name=\"principalNames\" schema=\"basicauditsearch\"/>\n        </predicate>\n      </whereClause>\n      <sort ascending=\"false\" column=\"eventDate\"/>\n        <pageSize>10</pageSize>\n        <maxPageSize>1000</maxPageSize>\n    </genericPageProvider>\n\n      <genericPageProvider class=\"org.nuxeo.elasticsearch.audit.pageprovider.ESAuditPageProvider\" name=\"ADMIN_HISTORY\">\n        <property name=\"coreSession\"/>\n        <property name=\"generateUIComments\">false</property>\n        <whereClause docType=\"BasicAuditSearch\">\n          <predicate operator=\"BETWEEN\" parameter=\"eventDate\">\n            <field name=\"startDate\" schema=\"basicauditsearch\"/>\n            <field name=\"endDate\" schema=\"basicauditsearch\"/>\n          </predicate>\n          <predicate operator=\"=\" parameter=\"category\">\n            <field name=\"eventCategory\" schema=\"basicauditsearch\"/>\n          </predicate>\n          <predicate operator=\"IN\" parameter=\"eventId\">\n            <field name=\"eventIds\" schema=\"basicauditsearch\"/>\n          </predicate>\n          <predicate operator=\"=\" parameter=\"principalName\">\n            <field name=\"principalName\" schema=\"basicauditsearch\"/>\n          </predicate>\n        </whereClause>\n        <sort ascending=\"false\" column=\"eventDate\"/>\n        <pageSize>10</pageSize>\n        <maxPageSize>1000</maxPageSize>\n      </genericPageProvider>\n\n  <genericPageProvider class=\"org.nuxeo.elasticsearch.audit.pageprovider.ESDocumentHistoryPageProvider\" name=\"LATEST_AUDITED_CREATED_USERS_OR_GROUPS_PROVIDER\">\n     <pattern>\n{\n  \"query\": {\n    \"bool\": {\n      \"must\": [\n        {\n          \"term\": {\n            \"category\": \"userGroup\"\n          }\n        },\n        {\n          \"bool\": {\n            \"should\": [\n              {\n                \"term\": {\n                  \"eventId\": \"user_created\"\n                }\n              },\n              {\n                \"term\": {\n                  \"eventId\": \"group_created\"\n                }\n              }\n            ]\n          }\n        }\n      ]\n    }\n  }\n}\n    </pattern>\n    <sort ascending=\"false\" column=\"eventDate\"/>\n    <pageSize>5</pageSize>\n    <maxPageSize>100</maxPageSize>\n  </genericPageProvider>\n\n  </extension>"
            }
          ],
          "hierarchyPath": "/grp:org.nuxeo.elasticsearch/org.nuxeo.elasticsearch.audit/org.nuxeo.ecm.platform.audit.PageProviderservice.es.contrib",
          "name": "org.nuxeo.ecm.platform.audit.PageProviderservice.es.contrib",
          "requirements": [
            "org.nuxeo.admin.pageproviders",
            "org.nuxeo.ecm.platform.audit.PageProviderservice.contrib"
          ],
          "resolutionOrder": 290,
          "services": [],
          "startOrder": 272,
          "version": "2021.54.6",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n<component name=\"org.nuxeo.ecm.platform.audit.PageProviderservice.es.contrib\">\n\n  <require>org.nuxeo.ecm.platform.audit.PageProviderservice.contrib</require>\n  <require>org.nuxeo.admin.pageproviders</require>\n\n  <extension target=\"org.nuxeo.ecm.platform.query.api.PageProviderService\"\n    point=\"providers\">\n\n    <genericPageProvider name=\"EVENTS_VIEW\" class=\"org.nuxeo.elasticsearch.audit.pageprovider.ESAuditPageProvider\">\n      <property name=\"coreSession\">#{documentManager}</property>\n      <property name=\"generateUIComments\">false</property>\n      <whereClause docType=\"BasicAuditSearch\">\n        <predicate parameter=\"eventDate\" operator=\"BETWEEN\">\n          <field schema=\"basicauditsearch\" name=\"startDate\" />\n          <field schema=\"basicauditsearch\" name=\"endDate\" />\n        </predicate>\n        <predicate parameter=\"category\" operator=\"=\">\n          <field schema=\"basicauditsearch\" name=\"eventCategory\" />\n        </predicate>\n        <predicate parameter=\"eventId\" operator=\"IN\">\n          <field schema=\"basicauditsearch\" name=\"eventIds\" />\n        </predicate>\n        <predicate parameter=\"principalName\" operator=\"=\">\n          <field schema=\"basicauditsearch\" name=\"principalName\" />\n        </predicate>\n      </whereClause>\n      <sort column=\"eventDate\" ascending=\"false\" />\n      <pageSize>10</pageSize>\n      <maxPageSize>1000</maxPageSize>\n    </genericPageProvider>\n\n    <genericPageProvider name=\"DOCUMENT_HISTORY_PROVIDER_OLD\"\n      class=\"org.nuxeo.elasticsearch.audit.pageprovider.ESAuditPageProvider\">\n      <whereClause docType=\"BasicAuditSearch\">\n        <fixedPart>\n            {\n\t\t        \"bool\" : {\n\t\t          \"must\" : {\n\t\t            \"match\" : {\n\t\t              \"docUUID\" : {\n\t\t                \"query\" : \"?\"\n\t\t              }\n\t\t            }\n\t\t          }\n\t\t        }\n\t\t\t  }\n        </fixedPart>\n        <predicate parameter=\"eventDate\" operator=\"BETWEEN\">\n          <field schema=\"basicauditsearch\" name=\"startDate\" />\n          <field schema=\"basicauditsearch\" name=\"endDate\" />\n        </predicate>\n        <predicate parameter=\"category\" operator=\"IN\">\n          <field schema=\"basicauditsearch\" name=\"eventCategories\" />\n        </predicate>\n        <predicate parameter=\"eventId\" operator=\"IN\">\n          <field schema=\"basicauditsearch\" name=\"eventIds\" />\n        </predicate>\n        <predicate parameter=\"principalName\" operator=\"IN\">\n          <field schema=\"basicauditsearch\" name=\"principalNames\" />\n        </predicate>\n      </whereClause>\n      <sort column=\"id\" ascending=\"true\" />\n      <pageSize>5</pageSize>\n    </genericPageProvider>\n\n\n    <genericPageProvider name=\"DOCUMENT_HISTORY_PROVIDER\"\n      class=\"org.nuxeo.elasticsearch.audit.pageprovider.ESDocumentHistoryPageProvider\">\n      <whereClause docType=\"BasicAuditSearch\">\n        <predicate parameter=\"eventDate\" operator=\"BETWEEN\">\n          <field schema=\"basicauditsearch\" name=\"startDate\" />\n          <field schema=\"basicauditsearch\" name=\"endDate\" />\n        </predicate>\n        <predicate parameter=\"category\" operator=\"IN\">\n          <field schema=\"basicauditsearch\" name=\"eventCategories\" />\n        </predicate>\n        <predicate parameter=\"eventId\" operator=\"IN\">\n          <field schema=\"basicauditsearch\" name=\"eventIds\" />\n        </predicate>\n        <predicate parameter=\"principalName\" operator=\"IN\">\n          <field schema=\"basicauditsearch\" name=\"principalNames\" />\n        </predicate>\n      </whereClause>\n      <sort column=\"eventDate\" ascending=\"false\" />\n        <pageSize>10</pageSize>\n        <maxPageSize>1000</maxPageSize>\n    </genericPageProvider>\n\n      <genericPageProvider name=\"ADMIN_HISTORY\" class=\"org.nuxeo.elasticsearch.audit.pageprovider.ESAuditPageProvider\">\n        <property name=\"coreSession\"></property>\n        <property name=\"generateUIComments\">false</property>\n        <whereClause docType=\"BasicAuditSearch\">\n          <predicate parameter=\"eventDate\" operator=\"BETWEEN\">\n            <field schema=\"basicauditsearch\" name=\"startDate\" />\n            <field schema=\"basicauditsearch\" name=\"endDate\" />\n          </predicate>\n          <predicate parameter=\"category\" operator=\"=\">\n            <field schema=\"basicauditsearch\" name=\"eventCategory\" />\n          </predicate>\n          <predicate parameter=\"eventId\" operator=\"IN\">\n            <field schema=\"basicauditsearch\" name=\"eventIds\" />\n          </predicate>\n          <predicate parameter=\"principalName\" operator=\"=\">\n            <field schema=\"basicauditsearch\" name=\"principalName\" />\n          </predicate>\n        </whereClause>\n        <sort column=\"eventDate\" ascending=\"false\" />\n        <pageSize>10</pageSize>\n        <maxPageSize>1000</maxPageSize>\n      </genericPageProvider>\n\n  <genericPageProvider name=\"LATEST_AUDITED_CREATED_USERS_OR_GROUPS_PROVIDER\"\n    class=\"org.nuxeo.elasticsearch.audit.pageprovider.ESDocumentHistoryPageProvider\">\n     <pattern>\n{\n  \"query\": {\n    \"bool\": {\n      \"must\": [\n        {\n          \"term\": {\n            \"category\": \"userGroup\"\n          }\n        },\n        {\n          \"bool\": {\n            \"should\": [\n              {\n                \"term\": {\n                  \"eventId\": \"user_created\"\n                }\n              },\n              {\n                \"term\": {\n                  \"eventId\": \"group_created\"\n                }\n              }\n            ]\n          }\n        }\n      ]\n    }\n  }\n}\n    </pattern>\n    <sort column=\"eventDate\" ascending=\"false\" />\n    <pageSize>5</pageSize>\n    <maxPageSize>100</maxPageSize>\n  </genericPageProvider>\n\n  </extension>\n\n</component>\n",
          "xmlFileName": "/OSGI-INF/es-audit-pageprovider-contrib.xml",
          "xmlPureComponent": true
        },
        {
          "@type": "NXComponent",
          "documentationHtml": "",
          "extensionPoints": [],
          "extensions": [
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.platform.audit.service.NXAuditEventsService--backend",
              "hierarchyPath": "/grp:org.nuxeo.elasticsearch/org.nuxeo.elasticsearch.audit/org.nuxeo.elasticsearch.audit.contrib/Contributions/org.nuxeo.elasticsearch.audit.contrib--backend",
              "id": "org.nuxeo.elasticsearch.audit.contrib--backend",
              "registrationOrder": 1,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.platform.audit.service.NXAuditEventsService",
                "name": "org.nuxeo.ecm.platform.audit.service.NXAuditEventsService",
                "type": "service"
              },
              "version": "2021.54.6",
              "xml": "<extension point=\"backend\" target=\"org.nuxeo.ecm.platform.audit.service.NXAuditEventsService\">\n    <backend class=\"org.nuxeo.elasticsearch.audit.ESAuditBackend\">\n      <require>org.nuxeo.elasticsearch.ElasticSearchComponent</require>\n    </backend>\n  </extension>"
            },
            {
              "@type": "NXContribution",
              "documentationHtml": "",
              "extensionPoint": "org.nuxeo.ecm.platform.audit.service.NXAuditEventsService--storage",
              "hierarchyPath": "/grp:org.nuxeo.elasticsearch/org.nuxeo.elasticsearch.audit/org.nuxeo.elasticsearch.audit.contrib/Contributions/org.nuxeo.elasticsearch.audit.contrib--storage",
              "id": "org.nuxeo.elasticsearch.audit.contrib--storage",
              "registrationOrder": 0,
              "targetComponentName": {
                "rawName": "service:org.nuxeo.ecm.platform.audit.service.NXAuditEventsService",
                "name": "org.nuxeo.ecm.platform.audit.service.NXAuditEventsService",
                "type": "service"
              },
              "version": "2021.54.6",
              "xml": "<extension point=\"storage\" target=\"org.nuxeo.ecm.platform.audit.service.NXAuditEventsService\">\n    <storage class=\"org.nuxeo.elasticsearch.audit.ESAuditBackend\" id=\"elasticsearchAuditStorage\"/>\n  </extension>"
            }
          ],
          "hierarchyPath": "/grp:org.nuxeo.elasticsearch/org.nuxeo.elasticsearch.audit/org.nuxeo.elasticsearch.audit.contrib",
          "name": "org.nuxeo.elasticsearch.audit.contrib",
          "requirements": [
            "org.nuxeo.elasticsearch.uidgen.sequencer.contrib",
            "org.nuxeo.ecm.platform.audit.service.NXAuditEventsService"
          ],
          "resolutionOrder": 825,
          "services": [],
          "startOrder": 676,
          "version": "2021.54.6",
          "xmlFileContent": "<?xml version=\"1.0\"?>\n<component name=\"org.nuxeo.elasticsearch.audit.contrib\">\n\n  <require>org.nuxeo.ecm.platform.audit.service.NXAuditEventsService</require>\n  <require>org.nuxeo.elasticsearch.uidgen.sequencer.contrib</require>\n\n  <extension target=\"org.nuxeo.ecm.platform.audit.service.NXAuditEventsService\"\n\t     point=\"backend\">\n    <backend class=\"org.nuxeo.elasticsearch.audit.ESAuditBackend\">\n      <require>org.nuxeo.elasticsearch.ElasticSearchComponent</require>\n    </backend>\n  </extension>\n\n  <extension target=\"org.nuxeo.ecm.platform.audit.service.NXAuditEventsService\" point=\"storage\">\n    <storage id=\"elasticsearchAuditStorage\" class=\"org.nuxeo.elasticsearch.audit.ESAuditBackend\"/>\n  </extension>\n\n</component>\n",
          "xmlFileName": "/OSGI-INF/elasticsearch-audit-contrib.xml",
          "xmlPureComponent": true
        }
      ],
      "fileName": "nuxeo-elasticsearch-audit-2021.54.6.jar",
      "groupId": "org.nuxeo.elasticsearch",
      "hierarchyPath": "/grp:org.nuxeo.elasticsearch/org.nuxeo.elasticsearch.audit",
      "id": "org.nuxeo.elasticsearch.audit",
      "location": "",
      "manifest": "Manifest-Version: 1.0\r\nArchiver-Version: Plexus Archiver\r\nCreated-By: Apache Maven\r\nBuilt-By: root\r\nBuild-Jdk: 11.0.23\r\nBundle-ManifestVersion: 1\r\nBundle-Version: 1.0.0\r\nBundle-Name: Audit ElasticSearch backend\r\nBundle-SymbolicName: org.nuxeo.elasticsearch.audit;singleton:=true\r\nNuxeo-Component: OSGI-INF/elasticsearch-audit-contrib.xml,OSGI-INF/es-\r\n audit-pageprovider-contrib.xml,OSGI-INF/es-audit-search-contrib.xml\r\n\r\n",
      "maxResolutionOrder": 825,
      "minResolutionOrder": 203,
      "packages": [],
      "parentReadme": {
        "blobProviderId": "default",
        "content": "nuxeo-elasticsearch\n===================\n\n## About\n\nThis project aims at providing Nuxeo bundles to integrate\nElasticsearch with the Nuxeo Platform.\n\nThe idea is to index/query Nuxeo Documents to/from Elasticsearch.\n\n## Building\n\nTo build and run the tests, simply start the Maven build:\n\n    mvn clean install\n\n## Running tests\n\n### Using the embedded Elasticsearch\n\nWith the default `RestClient`:\n```bash\nmvn -nsu test\n# -Dnuxeo.test.elasticsearch.client=RestClient is set by default\n```\n\nOr with the `TransportClient`\n\n```bash\nmvn -nsu test -Dnuxeo.test.elasticsearch.client=TransportClient\n```\n\n### Using an external Elasticsearch\n\n1. Start an Elasticsearch using docker:\n```bash\ndocker run -p 9400:9200 -p 9600:9300 docker.elastic.co/elasticsearch/elasticsearch-oss:6.5.3\n```\n\n2.a Run the test with `RestClient`:\n```bash\nmvn -nsu test -Dnuxeo.test.elasticsearch.addressList=http://localhost:9400\n```\n\n2.b Or run the test with `TransportClient`:\n```bash\nmvn -nsu test -Dnuxeo.test.elasticsearch.client=TransportClient -Dnuxeo.test.elasticsearch.clusterName=docker-cluster -Dnuxeo.test.elasticsearch.addressList=localhost:9600\n```\n\n## Links\n\n- Administration: http://doc.nuxeo.com/x/UBY5AQ\n- Configuring mapping: http://doc.nuxeo.com/x/WxI5AQ\n- Overview: http://doc.nuxeo.com/x/iYElAQ\n- [Open jira tikets](https://jira.nuxeo.com/issues/?jql=project%20%3D%20NXP%20AND%20component%20%3D%20Elasticsearch%20AND%20Status%20!%3D%20%22Resolved%22%20ORDER%20BY%20updated%20DESC%2C%20priority%20DESC%2C%20created%20ASC)\n",
        "digest": "39fe49f5b0c4b24c62cb008ba470a7c5",
        "encoding": "UTF-8",
        "length": 1513,
        "mimeType": "text/plain",
        "name": "README.md"
      },
      "readme": {
        "blobProviderId": "default",
        "content": "nuxeo-elasticsearch-audit\n=========================\n\n## About\n\nThis project provides a backend based on Elasticsearch for Nuxeo for Audit Service.\n\nThe idea is to use Lucene / Elastocsearch as storage backend for the Audit trail entries.\n\nUsage of Elasticsearch as a replacement for the JPA based default backend allows to easily make the Audit service scale :\n\n - when there are a lot of entries\n     - lot of access\n     - custom logging\n - when there are a lot of queries\n     - reporting\n     - usage of sync systems like Nuxeo Drive\n - when custom attributes on Audit entries are used\n\n## How it works\n\nAn Elasticsearch  based `AuditBackend` is contributed at startup to replace the default JPA based one and it use dedicated `audit` Elasticsearch index to handle storage and queries.\n\nThe queries and PageProviders are based on Elasticsearch native DSL : no automatic conversion is done between EJBQL and Elasticsearch DSL.\n\nThe orginal Audit service uses a JPA sequence to assign each audit entry a unique id.\n\nIn the Elasticsearch implementation, an alternate sequence genaration system is used : `nuxeo-elasticsearch-seqgen`.\n\n## Data Migration\n\nWhen `nuxeo-elasticsearch-audit` is deployed it will automatically replace the default JPA implementation.\n\nHowever, if you have previous data inside JPA you have to migrate it.\n\nThe migration is done in a Worker that will simply go through all existing JPA Audit entries to store them inside the Elasticsearch index.\n\nThe migration is done using a configurable batch size (default is 1000 entries).\n\nAn Automation Operation is provided to trigger the migration Work.\n\nSample call using curl :\n\n    curl -H 'Content-Type:application/json' -X POST -d '{\"params\":{\"batchSize\":5000}}' -u Administrator:Administrator http://127.0.0.1:8080/nuxeo/api/v1/automation/Audit.StartMigration\n\n\nNB : Migration of 16 Millions entries on a C3.XLarge AWS instance with default PGSQL setup and default embedded Elasticsearch takes about 3h (1500 entries/s).\n\n## Building\n\nTo build and run the tests, simply start the Maven build:\n\n    mvn clean install\n",
        "digest": "c512c512c532dcc09afe8a33d888ea10",
        "encoding": "UTF-8",
        "length": 2091,
        "mimeType": "text/plain",
        "name": "README.md"
      },
      "requirements": [],
      "version": "2021.54.6"
    }
  ],
  "creationDate": 1716281073860,
  "key": "Nuxeo Platform-2021.54",
  "name": "Nuxeo Platform",
  "operations": [],
  "packages": [],
  "pluginSnapshots": {},
  "releaseDate": 1716281073860,
  "version": "2021.54"
}