package com.sequenceiq.cloudbreak.shell.transformer; import java.util.Collection; import java.util.List; import java.util.Map; import javax.inject.Inject; import javax.ws.rs.NotSupportedException; import org.springframework.stereotype.Component; import com.fasterxml.jackson.core.JsonProcessingException; import com.sequenceiq.cloudbreak.shell.model.OutPutType; import com.sequenceiq.cloudbreak.shell.support.JsonRenderer; import com.sequenceiq.cloudbreak.shell.support.TableRenderer; @Component public class OutputTransformer { @Inject private TableRenderer tableRenderer; @Inject private JsonRenderer jsonRenderer; public <O> String render(OutPutType outPutType, O object, String... headers) throws JsonProcessingException { outPutType = outPutType == null ? OutPutType.RAW : outPutType; if (OutPutType.JSON.equals(outPutType)) { return jsonRenderer.render(object); } else if (OutPutType.RAW.equals(outPutType)) { if (object instanceof Map) { Map<?, ?> map = (Map<?, ?>) object; if (!map.values().isEmpty()) { Object value = map.values().stream().filter(e -> e != null).findAny().orElse(null); if (value instanceof Collection) { return tableRenderer.renderMultiValueMap((Map<String, List<String>>) object, true, headers); } else if (value instanceof String) { return tableRenderer.renderSingleMapWithSortedColumn((Map<Object, String>) object, headers); } else { return tableRenderer.renderObjectValueMap((Map<String, Object>) object, headers[0]); } } else { return "No available entity"; } } else { return "No available entity"; } } else { throw new NotSupportedException("Output type not supported."); } } public <O> String render(O object, String... headers) throws JsonProcessingException { return render(OutPutType.RAW, object, headers); } }