diff --git a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/builder/XDOMOfficeDocumentBuilder.java b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/builder/XDOMOfficeDocumentBuilder.java index a013348..023dd8c 100644 --- a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/builder/XDOMOfficeDocumentBuilder.java +++ b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/builder/XDOMOfficeDocumentBuilder.java @@ -20,6 +20,7 @@ package org.xwiki.officeimporter.builder; import java.io.InputStream; +import java.util.Map; import org.xwiki.component.annotation.Role; import org.xwiki.model.reference.DocumentReference; @@ -45,13 +46,15 @@ * @param reference reference document w.r.t which HTML cleaning is performed. If the office file contains images or * other binary artifacts, HTML cleaning will be performed assuming that those artifacts are present as * attachments to the reference document - * @param filterStyles whether to filter CSS styles present in the HTML content produced by the office server + * @param parameters some configuration option to control the conversion. For example {@code filterStyles} is + * supported and if "true" it means that styles will be filtered to the maximum and the focus will be put on + * importing only the content * @return an {@link XDOMOfficeDocument} corresponding to the office document * @throws OfficeImporterException if an error occurs while performing the import operation * @since 2.2M1 */ XDOMOfficeDocument build(InputStream officeFileStream, String officeFileName, DocumentReference reference, - boolean filterStyles) throws OfficeImporterException; + Map parameters) throws OfficeImporterException; /** * Builds a {@link XDOMOfficeDocument} from the given {@link XHTMLOfficeDocument}. diff --git a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/builder/XHTMLOfficeDocumentBuilder.java b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/builder/XHTMLOfficeDocumentBuilder.java index c83a21b..dda0994 100644 --- a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/builder/XHTMLOfficeDocumentBuilder.java +++ b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/builder/XHTMLOfficeDocumentBuilder.java @@ -20,6 +20,7 @@ package org.xwiki.officeimporter.builder; import java.io.InputStream; +import java.util.Map; import org.xwiki.component.annotation.Role; import org.xwiki.model.reference.DocumentReference; @@ -43,11 +44,13 @@ * @param reference reference document w.r.t which HTML cleaning is performed. If the office file contains images or * other binary artifacts, HTML cleaning will be performed assuming that those artifacts are present as * attachments to the reference document - * @param filterStyles whether to filter CSS styles present in the HTML content produced by office server + * @param parameters some configuration option to control the conversion. For example {@code filterStyles} is + * supported and if "true" it means that styles will be filtered to the maximum and the focus will be put on + * importing only the content * @return an {@link XHTMLOfficeDocument} corresponding to the office document * @throws OfficeImporterException if an error occurs while performing the import operation * @since 2.2M1 */ XHTMLOfficeDocument build(InputStream officeFileStream, String officeFileName, DocumentReference reference, - boolean filterStyles) throws OfficeImporterException; + Map parameters) throws OfficeImporterException; } diff --git a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/internal/builder/DefaultXDOMOfficeDocumentBuilder.java b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/internal/builder/DefaultXDOMOfficeDocumentBuilder.java index ffaf768..abefa4a 100644 --- a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/internal/builder/DefaultXDOMOfficeDocumentBuilder.java +++ b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/internal/builder/DefaultXDOMOfficeDocumentBuilder.java @@ -21,6 +21,7 @@ import java.io.InputStream; import java.io.StringReader; +import java.util.Map; import javax.inject.Inject; import javax.inject.Named; @@ -79,10 +80,10 @@ @Override public XDOMOfficeDocument build(InputStream officeFileStream, String officeFileName, DocumentReference reference, - boolean filterStyles) throws OfficeImporterException + Map parameters) throws OfficeImporterException { XDOMOfficeDocument xdomOfficeDocument = - build(this.xhtmlOfficeDocumentBuilder.build(officeFileStream, officeFileName, reference, filterStyles)); + build(this.xhtmlOfficeDocumentBuilder.build(officeFileStream, officeFileName, reference, parameters)); // Make sure references are resolved relative to the target document reference. xdomOfficeDocument.getContentDocument().getMetaData() .addMetaData(MetaData.BASE, entityReferenceSerializer.serialize(reference)); diff --git a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/internal/builder/DefaultXHTMLOfficeDocumentBuilder.java b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/internal/builder/DefaultXHTMLOfficeDocumentBuilder.java index 658c342..fe73165 100644 --- a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/internal/builder/DefaultXHTMLOfficeDocumentBuilder.java +++ b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/internal/builder/DefaultXHTMLOfficeDocumentBuilder.java @@ -25,6 +25,7 @@ import java.io.InputStreamReader; import java.io.Reader; import java.nio.charset.Charset; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -82,7 +83,7 @@ @Override public XHTMLOfficeDocument build(InputStream officeFileStream, String officeFileName, DocumentReference reference, - boolean filterStyles) throws OfficeImporterException + Map parameters) throws OfficeImporterException { // Invoke the office document converter. Map inputStreams = new HashMap(); @@ -98,16 +99,29 @@ public XHTMLOfficeDocument build(InputStream officeFileStream, String officeFile } // Prepare the parameters for HTML cleaning. - Map params = new HashMap(); - params.put("targetDocument", this.entityReferenceSerializer.serialize(reference)); - if (filterStyles) { - params.put("filterStyles", "strict"); + Map cleaningParameters = new HashMap(); + cleaningParameters.put("targetDocument", this.entityReferenceSerializer.serialize(reference)); + if (parameters.containsKey("filterStyles")) { + boolean filterStyles = (Boolean) parameters.get("filterStyles"); + if (filterStyles) { + cleaningParameters.put("filterStyles", "strict"); + } } + // Truncate HTML to leave only the number of bytes defined by the user + byte[] htmlBytes = artifacts.remove(outputFileName); + if (parameters.containsKey("bytes")) { + int bytes = (Integer) parameters.get("bytes"); + if (bytes > 0) { + htmlBytes = Arrays.copyOf(htmlBytes, bytes); + } + } + + // Parse and clean the HTML output. HTMLCleanerConfiguration configuration = this.officeHtmlCleaner.getDefaultConfiguration(); - configuration.setParameters(params); - Reader html = getReader(artifacts.remove(outputFileName)); + configuration.setParameters(cleaningParameters); + Reader html = getReader(htmlBytes); Document xhtmlDoc = this.officeHtmlCleaner.clean(html, configuration); // Return a new XHTMLOfficeDocument instance. diff --git a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/script/OfficeImporterScriptService.java b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/script/OfficeImporterScriptService.java index cf3c088..08d0d89 100644 --- a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/script/OfficeImporterScriptService.java +++ b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/main/java/org/xwiki/officeimporter/script/OfficeImporterScriptService.java @@ -20,6 +20,7 @@ package org.xwiki.officeimporter.script; import java.io.InputStream; +import java.util.Collections; import java.util.Map; import javax.inject.Inject; @@ -145,7 +146,8 @@ public XHTMLOfficeDocument officeToXHTML(InputStream officeFileStream, String of { try { assertConnected(); - return this.xhtmlBuilder.build(officeFileStream, officeFileName, targetDocumentReference, filterStyles); + return this.xhtmlBuilder.build(officeFileStream, officeFileName, targetDocumentReference, + Collections.singletonMap("filterStyles", filterStyles)); } catch (Exception ex) { setErrorMessage(ex.getMessage()); logger.error(ex.getMessage(), ex); @@ -214,7 +216,8 @@ public XDOMOfficeDocument officeToXDOM(InputStream officeFileStream, String offi if (isPresentation(officeFileName)) { return this.presentationBuilder.build(officeFileStream, officeFileName, targetDocumentReference); } else { - return this.xdomBuilder.build(officeFileStream, officeFileName, targetDocumentReference, filterStyles); + return this.xdomBuilder.build(officeFileStream, officeFileName, targetDocumentReference, + Collections.singletonMap("filterStyles", filterStyles)); } } catch (Exception ex) { setErrorMessage(ex.getMessage()); diff --git a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/test/java/org/xwiki/officeimporter/internal/builder/DefaultXDOMOfficeDocumentBuilderTest.java b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/test/java/org/xwiki/officeimporter/internal/builder/DefaultXDOMOfficeDocumentBuilderTest.java index bbcb32e..af07f3a 100644 --- a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/test/java/org/xwiki/officeimporter/internal/builder/DefaultXDOMOfficeDocumentBuilderTest.java +++ b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/test/java/org/xwiki/officeimporter/internal/builder/DefaultXDOMOfficeDocumentBuilderTest.java @@ -23,6 +23,7 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -99,8 +100,8 @@ public void testXDOMOfficeDocumentBuilding() throws Exception } }); - XDOMOfficeDocument document = - xdomOfficeDocumentBuilder.build(mockOfficeFileStream, INPUT_FILE_NAME, documentReference, true); + XDOMOfficeDocument document = xdomOfficeDocumentBuilder.build(mockOfficeFileStream, INPUT_FILE_NAME, + documentReference, Collections.singletonMap("filterStyles", true)); assertEquals("xwiki:Main.Test", document.getContentDocument().getMetaData().getMetaData(MetaData.BASE)); assertEquals("**Hello There**", document.getContentAsString()); assertEquals(0, document.getArtifacts().size()); diff --git a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/test/java/org/xwiki/officeimporter/internal/builder/DefaultXHTMLOfficeDocumentBuilderTest.java b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/test/java/org/xwiki/officeimporter/internal/builder/DefaultXHTMLOfficeDocumentBuilderTest.java index 016007c..81a5fc3 100644 --- a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/test/java/org/xwiki/officeimporter/internal/builder/DefaultXHTMLOfficeDocumentBuilderTest.java +++ b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-importer/src/test/java/org/xwiki/officeimporter/internal/builder/DefaultXHTMLOfficeDocumentBuilderTest.java @@ -21,6 +21,7 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -111,8 +112,8 @@ public void testXHTMLOfficeDocumentBuilding() throws Exception } }); - OfficeDocument document = - xhtmlDocumentBuilder.build(mockOfficeFileStream, INPUT_FILE_NAME, documentReference, true); + OfficeDocument document = xhtmlDocumentBuilder.build(mockOfficeFileStream, INPUT_FILE_NAME, documentReference, + Collections.singletonMap("filterStyles", true)); assertNotNull(document.getContentDocument()); assertEquals(0, document.getArtifacts().size()); } diff --git a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-macro/src/main/java/org/xwiki/rendering/internal/macro/office/OfficeMacro.java b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-macro/src/main/java/org/xwiki/rendering/internal/macro/office/OfficeMacro.java index 5386e6e..68f4c79 100644 --- a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-macro/src/main/java/org/xwiki/rendering/internal/macro/office/OfficeMacro.java +++ b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-macro/src/main/java/org/xwiki/rendering/internal/macro/office/OfficeMacro.java @@ -29,6 +29,7 @@ import org.apache.commons.lang3.StringUtils; import org.xwiki.component.annotation.Component; +import org.xwiki.configuration.ConfigurationSource; import org.xwiki.model.reference.AttachmentReference; import org.xwiki.model.reference.AttachmentReferenceResolver; import org.xwiki.model.reference.DocumentReference; @@ -77,6 +78,9 @@ @Inject private EntityReferenceSerializer serializer; + @Inject + private ConfigurationSource configurationSource; + /** * Default constructor. */ @@ -98,6 +102,16 @@ public OfficeMacro() viewParameters.put("filterStyles", parameters.isFilterStyles()); viewParameters.put("ownerDocument", getOwnerDocument(context.getCurrentMacroBlock())); + // First, check if there's a configured "bytes" parameters and use it if so. + int bytes = parameters.getBytes(); + if (parameters.getBytes() < 0) { + // If not, check the configuration parameter + bytes = this.configurationSource.getProperty("openoffice.macro.bytes", new Integer(-1)); + } + if (bytes > 0) { + viewParameters.put("bytes", bytes); + } + try { return this.officeViewer.createView(resourceReference, viewParameters).getChildren(); } catch (Exception e) { diff --git a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-macro/src/main/java/org/xwiki/rendering/macro/office/OfficeMacroParameters.java b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-macro/src/main/java/org/xwiki/rendering/macro/office/OfficeMacroParameters.java index 6c66cc6..6defb7a 100644 --- a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-macro/src/main/java/org/xwiki/rendering/macro/office/OfficeMacroParameters.java +++ b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-macro/src/main/java/org/xwiki/rendering/macro/office/OfficeMacroParameters.java @@ -51,6 +51,11 @@ private boolean filterStyles = true; /** + * Number of bytes to display. If -1 then display the full content. + */ + private int bytes = -1; + + /** * @return a string reference to the office attachment to be viewed * @deprecated since 5.4.6, use {@link #getSource()} instead */ @@ -119,4 +124,15 @@ public void setFilterStyles(boolean filterStyles) { this.filterStyles = filterStyles; } + + @PropertyDescription("The number of bytes to display. If -1 then display the full content.") + public void setBytes(int bytes) + { + this.bytes = bytes; + } + + public int getBytes() + { + return this.bytes; + } } diff --git a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-viewer/src/main/java/org/xwiki/office/viewer/internal/DefaultOfficeResourceViewer.java b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-viewer/src/main/java/org/xwiki/office/viewer/internal/DefaultOfficeResourceViewer.java index 58a26fc..062281f 100644 --- a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-viewer/src/main/java/org/xwiki/office/viewer/internal/DefaultOfficeResourceViewer.java +++ b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-viewer/src/main/java/org/xwiki/office/viewer/internal/DefaultOfficeResourceViewer.java @@ -267,7 +267,7 @@ private XDOMOfficeDocument createXDOM(DocumentReference ownerDocument, InputStre return this.presentationBuilder.build(officeFileStream, officeFileName, ownerDocument); } else { boolean filterStyles = this.converter.convert(boolean.class, parameters.get("filterStyles")); - return this.documentBuilder.build(officeFileStream, officeFileName, ownerDocument, filterStyles); + return this.documentBuilder.build(officeFileStream, officeFileName, ownerDocument, parameters); } } finally { IOUtils.closeQuietly(officeFileStream); diff --git a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-viewer/src/test/java/org/xwiki/office/viewer/internal/DefaultOfficeResourceViewerTest.java b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-viewer/src/test/java/org/xwiki/office/viewer/internal/DefaultOfficeResourceViewerTest.java index c0eaeea..55014c3 100644 --- a/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-viewer/src/test/java/org/xwiki/office/viewer/internal/DefaultOfficeResourceViewerTest.java +++ b/xwiki-platform-core/xwiki-platform-office/xwiki-platform-office-viewer/src/test/java/org/xwiki/office/viewer/internal/DefaultOfficeResourceViewerTest.java @@ -216,7 +216,8 @@ public void testViewExistingOfficeAttachmentWithCacheMiss() throws Exception new XDOMOfficeDocument(new XDOM(new ArrayList()), new HashMap(), mocker); when( officeDocumentBuilder.build(attachmentContent, ATTACHMENT_REFERENCE.getName(), - ATTACHMENT_REFERENCE.getDocumentReference(), false)).thenReturn(xdomOfficeDocument); + ATTACHMENT_REFERENCE.getDocumentReference(), Collections.singletonMap("filterStyles", false))) + .thenReturn(xdomOfficeDocument); mocker.getComponentUnderTest().createView(ATTACHMENT_RESOURCE_REFERENCE, DEFAULT_VIEW_PARAMETERS); @@ -291,7 +292,8 @@ public void testViewANewVersionOfAnExistingOfficeAttachment() throws Exception new XDOMOfficeDocument(new XDOM(new ArrayList()), new HashMap(), mocker); when( officeDocumentBuilder.build(attachmentContent, ATTACHMENT_REFERENCE.getName(), - ATTACHMENT_REFERENCE.getDocumentReference(), false)).thenReturn(xdomOfficeDocument); + ATTACHMENT_REFERENCE.getDocumentReference(), Collections.singletonMap("filterStyles", false))) + .thenReturn(xdomOfficeDocument); Assert.assertNotNull(mocker.getComponentUnderTest().createView(ATTACHMENT_RESOURCE_REFERENCE, DEFAULT_VIEW_PARAMETERS));