Hi,
I have created custom workflow, which is generating additional renditions for assets after they are created/modified. Problem is that (after workflow finish) value of property dam:assetState remains "processing". Workflow is not transient. Assets are fully modifiable and I can use them normally.
I guess that probably I've forget about adding some step in workflow model, or whatever.
AEM version 6.2.0.SP1.
Please advise.
Thanks,
Arek
Solved! Go to Solution.
dam:assetState is being set to processed in the DAM Update Asset Workflow Completed Step. Please check if you have that step in the dam update asset workflow.
Are you using the AssetManager API in a custom step to create the renditions?
Views
Replies
Total Likes
Hi,
To create renditions I'm using com.day.image.Layer and its methods: resize() and crop(). After that, using InputStream from the layer I'm adding new rendition using com.day.cq.dam.api.Asset.addRenditionMethod().
Views
Replies
Total Likes
You are using this API in a custom workflow step - correct?
Views
Replies
Total Likes
Correct.
I've created custom workflow step as implementation of com.adobe.granite.workflow.exec.WorkflowProcess. In this custom step I'm using classes I've described in the previous comment.
Views
Replies
Total Likes
The only thing i can do is try to reduplicate your findings. I will write a custom workflow step that uses the AssetManager API to see if i get the same results. I will post back my findings.
Views
Replies
Total Likes
I built a custom workflow step and injected that into a workflow model. In the custom workflow - i used the AssetManager API to work with an asset and place it in an AEM DAM location.
Here is the node props.
There is no issue when you code with the AssetManager API.
Views
Replies
Total Likes
Okay, I see. Maybe you could help me with pointing which process is responsible for changing property state from "processing" to "processed"?
Views
Replies
Total Likes
There is not a specific workflow that places an asset in this state. The point is when you write a custom workflow step that modifies an asset - use the Asset Manager API. When it creates the asset and the workflow completes, the asset will automatically be put in this state - as shown in my illustration.
For example, if you had this custom workflow step in a workflow - the asset would be in the processed state.
@Component
@Service
@Properties({
@Property(name = Constants.SERVICE_DESCRIPTION, value = "Test Email workflow process implementation."),
@Property(name = Constants.SERVICE_VENDOR, value = "Adobe"),
@Property(name = "process.label", value = "Test Email Workflow Process") })
public class CustomStep implements WorkflowProcess
{
/** Default log. */
protected final Logger log = LoggerFactory.getLogger(this.getClass());
//Inject a MessageGatewayService
//Inject a Sling ResourceResolverFactory
@Reference
private ResourceResolverFactory resolverFactory;
public void execute(WorkItem item, WorkflowSession wfsession,MetaDataMap args) throws WorkflowException {
try
{
log.info("**** Here in execute method"); //ensure that the execute method is invoked
//Get the Assets from the file system for a test
File file = new File("C:\\Users\\scottm\\Mal10.JPG");
InputStream fis = null;
fis = new FileInputStream(file);
String name = writeToDam(fis, "Malcolm.jpg") ;
log.info("**** Name of the new Assets is "+name);
}
catch (Exception e)
{
e.printStackTrace() ;
}
}
//Save the uploaded file into the AEM DAM using AssetManager API
private String writeToDam(InputStream is, String fileName)
{
try
{
//Inject a ResourceResolver
ResourceResolver resourceResolver = resolverFactory.getAdministrativeResourceResolver(null);
//Use AssetManager to place the file into the AEM DAM
com.day.cq.dam.api.AssetManager assetMgr = resourceResolver.adaptTo(com.day.cq.dam.api.AssetManager.class);
String newFile = "/content/dam/summit-toys/"+fileName ;
assetMgr.createAsset(newFile, is,"image/jpeg", true);
// Return the path to the file was stored
return newFile;
}
catch(Exception e)
{
e.printStackTrace();
}
return null;
}
}
If you are not getting this result in a custom workflow - you are doing something wrong.
But AssetManager enables to create new Asset. In my case, I already have the asset and I'm just creating a few new renditions for the asset. Please take a look at the code below.
private static final String CONTENT_PATH = "/" + JcrConstants.JCR_CONTENT;
private static final String DAM_THUMBNAIL_FORMAT = "cq5dam.thumbnail.%s.%s.png";
public void execute(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap metaDataMap)
throws WorkflowException {
org.apache.sling.api.resource.Resource imgResource = getResourceFromPayload(workItem, workflowSession);
com.day.cq.dam.api.Asset asset = imgResource.adaptTo(Asset.class);
String mimeType = asset.getMimeType();
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
com.day.image.Layer layer = new Layer(asset.getOriginal().getStream());
int width = layer.getWidth();
int height = layer.getHeight();
int resizedWidth = width / 2;
int resizedHeight = height / 2;
layer.resize(resizedWidth, resizedHeight);
layer.write(mimeType, 1, outputStream);
try (ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray())) {
String renditionName = String.format(DAM_THUMBNAIL_FORMAT, 1, 1);
asset.addRendition(renditionName, inputStream, mimeType);
}
} catch (IOException e) {
LOG.error("IOException while creating custom rendition for an image", e);
}
}
Do you have any bits of advice for me?
Thanks
Views
Replies
Total Likes
Hi Scott
We are also facing the similar issue. Could you let us know what could be done about it.
Below is our code which we are using to write the custom renditions when the asset gets uploaded.
protected void writeRenditionToRepository(AssetHandler assetHandler, double originalHeight, double originalWidth,
double res, Rendition original, String renditionName, Session session, Asset asset, String mimeType,
String extension) throws IOException, RepositoryException {
Dimension dim = new Dimension((int) Math.round(originalWidth * res), (int) Math.round(originalHeight * res));
BufferedImage image = assetHandler.getImage(original, dim);
log.debug("Rasterized to an image with dim {}x{}", image.getWidth(), image.getHeight());
ByteArrayOutputStream out = new ByteArrayOutputStream();
boolean w = ImageIO.write(image, extension, out);
if (w) {
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
asset.setBatchMode(true);
asset.addRendition(renditionName, in, mimeType);
session.save();
in.close();
}
out.close();
}
Views
Replies
Total Likes
dam:assetState is being set to processed in the DAM Update Asset Workflow Completed Step. Please check if you have that step in the dam update asset workflow.
Thanks.
This seemed to have resolved it.
We had the previous version of the dam update asset model checked in which might have got deployed post the upgrade of our 6.2 instance overriding the updated model & causing this bizarre behavior.
Views
Replies
Total Likes
Views
Likes
Replies
Views
Likes
Replies