blob: 78a2fd2324ad0e3d83c034cb1a4a903054bfb54e [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2017 Boeing
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Boeing - initial API and implementation
**********************************************************************/
package org.eclipse.osee.define.rest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.StreamingOutput;
import org.eclipse.osee.ats.api.AtsApi;
import org.eclipse.osee.define.api.MSWordOperations;
import org.eclipse.osee.define.api.PublishingOptions;
import org.eclipse.osee.define.api.WordTemplateContentData;
import org.eclipse.osee.define.api.WordUpdateChange;
import org.eclipse.osee.define.api.WordUpdateData;
import org.eclipse.osee.define.rest.internal.wordupdate.WordMLApplicabilityHandler;
import org.eclipse.osee.define.rest.internal.wordupdate.WordMlLinkHandler;
import org.eclipse.osee.define.rest.internal.wordupdate.WordTemplateContentRendererHandler;
import org.eclipse.osee.define.rest.internal.wordupdate.WordUpdateArtifact;
import org.eclipse.osee.define.rest.internal.wordupdate.WordUtilities;
import org.eclipse.osee.define.rest.publishing.SpecifiedTemplatePublisherStreamingOutput;
import org.eclipse.osee.framework.core.data.ArtifactId;
import org.eclipse.osee.framework.core.data.BranchId;
import org.eclipse.osee.framework.core.model.type.LinkType;
import org.eclipse.osee.framework.core.util.ReportConstants;
import org.eclipse.osee.framework.jdk.core.type.Pair;
import org.eclipse.osee.logger.Log;
import org.eclipse.osee.orcs.OrcsApi;
import org.osgi.service.event.EventAdmin;
/**
* @author Ryan D. Brooks
*/
public class MSWordOperationsImpl implements MSWordOperations {
private final OrcsApi orcsApi;
private final AtsApi atsApi;
private final Log logger;
private final EventAdmin eventAdmin;
public MSWordOperationsImpl(OrcsApi orcsApi, AtsApi atsApi, Log logger, EventAdmin eventAdmin) {
this.orcsApi = orcsApi;
this.atsApi = atsApi;
this.logger = logger;
this.eventAdmin = eventAdmin;
}
@Override
public Pair<String, Set<String>> renderWordTemplateContent(WordTemplateContentData data) {
WordTemplateContentRendererHandler wordRendererHandler = new WordTemplateContentRendererHandler(orcsApi, logger);
return wordRendererHandler.renderWordML(data);
}
@Override
public String renderPlainText(BranchId branchId, String data) {
String PL_STYLE_WITH_RETURN =
"<w:rPr><w:rStyle w:val=\"ProductLineApplicability\"((?=/>)(/>)|(.*?</w:rStyle>)).*?</w:rPr>";
String PL_STYLE = "<w:rStyle w:val=\"ProductLineApplicability\"((?=/>)(/>)|(.*?</w:rStyle>))";
String PL_HIGHLIGHT =
"<w:highlight w:val=\"light-gray\"></w:highlight><w:shd w:color=\"auto\" w:fill=\"BFBFBF\" w:val=\"clear\"></w:shd>";
String EMPTY_PARAGRAPHS = "<w:r wsp:rsidRPr=\"\\d+\"><w:t></w:t></w:r>";
Pattern REVIEW_COMMENT = Pattern.compile(
"<aml:annotation[^>]*w:type=\"Word.Comment.Start\"/?>(</aml:annotation>)?[\\s\\S]+?<aml:annotation[^>]*w:type=\"Word.Comment.End\"/?>(</aml:annotation>)?[\\s\\S]+?</aml:annotation></w:r>");
data = WordUtilities.reassignBinDataID(data);
data = WordMlLinkHandler.renderPlainTextWithoutLinks(orcsApi.getQueryFactory(), branchId, data);
data = WordUtilities.reassignBookMarkID(data);
data = WordUtilities.removeNewLines(data);
// if no extra paragraphs have been added this will replace the normal footer
data = data.replaceAll(ReportConstants.ENTIRE_FTR_EXTRA_PARA, "");
data = data.replaceAll(ReportConstants.ENTIRE_FTR, "");
data = data.replaceAll(ReportConstants.EMPTY_SECTION_BREAK, ReportConstants.PAGE_BREAK);
data = data.replaceAll(ReportConstants.NO_DATA_RIGHTS, "");
if (!data.contains("<w:tbl>")) {
int lastIndex = data.lastIndexOf("<w:p wsp:rsidR=");
if (lastIndex != -1) {
// temp should equal <w:p wsp:rsidR ..</w:p> ...
String temp = data.substring(lastIndex);
temp = temp.replaceAll("<w:p\\s[^>]*>(<w:pPr><w:spacing[^>]*></w:spacing></w:pPr>)?</w:p>", "");
data = data.substring(0, lastIndex) + temp;
}
}
data = data.replaceAll(PL_STYLE_WITH_RETURN, "");
data = data.replaceAll(PL_STYLE, "");
data = data.replaceAll(PL_HIGHLIGHT, "");
data = data.replaceAll(EMPTY_PARAGRAPHS, "");
Matcher commentMatch = REVIEW_COMMENT.matcher(data);
if (commentMatch.find()) {
data = data.replaceAll(ReportConstants.WORD_COMMENT_START, "");
data = data.replaceAll(ReportConstants.WORD_COMMENT_END, "");
data = data.replaceAll(ReportConstants.WORD_COMMENT, "");
}
return data;
}
@Override
public String renderWordTemplateContentWithApplicability(BranchId branchId, ArtifactId viewId, String data) {
WordMLApplicabilityHandler wordHandler = new WordMLApplicabilityHandler(orcsApi, logger, branchId, viewId);
return wordHandler.previewValidApplicabilityContent(data);
}
@Override
public WordUpdateChange updateWordArtifacts(WordUpdateData data) {
WordUpdateArtifact updateArt = new WordUpdateArtifact(logger, orcsApi, eventAdmin);
return updateArt.updateArtifacts(data);
}
@Override
public Response msWordTemplatePublish(BranchId branch, ArtifactId template, ArtifactId headArtifact, ArtifactId view) {
//Generate filename with the headArtifact name and current time
String name = orcsApi.getQueryFactory().fromBranch(branch).andId(headArtifact).asArtifact().getName();
SimpleDateFormat format = new SimpleDateFormat("MM-dd_HH-mm-ss");
Date date = new Date(System.currentTimeMillis());
String time = format.format(date);
String fileName = name + "_" + time + ".xml";
PublishingOptions publishingOptions = new PublishingOptions();
publishingOptions.branch = branch;
publishingOptions.linkType = LinkType.INTERNAL_DOC_REFERENCE_USE_NAME;
publishingOptions.excludeFolders = true;
publishingOptions.view = view;
StreamingOutput streamingOutput =
new SpecifiedTemplatePublisherStreamingOutput(publishingOptions, template, headArtifact, orcsApi, atsApi);
ResponseBuilder builder = Response.ok(streamingOutput);
builder.header("Content-Disposition", "attachment; filename=" + fileName);
return builder.build();
}
}