Skip to content

Commit

Permalink
Generates the P2Artifact after binary is published
Browse files Browse the repository at this point in the history
Currently we generate the P2Artifact (+ IArtifactDescriptor) at time
where the output stream is requested, that has the problem that the file
actually do not exits at this point and we can not calculate the
checksum for feature root artifacts.

This postpones the creation to the stage where the file is already
published.
  • Loading branch information
laeubi committed Dec 5, 2023
1 parent 9b4de36 commit 81def04
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,24 +14,26 @@

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;

import org.eclipse.equinox.internal.p2.artifact.repository.simple.SimpleArtifactDescriptor;
import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.metadata.IArtifactKey;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.publisher.IPublisherAdvice;
import org.eclipse.equinox.p2.publisher.PublisherInfo;
import org.eclipse.equinox.p2.publisher.actions.IPropertyAdvice;
import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor;
import org.eclipse.equinox.p2.repository.artifact.spi.ArtifactDescriptor;
import org.eclipse.equinox.spi.p2.publisher.PublisherHelper;
import org.eclipse.tycho.TychoConstants;
import org.eclipse.tycho.p2.metadata.IP2Artifact;
Expand All @@ -41,11 +43,19 @@
import org.eclipse.tycho.p2maven.advices.MavenPropertiesAdvice;

public class FeatureRootfileArtifactRepository extends TransientArtifactRepository {
//for backward compatibility
@SuppressWarnings("deprecation")
private static final String PROP_EXTENSION = TychoConstants.PROP_EXTENSION;

private final File outputDirectory;

private final PublisherInfo publisherInfo;

private Map<String, IP2Artifact> publishedArtifacts = new HashMap<>();
private Map<File, IArtifactKey> artifactsToPublish = new HashMap<>();

private Map<String, IP2Artifact> collect;

private List<IArtifactDescriptor> temp = new ArrayList<>();

public FeatureRootfileArtifactRepository(PublisherInfo publisherInfo, File outputDirectory) {
this.publisherInfo = publisherInfo;
Expand All @@ -56,8 +66,18 @@ public FeatureRootfileArtifactRepository(PublisherInfo publisherInfo, File outpu
public OutputStream getOutputStream(IArtifactDescriptor descriptor) throws ProvisionException {
IArtifactKey artifactKey = descriptor.getArtifactKey();
if (artifactKey != null && PublisherHelper.BINARY_ARTIFACT_CLASSIFIER.equals(artifactKey.getClassifier())) {
if (!publisherInfo
.getAdvice(null, false, artifactKey.getId(), artifactKey.getVersion(), IPropertyAdvice.class)
.stream().anyMatch(advice -> advice instanceof MavenPropertiesAdvice)) {
throw new ProvisionException("MavenPropertiesAdvice does not exist for artifact: " + artifactKey);
}
File outputFile = new File(this.outputDirectory, artifactKey.getId() + "-" + artifactKey.getVersion() + "-"
+ TychoConstants.ROOTFILE_CLASSIFIER + "." + TychoConstants.ROOTFILE_EXTENSION);
try {
return createRootfileOutputStream(artifactKey);
temp.add(descriptor);
descriptors.add(descriptor);
artifactsToPublish.put(outputFile, artifactKey);
return new BufferedOutputStream(new FileOutputStream(outputFile));
} catch (IOException e) {
throw new ProvisionException(e.getMessage(), e);
}
Expand All @@ -66,52 +86,6 @@ public OutputStream getOutputStream(IArtifactDescriptor descriptor) throws Provi
return super.getOutputStream(descriptor);
}

private OutputStream createRootfileOutputStream(IArtifactKey artifactKey) throws ProvisionException, IOException {
File outputFile = new File(this.outputDirectory, artifactKey.getId() + "-" + artifactKey.getVersion() + "-"
+ TychoConstants.ROOTFILE_CLASSIFIER + "." + TychoConstants.ROOTFILE_EXTENSION);

OutputStream target = null;
try {
SimpleArtifactDescriptor simpleArtifactDescriptor = (SimpleArtifactDescriptor) createArtifactDescriptor(
artifactKey);

Collection<IPropertyAdvice> advices = publisherInfo.getAdvice(null, false,
simpleArtifactDescriptor.getArtifactKey().getId(),
simpleArtifactDescriptor.getArtifactKey().getVersion(), IPropertyAdvice.class);

boolean mavenPropAdviceExists = false;
for (IPropertyAdvice entry : advices) {
if (entry instanceof MavenPropertiesAdvice) {
mavenPropAdviceExists = true;
entry.getArtifactProperties(null, simpleArtifactDescriptor);
}
}

if (!mavenPropAdviceExists) {
throw new ProvisionException(
"MavenPropertiesAdvice does not exist for artifact: " + simpleArtifactDescriptor);
}

String mavenArtifactClassifier = getRootFileArtifactClassifier(
simpleArtifactDescriptor.getArtifactKey().getId());
simpleArtifactDescriptor.setProperty(TychoConstants.PROP_CLASSIFIER, mavenArtifactClassifier);
//Type and extension are the same for rootfiles ...
simpleArtifactDescriptor.setProperty(TychoConstants.PROP_EXTENSION, TychoConstants.ROOTFILE_EXTENSION);
simpleArtifactDescriptor.setProperty(TychoConstants.PROP_TYPE, TychoConstants.ROOTFILE_EXTENSION);

target = new BufferedOutputStream(new FileOutputStream(outputFile));

this.publishedArtifacts.put(mavenArtifactClassifier,
new P2Artifact(outputFile, Collections.<IInstallableUnit> emptySet(), simpleArtifactDescriptor));

descriptors.add(simpleArtifactDescriptor);
} catch (FileNotFoundException e) {
throw new ProvisionException(e.getMessage(), e);
}

return target;
}

String getRootFileArtifactClassifier(String artifactId) {
List<IPublisherAdvice> adviceList = this.publisherInfo.getAdvice();

Expand All @@ -131,6 +105,35 @@ String getRootFileArtifactClassifier(String artifactId) {
}

public Map<String, IP2Artifact> getPublishedArtifacts() {
return publishedArtifacts;
if (collect == null) {
this.descriptors.removeAll(temp);
collect = artifactsToPublish.entrySet().stream().map(entry -> {
File outputFile = entry.getKey();
IArtifactKey artifactKey = entry.getValue();
IArtifactDescriptor artifactDescriptor = PublisherHelper.createArtifactDescriptor(publisherInfo,
artifactKey, outputFile);
Collection<IPropertyAdvice> advices = publisherInfo.getAdvice(null, false,
artifactDescriptor.getArtifactKey().getId(), artifactDescriptor.getArtifactKey().getVersion(),
IPropertyAdvice.class);

for (IPropertyAdvice advice : advices) {
if (advice instanceof MavenPropertiesAdvice) {
advice.getArtifactProperties(null, artifactDescriptor);
}
}
String mavenArtifactClassifier = getRootFileArtifactClassifier(
artifactDescriptor.getArtifactKey().getId());
if (artifactDescriptor instanceof ArtifactDescriptor impl) {
impl.setProperty(TychoConstants.PROP_CLASSIFIER, mavenArtifactClassifier);
//Type and extension are the same for rootfiles ...
impl.setProperty(PROP_EXTENSION, TychoConstants.ROOTFILE_EXTENSION);
impl.setProperty(TychoConstants.PROP_TYPE, TychoConstants.ROOTFILE_EXTENSION);
}
addDescriptor(artifactDescriptor);
return Map.entry(mavenArtifactClassifier,
new P2Artifact(outputFile, Collections.<IInstallableUnit> emptySet(), artifactDescriptor));
}).collect(Collectors.toMap(Entry::getKey, Entry::getValue));
}
return collect;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -107,11 +107,11 @@ public void testRepoWithInitEmptyAttachedArtifacts() {
}

private void assertMavenProperties(IArtifactDescriptor descriptor, String root) {
Assert.assertEquals(descriptor.getProperty("maven-groupId"), "artifactGroupId");
Assert.assertEquals(descriptor.getProperty("maven-artifactId"), "artifactId");
Assert.assertEquals(descriptor.getProperty("maven-version"), "artifactVersion");
Assert.assertEquals(descriptor.getProperty("maven-classifier"), root);
Assert.assertEquals(descriptor.getProperty("maven-extension"), "zip");
Assert.assertEquals("artifactGroupId", descriptor.getProperty("maven-groupId"));
Assert.assertEquals("artifactId", descriptor.getProperty("maven-artifactId"));
Assert.assertEquals("artifactVersion", descriptor.getProperty("maven-version"));
Assert.assertEquals(root, descriptor.getProperty("maven-classifier"));
Assert.assertEquals("zip", descriptor.getProperty("maven-extension"));
}

private void assertAttachedArtifact(Map<String, IP2Artifact> attachedArtifacts, int expectedSize,
Expand Down

0 comments on commit 81def04

Please sign in to comment.