blob: efa5f1cfb916a0b2677a8034c632a4516f8331c1 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 David A Carlson.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* David A Carlson (XMLmodeling.com) - initial API and implementation
* Les Westberg - Fixed a problem related to generating the DITA for value sets
* that were not contained in the vocab project and that are in
* models which are not based on CDA
*
*
* $Id$
*******************************************************************************/
package org.eclipse.mdht.uml.cda.dita;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import org.eclipse.core.runtime.IPath;
import org.eclipse.mdht.uml.cda.core.util.CDAModelUtil;
import org.eclipse.mdht.uml.cda.dita.internal.Logger;
import org.eclipse.mdht.uml.term.core.profile.ValueSetCode;
import org.eclipse.mdht.uml.term.core.profile.ValueSetVersion;
import org.eclipse.mdht.uml.term.core.util.TermProfileUtil;
import org.eclipse.uml2.uml.Comment;
import org.eclipse.uml2.uml.Enumeration;
import org.eclipse.uml2.uml.EnumerationLiteral;
public class TransformValueSet extends TransformAbstract {
public TransformValueSet(DitaTransformerOptions options) {
super(options);
}
public String getDefinition(Enumeration enumeration) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
pw.println("<section id=\"definition\">");
appendDefinition(pw, enumeration);
appendConcepts(pw, enumeration);
pw.println("</section>");
return sw.toString();
}
private void appendBody(PrintWriter writer, Enumeration umlEnumeration) {
writer.println("<body>");
writer.println("<!-- THIS IS GENERATED CONTENT, DO NOT EDIT -->");
writer.println("<section id=\"definition\">");
appendDefinition(writer, umlEnumeration);
appendConcepts(writer, umlEnumeration);
writer.println("</section>");
writer.println("</body>");
writer.println("</topic>");
}
private void appendConcepts(PrintWriter writer, Enumeration umlEnumeration) {
String codeSystemName = null;
ValueSetVersion valueSetVersion = TermProfileUtil.getValueSetVersion(umlEnumeration);
if (valueSetVersion != null && valueSetVersion.getCodeSystem() != null &&
!valueSetVersion.getCodeSystem().eIsProxy()) {
codeSystemName = valueSetVersion.getCodeSystem().getBase_Enumeration().getName();
}
if (!umlEnumeration.getOwnedLiterals().isEmpty()) {
// print the <table> tag
writer.println(getTableType());
if (transformerOptions.isIncludeUsageNotes()) {
writer.println("<tgroup cols=\"4\">");
writer.println("<colspec colname=\"col1\" colwidth=\"1*\"/>");
writer.println("<colspec colname=\"col2\" colwidth=\"1*\"/>");
writer.println("<colspec colname=\"col3\" colwidth=\"1*\"/>");
writer.println("<colspec colname=\"col4\" colwidth=\"2*\"/>");
writer.println("<thead><row>");
writer.println(
"<entry>Code</entry><entry>Code System</entry><entry>Print Name</entry><entry>Usage Note</entry>");
writer.println("</row></thead><tbody>");
} else {
writer.println("<tgroup cols=\"3\">");
writer.println("<colspec colname=\"col1\" colwidth=\"1*\"/>");
writer.println("<colspec colname=\"col2\" colwidth=\"1*\"/>");
writer.println("<colspec colname=\"col3\" colwidth=\"2*\"/>");
writer.println("<thead><row>");
writer.println("<entry>Code</entry><entry>Code System</entry><entry>Print Name</entry>");
writer.println("</row></thead><tbody>");
}
for (EnumerationLiteral literal : umlEnumeration.getOwnedLiterals()) {
ValueSetCode valueSetCode = TermProfileUtil.getValueSetCode(literal);
writer.print("<row>");
// Concept Code
writer.print("<entry>" + literal.getName() + "</entry>");
// Code System
writer.print("<entry>");
if (valueSetCode != null && valueSetCode.getCodeSystem() != null) {
if (valueSetCode.getCodeSystem().getBase_Enumeration() != null) {
writer.print(valueSetCode.getCodeSystem().getBase_Enumeration().getName());
} else {
Logger.log(
Logger.ERROR, "VALUE SET LITERAL MISSING CODE SYSTEM " + valueSetVersion.getFullName() +
" " + valueSetCode.getBase_EnumerationLiteral().getName());
writer.print("MISSING");
}
} else if (codeSystemName != null) {
writer.print(codeSystemName);
}
writer.print("</entry>");
// Print Name
writer.print("<entry>");
if (valueSetCode != null && valueSetCode.getConceptName() != null) {
writer.print(CDAModelUtil.fixNonXMLCharacters(valueSetCode.getConceptName()));
}
writer.print("</entry>");
if (transformerOptions.isIncludeUsageNotes()) {
writer.print("<entry>");
if (valueSetCode != null && valueSetCode.getUsageNote() != null) {
writer.print(CDAModelUtil.fixNonXMLCharacters(valueSetCode.getUsageNote()));
}
writer.print("</entry>");
}
writer.println("</row>");
}
writer.println("</tbody></tgroup></table>");
}
}
/**
* Using transformerOptions determine the correct table type to use for
* output
*
* @return either {@code <table frame=\"topbot\" rowsep=\"1\"> } if isNoVerticalLinesInTables is set
* or {@code <table frame=\"all\" rowsep=\"1\" colsep=\"1\"> }
*/
private String getTableType() {
return transformerOptions.isNoVerticalLinesInTables()
? "<table frame=\"topbot\" rowsep=\"1\">"
: "<table frame=\"all\" rowsep=\"1\" colsep=\"1\">";
}
private void appendDefinition(PrintWriter writer, Enumeration umlEnumeration) {
writer.println(getTableType());
writer.println("<tgroup cols=\"2\">");
writer.println("<colspec colname=\"col1\" colwidth=\"1*\"/>");
writer.println("<colspec colname=\"col2\" colwidth=\"4*\"/>");
writer.println("<tbody>");
ValueSetVersion valueSetVersion = TermProfileUtil.getValueSetVersion(umlEnumeration);
if (valueSetVersion != null) {
String valueSetId = valueSetVersion.getIdentifier() != null
? valueSetVersion.getIdentifier()
: "(OID not specified)";
writer.print("<row><entry>Value Set</entry><entry>");
writer.print(umlEnumeration.getName());
writer.print(" - " + valueSetId);
writer.println("</entry></row>");
if (valueSetVersion.getCodeSystem() != null) {
if (valueSetVersion.getCodeSystem().eIsProxy()) {
System.err.println("Cannot load Code System ref from: " + umlEnumeration.getQualifiedName());
} else {
String codeSystemId = valueSetVersion.getCodeSystem().getIdentifier() != null
? valueSetVersion.getCodeSystem().getIdentifier()
: "(OID not specified)";
writer.print("<row><entry>Code System</entry><entry>");
writer.print(
CDAModelUtil.fixNonXMLCharacters(
valueSetVersion.getCodeSystem().getBase_Enumeration().getName()));
writer.print(" - " + codeSystemId);
writer.println("</entry></row>");
}
}
if (valueSetVersion.getVersion() != null) {
writer.print("<row><entry>Version</entry><entry>");
writer.print(valueSetVersion.getVersion());
writer.println("</entry></row>");
}
if (valueSetVersion.getSource() != null) {
writer.print("<row><entry>Source</entry><entry>");
writer.print(CDAModelUtil.fixNonXMLCharacters(valueSetVersion.getSource()));
writer.println("</entry></row>");
}
if (valueSetVersion.getUrl() != null) {
writer.print("<row><entry>Source URL</entry><entry>");
writer.print(CDAModelUtil.fixNonXMLCharacters(valueSetVersion.getUrl()));
writer.println("</entry></row>");
}
if (valueSetVersion.getDefinition() != null) {
writer.print("<row><entry>Definition</entry><entry>");
writer.print(CDAModelUtil.fixNonXMLCharacters(valueSetVersion.getDefinition()));
writer.println("</entry></row>");
}
} else {
writer.print("<row><entry>Value Set</entry><entry>");
writer.print(umlEnumeration.getName());
writer.println("</entry></row>");
}
for (Comment comment : umlEnumeration.getOwnedComments()) {
writer.print("<row><entry>Description</entry><entry>");
writer.println(comment.getBody());
writer.println("</entry></row>");
}
writer.println("</tbody></tgroup></table>");
}
private static void appendHeader(PrintWriter writer, Enumeration umlEnumeration) {
writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
writer.println("<!DOCTYPE topic PUBLIC \"-//OASIS//DTD DITA Topic//EN\" \"topic.dtd\">");
writer.println("<topic id=\"classId\" xml:lang=\"en-us\">");
writer.print("<title>");
writer.print(TransformAbstract.getPublicationName(umlEnumeration));
writer.println("</title>");
ValueSetVersion valueSetVersion = TermProfileUtil.getValueSetVersion(umlEnumeration);
String valueSetId = valueSetVersion != null && valueSetVersion.getIdentifier() != null
? valueSetVersion.getIdentifier()
: "not specified";
// CodeSystemVersion codeSystem = null;
// Enumeration codeSystemEnum = null;
// if (valueSetVersion != null && valueSetVersion.getCodeSystem() != null) {
// codeSystem = valueSetVersion.getCodeSystem();
// codeSystemEnum = codeSystem.getBase_Enumeration();
// }
//
// writer.print("<shortdesc id=\"shortdesc\">");
// if (valueSetVersion != null) {
// writer.print("[OID: <tt>" + valueSetId + "</tt>");
// if (codeSystemEnum != null) {
// writer.print(" from code system: " + CDAModelUtil.fixNonXMLCharacters(codeSystemEnum.getName()));
// }
// writer.print("]");
// }
// writer.println("</shortdesc>");
writer.println("<prolog id=\"prolog\">");
if (valueSetVersion != null) {
writer.println("<resourceid id=\"" + valueSetId + "\"/>");
}
writer.println("</prolog>");
}
@Override
public Object caseEnumeration(Enumeration umlEnumeration) {
String fileName = normalizeCodeName(umlEnumeration.getName()) + ".dita";
if (transformerOptions.getValueSetList().contains(fileName)) {
// no need to generate dita file twice!
return umlEnumeration;
}
String pathFolder = "terminology";
IPath filePath = transformerOptions.getOutputPath().append(pathFolder).addTrailingSeparator().append(fileName);
File file = filePath.toFile();
PrintWriter writer = null;
// if (!file.exists()) {
try {
file.createNewFile();
writer = new PrintWriter(file);
appendHeader(writer, umlEnumeration);
appendBody(writer, umlEnumeration);
} catch (FileNotFoundException e) {
Logger.logException(e);
} catch (IOException e1) {
Logger.logException(e1);
} finally {
if (writer != null) {
writer.close();
}
}
// }
transformerOptions.getValueSetList().add(fileName);
return umlEnumeration;
}
}