1 /* 2 * Portions of this software was developed by employees of the National Institute 3 * of Standards and Technology (NIST), an agency of the Federal Government and is 4 * being made available as a public service. Pursuant to title 17 United States 5 * Code Section 105, works of NIST employees are not subject to copyright 6 * protection in the United States. This software may be subject to foreign 7 * copyright. Permission in the United States and in foreign countries, to the 8 * extent that NIST may hold copyright, to use, copy, modify, create derivative 9 * works, and distribute this software and its documentation without fee is hereby 10 * granted on a non-exclusive basis, provided that this notice and disclaimer 11 * of warranty appears in all copies. 12 * 13 * THE SOFTWARE IS PROVIDED 'AS IS' WITHOUT ANY WARRANTY OF ANY KIND, EITHER 14 * EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, ANY WARRANTY 15 * THAT THE SOFTWARE WILL CONFORM TO SPECIFICATIONS, ANY IMPLIED WARRANTIES OF 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND FREEDOM FROM 17 * INFRINGEMENT, AND ANY WARRANTY THAT THE DOCUMENTATION WILL CONFORM TO THE 18 * SOFTWARE, OR ANY WARRANTY THAT THE SOFTWARE WILL BE ERROR FREE. IN NO EVENT 19 * SHALL NIST BE LIABLE FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO, DIRECT, 20 * INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES, ARISING OUT OF, RESULTING FROM, 21 * OR IN ANY WAY CONNECTED WITH THIS SOFTWARE, WHETHER OR NOT BASED UPON WARRANTY, 22 * CONTRACT, TORT, OR OTHERWISE, WHETHER OR NOT INJURY WAS SUSTAINED BY PERSONS OR 23 * PROPERTY OR OTHERWISE, AND WHETHER OR NOT LOSS WAS SUSTAINED FROM, OR AROSE OUT 24 * OF THE RESULTS OF, OR USE OF, THE SOFTWARE OR SERVICES PROVIDED HEREUNDER. 25 */ 26 27 package gov.nist.secauto.metaschema.core.model.xml; 28 29 import gov.nist.secauto.metaschema.core.datatype.markup.MarkupLine; 30 import gov.nist.secauto.metaschema.core.datatype.markup.MarkupMultiline; 31 import gov.nist.secauto.metaschema.core.model.IModule; 32 import gov.nist.secauto.metaschema.core.model.xml.xmlbeans.MarkupLineDatatype; 33 import gov.nist.secauto.metaschema.core.model.xml.xmlbeans.MarkupMultilineDatatype; 34 import gov.nist.secauto.metaschema.core.util.ObjectUtils; 35 36 import org.apache.xmlbeans.XmlOptions; 37 import org.apache.xmlbeans.XmlTokenSource; 38 39 import java.io.IOException; 40 import java.io.StringWriter; 41 42 import edu.umd.cs.findbugs.annotations.NonNull; 43 44 // TODO: is this needed, or can we use methods on the markup implementations? 45 final class MarkupStringConverter { 46 private MarkupStringConverter() { 47 // disable construction 48 } 49 50 /** 51 * Converts HTML-like markup into a MarkupLine. 52 * 53 * @param content 54 * the content to convert 55 * @return the equivalent formatted text as a MarkupLine 56 * @throws IllegalArgumentException 57 * if the {@code content} argument contains malformed markup 58 */ 59 @NonNull 60 public static MarkupLine toMarkupString(@NonNull MarkupLineDatatype content) { 61 String html = processHTML(content); 62 return MarkupLine.fromHtml(html); 63 } 64 65 /** 66 * Converts multiple lines of HTML-like markup into a MarkupMultiline. 67 * 68 * @param content 69 * the content to convert 70 * @return the equivalent formatted text as a MarkupLine 71 * @throws IllegalArgumentException 72 * if the {@code content} argument contains malformed markup 73 */ 74 @NonNull 75 public static MarkupMultiline toMarkupString(@NonNull MarkupMultilineDatatype content) { 76 String html = processHTML(content); 77 return MarkupMultiline.fromHtml(html); 78 } 79 80 @NonNull 81 public static MarkupLineDatatype toMarkupLineDatatype(@NonNull MarkupLine markupLine) { 82 MarkupLineDatatype retval = ObjectUtils.notNull(MarkupLineDatatype.Factory.newInstance()); 83 XmlbeansMarkupVisitor.visit(markupLine, IModule.METASCHEMA_XML_NS, retval); 84 return retval; 85 } 86 87 /** 88 * Converts a set of XML tokens, which represent HTML content, into an HTML 89 * string. 90 * 91 * @param content 92 * the content to convert 93 * @return an HTML string 94 * @throws IllegalArgumentException 95 * if the {@code content} argument contains malformed markup 96 */ 97 @NonNull 98 private static String processHTML(XmlTokenSource content) { 99 XmlOptions options = new XmlOptions(); 100 options.setSaveInner(); 101 options.setSaveUseOpenFrag(); 102 StringWriter writer = new StringWriter(); 103 try { 104 content.save(writer, options); 105 } catch (IOException e) { 106 throw new IllegalArgumentException(e); 107 } 108 return ObjectUtils.notNull( 109 writer.toString().replaceFirst("^<frag\\:fragment[^>]+>", "").replaceFirst("</frag\\:fragment>$", "")); 110 } 111 }