/******************************************************************************* * (c) Copyright 2016 Hewlett-Packard Development Company, L.P. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Apache License v2.0 which accompany this distribution. * * The Apache License is available at * http://www.apache.org/licenses/LICENSE-2.0 * *******************************************************************************/ package io.cloudslang.lang.compiler.modeller.model; import java.io.IOException; import java.io.StringReader; import java.lang.reflect.Field; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.collections4.MapUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; public class Metadata { private String description; private String prerequisites; private Map<String, String> inputs; private Map<String, String> outputs; private Map<String, String> results; public Metadata() { description = ""; prerequisites = ""; inputs = new HashMap<>(); outputs = new HashMap<>(); results = new HashMap<>(); } public Metadata( String description, String prerequisites, Map<String, String> inputs, Map<String, String> outputs, Map<String, String> results) { this.description = description; this.prerequisites = prerequisites; this.inputs = inputs; this.outputs = outputs; this.results = results; } public Map<String, String> getInputs() { return inputs; } public void setInputs(Map<String, String> inputs) { this.inputs = inputs; } public Map<String, String> getOutputs() { return outputs; } public void setOutputs(Map<String, String> outputs) { this.outputs = outputs; } public Map<String, String> getResults() { return results; } public void setResults(Map<String, String> results) { this.results = results; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getPrerequisites() { return prerequisites; } public void setPrerequisites(String prerequisites) { this.prerequisites = prerequisites; } public String prettyPrint() { StringBuilder stringBuilder = new StringBuilder(); Field[] allFields = this.getClass().getDeclaredFields(); for (Field field : allFields) { appendField(stringBuilder, field); } return stringBuilder.toString(); } private void appendField(StringBuilder stringBuilder, Field field) { try { field.setAccessible(true); Object fieldValue = field.get(this); if (fieldValue instanceof String) { appendStringField(stringBuilder, field.getName(), (String) fieldValue); } else if (fieldValue instanceof Map) { appendMapField(stringBuilder, field.getName(), (Map<String, String>) fieldValue); } } catch (IllegalAccessException | IOException e) { throw new RuntimeException(e); } } private void appendStringField(StringBuilder stringBuilder, String fieldName, String fieldValue) throws IOException { if (StringUtils.isNotEmpty(fieldValue)) { stringBuilder.append(fieldName).append(": "); appendString(stringBuilder, fieldValue, " "); } } private void appendMapField(StringBuilder stringBuilder, String fieldName, Map<String, String> fieldMap) throws IOException { if (MapUtils.isNotEmpty(fieldMap)) { stringBuilder.append(fieldName).append(": "); appendMap(stringBuilder, fieldMap); } } private void appendMap(StringBuilder stringBuilder, Map<String, String> map) throws IOException { stringBuilder.append(System.lineSeparator()); for (Map.Entry<String, String> entry : map.entrySet()) { stringBuilder.append(" ").append(entry.getKey()); if (StringUtils.isNotEmpty(entry.getValue())) { stringBuilder.append(": "); } appendString(stringBuilder, entry.getValue(), " "); } } private static void appendString(StringBuilder stringBuilder, String fieldValue, String spacing) throws IOException { List<String> lines = IOUtils.readLines(new StringReader(fieldValue)); if (lines.size() > 1) { stringBuilder.append(System.lineSeparator()); for (String line : lines) { stringBuilder.append(spacing).append(line).append(System.lineSeparator()); } } else { stringBuilder.append(fieldValue).append(System.lineSeparator()); } } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } Metadata that = (Metadata) o; return new EqualsBuilder() .append(description, that.description) .append(prerequisites, that.prerequisites) .append(inputs, that.inputs) .append(outputs, that.outputs) .append(results, that.results) .isEquals(); } @Override public int hashCode() { return new HashCodeBuilder(17, 37) .append(description) .append(prerequisites) .append(inputs) .append(outputs) .append(results) .toHashCode(); } @Override public String toString() { return "Metadata{" + "description='" + description + '\'' + ", prerequisites='" + prerequisites + '\'' + ", inputs=" + inputs + ", outputs=" + outputs + ", results=" + results + '}'; } }