Created
October 15, 2019 08:50
-
-
Save dfparker2002/fb48f9f462299ea1e1fa7c4e41392eb1 to your computer and use it in GitHub Desktop.
Sample rendition metadata Workflow Process
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// src: https://github.com/wcm-io/wcm-io-handler/blob/cd2d552447ca4e60eb7a51bba6dc6406fa402a9f/media/src/main/java/io/wcm/handler/mediasource/dam/impl/metadata/RenditionMetadataWorkflowProcess.java | |
import static com.day.cq.dam.api.DamConstants.NT_DAM_ASSET; | |
import java.util.List; | |
import java.util.concurrent.locks.Lock; | |
import org.apache.sling.api.resource.Resource; | |
import org.apache.sling.api.resource.ResourceResolver; | |
import org.jetbrains.annotations.NotNull; | |
import org.osgi.service.component.annotations.Component; | |
import org.osgi.service.component.annotations.Reference; | |
import org.slf4j.Logger; | |
import org.slf4j.LoggerFactory; | |
import com.adobe.granite.workflow.WorkflowSession; | |
import com.adobe.granite.workflow.collection.ResourceCollectionManager; | |
import com.adobe.granite.workflow.exec.WorkItem; | |
import com.adobe.granite.workflow.exec.WorkflowProcess; | |
import com.adobe.granite.workflow.metadata.MetaDataMap; | |
import com.day.cq.dam.api.Asset; | |
import com.day.cq.dam.commons.util.DamUtil; | |
import io.wcm.sling.commons.adapter.AdaptTo; | |
/** | |
* Workflow process that generated rendition metadata required for the media handler processing. | |
* Can also process workflow packages. | |
*/ | |
@Component( | |
service = WorkflowProcess.class, | |
property = { | |
"process.label=wcm.io Media Handler: Rendition Metadata" | |
}) | |
public final class RenditionMetadataWorkflowProcess implements WorkflowProcess { | |
private static final Logger log = LoggerFactory.getLogger(RenditionMetadataWorkflowProcess.class); | |
@Reference | |
private ResourceCollectionManager resourceCollectionManager; | |
@Reference | |
private AssetSynchonizationService assetSynchronizationService; | |
@Override | |
public void execute(WorkItem item, WorkflowSession workflowSession, MetaDataMap args) { | |
String payloadPath = WorkflowProcessUtil.getPayloadResourcePath(item); | |
if (payloadPath == null) { | |
log.warn("Invalid payload: " + item.getWorkflowData().getPayloadType()); | |
return; | |
} | |
// collect asset(s) from payload | |
ResourceResolver resourceResolver = AdaptTo.notNull(workflowSession, ResourceResolver.class); | |
List<String> assetPaths = WorkflowProcessUtil.getPayloadResourcePaths(payloadPath, | |
NT_DAM_ASSET, resourceResolver, resourceCollectionManager); | |
if (assetPaths.isEmpty()) { | |
log.info("Did not found any asset reference in workflow payload: {}", payloadPath); | |
} | |
else { | |
log.info("Start processing {} asset references from workflow payload {} ...", assetPaths.size(), payloadPath); | |
log.debug("All asset references: {}", assetPaths); | |
} | |
// process all assets | |
for (String assetPath : assetPaths) { | |
process(assetPath, resourceResolver); | |
} | |
log.info("Finished processing {} asset references from workflow payload {}.", assetPaths.size(), payloadPath); | |
} | |
/** | |
* Process a single asset path. | |
* @param assetOrRenditionPath Path to asset or a rendition of it | |
* @param resourceResolver Resource resolver from workflow | |
*/ | |
private void process(@NotNull String assetOrRenditionPath, @NotNull ResourceResolver resourceResolver) { | |
// make sure asset exists | |
Asset asset = getAsset(assetOrRenditionPath, resourceResolver); | |
if (asset == null) { | |
log.debug("Unable to read asset at {} with user {}", assetOrRenditionPath, resourceResolver.getUserID()); | |
return; | |
} | |
// process event synchronized per asset path | |
Lock lock = assetSynchronizationService.getLock(asset.getPath()); | |
lock.lock(); | |
try { | |
// refresh resource resolver to reflect changes on metadata probably made by listener service | |
resourceResolver.refresh(); | |
// process asset renditions | |
RenditionMetadataGenerator generator = new RenditionMetadataGenerator(resourceResolver); | |
generator.processAllRenditions(asset); | |
} | |
finally { | |
lock.unlock(); | |
} | |
} | |
/** | |
* Get asset instance for given asset path. | |
* @param assetOrRenditionPath Path to asset or a rendition of it | |
* @return Asset or null if path is invalid | |
*/ | |
private Asset getAsset(String assetOrRenditionPath, ResourceResolver resolver) { | |
Resource resource = resolver.getResource(assetOrRenditionPath); | |
if (resource != null) { | |
return DamUtil.resolveToAsset(resource); | |
} | |
else { | |
return null; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment