/** * Copyright 2005-2014 Restlet * * The contents of this file are subject to the terms of one of the following * open source licenses: Apache 2.0 or or EPL 1.0 (the "Licenses"). You can * select the license that you prefer but you may not use this file except in * compliance with one of these Licenses. * * You can obtain a copy of the Apache 2.0 license at * http://www.opensource.org/licenses/apache-2.0 * * You can obtain a copy of the EPL 1.0 license at * http://www.opensource.org/licenses/eclipse-1.0 * * See the Licenses for the specific language governing permissions and * limitations under the Licenses. * * Alternatively, you can obtain a royalty free commercial license with less * limitations, transferable or non-transferable, directly at * http://restlet.com/products/restlet-framework * * Restlet is a registered trademark of Restlet S.A.S. */ package org.restlet.ext.emf.internal; import java.io.IOException; import java.io.Writer; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EAnnotation; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; /** * Offers a generic HTML representation of an EMF object. It lists all its * properties and can even generate HTML links when the proper EMF eAnnotation * is detected. * * This is useful to be able to automatically navigate a Web API whose resource * representations are defined using EMF. * * @author Jerome Louvel */ public class EmfHtmlWriter { public static final String ANNOTATION_URI = "http://restlet.org/schemas/2011/emf/html"; private final EObject object; /** * Constructor. * * @param object */ public EmfHtmlWriter(EObject object) { this.object = object; } /** * Returns the EMF object to write. * * @return The EMF object to write. */ public EObject getObject() { return object; } /** * Writes the wrapped EMF object as an HTML document. * * @param writer * The writer to use. * @throws IOException */ @SuppressWarnings("unchecked") public void write(Writer writer) throws IOException { String title = null; EClass eClass = getObject().eClass(); EAnnotation annotation = eClass.getEAnnotation(ANNOTATION_URI); if (annotation != null) { title = (String) annotation.getDetails().get("label"); } title = (title == null) ? eClass.getName() : title; // Write the header writer.write("<html>\n"); writer.write("<body style=\"font-family: sans-serif;\">\n"); writer.write("<h2>" + title + "</h2>\n"); writer.write("<table border=\"0\">\n"); writer.write("<thead>\n"); writer.write("<tr>"); writer.write("<td><b>Property</b></td>\n"); writer.write("<td><b>Value</b></td>\n"); writer.write("</tr>\n"); writer.write("</thead>\n"); writer.write("<tbody>\n"); // Write the object properties for (EObject content : eClass.eContents()) { if (content instanceof EStructuralFeature) { EStructuralFeature sf = (EStructuralFeature) content; String label = null; boolean hyperlink = false; annotation = sf.getEAnnotation(ANNOTATION_URI); if (annotation != null) { label = (String) annotation.getDetails().get("label"); hyperlink = Boolean.parseBoolean(annotation.getDetails() .get("linked")); } label = (label == null) ? sf.getName() : label; Object value = getObject().eGet(sf); if (value instanceof EList) { EList<Object> items = (EList<Object>) value; for (Object item : items) { writeRow(writer, label, item.toString(), hyperlink); } } else { writeRow(writer, label, (value == null) ? "null" : value.toString(), hyperlink); } } } writer.write("</tbody>\n"); writer.write("</table>\n"); writer.write("</body>\n"); writer.write("</html>\n"); writer.flush(); } private void writeRow(Writer writer, String name, String value, boolean hyperlink) throws IOException { writer.write("<tr>"); // Write the property name writer.write("<td>"); writer.write(name); writer.write("</td>\n"); // Write the property value writer.write("<td>"); if (hyperlink) { writer.write("<a href=\"" + value + "\">"); } writer.write(value); if (hyperlink) { writer.write("</a>"); } writer.write("</td>\n"); writer.write("</tr>\n"); } }