You might often want to provision a Nuxeo server with an existing set of data. For instance, you might want the same set of data between several environments or maybe you just want to import the data set while setting up your server. Today, I will explain how we can build a data set for import using our plugin nuxeo-showcase-content-importer, just like we handle it in Nuxeo Showcase Content containing a bunch of basic Nuxeo Documents or in Nuxeo Getting Started.

Create your Data

The first thing we have to do is import data in a running Nuxeo server. To do that, you can use the import button in the JSF UI, or the + button in Web UI. If you need something more, in case you have a lot of documents, the REST API or any other importers should do the trick but it will require a little more work.

Optimize your Export

Now, your Nuxeo server contains all the documents/files you imported in the previous step. It has a lot of documents and you would like to export them. But before you use our export zip, I would like to warn you that the showcase-content-importer re-triggers all the generated stuff, which will prevent you from exporting a huge zip containing all picture views, video encodings, etc.

So, let's remove all those generated documents before exporting and ensure that all trashed documents have been cleared because we do not want them to be a part of the export. The easiest way to reduce useless documents is to stop your server, then execute the following SQL query in your database.

delete from hierarchy where primarytype  = 'view' or primarytype = 'storyboarditem' or primarytype = 'transcodedVideoItem';

Now, you can restart your server, go to your root document, and use the Zip Export action under the export menu using the Web UI or the JSF UI.

Bundle the Data

Now that we have exported our zip file without any useless technical document, we are going to package the zip in a Nuxeo Package to deploy it everywhere.

Prepare the Package

To prepare the package, we will use the Nuxeo Generator. It helps bootstrapping an empty Nuxeo Package in one command.

$ yo nuxeo --type="ressources" single-module package

   create Generating Multi module (Your project parent POM)
     info   Parameters: Use a parent artifact, Parent group, Parent artifact, Parent version, Import nuxeo in the `dependency management`, Nuxeo version, Project group, Project artifact, Project version, Project description
? Use a parent artifact (for instance your company's BOM or the org.nuxeo.ecm.distribution:nuxeo-distribution POM)? Yes
? Parent Group id: org.nuxeo.ecm.distribution
? Parent Artifact id: nuxeo-distribution
? Parent Version: 8.10
? Project Group id: org.nuxeo.provisioning
? Project Artifact id: easy-provisioning-parent
? Project Version: 1.0-SNAPSHOT
? Project Description:

   create Generate Module: easy-provisioning-ressources

   create Generating Single module
     info   Parameters: Nuxeo version, Project group, Project artifact, Project version, Project description
? Project Group id: org.nuxeo.provisioning
? Project Artifact id: easy-provisioning-ressources
? Project version: 1.0-SNAPSHOT
? Project description:

   create Generate Module: easy-provisioning-package

   create Generating Package
     info   Parameters: Package artifact, Package version, Package name, Company name
? Package Artifact id: easy-provisioning-package
? Package Version: 1.0-SNAPSHOT
? Package name: easy-provisioning
? Company name:

Your folder should look like:

$ tree -d
.
├── easy-provisioning-package
│   └── src
│       └── main
│           ├── assemble
│           └── resources
│               └── install
│                   └── templates
│                       └── easy-provisioning
└── easy-provisioning-ressources
    └── src
        ├── main
        │   ├── java
        │   │   └── org
        │   │       └── nuxeo
        │   │           └── provisioning
        │   └── resources
        │       ├── META-INF
        │       └── OSGI-INF
        └── test
            ├── java
            │   └── org
            │       └── nuxeo
            │           └── provisioning
            └── resources

Add Dependency to the nuxeo-showcase-content-importer plugin

Our Nuxeo Package is ready to be deployed but we have to depend on nuxeo-showcase-content-importer to let it import your exported zip.

We have to ensure that the assembly.xml file will copy the expected bundles during the build process. To do that, simply add a direct dependency to org.nuxeo.ecm.platform:nuxeo-showcase-content-importer in the easy-provisioning-package/pom.xml file:

<dependencies>
  <!-- Additional bundles to be deployed by the MP -->
  ..
  <dependency>
    <groupId>org.nuxeo.ecm.platform</groupId>
    <artifactId>nuxeo-showcase-content-importer</artifactId>
  </dependency>
</dependencies>

Add the Exported File

We just finished preparing a Nuxeo Package using the generator. It contains everything we need except our exported zip file. Copy it to the easy-provisioning-ressources/src/main/resources folder named easy-provisioning.zip. Add a contribution to declare it (easy-provisioning-ressources/src/main/resources/OSGI-INF/):

<?xml version="1.0" encoding="UTF-8" ?>
<component name="org.nuxeo.provisioning">
  <extension target="org.nuxeo.ecm.showcase.content" point="contents">
    <content name="easy-provisioning">
      <!-- Use the name of your zip file -->
      <filename>easy-provisioning.zip</filename>
    </content>
  </extension>
</component>

Next, add this contribution to easy-provisioning-ressources/src/main/resources/META-INF/MANIFEST.MF file:

Nuxeo-Component: OSGI-INF/showcasecontent-resources-contrib.xml

Deploy your Package

Now you just have to build your package and install it:

$ mvn install
$ cd $NUXEO_HOME
$ ./bin/nuxeoctl mp-install easy-provisioning-package/target/easy-provisioning-package-1.0-SNAPSHOT.zip

That’s all. Your content is imported only once, and all converters are going to work hard to recreate all picture views, videos storyboards and encoded videos!