/** * CertWare Project * Copyright (c) 2010 National Aeronautics and Space Administration. All rights reserved. */ package net.certware.export.arm.jobs; import java.util.Collection; import javax.xml.bind.JAXBException; import net.certware.argument.arm.Annotation; import net.certware.argument.arm.Argument; import net.certware.argument.arm.ArgumentElement; import net.certware.argument.arm.ArgumentLink; import net.certware.argument.arm.ArgumentReasoning; import net.certware.argument.arm.ArmPackage; import net.certware.argument.arm.AssertedChallenge; import net.certware.argument.arm.AssertedContext; import net.certware.argument.arm.AssertedCounterEvidence; import net.certware.argument.arm.AssertedEvidence; import net.certware.argument.arm.AssertedInference; import net.certware.argument.arm.AssertedRelationship; import net.certware.argument.arm.CitationElement; import net.certware.argument.arm.Claim; import net.certware.argument.arm.EvidenceAssertion; import net.certware.argument.arm.InformationElement; import net.certware.argument.arm.ModelElement; import net.certware.argument.arm.ReasoningElement; import net.certware.argument.arm.TaggedValue; import net.certware.argument.arm.util.ArmSwitch; import net.certware.core.ui.log.CertWareLog; import net.certware.export.jobs.AbstractExportJob; import org.docx4j.openpackaging.exceptions.Docx4JException; import org.docx4j.wml.P; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; /** * Exports ARM model elements to a document file. * Designed as well to be super class of exporting jobs for models extending ARM notation. * @author mrb * @since 1.0 */ public class ExportARMJob extends AbstractExportJob { /** * Default constructor, default name. */ public ExportARMJob() { super(); } /** * Create the export job with a name. * @param name job name */ public ExportARMJob(String name) { super(name); } /** * Create the export job with a given model element node. * @param name job name * @param node model element to export */ public ExportARMJob(String name, EObject node) { super(name,node); } /** * Create the export job with a collection of nodes. * @param name job name * @param nodes selected node collection to export */ @SuppressWarnings({ "rawtypes", "unchecked" }) public ExportARMJob(String name, Collection nodes ) { super(name,nodes); } /** * Create the export job with the selected resource. * @param name job name * @param resource resource to export */ public ExportARMJob(String name, Resource resource ) { super(name,resource); } @Override protected void doSwitch(EObject eObject) { visitor.doSwitch(eObject); } /** * Visitor to pass to the model's tree iterator. * Overrides the case methods of the generated switch class. */ public ArmSwitch<Boolean> visitor = new ArmSwitch<Boolean>() { private boolean writeTagsHeader; private boolean writeArgumentElementHeader; private boolean writeArgumentLinkHeader; private boolean writeAssertedRelationshipHeader; @SuppressWarnings("unused") private boolean writeSourceHeader; @SuppressWarnings("unused") private boolean writeTargetHeader; private boolean writeAssertedInferenceHeader; private boolean writeAssertedEvidenceHeader; private boolean writeAssertedContextHeader; private boolean writeAssertedCounterEvidenceHeader; private boolean writeAssertedChallengeHeader; /** * Returns the result of interpreting the object as an instance of '<em>Model Element</em>'. * @param me the target of the switch. * @param prefix model element type prefix * @return always returns true * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) */ public Boolean caseModelElement(String prefix, ModelElement me) { // prefix, identifier, description, and content // tagged values visited in a different case // prefix, identifier, description, and content // tagged values visited in a different case //Br b = factory.createBr(); //b.setType(STBrType.TEXT_WRAPPING); P modelElementParagraph = factory.createP(); String id = me.getIdentifier(); String heading = prefix + ' ' + me.getIdentifier(); if ( id.startsWith(prefix) ) heading = me.getIdentifier(); modelElementParagraph.getParagraphContent().add( addStyledRunOfText(styleMap.get(ArmPackage.MODEL_ELEMENT),heading)); //modelElementParagraph.getParagraphContent().add( factory.createRTab() ); //modelElementParagraph.getParagraphContent().add( factory.createRTab() ); //modelElementParagraph.getParagraphContent().add( addStyledRunOfText(styleMap.get(ArmPackage.MODEL_ELEMENT__IDENTIFIER),me.getIdentifier())); // modelElementParagraph.getParagraphContent().add( factory.createRCr()); modelElementParagraph.getParagraphContent().add( factory.createBr()); modelElementParagraph.getParagraphContent().add( addRunOfText("Description: ")); modelElementParagraph.getParagraphContent().add( addStyledRunOfText(styleMap.get(ArmPackage.MODEL_ELEMENT__DESCRIPTION),me.getDescription())); modelElementParagraph.getParagraphContent().add( factory.createBr()); modelElementParagraph.getParagraphContent().add( addRunOfText("Content: ")); modelElementParagraph.getParagraphContent().add( addStyledRunOfText(styleMap.get(ArmPackage.MODEL_ELEMENT__CONTENT),me.getContent())); mainDocumentPart.addObject(modelElementParagraph); // tags header, if any writeTagsHeader = me.getIsTagged().isEmpty() == false; return Boolean.TRUE; } /** * Returns the result of interpreting the object as an instance of '<em>Tagged Value</em>'. * @param taggedValue the target of the switch. * @return always returns null * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) */ public Boolean caseTaggedValue(TaggedValue taggedValue) { if ( writeTagsHeader ) { addStyledText(styleMap.get(ArmPackage.TAGGED_VALUE),"Tags"); writeTagsHeader = false; } P tagLine = factory.createP(); tagLine.getParagraphContent().add( addStyledRunOfText(styleMap.get(ArmPackage.TAGGED_VALUE),"Key:")); tagLine.getParagraphContent().add( addRunOfText(" ")); tagLine.getParagraphContent().add( addStyledRunOfText(styleMap.get(ArmPackage.TAGGED_VALUE__KEY),taggedValue.getKey())); tagLine.getParagraphContent().add( addStyledRunOfText(styleMap.get(ArmPackage.TAGGED_VALUE),"Value:")); tagLine.getParagraphContent().add( addRunOfText(" ")); tagLine.getParagraphContent().add( addStyledRunOfText(styleMap.get(ArmPackage.TAGGED_VALUE__VALUE),taggedValue.getValue())); mainDocumentPart.addObject(tagLine); return Boolean.TRUE; } /** * Returns the result of interpreting the object as an instance of '<em>Argument</em>'. * @param argument the target of the switch. * @return always returns true * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) */ public Boolean caseArgument(Argument argument) { // identifier, description, and content caseModelElement("Argument",argument); // headers, if any writeArgumentElementHeader = argument.getContainsArgumentElement().isEmpty() == false; writeArgumentLinkHeader = argument.getContainsArgumentLink().isEmpty() == false; return Boolean.TRUE; } /** * Returns the result of interpreting the object as an instance of '<em>Argument Element</em>'. * @param argumentElement the target of the switch. * @return always returns true * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) */ public Boolean caseArgumentElement(ArgumentElement argumentElement) { if ( writeArgumentElementHeader ) { addStyledText(styleMap.get(ArmPackage.ARGUMENT_ELEMENT),"Argument Elements"); writeArgumentElementHeader = false; } caseModelElement("Argument Element",argumentElement); return Boolean.TRUE; } /** * Returns the result of interpreting the object as an instance of '<em>Argument Link</em>'. * @param argumentLink the target of the switch. * @return always returns true * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) */ public Boolean caseArgumentLink(ArgumentLink argumentLink) { if ( writeArgumentLinkHeader ) { addStyledText(styleMap.get(ArmPackage.ARGUMENT_ELEMENT), "Argument Links"); writeArgumentLinkHeader = false; } caseModelElement("Argument Link", argumentLink); if ( argumentLink.getSource().isEmpty() == false ) { writeSourceHeader = true; } if ( argumentLink.getTarget().isEmpty() == false ) { writeTargetHeader = true; } return Boolean.TRUE; } /** * Returns the result of interpreting the object as an instance of '<em>Asserted Relationship</em>'. * @param assertedRelationship the target of the switch. * @return always returns true * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) */ public Boolean caseAssertedRelationship(AssertedRelationship assertedRelationship) { if ( writeAssertedRelationshipHeader ) { addStyledText(styleMap.get(ArmPackage.ASSERTED_RELATIONSHIP), "Asserted Relationship"); writeAssertedRelationshipHeader = false; } caseModelElement("Asserted Relationship", assertedRelationship); if ( assertedRelationship.getSource().isEmpty() == false ) { writeSourceHeader = true; } if ( assertedRelationship.getTarget().isEmpty() == false ) { writeTargetHeader = true; } return Boolean.TRUE; } /** * Returns the result of interpreting the object as an instance of '<em>Annotation</em>'. * @param annotation the target of the switch. * @return always returns true * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) */ public Boolean caseAnnotation(Annotation annotation) { caseArgumentLink(annotation); return Boolean.TRUE; } /** * Returns the result of interpreting the object as an instance of '<em>Asserted Inference</em>'. * @param assertedInference the target of the switch. * @return always returns true * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) */ public Boolean caseAssertedInference(AssertedInference assertedInference) { if ( writeAssertedInferenceHeader ) { addStyledText(styleMap.get(ArmPackage.ASSERTED_INFERENCE), "Asserted Inference"); writeAssertedInferenceHeader = false; } caseAssertedRelationship(assertedInference); return Boolean.TRUE; } /** * Returns the result of interpreting the object as an instance of '<em>Asserted Evidence</em>'. * @param assertedEvidence the target of the switch. * @return always returns true * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) */ public Boolean caseAssertedEvidence(AssertedEvidence assertedEvidence) { if ( writeAssertedEvidenceHeader ) { addStyledText(styleMap.get(ArmPackage.ASSERTED_EVIDENCE), "Asserted Evidence"); writeAssertedEvidenceHeader = false; } caseAssertedRelationship(assertedEvidence); return Boolean.TRUE; } /** * Returns the result of interpreting the object as an instance of '<em>Asserted Context</em>'. * @param assertedContext the target of the switch. * @return always returns true * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) */ public Boolean caseAssertedContext(AssertedContext assertedContext) { if ( writeAssertedContextHeader ) { addStyledText(styleMap.get(ArmPackage.ASSERTED_CONTEXT), "Asserted Context"); writeAssertedContextHeader = false; } caseAssertedRelationship(assertedContext); return Boolean.TRUE; } /** * Returns the result of interpreting the object as an instance of '<em>Asserted Counter Evidence</em>'. * @param assertedCounterEvidence the target of the switch. * @return always returns true * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) */ public Boolean caseAssertedCounterEvidence(AssertedCounterEvidence assertedCounterEvidence) { if ( writeAssertedCounterEvidenceHeader ) { addStyledText(styleMap.get(ArmPackage.ASSERTED_COUNTER_EVIDENCE), "Asserted Counter-Evidence"); writeAssertedCounterEvidenceHeader = false; } caseAssertedRelationship(assertedCounterEvidence); return Boolean.TRUE; } /** * Returns the result of interpreting the object as an instance of '<em>Asserted Challenge</em>'. * @param assertedChallenge the target of the switch. * @return always returns true * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) */ public Boolean caseAssertedChallenge(AssertedChallenge assertedChallenge) { if ( writeAssertedChallengeHeader ) { addStyledText(styleMap.get(ArmPackage.ASSERTED_CHALLENGE), "Asserted Challenge"); writeAssertedChallengeHeader = false; } caseAssertedRelationship(assertedChallenge); return Boolean.TRUE; } /** * Returns the result of interpreting the object as an instance of '<em>Reasoning Element</em>'. * @param reasoningElement the target of the switch. * @return always returns true * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) */ public Boolean caseReasoningElement(ReasoningElement reasoningElement) { caseModelElement("Reasoning Element", reasoningElement); return Boolean.TRUE; } /** * Returns the result of interpreting the object as an instance of '<em>Claim</em>'. * @param claim the target of the switch. * @return always returns true * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) */ public Boolean caseClaim(Claim claim) { caseModelElement("Claim", claim); return Boolean.TRUE; } /** * Returns the result of interpreting the object as an instance of '<em>Evidence Assertion</em>'. * @param evidenceAssertion the target of the switch. * @return always returns true * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) */ public Boolean caseEvidenceAssertion(EvidenceAssertion evidenceAssertion) { caseModelElement("Evidence Assertion", evidenceAssertion); return Boolean.TRUE; } /** * Returns the result of interpreting the object as an instance of '<em>Information Element</em>'. * @param informationElement the target of the switch. * @return always returns true * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) */ public Boolean caseInformationElement(InformationElement informationElement) { caseArgumentElement(informationElement); return Boolean.TRUE; } /** * Returns the result of interpreting the object as an instance of '<em>Argument Reasoning</em>'. * @param argumentReasoning the target of the switch. * @return always returns true * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) */ public Boolean caseArgumentReasoning(ArgumentReasoning argumentReasoning) { caseReasoningElement(argumentReasoning); return Boolean.TRUE; } /** * Returns the result of interpreting the object as an instance of '<em>Citation Element</em>'. * @param citationElement the target of the switch. * @return always returns true * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject) */ public Boolean caseCitationElement(CitationElement citationElement) { caseArgumentElement(citationElement); return Boolean.TRUE; } /** * Returns the result of interpreting the object as an instance of '<em>EObject</em>'. * @param object the target of the switch. * @return always returns null * @see #doSwitch(org.eclipse.emf.ecore.EObject) */ public Boolean defaultCase(EObject object) { return Boolean.TRUE; } }; /** * Returns the visitor for the ARM model traversal. * @return visitor suitable for ARM switch */ public ArmSwitch<Boolean> getVisitor() { return visitor; } /** * Setup a style for each model element type. * Calls super class to override with plugin contributions. */ public void loadStyleMap() { // each model element can have its own style // for convenience we use the model element literals as keys styleMap.put(ArmPackage.ANNOTATION, new StyleEntry(false, "Annotation")); styleMap.put(ArmPackage.ARGUMENT, new StyleEntry(true,"Argument")); styleMap.put(ArmPackage.ARGUMENT_ELEMENT,new StyleEntry(false,"ArgumentElement")); styleMap.put(ArmPackage.ARGUMENT_LINK, new StyleEntry(false,"ArgumentLink")); styleMap.put(ArmPackage.ARGUMENT_LINK__SOURCE, new StyleEntry(false,"ArgumentLinkSource")); styleMap.put(ArmPackage.ARGUMENT_LINK__TARGET, new StyleEntry(false,"ArgumentLinkTarget")); styleMap.put(ArmPackage.ARGUMENT_REASONING__DESCRIBES, new StyleEntry(false,"ArgumentReasoningDescribes")); styleMap.put(ArmPackage.ARGUMENT_REASONING__HAS_STRUCTURE, new StyleEntry(false,"ArgumentReasoningHasStructure")); styleMap.put(ArmPackage.ARGUMENT__CONTAINS_ARGUMENT,new StyleEntry(false,"ArgumentContainsArgument")); styleMap.put(ArmPackage.ARGUMENT__CONTAINS_ARGUMENT_ELEMENT, new StyleEntry(false,"ArgumentContainsArgumentElement")); styleMap.put(ArmPackage.ARGUMENT__CONTAINS_ARGUMENT_LINK,new StyleEntry(false,"ArgumentContainsArgumentLink")); styleMap.put(ArmPackage.ARGUMENT_REASONING, new StyleEntry(false,"ArgumentReasoning")); styleMap.put(ArmPackage.ASSERTED_CHALLENGE, new StyleEntry(false,"AssertedChallenge")); styleMap.put(ArmPackage.ASSERTED_CONTEXT, new StyleEntry(false,"AssertedContext")); styleMap.put(ArmPackage.ASSERTED_COUNTER_EVIDENCE, new StyleEntry(false,"AssertedCounterEvidence")); styleMap.put(ArmPackage.ASSERTED_EVIDENCE, new StyleEntry(false,"AssertedEvidence")); styleMap.put(ArmPackage.ASSERTED_INFERENCE, new StyleEntry(false,"AssertedInference")); styleMap.put(ArmPackage.ASSERTED_RELATIONSHIP, new StyleEntry(false,"AssertedRelationship")); styleMap.put(ArmPackage.CITATION_ELEMENT, new StyleEntry(false,"CitationElement")); styleMap.put(ArmPackage.CITATION_ELEMENT__REFERS_TO_ARGUMENT, new StyleEntry(false,"CitationElementRefersToArgument")); styleMap.put(ArmPackage.CITATION_ELEMENT__REFERS_TO_ARGUMENT_ELEMENT, new StyleEntry(false,"CitationElementRefersToArgumentElement")); styleMap.put(ArmPackage.CLAIM, new StyleEntry(false,"Claim")); styleMap.put(ArmPackage.CLAIM__ASSUMED, new StyleEntry(false,"ClaimAssumed")); styleMap.put(ArmPackage.CLAIM__TO_BE_SUPPORTED, new StyleEntry(false,"ClaimToBeSupported")); styleMap.put(ArmPackage.EVIDENCE_ASSERTION, new StyleEntry(false,"EvidenceAssertion")); styleMap.put(ArmPackage.INFORMATION_ELEMENT, new StyleEntry(false,"InformationElement")); styleMap.put(ArmPackage.MODEL_ELEMENT, new StyleEntry(false,"ModelElement")); styleMap.put(ArmPackage.MODEL_ELEMENT__CONTENT, new StyleEntry(false,"ModelElementContent")); styleMap.put(ArmPackage.MODEL_ELEMENT__DESCRIPTION, new StyleEntry(false,"ModelElementDescription")); styleMap.put(ArmPackage.MODEL_ELEMENT__IDENTIFIER, new StyleEntry(false,"ModelElementIdentifier")); styleMap.put(ArmPackage.MODEL_ELEMENT__IS_TAGGED, new StyleEntry(false,"ModelElementIsTagged")); styleMap.put(ArmPackage.REASONING_ELEMENT, new StyleEntry(false,"ReasoningElement")); styleMap.put(ArmPackage.TAGGED_VALUE,new StyleEntry(false, "TaggedValue")); styleMap.put(ArmPackage.TAGGED_VALUE__KEY, new StyleEntry(false,"TaggedValueKey")); styleMap.put(ArmPackage.TAGGED_VALUE__VALUE, new StyleEntry(false,"TaggedValueValue")); assignStyleId(ArmPackage.MODEL_ELEMENT__CONTENT,true,"Heading2Char"); // TODO testing assignStyleId(ArmPackage.ARGUMENT_ELEMENT__CONTENT,false,"Heading3Char"); // TODO testing // override with plugin contributions loadContributedStyles(); } /** * Produces the export content. * Calls setup and test methods, then checks return value for tear-down. * @param monitor progress monitor * @return IStatus OK on success, CANCEL if export canceled by user */ public IStatus produce(IProgressMonitor monitor) { IStatus rv = Status.OK_STATUS; // setup, produce, and tear-down the document try { loadStyleMap(); setupDocument(monitor); rv = exportSelection(monitor); if ( rv == Status.OK_STATUS ) { tearDownDocument(monitor,true); } } catch (JAXBException e) { CertWareLog.logError("Exporting ARM document", e); } catch (Docx4JException e) { CertWareLog.logError("Exporting ARM document", e); } cleanupJob(monitor,rv); return rv; } }