class OperationInformation {

	public DataValue create_execution_request(long exec_id, String dst_id,
			String obj_id, DataValue op_v, Map<String,
			DataValue> input_arguments) {
		Ensure.not_null(dst_id, "dst_id == null");
		Ensure.not_null(obj_id, "obj_id == null");
		Ensure.is_true(is_operation(op_v), "op_v is not an operation");
		Ensure.not_null(input_arguments, "input_arguments == null");
		
		Set<String> all_params = parameters(op_v);
		Set<String> params = new HashSet<>();
		for (String p : all_params) {
			if (parameter_direction(op_v, p) == ParameterDirection.INPUT) {
				params.add(p);
			}
		}
		
		Ensure.equals(params.size(), input_arguments.size());
		
		MapDataValue mdv = MapDataType.map_of(m_pscope.string(),
				m_pscope.any(), m_pscope).make();
		for (String p : params) {
			DataValue v = input_arguments.get(p);
			Ensure.not_null(v);
			Ensure.is_true(parameter_type(op_v, p).is_instance(v));
			mdv.put(m_pscope.string().make(p), v);
		}
		
		Map<Field, DataValue> sfields = new HashMap<>();
		sfields.put(m_request_dst_id_field, m_pscope.string().make(dst_id));
		sfields.put(m_request_exec_id_field, m_pscope.int64().make(exec_id));
		sfields.put(m_request_obj_id_field, m_pscope.string().make(obj_id));
		sfields.put(m_request_operation_field, m_pscope.string().make(
				operation_name(op_v)));
		sfields.put(m_request_inputs_field, mdv);
		
		return m_request_type.make(sfields);
	}

	public  OperationInformation(PrimitiveScope pscope);

}