Programmatically generating a JcrPackage.
Initially, we need to obtain the session object which is required for creating a JcrPackage.
Note: I'm leveraging the sub-service serviceUserName, which already incorporates a system user configuration.
Map<String, Object> serviceUser = new HashMap<>();
serviceUser.put(ResourceResolverFactory.SUBSERVICE, "serviceUserName");
ResourceResolver resourceResolver = resolverFactory.getServiceResourceResolver(serviceUser);
Session session? = resourceResolver.adaptTo(Session.class);
Instantiate a JcrPackageManager.
JcrPackageManager jpm = PackagingService.getPackageManager(session);
Using the JcrPackageManager object reference, create a JcrPackage, and then instantiate a JcrPackageDefinition using the JcrPackage reference.
The JcrPackageDefinition is utilized to define filters.
Eg: jpm.create("text-packages", "create-dynamic-package", "0.0.1");
JcrPackage pack = jpm.create("package-group-name", "package-name", "package-version");
JcrPackageDefinition definition = pack.getDefinition();
Using below code it adds the filters to the JcrPackage.
Note: We need to create PathFilterSet object reference for each filter.
领英推荐
DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
PathFilterSet pathFilterSet = new PathFilterSet();
pathFilterSet.setRoot("/content/we-retail/us/en/home");
filter.add(pathFilterSet);
Once all filters are added we need to set those to the definition
definition.setFilter(filter, true);
Need to create ProgresstrackeListener reference which will be used for building the jcrPackage
ProgressTrackerListener listener = new DefaultProgressListener();
assemble method will build the JcrPackage with all the filters added to it.
jpm.assemble(pack,listener);
Interface Class:
package com.core.service
public interface JcrPackageCreation {
public String createJcrPackage();
}
Implementation Class:
package com.core.impl
import java.util.HashMap;
import java.util.Map;
import javax.jcr.Session;
import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
import org.apache.jackrabbit.vault.fs.api.ProgressTrackerListener;
import org.apache.jackrabbit.vault.fs.config.DefaultWorkspaceFilter;
import org.apache.jackrabbit.vault.packaging.JcrPackage;
import org.apache.jackrabbit.vault.packaging.JcrPackageDefinition;
import org.apache.jackrabbit.vault.packaging.JcrPackageManager;
import org.apache.jackrabbit.vault.packaging.PackagingService;
import org.apache.jackrabbit.vault.util.DefaultProgressListener;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import com.test.core.service.JcrPackageCreation;
@Component(service = JcrPackageCreation.class)
public class BaseJcrPackageCreation implements JcrPackageCreation {
@Reference
private ResourceResolverFactory resolverFactory;
@Override
public String createJcrPackage() {
ResourceResolver resourceResolver = null;
Session session = null;
JcrPackage pack = null;
try {
Map<String, Object> param = new HashMap<>();
param.put(ResourceResolverFactory.SUBSERVICE, "testService");
resourceResolver = resolverFactory.getServiceResourceResolver(param);
session? = resourceResolver.adaptTo(Session.class);
JcrPackageManager jpm = PackagingService.getPackageManager(session);
pack = jpm.create("test-packages", "test-dynamic-package", "0.0.1");
JcrPackageDefinition definition = pack.getDefinition();
DefaultWorkspaceFilter filter = new DefaultWorkspaceFilter();
PathFilterSet pathFilterSet = new PathFilterSet();
pathFilterSet.setRoot("/content/test/us/en/home/devspace");
filter.add(pathFilterSet);
boolean autoSave = true;
if(definition != null)
definition.setFilter(filter, autoSave);
ProgressTrackerListener listener = new DefaultProgressListener();
jpm.assemble(pack,listener); ? ??
} catch (Exception e)
{
// Exception Logger
} finally
{
if(pack!= null)
pack.close();
if(session != null)
session.logout();
}
return "Jcrpackage Created Successfully!";
}
}