Expand my Community achievements bar.

Learn about Edge Delivery Services in upcoming GEM session
SOLVED

Build package programmatically

Avatar

Level 4

Hello,

I am able to assemble a package using the JcrPackageManager assemble method, however in the package manager I get the package definition and the filters, but the package itself needs to be built. I am sure there should be a way, since it is possible via the HTTP interface using curl.

Thanks.

1 Accepted Solution

Avatar

Correct answer by
Level 4

Found the issue, I was calling:

assemble(JcrPackageDefinition definition, ProgressTrackerListener listener, java.io.OutputStream out)

But that writes the file to the output stream requiring therefore an additional build step. The solution was to invoke:

assemble(JcrPackage pack, ProgressTrackerListener listener)

Thanks all for your time.

View solution in original post

13 Replies

Avatar

Level 4

Exactly, I forgot to mention that I did check documentation but I didn't found a method there, still, there should be a such API functionality that builds packages.

Avatar

Level 10

I will double check with the team tomorrow - however - i believe they did mention in past you still needed to manually build.

Avatar

Community Advisor

Here is what you need to do:

  • Get  com.day.jcr.vault.packaging.Packaging reference injection in your service.
    • Packaging API will get you access to JCRPackageManager i.e. - packaging.getPackageManager(session);
  • Now using PackageManager you can set conflict resolution policy, package name, group, version and package filters.

Below is the sample code:

final JcrPackageManager jcrPackageManager = packaging.getPackageManager(session); if (ConflictResolution.Replace.equals(conflictResolution)) { this.removePackage(jcrPackageManager, groupName, name, version); } else if (ConflictResolution.IncrementVersion.equals(conflictResolution)) { version = this.getNextVersion(jcrPackageManager, groupName, name, version).toString(); } final JcrPackage jcrPackage = jcrPackageManager.create(groupName, name, version); final JcrPackageDefinition jcrPackageDefinition = jcrPackage.getDefinition(); final DefaultWorkspaceFilter workspaceFilter = new DefaultWorkspaceFilter(); for (final PathFilterSet pathFilterSet : pathFilterSets) { workspaceFilter.add(pathFilterSet); } jcrPackageDefinition.setFilter(workspaceFilter, true); for (final Map.Entry<String, String> entry : packageDefinitionProperties.entrySet()) { jcrPackageDefinition.set(entry.getKey(), entry.getValue(), false); } session.save(); ProgressTrackerListener listener = new DefaultProgressListener(); try { jcrPackageManager.assemble(jcrPackage,listener); } catch (PackageException e) { e.printStackTrace(); }

 

jcrPackageManager.assemble(jcrPackage,listener);  is the method that build the package based on filter paths. You can also have a listener that will listen to package creation events and do further processing once package is created/built.

You will deal with following APIs when going the programmatic route for package creation.

com.day.cq.commons.jcr.JcrUtil com.day.jcr.vault.fs.api.PathFilterSet com.day.jcr.vault.fs.api.ProgressTrackerListener com.day.jcr.vault.fs.config.DefaultWorkspaceFilter com.day.jcr.vault.fs.io.ImportOptions com.day.jcr.vault.packaging.JcrPackage com.day.jcr.vault.packaging.JcrPackageDefinition com.day.jcr.vault.packaging.JcrPackageManager com.day.jcr.vault.packaging.PackageException com.day.jcr.vault.packaging.PackageId com.day.jcr.vault.packaging.Packaging com.day.jcr.vault.packaging.Version com.day.jcr.vault.util.DefaultProgressListener

 

Hope this helps.

- Runal

Avatar

Level 4

ronnyfm wrote...

Hello,

I am able to assemble a package using the JcrPackageManager assemble method, however in the package manager I get the package definition and the filters, but the package itself needs to be built. I am sure there should be a way, since it is possible via the HTTP interface using curl.

Thanks.

 

Hi,

 

Refer below url-

http://aemtips.blogspot.co.nz/2013/05/some-of-common-curl-commands-to-work.html

Regards

Ankur

Avatar

Level 4

Thanks, that is what I said, I am invoking assemble, but the package needs to be build either manually or via curl. I get the same result that appears for example in this image  found in this article: https://helpx.adobe.com/experience-manager/using/dynamic_aem_packages.html

Package definition is OK, but still needs to be built. I want to know how to code that, not via curl, in order to have the package ready to download.

Avatar

Level 4

Thank you, I know how to do it with curl, but I want to know how to do it with the Packaging API.

Avatar

Administrator

See this :- https://gist.github.com/mak18ah/b695beef449e0f29c802  (Not tested)

// package manager example

You may also use Java API to manage packages. Start with this OSGi service: com.day.jcr.vault.packaging.Packaging.

~kautuk



Kautuk Sahni

Avatar

Level 2

HI Kautuk,

The link that you provided does not work anymore. 

By any chance could you point me to the updated document?

Thanks in advance.

Regards,

Prateek

Avatar

Correct answer by
Level 4

Found the issue, I was calling:

assemble(JcrPackageDefinition definition, ProgressTrackerListener listener, java.io.OutputStream out)

But that writes the file to the output stream requiring therefore an additional build step. The solution was to invoke:

assemble(JcrPackage pack, ProgressTrackerListener listener)

Thanks all for your time.

Avatar

Level 1

Hello,

JcrPackageManager.create will creates the package. You need to pass packagegroupname and packagename  as the parameters for create method.
Hope this helps.

Regards,

Mahi