Bug 569059 - [Model2Doc] the generated docx file can't be opened in Word
Load the template and save it in the new file directly
Signed-off-by: Pauline DEVILLE <pauline.deville@cea.fr>
Change-Id: I48ccf8a8f6071dcd772411c05f9b7f1d9494d2e8
Signed-off-by: Vincent Lorenzo <vincent.lorenzo@cea.fr>
diff --git a/plugins/core/org.eclipse.papyrus.model2doc.core.generatorconfiguration/META-INF/MANIFEST.MF b/plugins/core/org.eclipse.papyrus.model2doc.core.generatorconfiguration/META-INF/MANIFEST.MF
index 6df2aa5..3f1520b 100755
--- a/plugins/core/org.eclipse.papyrus.model2doc.core.generatorconfiguration/META-INF/MANIFEST.MF
+++ b/plugins/core/org.eclipse.papyrus.model2doc.core.generatorconfiguration/META-INF/MANIFEST.MF
@@ -18,3 +18,4 @@
org.eclipse.papyrus.model2doc.core.generatorconfiguration.util
Automatic-Module-Name: org.eclipse.papyrus.model2doc.core.generatorconfiguration
Bundle-ActivationPolicy: lazy
+Bundle-Activator: org.eclipse.papyrus.model2doc.core.generatorconfiguration.internal.Activator
diff --git a/plugins/core/org.eclipse.papyrus.model2doc.core.generatorconfiguration/src/org/eclipse/papyrus/model2doc/core/generatorconfiguration/operations/GeneratorConfigurationOperations.java b/plugins/core/org.eclipse.papyrus.model2doc.core.generatorconfiguration/src/org/eclipse/papyrus/model2doc/core/generatorconfiguration/operations/GeneratorConfigurationOperations.java
index be59c22..fb74d99 100755
--- a/plugins/core/org.eclipse.papyrus.model2doc.core.generatorconfiguration/src/org/eclipse/papyrus/model2doc/core/generatorconfiguration/operations/GeneratorConfigurationOperations.java
+++ b/plugins/core/org.eclipse.papyrus.model2doc.core.generatorconfiguration/src/org/eclipse/papyrus/model2doc/core/generatorconfiguration/operations/GeneratorConfigurationOperations.java
@@ -303,7 +303,10 @@
return URI.createFileURI(filePath).toString();// it add the file:/ before the path
}
String res = convertToLocalPath(eobject, filePath);
- return URI.createFileURI(res).toString();
+ if (res != null) {
+ return URI.createFileURI(res).toString();
+ }
+ return null;
}
/**
diff --git a/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/services/StyleServiceImpl.java b/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/services/StyleServiceImpl.java
index cfaf24e..92b6024 100755
--- a/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/services/StyleServiceImpl.java
+++ b/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/services/StyleServiceImpl.java
@@ -93,7 +93,7 @@
styleName = StyleConstants.NO_HEADER_STYLE_VALUE;
}
- if (document.getStyles().styleExist(styleName)) {
+ if (document.getStyles() != null && document.getStyles().styleExist(styleName)) {
xwpfTable.setStyleID(styleName);
return true;
}
diff --git a/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/transcription/DocxTranscription.java b/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/transcription/DocxTranscription.java
index 5030964..cd2d1a2 100755
--- a/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/transcription/DocxTranscription.java
+++ b/plugins/docx/org.eclipse.papyrus.model2doc.docx/src/org/eclipse/papyrus/model2doc/docx/internal/transcription/DocxTranscription.java
@@ -27,14 +27,12 @@
import java.util.List;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.Document;
import org.apache.poi.xwpf.usermodel.TableWidthType;
-import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
-import org.apache.poi.xwpf.usermodel.XWPFStyles;
import org.apache.poi.xwpf.usermodel.XWPFTable;
-import org.apache.xmlbeans.XmlException;
import org.eclipse.core.runtime.Assert;
import org.eclipse.osgi.util.NLS;
import org.eclipse.papyrus.model2doc.core.author.IAuthor;
@@ -64,6 +62,10 @@
public class DocxTranscription implements Transcription {
+ private static final String DOTX_SCHEMA = "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml";//$NON-NLS-1$
+
+ private static final String DOCX_SCHEMA = "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml";//$NON-NLS-1$
+
private IDocumentGeneratorConfiguration docxGeneratorConfig;
private CustomXWPFDocument document;
@@ -85,28 +87,49 @@
public DocxTranscription(IDocumentGeneratorConfiguration dgc) {
this.docxGeneratorConfig = dgc;
this.styleService = new StyleServiceImpl();
- this.document = new CustomXWPFDocument();
try {
- InputStream template = getTemplateInputStream();
- if (template != null) {
- // bug 569059 - see https://stackoverrun.com/fr/q/4419808 for solution
- XWPFDocument templateDocument = new XWPFDocument(template);
- final XWPFStyles newStyles = this.document.createStyles();
- newStyles.setStyles(templateDocument.getStyle());
- templateDocument.close();
+ final InputStream templateInputStream = getFileWithTemplateLoaded();
+ if (templateInputStream != null) {
+ // bug 569059 - see https://stackoverflow.com/questions/16264247/create-document-from-dotx-template-with-apache-poi-hwpf for solution
+ this.document = new CustomXWPFDocument(templateInputStream);
+ templateInputStream.close();
}
} catch (IOException e) {
Activator.log.warn("Cannot apply the template file"); //$NON-NLS-1$
- } catch (XmlException e) {
- Activator.log.warn("Cannot apply the template file"); //$NON-NLS-1$
+ } catch (InvalidFormatException e1) {
+ Activator.log.error("Cannot apply the template file", e1);//$NON-NLS-1$
+ }
+ if (this.document == null) {
+ this.document = new CustomXWPFDocument();
}
}
- private InputStream getTemplateInputStream() throws IOException {
- String stringUri = GeneratorConfigurationOperations.getTemplateFilePathInLocalPath(docxGeneratorConfig);
- stringUri = stringUri.replaceFirst(ECORE_FILE_PREFIX, EMPTY_STRING);
- InputStream stream = new FileInputStream(stringUri);
- return stream;
+ /**
+ * This method open the destination file and replace it by the the template
+ *
+ * @return an inputStream on the destination file
+ * @throws IOException
+ * @throws InvalidFormatException
+ */
+ private InputStream getFileWithTemplateLoaded() throws IOException, InvalidFormatException {
+ String templateURI = GeneratorConfigurationOperations.getTemplateFilePathInLocalPath(docxGeneratorConfig);
+ if (templateURI != null) {
+ templateURI = templateURI.replaceFirst(ECORE_FILE_PREFIX, EMPTY_STRING);
+ String destURI = GeneratorConfigurationOperations.getDocumentFileLocalPath(docxGeneratorConfig, DOCX_FILE_EXTENTION);
+ destURI = destURI.replaceFirst(ECORE_FILE_PREFIX, EMPTY_STRING);
+ FileInputStream templateIS = new FileInputStream(templateURI);
+ FileOutputStream destIS = new FileOutputStream(destURI);
+
+ OPCPackage pkg = OPCPackage.open(templateIS);
+ pkg.replaceContentType(DOTX_SCHEMA, DOCX_SCHEMA);
+ pkg.save(destIS);
+
+ templateIS.close();
+ destIS.close();
+
+ return new FileInputStream(destURI);
+ }
+ return null;
}
@Override