Skip to content

Commit

Permalink
FIPS-9783/FIPS-10074 :: mark files or projects causing exceptions in …
Browse files Browse the repository at this point in the history
…the build

Change-Id: Iaf2ee8e63ccae5a20eff5748ef303fc5b2bf0b89
  • Loading branch information
hookyAt committed May 8, 2024
1 parent a166879 commit 109f242
Show file tree
Hide file tree
Showing 6 changed files with 249 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,51 +43,60 @@
<booleanAttribute key="run_in_ui_thread" value="true"/>
<setAttribute key="selected_target_bundles">
<setEntry value="bcpg@default:default"/>
<setEntry value="bcpkix@default:default"/>
<setEntry value="bcprov@default:default"/>
<setEntry value="com.google.guava@default:default"/>
<setEntry value="bcutil@default:default"/>
<setEntry value="com.google.gson@default:default"/>
<setEntry value="com.google.guava*32.1.3.jre@default:default"/>
<setEntry value="com.google.guava.failureaccess@default:default"/>
<setEntry value="com.googlecode.javaewah.JavaEWAH@default:default"/>
<setEntry value="com.ibm.icu@default:default"/>
<setEntry value="com.jcraft.jsch@default:default"/>
<setEntry value="com.opencsv@default:default"/>
<setEntry value="com.sun.activation.javax.activation@default:default"/>
<setEntry value="com.sun.jna.platform@default:default"/>
<setEntry value="com.sun.jna@default:default"/>
<setEntry value="com.sun.xml.bind.jaxb-osgi@default:default"/>
<setEntry value="javaewah@default:default"/>
<setEntry value="jakarta.activation-api@default:default"/>
<setEntry value="jakarta.annotation-api@default:default"/>
<setEntry value="jakarta.inject.jakarta.inject-api@default:default"/>
<setEntry value="javax.annotation@default:default"/>
<setEntry value="javax.inject@default:default"/>
<setEntry value="javax.xml@default:default"/>
<setEntry value="jaxb-api@default:default"/>
<setEntry value="jaxen@default:default"/>
<setEntry value="joda-time@default:default"/>
<setEntry value="net.bytebuddy.byte-buddy*1.14.9@default:default"/>
<setEntry value="net.bytebuddy.byte-buddy-agent@default:default"/>
<setEntry value="net.bytebuddy.byte-buddy@default:default"/>
<setEntry value="net.i2p.crypto.eddsa@default:default"/>
<setEntry value="org.apache.ant@default:default"/>
<setEntry value="org.apache.batik.constants@default:default"/>
<setEntry value="org.apache.batik.css@default:default"/>
<setEntry value="org.apache.batik.i18n@default:default"/>
<setEntry value="org.apache.batik.util@default:default"/>
<setEntry value="org.apache.commons.cli@default:default"/>
<setEntry value="org.apache.commons.codec@default:default"/>
<setEntry value="org.apache.commons.collections@default:default"/>
<setEntry value="org.apache.commons.collections*3.2.2.v201511171945@default:default"/>
<setEntry value="org.apache.commons.commons-beanutils@default:default"/>
<setEntry value="org.apache.commons.commons-codec@default:default"/>
<setEntry value="org.apache.commons.commons-collections4@default:default"/>
<setEntry value="org.apache.commons.commons-io@default:default"/>
<setEntry value="org.apache.commons.commons-io*2.15.0@default:default"/>
<setEntry value="org.apache.commons.commons-text@default:default"/>
<setEntry value="org.apache.commons.jxpath@default:default"/>
<setEntry value="org.apache.commons.lang3@default:default"/>
<setEntry value="org.apache.commons.lang3*3.13.0@default:default"/>
<setEntry value="org.apache.commons.logging@default:default"/>
<setEntry value="org.apache.felix.gogo.runtime@default:default"/>
<setEntry value="org.apache.felix.gogo.shell@default:default"/>
<setEntry value="org.apache.felix.scr@1:true"/>
<setEntry value="org.apache.httpcomponents.httpclient@default:default"/>
<setEntry value="org.apache.httpcomponents.httpcore@default:default"/>
<setEntry value="org.apache.lucene.analyzers-common@default:default"/>
<setEntry value="org.apache.lucene.analyzers-smartcn@default:default"/>
<setEntry value="org.apache.lucene.analysis-common@default:default"/>
<setEntry value="org.apache.lucene.analysis-smartcn@default:default"/>
<setEntry value="org.apache.lucene.core@default:default"/>
<setEntry value="org.apache.sshd.osgi@default:default"/>
<setEntry value="org.apache.sshd.sftp@default:default"/>
<setEntry value="org.apache.xerces@default:default"/>
<setEntry value="org.apache.xml.resolver@default:default"/>
<setEntry value="org.apache.xml.serializer@default:default"/>
<setEntry value="org.apache.xmlgraphics@default:default"/>
<setEntry value="org.eclipse.ant.core@default:default"/>
<setEntry value="org.eclipse.ant.launching@default:default"/>
Expand Down Expand Up @@ -183,8 +192,7 @@
<setEntry value="org.eclipse.help.base@default:default"/>
<setEntry value="org.eclipse.help.ui@default:default"/>
<setEntry value="org.eclipse.help@default:default"/>
<setEntry value="org.eclipse.jdt.compiler.apt@default:false"/>
<setEntry value="org.eclipse.jdt.compiler.tool@default:false"/>
<setEntry value="org.eclipse.jdt.core.compiler.batch@default:default"/>
<setEntry value="org.eclipse.jdt.core.manipulation@default:default"/>
<setEntry value="org.eclipse.jdt.core@default:default"/>
<setEntry value="org.eclipse.jdt.debug.ui@default:default"/>
Expand All @@ -195,7 +203,6 @@
<setEntry value="org.eclipse.jdt.junit@default:default"/>
<setEntry value="org.eclipse.jdt.launching@default:default"/>
<setEntry value="org.eclipse.jdt.ui@default:default"/>
<setEntry value="org.eclipse.jem.util@default:default"/>
<setEntry value="org.eclipse.jface.databinding@default:default"/>
<setEntry value="org.eclipse.jface.text@default:default"/>
<setEntry value="org.eclipse.jface@default:default"/>
Expand All @@ -206,7 +213,10 @@
<setEntry value="org.eclipse.jsch.core@default:default"/>
<setEntry value="org.eclipse.ltk.core.refactoring@default:default"/>
<setEntry value="org.eclipse.ltk.ui.refactoring@default:default"/>
<setEntry value="org.eclipse.m2e.archetype.catalog@default:default"/>
<setEntry value="org.eclipse.m2e.archetype.common@default:default"/>
<setEntry value="org.eclipse.m2e.archetype.descriptor@default:default"/>
<setEntry value="org.eclipse.m2e.archetype.maven-artifact-transfer@default:default"/>
<setEntry value="org.eclipse.m2e.core.ui@default:default"/>
<setEntry value="org.eclipse.m2e.core@default:default"/>
<setEntry value="org.eclipse.m2e.maven.runtime@default:default"/>
Expand All @@ -216,13 +226,8 @@
<setEntry value="org.eclipse.osgi.services@default:default"/>
<setEntry value="org.eclipse.osgi.util@default:default"/>
<setEntry value="org.eclipse.osgi@-1:true"/>
<setEntry value="org.eclipse.pde.build@default:default"/>
<setEntry value="org.eclipse.pde.core@default:default"/>
<setEntry value="org.eclipse.pde.launching@default:default"/>
<setEntry value="org.eclipse.pde.runtime@default:default"/>
<setEntry value="org.eclipse.pde.ui@default:default"/>
<setEntry value="org.eclipse.pde@default:default"/>
<setEntry value="org.eclipse.platform@default:default"/>
<setEntry value="org.eclipse.search.core@default:default"/>
<setEntry value="org.eclipse.search@default:default"/>
<setEntry value="org.eclipse.swt.gtk.linux.x86_64@default:false"/>
<setEntry value="org.eclipse.swt@default:default"/>
Expand All @@ -240,7 +245,6 @@
<setEntry value="org.eclipse.ui.intro@default:default"/>
<setEntry value="org.eclipse.ui.navigator.resources@default:default"/>
<setEntry value="org.eclipse.ui.navigator@default:default"/>
<setEntry value="org.eclipse.ui.trace@default:default"/>
<setEntry value="org.eclipse.ui.views.log@default:default"/>
<setEntry value="org.eclipse.ui.views.properties.tabbed@default:default"/>
<setEntry value="org.eclipse.ui.views@default:default"/>
Expand All @@ -253,18 +257,15 @@
<setEntry value="org.eclipse.wst.common.emf@default:default"/>
<setEntry value="org.eclipse.wst.common.environment@default:default"/>
<setEntry value="org.eclipse.wst.common.frameworks@default:default"/>
<setEntry value="org.eclipse.wst.common.project.facet.core@default:default"/>
<setEntry value="org.eclipse.wst.common.uriresolver@default:default"/>
<setEntry value="org.eclipse.wst.sse.core@default:default"/>
<setEntry value="org.eclipse.wst.validation@default:default"/>
<setEntry value="org.eclipse.wst.xml.core@default:default"/>
<setEntry value="org.eclipse.wst.xsd.core@default:default"/>
<setEntry value="org.eclipse.xsd@default:default"/>
<setEntry value="org.eclipse.xtend.lib.macro@default:default"/>
<setEntry value="org.eclipse.xtend.lib@default:default"/>
<setEntry value="org.eclipse.xtext.xbase.lib@default:default"/>
<setEntry value="org.hamcrest.core*1.3.0.zz-NO-SPLIT_PCK-v201303031735@default:default"/>
<setEntry value="org.hamcrest@default:default"/>
<setEntry value="org.jdom2@default:default"/>
<setEntry value="org.junit@default:default"/>
<setEntry value="org.mockito.mockito-core@default:default"/>
<setEntry value="org.objenesis@default:default"/>
Expand All @@ -276,7 +277,6 @@
<setEntry value="org.osgi.service.metatype@default:default"/>
<setEntry value="org.osgi.service.prefs@default:default"/>
<setEntry value="org.osgi.service.provisioning@default:default"/>
<setEntry value="org.osgi.service.repository@default:default"/>
<setEntry value="org.osgi.service.upnp@default:default"/>
<setEntry value="org.osgi.service.useradmin@default:default"/>
<setEntry value="org.osgi.service.wireadmin@default:default"/>
Expand All @@ -287,13 +287,12 @@
<setEntry value="org.osgi.util.xml@default:default"/>
<setEntry value="org.sat4j.core@default:default"/>
<setEntry value="org.sat4j.pb@default:default"/>
<setEntry value="org.slf4j.api@default:default"/>
<setEntry value="org.tukaani.xz@default:default"/>
<setEntry value="org.w3c.css.sac@default:default"/>
<setEntry value="org.w3c.dom.events@default:default"/>
<setEntry value="org.w3c.dom.smil@default:default"/>
<setEntry value="org.w3c.dom.svg@default:default"/>
<setEntry value="slf4j.api@default:default"/>
<setEntry value="slf4j.api*1.7.36@default:default"/>
<setEntry value="slf4j.nop@default:default"/>
<setEntry value="spotbugs-annotations@default:default"/>
</setAttribute>
Expand All @@ -302,11 +301,13 @@
<setEntry value="org.faktorips.devtools.abstraction.eclipse@default:true"/>
<setEntry value="org.faktorips.devtools.abstraction.plainjava@default:default"/>
<setEntry value="org.faktorips.devtools.abstraction@default:true"/>
<setEntry value="org.faktorips.devtools.model.builder@default:default"/>
<setEntry value="org.faktorips.devtools.model.eclipse.test@default:false"/>
<setEntry value="org.faktorips.devtools.model.eclipse@default:true"/>
<setEntry value="org.faktorips.devtools.model.plainjava@default:default"/>
<setEntry value="org.faktorips.devtools.model@default:true"/>
<setEntry value="org.faktorips.dtflcommon@default:default"/>
<setEntry value="org.faktorips.eclipse.emf.codegen@default:default"/>
<setEntry value="org.faktorips.fl@default:default"/>
<setEntry value="org.faktorips.runtime@default:default"/>
<setEntry value="org.faktorips.testsupport@default:default"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
import java.util.Map;
import java.util.Set;
import java.util.SortedSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
Expand Down Expand Up @@ -71,6 +73,7 @@
import org.faktorips.runtime.MessageList;
import org.faktorips.runtime.ObjectProperty;
import org.faktorips.runtime.Severity;
import org.faktorips.runtime.internal.IpsStringUtils;
import org.faktorips.util.MultiMap;

/**
Expand All @@ -89,6 +92,11 @@ public class IpsBuilder {

public static final boolean TRACE_BUILDER_TRACE;

private static final String BUILD_ERROR_MSG_CODE = "BUILD_ERROR";

private static final Pattern EXCEPTION_WHILE_BUILDING_REGEX = Pattern
.compile("^(\\w+): Error during: (?:Build file|Delete file) ([\\w\\W]+).$", Pattern.DOTALL);

private final ABuilder builder;

static {
Expand Down Expand Up @@ -158,12 +166,19 @@ public Set<AProject> build(ABuildKind kind, IProgressMonitor monitor) {
return builder.getProject().getReferencedProjects();
}

Abstractions.getLog().log(buildStatus);
IStatus actualStatus = buildStatus;
while (actualStatus instanceof MultiStatus multiStatus && multiStatus.getChildren().length == 1) {
actualStatus = multiStatus.getChildren()[0];
}

Abstractions.getLog().log(actualStatus);

// Re-initialize the builders of the current builder set if an error occurs.
getIpsProject().reinitializeIpsArtefactBuilderSet();

throw new CoreException(buildStatus);
createMarkersFromBuildStatus(actualStatus, IpsBuilder.PROBLEM_MARKER);

throw new CoreException(actualStatus);

} catch (OperationCanceledException e) {
getIpsProject().reinitializeIpsArtefactBuilderSet();
Expand All @@ -181,6 +196,70 @@ public Set<AProject> build(ABuildKind kind, IProgressMonitor monitor) {
return builder.getProject().getReferencedProjects();
}

public void createMarkersFromBuildStatus(IStatus buildStatus, String markerType) {
Map<AResource, MessageList> errors = new HashMap<>();
for (IpsStatus ipsStatus : getIpsErrors(buildStatus)) {
if (ipsStatus.getMessage().contains("BuildProcessCmd[kind=")) {
preOrPostBuildErrors(errors, ipsStatus);
continue;
}
Matcher regexMatcher = EXCEPTION_WHILE_BUILDING_REGEX.matcher(ipsStatus.getMessage());
if (regexMatcher.find()) {
buildOrDeleteErrors(errors, ipsStatus, regexMatcher);
}
}
errors.forEach((resource, ml) -> {
ml.wrapUpMessages(BUILD_ERROR_MSG_CODE);
createMarkersFromMessageList(resource, ml, markerType);
});
}

private void buildOrDeleteErrors(Map<AResource, MessageList> errors, IpsStatus ipsStatus, Matcher regexMatcher) {
String builderName = regexMatcher.group(1);
String ipsSrcFile = regexMatcher.group(2);
AResource member = getIpsProject().getProject().getWorkspace().getRoot().findMember(ipsSrcFile);
if (member != null) {
MessageList ml = errors.computeIfAbsent(member, $ -> new MessageList());
if (ipsStatus.getException() != null) {
ml.add(Message.newError(BUILD_ERROR_MSG_CODE,
MessageFormat.format(
Messages.IpsBuilder_msgExceptionWhileBuildingWithFile,
builderName,
extractExceptionMessage(ipsStatus.getException()))));
} else {
ml.add(Message.newError(BUILD_ERROR_MSG_CODE, ipsStatus.getMessage()));
}
}
}

private void preOrPostBuildErrors(Map<AResource, MessageList> errors, IpsStatus ipsStatus) {
MessageList ml = errors.computeIfAbsent(getIpsProject().getProject(), $ -> new MessageList());
if (ipsStatus.getException() != null) {
ml.add(Message.newError(BUILD_ERROR_MSG_CODE,
MessageFormat.format(
Messages.IpsBuilder_msgExceptionWhileBuilding,
extractExceptionMessage(ipsStatus.getException()))));
} else {
ml.add(Message.newError(BUILD_ERROR_MSG_CODE, ipsStatus.getMessage()));
}
}

private String extractExceptionMessage(Throwable exception) {
return IpsStringUtils.isNotBlank(exception.getMessage()) ? exception.getMessage()
: exception.getClass().getName();
}

private List<IpsStatus> getIpsErrors(IStatus buildStatus) {
List<IpsStatus> errors = new ArrayList<>();
for (IStatus status : buildStatus.getChildren()) {
errors.addAll(getIpsErrors(status));
}
if (buildStatus instanceof IpsStatus ipsError) {
errors.add(ipsError);
}
return errors;
}

private IIpsArtefactBuilderSet getBuilderSetReInitialisedIfNecessary(IIpsProject project) {
Long timestamp = lastModificationTimestampForBuilderSets.get(project.getName());
if (timestamp == null) {
Expand Down Expand Up @@ -387,7 +466,9 @@ private void applyBuildCommand(IIpsArtefactBuilderSet currentBuilderSet,
}

private void addIpsStatus(IIpsArtefactBuilder builder, BuildCommand command, MultiStatus buildStatus, Exception e) {
String text = builder.getName() + ": Error during: " + command + "."; //$NON-NLS-1$ //$NON-NLS-2$
String localizedMessage = e.getLocalizedMessage();
String text = builder.getName() + ": Error during: " + command //$NON-NLS-1$
+ (IpsStringUtils.isNotBlank(localizedMessage) ? (": " + localizedMessage) : "."); //$NON-NLS-1$ //$NON-NLS-2$
buildStatus.add(new IpsStatus(text, e));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
/*******************************************************************************
* Copyright (c) Faktor Zehn GmbH - faktorzehn.org
*
*
* This source code is available under the terms of the AGPL Affero General Public License version
* 3.
*
*
* Please see LICENSE.txt for full license terms, including the additional permissions and
* restrictions as well as the possibility of alternative license terms.
*******************************************************************************/
Expand All @@ -27,6 +27,8 @@ private Messages() {
public static String IpsBuilder_ipsSrcFileNotParsable;
public static String IpsBuilder_missingManifestMf;
public static String IpsBuilder_msgExceptionWhileBuildingDependentProjects;
public static String IpsBuilder_msgExceptionWhileBuilding;
public static String IpsBuilder_msgExceptionWhileBuildingWithFile;
public static String IpsBuilder_msgBuildResults;
public static String IpsBuilder_msgInvalidProperties;
public static String IpsBuilder_validatingProject;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,7 @@ IpsBuilder_deleting=Deleting
IpsBuilder_msgInvalidProperties=The project can''t be build until its properties are valid.
IpsBuilder_startIncrementalBuild=Start incremental build.
IpsBuilder_ipsSrcFileNotParsable=This file is erroneous. The content of this file is not parsable.
IpsBuilder_msgExceptionWhileBuilding=While building this project an exception occurred: {0}
IpsBuilder_msgExceptionWhileBuildingWithFile=While building this file with the {0} an exception occurred: {1}
IpsBuilder_msgExceptionWhileBuildingDependentProjects=An exception occurred during an incremental build, while building the dependent project
IpsLoggingFrameworkConnectorPropertyDef_Deprecated=The property 'org.faktorips.devtools.model.loggingFrameworkConnector' is no longer used by Faktor-IPS and will be removed in a future version. Please set the value to 'None' to get rid of this warning.

0 comments on commit 109f242

Please sign in to comment.