blob: 3df13c035aa7a6201e2b9f5ae3a8e7049b29000a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 Boeing.
* 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:
* Boeing - initial API and implementation
*******************************************************************************/
package org.eclipse.osee.define.blam.operation;
import java.io.File;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.osee.framework.core.data.BranchId;
import org.eclipse.osee.framework.core.data.IArtifactType;
import org.eclipse.osee.framework.core.enums.CoreAttributeTypes;
import org.eclipse.osee.framework.jdk.core.type.HashCollection;
import org.eclipse.osee.framework.jdk.core.type.OseeCoreException;
import org.eclipse.osee.framework.jdk.core.type.ResultSet;
import org.eclipse.osee.framework.jdk.core.util.Strings;
import org.eclipse.osee.framework.jdk.core.util.io.xml.ExcelXmlWriter;
import org.eclipse.osee.framework.jdk.core.util.io.xml.ISheetWriter;
import org.eclipse.osee.framework.plugin.core.util.OseeData;
import org.eclipse.osee.framework.skynet.core.artifact.Artifact;
import org.eclipse.osee.framework.skynet.core.artifact.search.ArtifactQuery;
import org.eclipse.osee.framework.skynet.core.artifact.search.QueryBuilderArtifact;
import org.eclipse.osee.framework.skynet.core.linking.WordMlLinkHandler;
import org.eclipse.osee.framework.skynet.core.linking.WordMlLinkHandler.MatchRange;
import org.eclipse.osee.framework.ui.skynet.blam.AbstractBlam;
import org.eclipse.osee.framework.ui.skynet.blam.VariableMap;
import org.eclipse.swt.program.Program;
/**
* @author Megumi Telles
*/
public class FindErroneousEmbeddedLinksBlam extends AbstractBlam {
private static final String BRANCH = "Branch Input";
private static final String ARTIFACT_TYPES = "Artifact Types";
@Override
public String getXWidgetsXml() throws OseeCoreException {
StringBuilder builder = new StringBuilder();
builder.append(
String.format("<xWidgets><XWidget xwidgetType=\"XBranchSelectWidget\" displayName=\"%s\"/>", BRANCH));
builder.append(String.format(
"<XWidget xwidgetType=\"XArtifactTypeMultiChoiceSelect\" displayName=\"Artifact Types\" />", ARTIFACT_TYPES));
builder.append("</xWidgets>");
return builder.toString();
}
@Override
public String getDescriptionUsage() {
return "For a given branch, locate all WordTemplateContent attributes and list those artifacts with invalid hyperlinks";
}
@Override
public String getName() {
return "Find Erroneous Hyperlinks";
}
@Override
public void runOperation(VariableMap variableMap, IProgressMonitor monitor) throws Exception {
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss");
Date date = new Date();
File file = OseeData.getFile("INVALID_LINKS_" + dateFormat.format(date) + ".xml");
ISheetWriter excelWriter = new ExcelXmlWriter(file);
BranchId branch = variableMap.getBranch(BRANCH);
List<IArtifactType> artifactTypes = variableMap.getArtifactTypes(ARTIFACT_TYPES);
QueryBuilderArtifact queryBuilder = ArtifactQuery.createQueryBuilder(branch);
queryBuilder.andExists(CoreAttributeTypes.WordTemplateContent);
ResultSet<Artifact> arts = queryBuilder.getResults();
Iterator<Artifact> artIter = arts.iterator();
excelWriter.startSheet("Invalid Links", 6);
excelWriter.writeRow("Type", "Artifact", "Artifact Type", "Guid", "Subsystem", "Invalid Link Guid");
while (artIter.hasNext()) {
Artifact artifact = artIter.next();
if (artifact.isAttributeTypeValid(CoreAttributeTypes.WordTemplateContent) && //
isOfTypes(artifactTypes, artifact)) {
try {
String content = artifact.getSoleAttributeValueAsString(CoreAttributeTypes.WordTemplateContent, "");
if (Strings.isValid(content)) {
findIncorrectLinks(artifact, content, excelWriter);
}
} catch (OseeCoreException ex) {
logf("Artifact: [%s]: [%s]", artifact.getName(), ex);
}
}
artIter.remove();
}
excelWriter.endSheet();
excelWriter.endWorkbook();
Program.launch(file.getAbsolutePath());
}
private boolean isOfTypes(List<IArtifactType> artifactTypes, Artifact artifact) {
for (IArtifactType type : artifactTypes) {
if (artifact.isOfType(type)) {
return true;
}
}
return false;
}
private void findIncorrectLinks(Artifact artifact, String content, ISheetWriter excelWriter) throws IOException {
Set<String> unknownGuids = new HashSet<>();
HashCollection<String, MatchRange> errorMap = new HashCollection<>();
HashCollection<String, MatchRange> links = WordMlLinkHandler.getLinks(content, errorMap);
if (!links.isEmpty()) {
unknownGuids.addAll(links.keySet());
}
findInvalid(artifact, excelWriter, unknownGuids);
unknownGuids.clear();
if (!errorMap.isEmpty()) {
unknownGuids.addAll(errorMap.keySet());
}
findInvalid(artifact, excelWriter, unknownGuids);
}
private void findInvalid(Artifact artifact, ISheetWriter excelWriter, Set<String> unknownGuids) throws IOException {
Iterator<String> guidIter = unknownGuids.iterator();
while (guidIter.hasNext()) {
// Pointing to itself
String linkGuid = guidIter.next();
logLinksToSelf(artifact, linkGuid, excelWriter);
logInvalidGuidLink(artifact, linkGuid, excelWriter);
guidIter.remove();
}
}
private void logInvalidGuidLink(Artifact artifact, String linkGuid, ISheetWriter excelWriter) throws IOException {
try {
ArtifactQuery.getArtifactFromId(linkGuid, artifact.getBranch());
} catch (Exception e) {
String subsystem = artifact.getSoleAttributeValueAsString(CoreAttributeTypes.Subsystem, "");
excelWriter.writeRow("Invalid", artifact.getName(), artifact.getArtifactType().getName(), artifact.getGuid(),
subsystem, linkGuid);
}
}
private void logLinksToSelf(Artifact artifact, String linkGuid, ISheetWriter excelWriter) throws IOException {
String subsystem = artifact.getSoleAttributeValueAsString(CoreAttributeTypes.Subsystem, "");
if (linkGuid.equals(artifact.getGuid())) {
excelWriter.writeRow("Link to Self", artifact.getName(), artifact.getArtifactType().getName(),
artifact.getGuid(), subsystem, linkGuid);
}
}
@Override
public Collection<String> getCategories() {
return Collections.singletonList("Define.Publish.Check");
}
}