class RAWvernaActivity extends AbstractAsynchronousActivity<RAWvernaActivityConfigurationBean> implements
    AsynchronousActivity<RAWvernaActivityConfigurationBean> {

    @SuppressWarnings("unchecked")
    @Override
    public void executeAsynch(final Map<String, T2Reference> inputs, final AsynchronousActivityCallback callback) {
        // Don't execute service directly now, request to be run ask to be run
        // from thread pool and return asynchronously
        callback.requestRun(new Runnable() {

            public void run() {
                InvocationContext context = callback.getContext();
                ReferenceService referenceService = context.getReferenceService();
                // Resolve inputs
                String firstInput = (String) referenceService.renderIdentifier(inputs.get(IN_FIRST_INPUT),
                    String.class, context);

                // Support our configuration-dependendent input
                boolean optionalPorts = configBean.getExampleString().equals("specialCase");

                List<byte[]> special = null;
                // We'll also allow IN_EXTRA_DATA to be optionally not provided
                if (optionalPorts && inputs.containsKey(IN_EXTRA_DATA)) {
                    // Resolve as a list of byte[]
                    special = (List<byte[]>) referenceService.renderIdentifier(inputs.get(IN_EXTRA_DATA), byte[].class,
                        context);
                }

                // TODO: Do the actual service invocation
                // try {
                // results = this.service.invoke(firstInput, special)
                // } catch (ServiceException ex) {
                // callback.fail("Could not invoke RAWverna service " +
                // configBean.getExampleUri(),
                // ex);
                // // Make sure we don't call callback.receiveResult later
                // return;
                // }

                // Register outputs
                Map<String, T2Reference> outputs = new HashMap<String, T2Reference>();
                String simpleValue = "simple";
                T2Reference simpleRef = referenceService.register(simpleValue, 0, true, context);
                outputs.put(OUT_SIMPLE_OUTPUT, simpleRef);

                // For list outputs, only need to register the top level list
                List<String> moreValues = new ArrayList<String>();
                moreValues.add("Value 1");
                moreValues.add("Value 2");
                T2Reference moreRef = referenceService.register(moreValues, 1, true, context);
                outputs.put(OUT_MORE_OUTPUTS, moreRef);

                if (optionalPorts) {
                    // Populate our optional output port
                    // NOTE: Need to return output values for all defined output
                    // ports
                    String report = "Everything OK";
                    outputs.put(OUT_REPORT, referenceService.register(report, 0, true, context));
                }

                // return map of output data, with empty index array as this is
                // the only and final result (this index parameter is used if
                // pipelining output)
                callback.receiveResult(outputs, new int[0]);
            }
        });
    }

}