As automatic marshalling is not implemented into Automation server and client, only Document(s) and Blob(s) can be manipulated. Therefore, the way to return a custom type is to encapsulate the value in a Blob.
Below is an example, based on the results returned by the method QueryAndFetch
.
Operation code
package org.nuxeo.support; import java.io.ByteArrayInputStream; import java.io.Serializable; import java.util.Iterator; import java.util.Map; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.nuxeo.ecm.automation.core.Constants; import org.nuxeo.ecm.automation.core.annotations.Context; import org.nuxeo.ecm.automation.core.annotations.Operation; import org.nuxeo.ecm.automation.core.annotations.OperationMethod; import org.nuxeo.ecm.automation.core.annotations.Param; import org.nuxeo.ecm.core.api.Blob; import org.nuxeo.ecm.core.api.CoreSession; import org.nuxeo.ecm.core.api.IterableQueryResult; import org.nuxeo.ecm.core.api.impl.blob.InputStreamBlob; import org.nuxeo.ecm.core.query.sql.NXQL; @Operation(id = QueryAndFetch.ID, category = Constants.CAT_FETCH, label = "QueryAndFetch", description = "Sample to show how to return a blob for any result type.") public class QueryAndFetch { public static final String ID = "Test.QueryAndFetch"; @Context protected CoreSession session; @Param(name = "query") protected String query; protected String lang = NXQL.NXQL; @OperationMethod public Blob run() throws Exception { IterableQueryResult result = session.queryAndFetch(query, lang); Iterator<Map<String, Serializable>> it = result.iterator(); JSONArray array = new JSONArray(); while (it.hasNext()) { Map<String, Serializable> item = it.next(); JSONObject object = new JSONObject(); object.accumulateAll(item); array.add(object); } return new InputStreamBlob(new ByteArrayInputStream( array.toString().getBytes("UTF-8")), "application/json"); } }
Registering this operation
<?xml version="1.0"?> <component name="org.nuxeo.support.operations"> <extension target="org.nuxeo.ecm.core.operation.OperationServiceComponent" point="operations"> <operation class="org.nuxeo.support.QueryAndFetch" /> </extension> </component>
Sample code to use the result from the operation
HttpAutomationClient client = new HttpAutomationClient("http://localhost:8080/nuxeo/site/automation"); Session session = client.getSession(ADMINISTRATOR, ADMINISTRATOR); Blob response = (Blob) session.newRequest(QueryAndFetch.ID).set("query", "select ecm:uuid, dc:title, common:icon from Document").execute(); String json = FileUtils.read(response.getStream()); JSONArray array = JSONArray.fromObject(json); System.out.println("Objects received : " + array.size());