blob: 6239692355720d0c365366bf6a66d6d1c9cc6ab6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sling.cms.core.publication;
import java.util.Collections;
import java.util.stream.Stream;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.cms.ConfigurableJobExecutor;
import org.apache.sling.cms.PublishableResource;
import org.apache.sling.cms.ResourceTree;
import org.apache.sling.cms.publication.IsPublishableResourceContainer;
import org.apache.sling.cms.publication.IsPublishableResourceType;
import org.apache.sling.cms.publication.PublicationException;
import org.apache.sling.cms.publication.PublicationManager;
import org.apache.sling.cms.publication.PublicationManagerFactory;
import org.apache.sling.cms.publication.PublicationType;
import org.apache.sling.event.jobs.Job;
import org.apache.sling.event.jobs.consumer.JobConsumer;
import org.apache.sling.event.jobs.consumer.JobExecutionContext;
import org.apache.sling.event.jobs.consumer.JobExecutionResult;
import org.apache.sling.event.jobs.consumer.JobExecutor;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A Sling Post Operation to unpublish content
*/
@Component(service = { JobExecutor.class, ConfigurableJobExecutor.class }, property = {
JobConsumer.PROPERTY_TOPICS + "=" + BulkPublicationJob.TOPIC })
public class BulkPublicationJob extends ConfigurableJobExecutor {
private static final Logger log = LoggerFactory.getLogger(BulkPublicationJob.class);
public static final String TOPIC = "cmsjob/org/apache/sling/cms/publication/Bulk";
@Reference
private PublicationManagerFactory publicationManagerFactory;
@Reference
private ResourceResolverFactory factory;
@Override
public JobExecutionResult doProcess(Job job, JobExecutionContext context, ResourceResolver resolver) {
String[] paths = job.getProperty("paths", String[].class);
PublicationType type = PublicationType.valueOf(job.getProperty("type", String.class));
boolean deep = job.getProperty("deep", false);
PublicationManager publicationManager = publicationManagerFactory.getPublicationManager();
context.initProgress(paths.length, paths.length * 5000L);
log.info("Starting bulk publication: paths={}, type={}, deep={}", paths, type, deep);
for (String path : paths) {
Stream<PublishableResource> toPublish = null;
Resource resource = resolver.getResource(path);
if (deep) {
toPublish = ResourceTree
.stream(resource, new IsPublishableResourceContainer(), new IsPublishableResourceType())
.map(rt -> rt.getResource().adaptTo(PublishableResource.class));
} else {
toPublish = Collections.singletonList(resource.adaptTo(PublishableResource.class)).stream();
}
toPublish.forEach(pr -> {
try {
if (type == PublicationType.ADD) {
publicationManager.publish(pr);
} else {
publicationManager.unpublish(pr);
}
context.log("{0} complete for {1}", type, pr.getPath());
} catch (PublicationException e) {
context.log("{0} failed for {1}", type, pr.getPath());
log.warn("Failed to publish {}", pr, e);
}
});
context.log("Publication complete for path: {0}", path);
context.incrementProgressCount(1);
}
context.log("Publication complete!");
return context.result().succeeded();
}
@Override
public String getConfigurationPath() {
return "/mnt/overlay/sling-cms/content/publication/bulk";
}
@Override
public ResourceResolverFactory getResolverFactory() {
return factory;
}
@Override
public String getTitleKey() {
return "slingcms.bulkpublication.title";
}
@Override
public String getTopic() {
return TOPIC;
}
}