From 5e14005f87300a29d3124bc910973bf68acb8814 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=8A?=
=?UTF-8?q?=D1=80=20=D0=9A=D1=83=D1=80=D1=82=D0=B0=D0=BA=D0=BE=D0=B2?=
Date: Thu, 30 Mar 2023 13:30:21 +0300
Subject: [PATCH] Remove pack200 API
It's tracked in https://github.com/eclipse-equinox/p2/issues/238 .
This is first iteration removing the already non-functional API.
---
.../META-INF/MANIFEST.MF | 1 -
.../plugin.xml | 6 -
.../pack200/Pack200ProcessorStep.java | 64 --------
.../simple/SimpleArtifactRepository.java | 120 ++++++--------
.../internal/p2/jarprocessor/PackStep.java | 147 ------------------
.../p2/jarprocessor/PackUnpackStep.java | 60 -------
.../internal/p2/jarprocessor/UnpackStep.java | 65 --------
.../internal/p2/jarprocessor/Utils.java | 126 ++-------------
.../internal/p2/jarprocessor/pack-readme.html | 85 ----------
.../p2/jarprocessor/verifier/Verifier.java | 39 +----
.../equinox/p2/jarprocessor/JarProcessor.java | 91 +++--------
.../p2/jarprocessor/ant/JarProcessorTask.java | 17 +-
.../compatibility/IGeneratorConstants.java | 6 -
.../pde/internal/publishing/Utils.java | 13 +-
.../p2/publisher/ant/AbstractPublishTask.java | 17 +-
.../p2/publisher/AbstractPublisherAction.java | 71 +++++----
.../AbstractPublisherApplication.java | 34 ++--
.../equinox/p2/publisher/Publisher.java | 66 ++------
.../repository/mirroring/Mirroring.java | 27 ++--
.../repository/tools/MirrorApplication.java | 40 +++--
.../tools/RecreateRepositoryApplication.java | 25 ++-
.../repository/tools/Repo2Runnable.java | 62 ++++++--
.../repository/tools/tasks/MirrorTask.java | 5 +-
.../tools/tasks/ProcessRepoTask.java | 43 ++---
.../tools/tasks/Repo2RunnableTask.java | 17 +-
.../artifact/IArtifactDescriptor.java | 16 +-
.../META-INF/MANIFEST.MF | 1 -
.../equinox/p2/tests/ant/MirrorTaskTest.java | 17 +-
.../equinox/p2/tests/gc/GCCleanTest.java | 1 +
.../p2/tests/generator/GeneratorTests.java | 7 +-
.../mirror/ArtifactMirrorApplicationTest.java | 3 +-
.../NewMirrorApplicationArtifactTest.java | 3 +-
.../testData/mirror/mirrorRepo/artifacts.xml | 36 +++++
....core.filebuffers_3.4.0.v20080603-2000.jar | Bin 0 -> 112005 bytes
...osgi.services.source_3.1.200.v20071203.jar | Bin 0 -> 147113 bytes
.../p2/updatesite/DefaultSiteParser.java | 40 +++--
.../internal/p2/updatesite/SiteModel.java | 30 +---
37 files changed, 406 insertions(+), 995 deletions(-)
delete mode 100644 bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pack200/Pack200ProcessorStep.java
delete mode 100644 bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/PackStep.java
delete mode 100644 bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/PackUnpackStep.java
delete mode 100644 bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/UnpackStep.java
delete mode 100644 bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/pack-readme.html
create mode 100644 bundles/org.eclipse.equinox.p2.tests/testData/mirror/mirrorRepo/artifacts.xml
create mode 100644 bundles/org.eclipse.equinox.p2.tests/testData/mirror/mirrorRepo/plugins/org.eclipse.core.filebuffers_3.4.0.v20080603-2000.jar
create mode 100644 bundles/org.eclipse.equinox.p2.tests/testData/mirror/mirrorRepo/plugins/org.eclipse.osgi.services.source_3.1.200.v20071203.jar
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.artifact.repository/META-INF/MANIFEST.MF
index 928321ad65..e6ba563fd6 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/META-INF/MANIFEST.MF
@@ -9,7 +9,6 @@ Bundle-Localization: plugin
Export-Package: org.eclipse.equinox.internal.p2.artifact.processing;x-friends:="org.eclipse.equinox.p2.artifact.processors,org.eclipse.equinox.p2.artifact.optimizers",
org.eclipse.equinox.internal.p2.artifact.processors.checksum;x-friends:="org.eclipse.equinox.p2.publisher",
org.eclipse.equinox.internal.p2.artifact.processors.md5;x-internal:=true,
- org.eclipse.equinox.internal.p2.artifact.processors.pack200;x-friends:="org.eclipse.equinox.p2.artifact.processors,org.eclipse.equinox.p2.artifact.optimizers",
org.eclipse.equinox.internal.p2.artifact.processors.pgp;x-friends:="org.eclipse.equinox.p2.engine,org.eclipse.equinox.p2.ui.sdk,org.eclipse.equinox.p2.ui",
org.eclipse.equinox.internal.p2.artifact.repository;
x-friends:="org.eclipse.equinox.p2.publisher,
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/plugin.xml b/bundles/org.eclipse.equinox.p2.artifact.repository/plugin.xml
index c76afae803..8f02212972 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/plugin.xml
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/plugin.xml
@@ -6,12 +6,6 @@
-
-
-
-
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pack200/Pack200ProcessorStep.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pack200/Pack200ProcessorStep.java
deleted file mode 100644
index 1f21f0b4ab..0000000000
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pack200/Pack200ProcessorStep.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2018 compeople AG and others.
- *
- * This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * compeople AG (Stefan Liebig) - initial API and implementation
- * IBM Corporation - ongoing development
-* Mykola Nikishov - continuing development
- *******************************************************************************/
-package org.eclipse.equinox.internal.p2.artifact.processors.pack200;
-
-import java.io.*;
-import org.eclipse.equinox.internal.p2.artifact.processing.AbstractBufferingStep;
-import org.eclipse.equinox.internal.p2.jarprocessor.UnpackStep;
-import org.eclipse.internal.provisional.equinox.p2.jarprocessor.JarProcessorExecutor;
-import org.eclipse.internal.provisional.equinox.p2.jarprocessor.JarProcessorExecutor.Options;
-
-/**
- * The Pack200Unpacker expects an input containing ".jar.pack.gz" data.
- * @noinstantiate This class is not intended to be instantiated by clients.
- * @noextend This class is not intended to be subclassed by clients.
- * @noreference This class is not intended to be referenced by clients.
- * @deprecated See bug for details.
- */
-@Deprecated(forRemoval = true, since = "1.4.100")
-public class Pack200ProcessorStep extends AbstractBufferingStep {
- public static final String PACKED_SUFFIX = ".pack.gz"; //$NON-NLS-1$
-
- private File incoming;
-
- @Override
- protected OutputStream createIncomingStream() throws IOException {
- incoming = File.createTempFile(INCOMING_ROOT, JAR_SUFFIX + PACKED_SUFFIX);
- return new BufferedOutputStream(new FileOutputStream(incoming));
- }
-
- @Override
- protected void performProcessing() {
- // NO-OP see https://github.com/eclipse-equinox/p2/issues/40
- }
-
- protected File process() throws IOException {
- Options options = new Options();
- options.unpack = false;
- // TODO use false here assuming that all content is conditioned. Need to revise this
- options.processAll = false;
- options.input = incoming;
- options.outputDir = getWorkDir().getPath();
- options.verbose = false;
- new JarProcessorExecutor().runJarProcessor(options);
- return new File(getWorkDir(), incoming.getName().substring(0, incoming.getName().length() - PACKED_SUFFIX.length()));
- }
-
- @Override
- public boolean isEnabled() {
- return UnpackStep.canUnpack();
- }
-}
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/SimpleArtifactRepository.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/SimpleArtifactRepository.java
index 8ee48520d9..09511fdbfc 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/SimpleArtifactRepository.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/SimpleArtifactRepository.java
@@ -19,20 +19,48 @@
*******************************************************************************/
package org.eclipse.equinox.internal.p2.artifact.repository.simple;
-import java.io.*;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
import java.util.Map.Entry;
+import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
-import org.eclipse.core.runtime.*;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.core.runtime.URIUtil;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.equinox.internal.p2.artifact.processors.checksum.ChecksumUtilities;
import org.eclipse.equinox.internal.p2.artifact.processors.checksum.ChecksumVerifier;
import org.eclipse.equinox.internal.p2.artifact.processors.pgp.PGPSignatureVerifier;
-import org.eclipse.equinox.internal.p2.artifact.repository.*;
+import org.eclipse.equinox.internal.p2.artifact.repository.Activator;
import org.eclipse.equinox.internal.p2.artifact.repository.Messages;
+import org.eclipse.equinox.internal.p2.artifact.repository.MirrorRequest;
+import org.eclipse.equinox.internal.p2.artifact.repository.MirrorSelector;
+import org.eclipse.equinox.internal.p2.artifact.repository.SignatureVerifier;
import org.eclipse.equinox.internal.p2.core.helpers.FileUtils;
import org.eclipse.equinox.internal.p2.core.helpers.LogHelper;
import org.eclipse.equinox.internal.p2.metadata.ArtifactKey;
@@ -41,17 +69,29 @@
import org.eclipse.equinox.internal.p2.repository.DownloadStatus;
import org.eclipse.equinox.internal.p2.repository.Transport;
import org.eclipse.equinox.internal.p2.repository.helpers.ChecksumHelper;
-import org.eclipse.equinox.internal.provisional.p2.artifact.repository.processing.*;
+import org.eclipse.equinox.internal.provisional.p2.artifact.repository.processing.ProcessingStep;
+import org.eclipse.equinox.internal.provisional.p2.artifact.repository.processing.ProcessingStepHandler;
+import org.eclipse.equinox.internal.provisional.p2.artifact.repository.processing.ZipVerifierStep;
import org.eclipse.equinox.internal.provisional.p2.repository.IStateful;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.metadata.IArtifactKey;
import org.eclipse.equinox.p2.metadata.index.IIndex;
import org.eclipse.equinox.p2.metadata.index.IIndexProvider;
-import org.eclipse.equinox.p2.query.*;
-import org.eclipse.equinox.p2.repository.*;
-import org.eclipse.equinox.p2.repository.artifact.*;
-import org.eclipse.equinox.p2.repository.artifact.spi.*;
+import org.eclipse.equinox.p2.query.IQuery;
+import org.eclipse.equinox.p2.query.IQueryResult;
+import org.eclipse.equinox.p2.query.IQueryable;
+import org.eclipse.equinox.p2.repository.IRepository;
+import org.eclipse.equinox.p2.repository.IRepositoryManager;
+import org.eclipse.equinox.p2.repository.IRunnableWithProgress;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactRepositoryManager;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactRequest;
+import org.eclipse.equinox.p2.repository.artifact.IFileArtifactRepository;
+import org.eclipse.equinox.p2.repository.artifact.spi.AbstractArtifactRepository;
+import org.eclipse.equinox.p2.repository.artifact.spi.ArtifactDescriptor;
+import org.eclipse.equinox.p2.repository.artifact.spi.ProcessingStepDescriptor;
import org.eclipse.osgi.service.datalocation.Location;
import org.eclipse.osgi.util.NLS;
@@ -268,11 +308,6 @@ public void write(int b) throws IOException {
private static final String ARTIFACT_FOLDER = "artifact.folder"; //$NON-NLS-1$
private static final String ARTIFACT_UUID = "artifact.uuid"; //$NON-NLS-1$
static final private String BLOBSTORE = ".blobstore/"; //$NON-NLS-1$
- static final private String[][] PACKED_MAPPING_RULES = {{"(& (classifier=osgi.bundle) (format=packed))", "${repoUrl}/plugins/${id}_${version}.jar.pack.gz"}, //$NON-NLS-1$//$NON-NLS-2$
- {"(& (classifier=osgi.bundle))", "${repoUrl}/plugins/${id}_${version}.jar"}, //$NON-NLS-1$//$NON-NLS-2$
- {"(& (classifier=binary))", "${repoUrl}/binary/${id}_${version}"}, //$NON-NLS-1$ //$NON-NLS-2$
- {"(& (classifier=org.eclipse.update.feature) (format=packed))", "${repoUrl}/features/${id}_${version}.jar.pack.gz"}, //$NON-NLS-1$//$NON-NLS-2$
- {"(& (classifier=org.eclipse.update.feature))", "${repoUrl}/features/${id}_${version}.jar"}}; //$NON-NLS-1$//$NON-NLS-2$
static final private String[][] DEFAULT_MAPPING_RULES = {{"(& (classifier=osgi.bundle))", "${repoUrl}/plugins/${id}_${version}.jar"}, //$NON-NLS-1$//$NON-NLS-2$
{"(& (classifier=binary))", "${repoUrl}/binary/${id}_${version}"}, //$NON-NLS-1$ //$NON-NLS-2$
@@ -292,8 +327,6 @@ public void write(int b) throws IOException {
private KeyIndex keyIndex;
private boolean snapshotNeeded = false;
- static final private String PUBLISH_PACK_FILES_AS_SIBLINGS = "publishPackFilesAsSiblings"; //$NON-NLS-1$
-
private static final int DEFAULT_MAX_THREADS = 4;
protected String[][] mappingRules = DEFAULT_MAPPING_RULES;
@@ -391,19 +424,6 @@ public SimpleArtifactRepository(IProvisioningAgent agent, String repositoryName,
}
initializeAfterLoad(location, false); // Don't update the timestamp, it will be done during save
- if (properties != null) {
- if (properties.containsKey(PUBLISH_PACK_FILES_AS_SIBLINGS)) {
- synchronized (this) {
- String newValue = properties.get(PUBLISH_PACK_FILES_AS_SIBLINGS);
- if (Boolean.TRUE.toString().equals(newValue)) {
- mappingRules = PACKED_MAPPING_RULES;
- } else {
- mappingRules = DEFAULT_MAPPING_RULES;
- }
- initializeMapper();
- }
- }
- }
save();
} finally {
if (lockAcquired)
@@ -447,11 +467,6 @@ private SimpleArtifactDescriptor createInternalDescriptor(IArtifactDescriptor de
if (isFolderBased(descriptor))
internal.setRepositoryProperty(ARTIFACT_FOLDER, Boolean.TRUE.toString());
- //clear out the UUID if we aren't using the blobstore.
- if (flatButPackedEnabled(descriptor) && internal.getProperty(ARTIFACT_UUID) != null) {
- internal.setProperty(ARTIFACT_UUID, null);
- }
-
if (descriptor instanceof SimpleArtifactDescriptor) {
Map repoProperties = ((SimpleArtifactDescriptor) descriptor).getRepositoryProperties();
for (Map.Entry entry : repoProperties.entrySet()) {
@@ -584,9 +599,6 @@ public synchronized boolean contains(IArtifactKey key) {
}
public synchronized URI createLocation(ArtifactDescriptor descriptor) {
- if (flatButPackedEnabled(descriptor)) {
- return getLocationForPackedButFlatArtifacts(descriptor);
- }
// if the descriptor is canonical, clear out any UUID that might be set and use the Mapper
if (descriptor.getProcessingSteps().length == 0) {
descriptor.setProperty(ARTIFACT_UUID, null);
@@ -934,36 +946,12 @@ public synchronized Set getDescriptors() {
return artifactDescriptors;
}
- /**
- * Typically non-canonical forms of the artifact are stored in the blob store.
- * However, we support having the pack200 files alongside the canonical artifact
- * for compatibility with the format used in optimized update sites. We call
- * this arrangement "flat but packed".
- */
- @SuppressWarnings("removal")
- private boolean flatButPackedEnabled(IArtifactDescriptor descriptor) {
- return Boolean.TRUE.toString().equals(getProperties().get(PUBLISH_PACK_FILES_AS_SIBLINGS)) && IArtifactDescriptor.FORMAT_PACKED.equals(descriptor.getProperty(IArtifactDescriptor.FORMAT));
- }
-
- /**
- * @see #flatButPackedEnabled(IArtifactDescriptor)
- */
- private URI getLocationForPackedButFlatArtifacts(IArtifactDescriptor descriptor) {
- IArtifactKey key = descriptor.getArtifactKey();
- return mapper.map(getLocation(), key.getClassifier(), key.getId(), key.getVersion().toString(),
- descriptor.getProperty(IArtifactDescriptor.FORMAT), descriptor.getProperties());
- }
-
public synchronized URI getLocation(IArtifactDescriptor descriptor) {
// if the artifact has a uuid then use it
String uuid = descriptor.getProperty(ARTIFACT_UUID);
if (uuid != null)
return blobStore.fileFor(bytesFromHexString(uuid));
- if (flatButPackedEnabled(descriptor)) {
- return getLocationForPackedButFlatArtifacts(descriptor);
- }
-
try {
// if the artifact is just a reference then return the reference location
if (descriptor instanceof SimpleArtifactDescriptor) {
@@ -1387,16 +1375,6 @@ private String doSetProperty(String key, String newValue, IProgressMonitor monit
String oldValue = super.setProperty(key, newValue, new NullProgressMonitor());
if (oldValue == newValue || (oldValue != null && oldValue.equals(newValue)))
return oldValue;
- if (PUBLISH_PACK_FILES_AS_SIBLINGS.equals(key)) {
- synchronized (this) {
- if (Boolean.TRUE.toString().equals(newValue)) {
- mappingRules = PACKED_MAPPING_RULES;
- } else {
- mappingRules = DEFAULT_MAPPING_RULES;
- }
- initializeMapper();
- }
- }
if (save)
save();
return oldValue;
diff --git a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/PackStep.java b/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/PackStep.java
deleted file mode 100644
index 29ef701819..0000000000
--- a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/PackStep.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2017 IBM Corporation and others.
- *
- * This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.equinox.internal.p2.jarprocessor;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-import java.util.Properties;
-
-/**
- * @noreference This class is not intended to be referenced by clients.
- * @noextend This class is not intended to be subclassed by clients.
- * @noinstantiate This class is not intended to be instantiated by clients.
- * @deprecated See bug
- * and issue for
- * details.
- */
-@Deprecated(forRemoval = true, since = "1.2.0")
-public class PackStep extends CommandStep {
-
- protected static String packCommand = null;
-
- public static boolean canPack() {
- // Ignore everything pack200 https://github.com/eclipse-equinox/p2/issues/40
- return false;
- }
-
- public PackStep(Properties options) {
- super(options, null, null, false);
- }
-
- public PackStep(Properties options, boolean verbose) {
- super(options, null, null, verbose);
- }
-
- @Override
- public String recursionEffect(String entryName) {
- return null;
- }
-
- @Override
- public File preProcess(File input, File workingDirectory, List containers) {
- return null;
- }
-
- @Override
- public File postProcess(File input, File workingDirectory, List containers) {
- return null;
- }
-
- protected boolean shouldPack(File input, List containers, Properties inf) {
- return false;
- }
-
- protected String[] getCommand(File input, File outputFile, Properties inf, List containers)
- throws IOException {
- String[] cmd = null;
- String arguments = getArguments(input, inf, containers);
- if (arguments != null && arguments.length() > 0) {
- String[] args = Utils.toStringArray(arguments, ","); //$NON-NLS-1$
- cmd = new String[3 + args.length];
- cmd[0] = packCommand;
- System.arraycopy(args, 0, cmd, 1, args.length);
- cmd[cmd.length - 2] = outputFile.getCanonicalPath();
- cmd[cmd.length - 1] = input.getCanonicalPath();
- } else {
- cmd = new String[] { packCommand, outputFile.getCanonicalPath(), input.getCanonicalPath() };
- }
- return cmd;
- }
-
- protected String getArguments(File input, Properties inf, List containers) {
- // 1: Explicitly marked in our .inf file
- if (inf != null && inf.containsKey(Utils.PACK_ARGS)) {
- return inf.getProperty(Utils.PACK_ARGS);
- }
-
- // 2: Defaults set in one of our containing jars
- for (Properties container : containers) {
- if (container.containsKey(Utils.DEFAULT_PACK_ARGS)) {
- return container.getProperty(Utils.DEFAULT_PACK_ARGS);
- }
- }
-
- // 3: Set by name in outside pack.properties file
- Properties options = getOptions();
- String argsKey = input.getName() + Utils.PACK_ARGS_SUFFIX;
- if (options.containsKey(argsKey)) {
- return options.getProperty(argsKey);
- }
-
- // 4: Set by default in outside pack.properties file
- if (options.containsKey(Utils.DEFAULT_PACK_ARGS)) {
- return options.getProperty(Utils.DEFAULT_PACK_ARGS);
- }
-
- return ""; //$NON-NLS-1$
- }
-
- @Override
- public String getStepName() {
- return "Pack (NO-OP see https://github.com/eclipse-equinox/p2/issues/40)"; //$NON-NLS-1$
- }
-
- @Override
- public boolean adjustInf(File input, Properties inf, List containers) {
- if (input == null || inf == null)
- return false;
-
- // don't be verbose to check if we should mark the inf
- boolean v = verbose;
- verbose = false;
- if (!shouldPack(input, containers, inf)) {
- verbose = v;
- return false;
- }
- verbose = v;
-
- // mark as conditioned if not previously marked. A signed jar is assumed to be
- // previously conditioned.
- if (inf.getProperty(Utils.MARK_PROPERTY) != null)
- return false;
-
- inf.put(Utils.MARK_PROPERTY, "true"); //$NON-NLS-1$
- // record arguments used
- String arguments = inf.getProperty(Utils.PACK_ARGS);
- if (arguments == null) {
- arguments = getArguments(input, inf, containers);
- if (arguments != null && arguments.length() > 0)
- inf.put(Utils.PACK_ARGS, arguments);
- }
- return true;
- }
-}
diff --git a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/PackUnpackStep.java b/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/PackUnpackStep.java
deleted file mode 100644
index ab6e34ca16..0000000000
--- a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/PackUnpackStep.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2017 IBM Corporation and others.
- *
- * This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.equinox.internal.p2.jarprocessor;
-
-import java.io.File;
-import java.util.List;
-import java.util.Properties;
-
-/**
- * @noreference This class is not intended to be referenced by clients.
- * @noextend This class is not intended to be subclassed by clients.
- * @noinstantiate This class is not intended to be instantiated by clients.
- * @deprecated See bug
- * and issue for
- * details.
- */
-@Deprecated(forRemoval = true, since = "1.2.0")
-public class PackUnpackStep extends PackStep {
-
- public PackUnpackStep(Properties options) {
- super(options);
- }
-
- public PackUnpackStep(Properties options, boolean verbose) {
- super(options, verbose);
- }
-
- @Override
- public String recursionEffect(String entryName) {
- return null;
- }
-
- @Override
- public File postProcess(File input, File workingDirectory, List containers) {
- return null;
- }
-
- @Override
- public File preProcess(File input, File workingDirectory, List containers) {
- return null;
- }
-
- @Override
- public String getStepName() {
- return "Repack (NO-OP see https://github.com/eclipse-equinox/p2/issues/40)"; //$NON-NLS-1$
- }
-}
diff --git a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/UnpackStep.java b/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/UnpackStep.java
deleted file mode 100644
index 2a0ff7ec66..0000000000
--- a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/UnpackStep.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2017 IBM Corporation and others.
- *
- * This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which accompanies this distribution, and is available at
- * https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * IBM - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.equinox.internal.p2.jarprocessor;
-
-import java.io.File;
-import java.util.List;
-import java.util.Properties;
-
-/**
- * @noreference This class is not intended to be referenced by clients.
- * @noinstantiate This class is not intended to be instantiated by clients.
- * @noextend This class is not intended to be subclassed by clients.
- * @deprecated See bug
- * and issue for
- * details.
- */
-@Deprecated(forRemoval = true, since = "1.2.0")
-public class UnpackStep extends CommandStep {
- public static final String UNPACKER_PROPERTY = "org.eclipse.update.jarprocessor.Unpacker"; //$NON-NLS-1$
-
- public static boolean canUnpack() {
- return false;
- }
-
- public UnpackStep(Properties options) {
- super(options, null, null, false);
- }
-
- public UnpackStep(Properties options, boolean verbose) {
- super(options, null, null, verbose);
- }
-
- @Override
- public String recursionEffect(String entryName) {
- return null;
- }
-
- @Override
- public File preProcess(File input, File workingDirectory, List containers) {
- return null;
- }
-
- @Override
- public File postProcess(File input, File workingDirectory, List containers) {
- return null;
- }
-
- @Override
- public String getStepName() {
- return "Unpack (NO-OP see https://github.com/eclipse-equinox/p2/issues/40)"; //$NON-NLS-1$
- }
-}
diff --git a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/Utils.java b/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/Utils.java
index 2ff3a65b3c..7847c7541b 100644
--- a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/Utils.java
+++ b/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/Utils.java
@@ -13,12 +13,24 @@
*******************************************************************************/
package org.eclipse.equinox.internal.p2.jarprocessor;
-import java.io.*;
-import java.util.*;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Properties;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.StringTokenizer;
+import java.util.TreeMap;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.zip.ZipException;
-import org.eclipse.internal.provisional.equinox.p2.jarprocessor.JarProcessor;
/**
* @author aniefer@ca.ibm.com
@@ -32,106 +44,21 @@ public class Utils {
*/
// comma separated list of jars to exclude from sigining
public static final String SIGN_EXCLUDES = "sign.excludes"; //$NON-NLS-1$
- // comma separated list of jars to exlclude from packing
- /**
- * @noreference This field is not intended to be referenced by clients.
- * @deprecated See bug
- * for details.
- */
- @Deprecated(forRemoval = true, since = "1.2.0")
- public static final String PACK_EXCLUDES = "pack.excludes"; //$NON-NLS-1$
- // Suffix used when specifying arguments to use when running pack200 on a jar
-
- /**
- * @noreference This field is not intended to be referenced by clients.
- * @deprecated See bug
- * for details.
- */
- @Deprecated(forRemoval = true, since = "1.2.0")
- public static final String PACK_ARGS_SUFFIX = ".pack.args"; //$NON-NLS-1$
-
- /*
- * Properties found in both pack.properties and eclipse.inf
- */
- // Default arguments to use when running pack200.
- // Affects all jars when specified in pack.properties, affects children when
- // specified in eclipse.inf
- /**
- * @noreference This field is not intended to be referenced by clients.
- * @deprecated See bug
- * for details.
- */
- @Deprecated(forRemoval = true, since = "1.2.0")
- public static final String DEFAULT_PACK_ARGS = "pack200.default.args"; //$NON-NLS-1$
- /*
- * Properties found in eclipse.inf file
- */
- // This jar has been conditioned with pack200
- /**
- * @noreference This field is not intended to be referenced by clients.
- * @deprecated See bug
- * for details.
- */
- @Deprecated(forRemoval = true, since = "1.2.0")
- public static final String MARK_PROPERTY = "pack200.conditioned"; //$NON-NLS-1$
// Exclude this jar from processing
public static final String MARK_EXCLUDE = "jarprocessor.exclude"; //$NON-NLS-1$
- // Exclude this jar from pack200
- public static final String MARK_EXCLUDE_PACK = "jarprocessor.exclude.pack"; //$NON-NLS-1$
// Exclude this jar from signing
public static final String MARK_EXCLUDE_SIGN = "jarprocessor.exclude.sign"; //$NON-NLS-1$
// Exclude this jar's children from processing
public static final String MARK_EXCLUDE_CHILDREN = "jarprocessor.exclude.children"; //$NON-NLS-1$
- // Exclude this jar's children from pack200
- public static final String MARK_EXCLUDE_CHILDREN_PACK = "jarprocessor.exclude.children.pack"; //$NON-NLS-1$
// Exclude this jar's children from signing
public static final String MARK_EXCLUDE_CHILDREN_SIGN = "jarprocessor.exclude.children.sign"; //$NON-NLS-1$
- // Arguments used in pack200 for this jar
- /**
- * @noreference This field is not intended to be referenced by clients.
- * @deprecated See bug
- * for details.
- */
- @Deprecated(forRemoval = true, since = "1.2.0")
- public static final String PACK_ARGS = "pack200.args"; //$NON-NLS-1$
- /**
- * @noreference This field is not intended to be referenced by clients.
- * @deprecated See bug
- * for details.
- */
- @Deprecated(forRemoval = true, since = "1.2.0")
- public static final String PACK200_PROPERTY = "org.eclipse.update.jarprocessor.pack200"; //$NON-NLS-1$
public static final String JRE = "@jre"; //$NON-NLS-1$
public static final String PATH = "@path"; //$NON-NLS-1$
public static final String NONE = "@none"; //$NON-NLS-1$
- /**
- * @noreference This field is not intended to be referenced by clients.
- * @deprecated See bug
- * for details.
- */
- @Deprecated(forRemoval = true, since = "1.2.0")
- public static final String PACKED_SUFFIX = ".pack.gz"; //$NON-NLS-1$
public static final String JAR_SUFFIX = ".jar"; //$NON-NLS-1$
public static final FileFilter JAR_FILTER = pathname -> pathname.isFile() && pathname.getName().endsWith(".jar"); //$NON-NLS-1$
- /**
- * @noreference This field is not intended to be referenced by clients.
- * @deprecated See bug
- * for details.
- */
- @SuppressWarnings("removal")
- @Deprecated(forRemoval = true, since = "1.2.0")
- public static final FileFilter PACK_GZ_FILTER = pathname -> pathname.isFile()
- && pathname.getName().endsWith(JarProcessor.PACKED_SUFFIX);
public static void close(Object stream) {
if (stream != null) {
@@ -148,24 +75,6 @@ else if (stream instanceof JarFile)
}
}
- /**
- * Get the set of commands to try to execute pack/unpack
- *
- * @param cmd the command, either "pack200" or "unpack200"
- * @return null
as pack200 is not supported on Java >= 14
- *
- * @noreference This method is not intended to be referenced by clients.
- * @deprecated See bug
- * and issue for
- * details.
- */
- @Deprecated(forRemoval = true, since = "1.2.0")
- public static String[] getPack200Commands(String cmd) {
- return null;
- }
-
/**
* Transfers all available bytes from the given input stream to the given output
* stream. Closes both streams if close == true, regardless of failure. Flushes
@@ -330,9 +239,8 @@ public static boolean shouldSkipJar(File input, boolean processAll, boolean verb
if (processAll)
return false;
- // otherwise, we skip if not marked marked
- String marked = inf.getProperty(MARK_PROPERTY);
- return !Boolean.parseBoolean(marked);
+ // otherwise, we skip
+ return true;
}
/**
diff --git a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/pack-readme.html b/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/pack-readme.html
deleted file mode 100644
index 084ab2972a..0000000000
--- a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/pack-readme.html
+++ /dev/null
@@ -1,85 +0,0 @@
-
-
-
-
- Eclipse update packing tool readme
-
-
-Eclipse update packing tool
-
-Overview
-The update packing tool processes a hierarchy of arbitrarily nested
-JARs and ZIP files. It is a generic utility that performs a depth first traversal of
-a nested hierarchy of ZIPs and JARs, performs various commands on
-each of the JARs in the hierarchy, and then rebuilds the same hierarchy
-of ZIPs and JARs again. Currently its main functions are:
-
- - Packing JARs using the Java 1.5 pack200
- command.
- - Unpacking PACK.GZs using the Java 1.5 unpack200
- command.
- - Normalizing JARs for future compression by pack200. This is accomplished
- by running the pack200 command with the --repack command line argument.
- - Signing JARs to allow for authentication of the origin of JARs. This is accomplished by
- running a supplied command (typically the command will just be a wrapper around
- the Java jarsigner tool).
-
-The packing tool is used in the following contexts:
-
- - During a PDE build, to prepare JARs for uploading to an Eclipse
- update site. In this usage, it is used to both nomalize JAR contents
- (pack200 -repack), and sign JARs.
- - On an update site, to convert traditional JAR content into the
- compressed pack200 format.
- - From an Eclipse client application during update, to convert
- compressed pack200 format content into executable JAR files.
-
-Tool usage
-To run the packing tool, you need a 1.5 JRE installed. The tool is run
-by invoking Java as follows:
-
-
- java jarprocessor.jar [options] input
-
-
-Where input is either a zip file, a directory, or a JAR (or a pack.gz file). All files ending
-in ".jar" or ".pack.gz" in the provided zip or directory hierarchy
-will be processed.
-The following additional command line arguments are supported:
-
-- -repack : Normalize the jars using pack200 --repack
-- -sign <cmd> : signs the jars by executing the provided command.
-The command will be provided a single argument that will be the full path of the JAR to process.
-
-- -pack : for each input in JAR form, produce a corresponding output
-in packed form. For an input "a.jar", the output is a.jar.pack.gz.
-
-- -unpack : for each input in packed form, produce a corresponding output
-in unpacked form. For an input "a.jar.pack.gz", the output is "a.jar". -unpack is mutually exclusive with -repack, -pack and -sign.
-- -outputDir <dir> : The directory to put the tool's output into. If the input was a zip file, then an output zip file will be
-created containg all the output files. If the input was a directory, for each input file there is a corresponding output file in the output directory. By default the current working directory is used. If the input is in the same
-directory as the output, the input files may be overwritten.
-
-
-Additionally, when the input is a zip file, it may contain a file called
-pack.properties. The pack.properties file supports the following values:
-
-- pack.excludes = jarName[, jarName]* : A comma-delimited list of JARs that should not be packed or repacked.
-
-- sign.excludes = jarName[, jarName]* : A comma-delimited list of JARs that should not be signed.
-
-- <jarname>.pack.args = option[, option]* : A comma-delimited list of additional arguments that should
-be passed to pack200 when packing any jar with name <jarname>.
-
-
-
-
-.
-. This program and the accompanying materials
-are made available under the terms of the
-"https://www.eclipse.org/legal/epl-2.0/
-"
-"SPDX-License-Identifier: EPL-2.0">Eclipse Public License 2.0.
-
-
-
diff --git a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/verifier/Verifier.java b/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/verifier/Verifier.java
index cd56f38195..9f400c7b9d 100644
--- a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/verifier/Verifier.java
+++ b/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/verifier/Verifier.java
@@ -14,14 +14,16 @@
package org.eclipse.equinox.internal.p2.jarprocessor.verifier;
-import java.io.*;
+import java.io.File;
+import java.io.IOException;
import java.util.Iterator;
import java.util.Properties;
-import org.eclipse.equinox.internal.p2.jarprocessor.UnpackStep;
+
import org.eclipse.equinox.internal.p2.jarprocessor.Utils;
-import org.eclipse.internal.provisional.equinox.p2.jarprocessor.*;
+import org.eclipse.internal.provisional.equinox.p2.jarprocessor.IProcessStep;
+import org.eclipse.internal.provisional.equinox.p2.jarprocessor.JarProcessor;
+import org.eclipse.internal.provisional.equinox.p2.jarprocessor.JarProcessorExecutor;
-@SuppressWarnings("removal")
public class Verifier extends JarProcessorExecutor {
private static void printUsage() {
@@ -30,8 +32,8 @@ private static void printUsage() {
System.out.println(
"Usage: java -cp jarprocessor.jar org.eclipse.update.internal.jarprocessor.verifier.Verifier -dir input [input]"); //$NON-NLS-1$
System.out.println(""); //$NON-NLS-1$
- System.out.println("-dir : specifies a working directory where pack.gz files can be temporarily unpacked"); //$NON-NLS-1$
- System.out.println("input : a list of directories and/or pack.gz files to verify."); //$NON-NLS-1$
+ System.out.println("-dir : specifies a working directory "); //$NON-NLS-1$
+ System.out.println("input : a list of directories to verify."); //$NON-NLS-1$
}
@@ -82,8 +84,6 @@ public static void main(String[] args) {
public void verify(final File workingDirectory, String[] input) {
options = new Options();
options.verbose = false;
- options.repack = false; // We first unpack first during repack/sign phase
- options.pack = false; // then we are verifying during the pack phase.
options.outputDir = workingDirectory.toString();
Properties properties = new Properties();
@@ -106,29 +106,6 @@ public File processJar(File inputFile) throws IOException {
};
verifier.setWorkingDirectory(workingDirectory.getAbsolutePath());
- for (String input1 : input) {
- File inputFile = new File(input1);
- if (inputFile.exists()) {
- try {
- process(inputFile, Utils.PACK_GZ_FILTER, true, verifier, properties);
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- }
- }
Utils.clear(workingDirectory);
}
-
- @Override
- @Deprecated(forRemoval = true, since = "1.2.0")
- public void addPackStep(JarProcessor processor, Properties properties,
- JarProcessorExecutor.Options processOptions) {
- processor.addProcessStep(new VerifyStep(properties, processOptions.verbose));
- }
-
- @Override
- @Deprecated(forRemoval = true, since = "1.2.0")
- public void addPackUnpackStep(JarProcessor processor, Properties properties, Options processOptions) {
- processor.addProcessStep(new UnpackStep(properties, processOptions.verbose));
- }
}
diff --git a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/internal/provisional/equinox/p2/jarprocessor/JarProcessor.java b/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/internal/provisional/equinox/p2/jarprocessor/JarProcessor.java
index a77fda1beb..1a6b9d4500 100644
--- a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/internal/provisional/equinox/p2/jarprocessor/JarProcessor.java
+++ b/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/internal/provisional/equinox/p2/jarprocessor/JarProcessor.java
@@ -13,20 +13,31 @@
*******************************************************************************/
package org.eclipse.internal.provisional.equinox.p2.jarprocessor;
-import java.io.*;
-import java.util.*;
-import java.util.jar.*;
-import org.eclipse.equinox.internal.p2.jarprocessor.*;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.jar.JarEntry;
+import java.util.jar.JarException;
+import java.util.jar.JarFile;
+import java.util.jar.JarOutputStream;
+
+import org.eclipse.equinox.internal.p2.jarprocessor.Utils;
+import org.eclipse.equinox.internal.p2.jarprocessor.ZipProcessor;
public class JarProcessor {
- /**
- * @noreference This field is not intended to be referenced by clients.
- * @deprecated See bug
- * for details.
- */
- @Deprecated(forRemoval = true, since = "1.2.0")
- public static final String PACKED_SUFFIX = "pack.gz"; //$NON-NLS-1$
private List steps = new ArrayList<>();
private String workingDirectory = ""; //$NON-NLS-1$
@@ -35,58 +46,6 @@ public class JarProcessor {
private boolean processAll = false;
private LinkedList containingInfs = new LinkedList<>();
- /**
- * @noreference This method is not intended to be referenced by clients.
- * @deprecated See bug
- * and issue for
- * details.
- */
- @Deprecated(forRemoval = true, since = "1.2.0")
- public static JarProcessor getUnpackProcessor(Properties properties) {
- throw new UnsupportedOperationException();
- }
-
- /**
- * @noreference This method is not intended to be referenced by clients.
- * @deprecated See bug
- * and bug
- * and bug
- * and bug for details.
- */
- @Deprecated(forRemoval = true, since = "1.6.0")
- public static final String REUSE_PACK200 = "-reusePack200Files"; //$NON-NLS-1$
public static final String SOURCE = "-source"; //$NON-NLS-1$
public static final String INPLACE = "-inplace"; //$NON-NLS-1$
public static final String CONFIG = "-config"; //$NON-NLS-1$
diff --git a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/pde/internal/publishing/Utils.java b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/pde/internal/publishing/Utils.java
index 8f603e313f..bb2a79bc0e 100644
--- a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/pde/internal/publishing/Utils.java
+++ b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/pde/internal/publishing/Utils.java
@@ -14,9 +14,17 @@
*******************************************************************************/
package org.eclipse.pde.internal.publishing;
-import java.io.*;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.util.Dictionary;
import java.util.Enumeration;
+
import org.eclipse.osgi.service.resolver.BundleDescription;
import org.eclipse.osgi.util.ManifestElement;
import org.osgi.framework.BundleException;
@@ -59,8 +67,7 @@ public static boolean guessUnpack(BundleDescription bundle, String[] classpath)
return shape.equals("dir"); //$NON-NLS-1$
}
- // launcher fragments are a special case, they have no bundle-classpath and they must
- //be unpacked
+ // launcher fragments are a special case, they have no bundle-classpath
if (bundle.getHost() != null && bundle.getName().startsWith(Constants.BUNDLE_EQUINOX_LAUNCHER))
return true;
diff --git a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src_ant/org/eclipse/equinox/internal/p2/publisher/ant/AbstractPublishTask.java b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src_ant/org/eclipse/equinox/internal/p2/publisher/ant/AbstractPublishTask.java
index c9a149b4e1..9ec8856460 100644
--- a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src_ant/org/eclipse/equinox/internal/p2/publisher/ant/AbstractPublishTask.java
+++ b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src_ant/org/eclipse/equinox/internal/p2/publisher/ant/AbstractPublishTask.java
@@ -19,8 +19,12 @@
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
+
import org.apache.tools.ant.Task;
-import org.eclipse.core.runtime.*;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.URIUtil;
import org.eclipse.equinox.internal.p2.artifact.repository.CompositeArtifactRepository;
import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper;
import org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository;
@@ -28,7 +32,9 @@
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.metadata.IArtifactKey;
-import org.eclipse.equinox.p2.publisher.*;
+import org.eclipse.equinox.p2.publisher.IPublisherInfo;
+import org.eclipse.equinox.p2.publisher.Publisher;
+import org.eclipse.equinox.p2.publisher.PublisherInfo;
import org.eclipse.equinox.p2.query.IQueryResult;
import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.equinox.p2.repository.artifact.ArtifactKeyQuery;
@@ -91,7 +97,6 @@ public void setArtifact(boolean artifact) {
}
protected boolean compress = false;
- protected boolean reusePackedFiles = false;
protected boolean append = true;
protected boolean publish = true;
protected String source = null;
@@ -119,7 +124,7 @@ protected void initializeRepositories(PublisherInfo info) throws ProvisionExcept
if (artifactLocation != null) {
@SuppressWarnings("removal")
IArtifactRepository repo = Publisher.createArtifactRepository(getProvisioningAgent(), artifactLocation,
- artifactRepoName, compress, reusePackedFiles);
+ artifactRepoName, compress);
if (!append && !isEmpty(repo)) {
File repoLocation = URIUtil.toFile(artifactLocation);
if (repoLocation != null && source != null) {
@@ -174,10 +179,6 @@ public void setCompress(String value) {
compress = Boolean.parseBoolean(value);
}
- public void setReusePackedFiles(String value) {
- reusePackedFiles = Boolean.parseBoolean(value);
- }
-
public void setAppend(String value) {
append = Boolean.parseBoolean(value);
}
diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/AbstractPublisherAction.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/AbstractPublisherAction.java
index 8e4ca0c9a4..4e337c8642 100644
--- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/AbstractPublisherAction.java
+++ b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/AbstractPublisherAction.java
@@ -17,25 +17,60 @@
******************************************************************************/
package org.eclipse.equinox.p2.publisher;
-import java.io.*;
-import java.util.*;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
import java.util.Map.Entry;
-import org.eclipse.core.runtime.*;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
import org.eclipse.equinox.internal.p2.artifact.repository.simple.SimpleArtifactDescriptor;
import org.eclipse.equinox.internal.p2.core.helpers.FileUtils;
import org.eclipse.equinox.internal.p2.core.helpers.FileUtils.IPathComputer;
import org.eclipse.equinox.internal.p2.core.helpers.LogHelper;
-import org.eclipse.equinox.internal.p2.metadata.*;
+import org.eclipse.equinox.internal.p2.metadata.IRequiredCapability;
+import org.eclipse.equinox.internal.p2.metadata.InstallableUnit;
+import org.eclipse.equinox.internal.p2.metadata.RequiredCapability;
import org.eclipse.equinox.internal.p2.publisher.Activator;
import org.eclipse.equinox.internal.p2.publisher.QuotedTokenizer;
import org.eclipse.equinox.p2.core.ProvisionException;
-import org.eclipse.equinox.p2.metadata.*;
+import org.eclipse.equinox.p2.metadata.IInstallableUnit;
+import org.eclipse.equinox.p2.metadata.IProvidedCapability;
+import org.eclipse.equinox.p2.metadata.IRequirement;
+import org.eclipse.equinox.p2.metadata.ITouchpointData;
+import org.eclipse.equinox.p2.metadata.IUpdateDescriptor;
+import org.eclipse.equinox.p2.metadata.IVersionedId;
+import org.eclipse.equinox.p2.metadata.MetadataFactory;
import org.eclipse.equinox.p2.metadata.MetadataFactory.InstallableUnitDescription;
+import org.eclipse.equinox.p2.metadata.Version;
+import org.eclipse.equinox.p2.metadata.VersionRange;
import org.eclipse.equinox.p2.metadata.expression.IMatchExpression;
-import org.eclipse.equinox.p2.publisher.actions.*;
-import org.eclipse.equinox.p2.query.*;
-import org.eclipse.equinox.p2.repository.artifact.*;
-import org.eclipse.equinox.p2.repository.artifact.spi.ArtifactDescriptor;
+import org.eclipse.equinox.p2.publisher.actions.IAdditionalInstallableUnitAdvice;
+import org.eclipse.equinox.p2.publisher.actions.ICapabilityAdvice;
+import org.eclipse.equinox.p2.publisher.actions.IFilterAdvice;
+import org.eclipse.equinox.p2.publisher.actions.IPropertyAdvice;
+import org.eclipse.equinox.p2.publisher.actions.ITouchpointAdvice;
+import org.eclipse.equinox.p2.publisher.actions.IUpdateDescriptorAdvice;
+import org.eclipse.equinox.p2.query.Collector;
+import org.eclipse.equinox.p2.query.IQuery;
+import org.eclipse.equinox.p2.query.IQueryResult;
+import org.eclipse.equinox.p2.query.QueryUtil;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
+import org.eclipse.equinox.p2.repository.artifact.IFileArtifactRepository;
import org.eclipse.equinox.spi.p2.publisher.PublisherHelper;
public abstract class AbstractPublisherAction implements IPublisherAction {
@@ -208,24 +243,6 @@ protected InstallableUnitDescription createIUShell(String id, Version version) {
return root;
}
- /**
- * @noreference This method is not intended to be referenced by clients.
- * @deprecated See bug for details.
- */
- @Deprecated(forRemoval = true, since = "1.6.0")
- protected IArtifactDescriptor createPack200ArtifactDescriptor(IArtifactKey key, File pathOnDisk,
- String installSize) {
- ArtifactDescriptor result = (ArtifactDescriptor) PublisherHelper.createArtifactDescriptor(info, key,
- pathOnDisk);
- // TODO this size calculation is bogus
- if (pathOnDisk != null) {
- result.setProperty(IArtifactDescriptor.ARTIFACT_SIZE, installSize);
- // TODO - this is wrong but I'm testing a work-around for bug 205842
- result.setProperty(IArtifactDescriptor.DOWNLOAD_SIZE, Long.toString(pathOnDisk.length()));
- }
- return result;
- }
-
protected InstallableUnitDescription createParentIU(Collection extends IVersionedId> children, String id,
Version version) {
InstallableUnitDescription root = createIUShell(id, version);
diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/AbstractPublisherApplication.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/AbstractPublisherApplication.java
index 25af85cb77..4bd160ecc4 100644
--- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/AbstractPublisherApplication.java
+++ b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/AbstractPublisherApplication.java
@@ -19,14 +19,20 @@
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
-import org.eclipse.core.runtime.*;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.URIUtil;
import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;
import org.eclipse.equinox.internal.p2.artifact.repository.CompositeArtifactRepository;
import org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository;
import org.eclipse.equinox.internal.p2.publisher.Activator;
import org.eclipse.equinox.internal.p2.publisher.Messages;
-import org.eclipse.equinox.p2.core.*;
+import org.eclipse.equinox.p2.core.IProvisioningAgent;
+import org.eclipse.equinox.p2.core.IProvisioningAgentProvider;
+import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.metadata.IArtifactKey;
import org.eclipse.equinox.p2.query.IQueryResult;
import org.eclipse.equinox.p2.query.QueryUtil;
@@ -46,13 +52,10 @@ public abstract class AbstractPublisherApplication implements IApplication {
// instead of a 'plugins' directory, so a separate constant is defined and used
// here.
protected static final String[][] INPLACE_MAPPING_RULES = {
- { "(& (classifier=osgi.bundle) (format=packed)", "${repoUrl}/features/${id}_${version}.jar.pack.gz" }, //$NON-NLS-1$//$NON-NLS-2$
{ "(& (classifier=osgi.bundle))", "${repoUrl}/plugins/${id}_${version}.jar" }, //$NON-NLS-1$//$NON-NLS-2$
{ "(& (classifier=binary))", "${repoUrl}/binary/${id}_${version}" }, //$NON-NLS-1$//$NON-NLS-2$
{ "(& (classifier=org.eclipse.update.feature))", "${repoUrl}/features/${id}_${version}.jar" } }; //$NON-NLS-1$//$NON-NLS-2$
- public static final String PUBLISH_PACK_FILES_AS_SIBLINGS = "publishPackFilesAsSiblings"; //$NON-NLS-1$
-
protected PublisherInfo info;
protected String source;
protected URI metadataLocation;
@@ -65,7 +68,6 @@ public abstract class AbstractPublisherApplication implements IApplication {
protected boolean compress = false;
protected boolean inplace = false;
protected boolean append = false;
- protected boolean reusePackedFiles = false;
protected String[] configurations;
private IStatus status;
@@ -107,7 +109,7 @@ protected void initializeRepositories(PublisherInfo publisherInfo) throws Provis
if (artifactLocation != null) {
@SuppressWarnings("removal")
IArtifactRepository repo = Publisher.createArtifactRepository(agent, artifactLocation, artifactRepoName,
- compress, reusePackedFiles);
+ compress);
if (!append && !isEmpty(repo)) {
File repoLocation = URIUtil.toFile(artifactLocation);
if (repoLocation != null && source != null) {
@@ -246,9 +248,6 @@ protected void processFlag(String arg, PublisherInfo publisherInfo) {
if (arg.equalsIgnoreCase("-compress")) //$NON-NLS-1$
compress = true;
- if (arg.equalsIgnoreCase("-reusePack200Files")) //$NON-NLS-1$
- reusePackedFiles = true;
-
if (arg.equalsIgnoreCase("-inplace")) //$NON-NLS-1$
inplace = true;
}
@@ -362,21 +361,6 @@ public void setMetadataLocation(URI location) {
this.metadataLocation = location;
}
- /**
- * @noreference This method is not intended to be referenced by clients.
- * @deprecated See bug
- * for details.
- */
- @Deprecated(forRemoval = true, since = "1.6.0")
- public boolean reuseExistingPack200Files() {
- return reusePackedFiles;
- }
-
- public void setReuseExistingPackedFiles(boolean value) {
- reusePackedFiles = value;
- }
-
public void setCompress(boolean value) {
compress = value;
}
diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/Publisher.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/Publisher.java
index ebbdde5ead..8f79df8bb9 100644
--- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/Publisher.java
+++ b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/Publisher.java
@@ -17,13 +17,21 @@
import java.net.URI;
import java.util.Collection;
-import org.eclipse.core.runtime.*;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.equinox.internal.p2.core.helpers.Tracing;
import org.eclipse.equinox.internal.p2.publisher.Activator;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
-import org.eclipse.equinox.p2.repository.*;
+import org.eclipse.equinox.p2.repository.IRepository;
+import org.eclipse.equinox.p2.repository.IRepositoryManager;
+import org.eclipse.equinox.p2.repository.IRunnableWithProgress;
import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
import org.eclipse.equinox.p2.repository.artifact.IArtifactRepositoryManager;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
@@ -105,60 +113,6 @@ public static IMetadataRepository loadMetadataRepository(IProvisioningAgent agen
return result;
}
- /**
- * Returns an artifact repository that corresponds to the given settings. If a
- * repository at the given location already exists, it is updated with the
- * settings and returned. If no repository is found then a new Simple repository
- * is created, configured and returned
- *
- * @param agent the provisioning agent to use when creating the
- * repository
- * @param location the URL location of the repository
- * @param name the name of the repository
- * @param compress whether or not to compress the repository index
- * @param reusePackedFiles whether or not to include discovered Pack200 files in
- * the repository
- * @return the discovered or created repository
- * @throws ProvisionException
- *
- * @deprecated See bug
- * for details. Use
- * {@link #createArtifactRepository(IprovisioningAgent, URI, String, boolean)}
- * instead.
- */
- @Deprecated(forRemoval = true, since = "2.3.0")
- public static IArtifactRepository createArtifactRepository(IProvisioningAgent agent, URI location, String name,
- boolean compress, boolean reusePackedFiles) throws ProvisionException {
- try {
- IArtifactRepository result = loadArtifactRepository(agent, location, true, true);
- if (result != null && result.isModifiable()) {
- result.setProperty(IRepository.PROP_COMPRESSED, compress ? "true" : "false"); //$NON-NLS-1$//$NON-NLS-2$
- if (reusePackedFiles)
- result.setProperty(PUBLISH_PACK_FILES_AS_SIBLINGS, "true"); //$NON-NLS-1$
- return result;
- }
- } catch (ProvisionException e) {
- // fall through and create a new repository
- }
-
- IArtifactRepositoryManager manager = getService(agent, IArtifactRepositoryManager.SERVICE_NAME);
- String repositoryName = name != null ? name : location + " - artifacts"; //$NON-NLS-1$
- IArtifactRepository result = manager.createRepository(location, repositoryName,
- IArtifactRepositoryManager.TYPE_SIMPLE_REPOSITORY, null);
- if (result != null) {
- manager.removeRepository(result.getLocation());
- if (reusePackedFiles)
- result.setProperty(PUBLISH_PACK_FILES_AS_SIBLINGS, "true"); //$NON-NLS-1$
- result.setProperty(IRepository.PROP_COMPRESSED, compress ? "true" : "false"); //$NON-NLS-1$//$NON-NLS-2$
- return result;
- }
- // I don't think we can really get here, but just in case, we better throw a
- // provisioning exception
- String msg = org.eclipse.equinox.internal.p2.artifact.repository.Messages.repoMan_internalError;
- throw new ProvisionException(
- new Status(IStatus.ERROR, Activator.ID, ProvisionException.INTERNAL_ERROR, msg, null));
- }
/**
* Returns an artifact repository that corresponds to the given settings. If a
diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/mirroring/Mirroring.java b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/mirroring/Mirroring.java
index 2a830635e4..3a4801fac4 100644
--- a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/mirroring/Mirroring.java
+++ b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/mirroring/Mirroring.java
@@ -15,8 +15,18 @@
*******************************************************************************/
package org.eclipse.equinox.p2.internal.repository.mirroring;
-import java.util.*;
-import org.eclipse.core.runtime.*;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
import org.eclipse.equinox.internal.p2.artifact.repository.CompositeArtifactRepository;
import org.eclipse.equinox.internal.p2.artifact.repository.RawMirrorRequest;
import org.eclipse.equinox.internal.p2.repository.Transport;
@@ -26,7 +36,9 @@
import org.eclipse.equinox.p2.metadata.IArtifactKey;
import org.eclipse.equinox.p2.query.IQuery;
import org.eclipse.equinox.p2.query.IQueryResult;
-import org.eclipse.equinox.p2.repository.artifact.*;
+import org.eclipse.equinox.p2.repository.artifact.ArtifactKeyQuery;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
import org.eclipse.equinox.p2.repository.artifact.spi.ArtifactDescriptor;
import org.eclipse.equinox.p2.repository.tools.comparator.ArtifactComparatorFactory;
import org.eclipse.equinox.p2.repository.tools.comparator.IArtifactComparator;
@@ -49,7 +61,6 @@ public class Mirroring {
private List keysToMirror;
private IArtifactMirrorLog comparatorLog;
private Transport transport;
- private boolean includePacked = true;
private boolean mirrorProperties = false;
private IArtifactComparator getComparator() {
@@ -149,12 +160,7 @@ public MultiStatus run(boolean failOnError, boolean verbose) {
return multiStatus;
}
- @SuppressWarnings("removal")
private IStatus mirror(IArtifactDescriptor sourceDescriptor, boolean verbose) {
- if (!includePacked
- && IArtifactDescriptor.FORMAT_PACKED.equals(sourceDescriptor.getProperty(IArtifactDescriptor.FORMAT)))
- return Status.OK_STATUS;
-
IArtifactDescriptor targetDescriptor = raw ? sourceDescriptor : new ArtifactDescriptor(sourceDescriptor);
IArtifactDescriptor baselineDescriptor = getBaselineDescriptor(sourceDescriptor);
@@ -367,7 +373,4 @@ public void setTransport(Transport transport) {
this.transport = transport;
}
- public void setIncludePacked(boolean includePacked) {
- this.includePacked = includePacked;
- }
}
diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/MirrorApplication.java b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/MirrorApplication.java
index 72a4ab54ac..738ebe1a9c 100644
--- a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/MirrorApplication.java
+++ b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/MirrorApplication.java
@@ -16,8 +16,19 @@
import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
-import java.util.*;
-import org.eclipse.core.runtime.*;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExecutableExtension;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.URIUtil;
import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;
import org.eclipse.equinox.internal.p2.core.helpers.LogHelper;
@@ -27,13 +38,24 @@
import org.eclipse.equinox.internal.p2.repository.helpers.RepositoryHelper;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.core.ProvisionException;
-import org.eclipse.equinox.p2.engine.*;
+import org.eclipse.equinox.p2.engine.IProfile;
+import org.eclipse.equinox.p2.engine.IProfileRegistry;
+import org.eclipse.equinox.p2.engine.IProvisioningPlan;
import org.eclipse.equinox.p2.internal.repository.comparator.ArtifactChecksumComparator;
-import org.eclipse.equinox.p2.internal.repository.mirroring.*;
-import org.eclipse.equinox.p2.metadata.*;
+import org.eclipse.equinox.p2.internal.repository.mirroring.FileMirrorLog;
+import org.eclipse.equinox.p2.internal.repository.mirroring.IArtifactMirrorLog;
+import org.eclipse.equinox.p2.internal.repository.mirroring.Mirroring;
+import org.eclipse.equinox.p2.internal.repository.mirroring.XMLMirrorLog;
+import org.eclipse.equinox.p2.metadata.IArtifactKey;
+import org.eclipse.equinox.p2.metadata.IInstallableUnit;
+import org.eclipse.equinox.p2.metadata.VersionRange;
import org.eclipse.equinox.p2.planner.IPlanner;
import org.eclipse.equinox.p2.planner.IProfileChangeRequest;
-import org.eclipse.equinox.p2.query.*;
+import org.eclipse.equinox.p2.query.CompoundQueryable;
+import org.eclipse.equinox.p2.query.IQuery;
+import org.eclipse.equinox.p2.query.IQueryResult;
+import org.eclipse.equinox.p2.query.IQueryable;
+import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor;
import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
@@ -57,7 +79,6 @@ public class MirrorApplication extends AbstractApplication implements IApplicati
private boolean mirrorReferences = true;
private String metadataOrArtifacts = null;
private String[] rootIUs = null;
- private boolean includePacked = true;
private boolean mirrorProperties = false;
private File mirrorLogFile; // file to log mirror output to (optional)
@@ -255,7 +276,6 @@ protected Mirroring getMirroring(IQueryable slice, IProgressMo
mirror.setValidate(validate);
mirror.setCompareExclusions(compareExclusions);
mirror.setTransport((Transport) agent.getService(Transport.SERVICE_NAME));
- mirror.setIncludePacked(includePacked);
mirror.setMirrorProperties(mirrorProperties);
// If IUs have been specified then only they should be mirrored, otherwise
@@ -497,10 +517,6 @@ public void setComparatorExclusions(IQuery exclusions) {
compareExclusions = exclusions;
}
- public void setIncludePacked(boolean includePacked) {
- this.includePacked = includePacked;
- }
-
public void setMirrorProperties(boolean mirrorProperties) {
this.mirrorProperties = mirrorProperties;
}
diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/RecreateRepositoryApplication.java b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/RecreateRepositoryApplication.java
index dc7183b0ef..994a7eb9fc 100644
--- a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/RecreateRepositoryApplication.java
+++ b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/RecreateRepositoryApplication.java
@@ -18,8 +18,17 @@
import java.io.File;
import java.net.URI;
-import java.util.*;
-import org.eclipse.core.runtime.*;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.URIUtil;
import org.eclipse.equinox.internal.p2.artifact.processors.checksum.ChecksumUtilities;
import org.eclipse.equinox.internal.p2.artifact.repository.simple.SimpleArtifactRepository;
import org.eclipse.equinox.internal.p2.core.helpers.LogHelper;
@@ -29,12 +38,15 @@
import org.eclipse.equinox.p2.query.IQueryResult;
import org.eclipse.equinox.p2.repository.IRepository;
import org.eclipse.equinox.p2.repository.IRepositoryManager;
-import org.eclipse.equinox.p2.repository.artifact.*;
+import org.eclipse.equinox.p2.repository.artifact.ArtifactKeyQuery;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactRepositoryManager;
+import org.eclipse.equinox.p2.repository.artifact.IFileArtifactRepository;
import org.eclipse.equinox.p2.repository.artifact.spi.ArtifactDescriptor;
import org.eclipse.osgi.util.NLS;
public class RecreateRepositoryApplication extends AbstractApplication {
- static final private String PUBLISH_PACK_FILES_AS_SIBLINGS = "publishPackFilesAsSiblings"; //$NON-NLS-1$
private URI repoLocation;
private String repoName = null;
boolean removeArtifactRepo = true;
@@ -109,11 +121,8 @@ private void removeRepository(IArtifactRepository repository, IProgressMonitor m
private void recreateRepository(IProgressMonitor monitor) throws ProvisionException {
IArtifactRepositoryManager manager = getArtifactRepositoryManager();
- // add pack200 mappings, the existing repoProperties is not modifiable
- Map newProperties = new HashMap<>(repoProperties);
- newProperties.put(PUBLISH_PACK_FILES_AS_SIBLINGS, "true"); //$NON-NLS-1$
IArtifactRepository repository = manager.createRepository(repoLocation, repoName,
- IArtifactRepositoryManager.TYPE_SIMPLE_REPOSITORY, newProperties);
+ IArtifactRepositoryManager.TYPE_SIMPLE_REPOSITORY, repoProperties);
if (!(repository instanceof IFileArtifactRepository))
throw new ProvisionException(NLS.bind(Messages.exception_notLocalFileRepo, repository.getLocation()));
diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/Repo2Runnable.java b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/Repo2Runnable.java
index 397cb4b05f..0fd0ce5bcb 100644
--- a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/Repo2Runnable.java
+++ b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/Repo2Runnable.java
@@ -1,13 +1,13 @@
/*******************************************************************************
* Copyright (c) 2009, 2018 IBM Corporation and others.
*
- * This program and the accompanying materials
+ * This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
- *
+ *
* Contributors:
* IBM Corporation - initial API and implementation
* Sonatype, Inc. - ongoing development
@@ -15,34 +15,64 @@
*******************************************************************************/
package org.eclipse.equinox.p2.internal.repository.tools;
-import java.io.*;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;
-import java.util.*;
-import org.eclipse.core.runtime.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.core.runtime.URIUtil;
import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;
import org.eclipse.equinox.frameworkadmin.BundleInfo;
import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper;
-import org.eclipse.equinox.internal.p2.engine.*;
+import org.eclipse.equinox.internal.p2.engine.DownloadManager;
+import org.eclipse.equinox.internal.p2.engine.InstallableUnitOperand;
+import org.eclipse.equinox.internal.p2.engine.InstallableUnitPhase;
+import org.eclipse.equinox.internal.p2.engine.Phase;
+import org.eclipse.equinox.internal.p2.engine.PhaseSet;
+import org.eclipse.equinox.internal.p2.engine.ProfileWriter;
+import org.eclipse.equinox.internal.p2.engine.ProfileXMLConstants;
import org.eclipse.equinox.internal.p2.engine.phases.Collect;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.core.ProvisionException;
-import org.eclipse.equinox.p2.engine.*;
+import org.eclipse.equinox.p2.engine.IEngine;
+import org.eclipse.equinox.p2.engine.IProfile;
+import org.eclipse.equinox.p2.engine.IProfileRegistry;
+import org.eclipse.equinox.p2.engine.IProvisioningPlan;
+import org.eclipse.equinox.p2.engine.ProvisioningContext;
import org.eclipse.equinox.p2.engine.spi.ProvisioningAction;
-import org.eclipse.equinox.p2.metadata.*;
+import org.eclipse.equinox.p2.metadata.IArtifactKey;
+import org.eclipse.equinox.p2.metadata.IInstallableUnit;
+import org.eclipse.equinox.p2.metadata.IProvidedCapability;
import org.eclipse.equinox.p2.query.IQueryResult;
import org.eclipse.equinox.p2.query.QueryUtil;
-import org.eclipse.equinox.p2.repository.artifact.*;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactRepositoryManager;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactRequest;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
import org.eclipse.equinox.simpleconfigurator.manipulator.SimpleConfiguratorManipulator;
/**
- * The transformer takes an existing p2 repository (local or remote), iterates over
- * its list of IUs, and fetches all of the corresponding artifacts to a user-specified location.
- * Once fetched, the artifacts will be in "runnable" form... that is directory-based bundles will be
- * extracted into folders and packed JAR files will be un-packed.
- *
+ * The transformer takes an existing p2 repository (local or remote), iterates
+ * over its list of IUs, and fetches all of the corresponding artifacts to a
+ * user-specified location. Once fetched, the artifacts will be in "runnable"
+ * form... that is directory-based bundles will be extracted into folders.
+ *
* @since 1.0
*/
public class Repo2Runnable extends AbstractApplication implements IApplication {
@@ -121,7 +151,7 @@ protected IStatus completePhase(IProgressMonitor monitor, IProfile profile, Map<
}
}
- // the list of IUs that we actually transformed... could have come from the repo
+ // the list of IUs that we actually transformed... could have come from the repo
// or have been user-specified.
private Collection processedIUs = new ArrayList<>();
@@ -260,7 +290,7 @@ private void collectIUs(IProgressMonitor monitor) throws ProvisionException {
/*
* If there is a destination metadata repository set, then add all our transformed
- * IUs to it.
+ * IUs to it.
*/
private void publishMetadata(IProgressMonitor monitor) {
// publishing the metadata is optional
diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/MirrorTask.java b/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/MirrorTask.java
index 1169e61e44..b0396d66ab 100644
--- a/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/MirrorTask.java
+++ b/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/MirrorTask.java
@@ -16,6 +16,7 @@
import java.io.File;
import java.util.ArrayList;
import java.util.List;
+
import org.apache.tools.ant.BuildException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.equinox.p2.core.ProvisionException;
@@ -138,10 +139,6 @@ public void setValidate(boolean value) {
((MirrorApplication) application).setValidate(value);
}
- public void setIncludePacked(boolean value) {
- ((MirrorApplication) application).setIncludePacked(value);
- }
-
public void setReferences(boolean value) {
((MirrorApplication) application).setReferences(value);
}
diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/ProcessRepoTask.java b/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/ProcessRepoTask.java
index 6a41e1dcc6..686f95a9ea 100644
--- a/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/ProcessRepoTask.java
+++ b/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/ProcessRepoTask.java
@@ -17,7 +17,9 @@
import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
-import org.apache.tools.ant.*;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.URIUtil;
import org.eclipse.equinox.internal.p2.jarprocessor.ant.JarProcessorTask;
@@ -58,33 +60,28 @@ public void setUnsign(String unsign) {
private URI repository = null;
- private boolean pack = false;
- private boolean repack = false;
private SigningOptions signing = null;
private JarProcessorTask jarProcessor = null;
- @SuppressWarnings("removal")
@Override
public void execute() throws BuildException {
File file = URIUtil.toFile(repository);
if (file == null || !file.exists()) {
throw new BuildException(NLS.bind(Messages.ProcessRepo_must_be_local, repository.toString()));
}
- if (pack | repack | signing != null) {
- if (jarProcessor == null)
+ if (signing != null) {
+ if (jarProcessor == null) {
jarProcessor = new JarProcessorTask();
- if (signing != null) {
- jarProcessor.setAlias(signing.alias);
- jarProcessor.setKeypass(signing.keypass);
- jarProcessor.setKeystore(signing.keystore);
- jarProcessor.setStorepass(signing.storepass);
- jarProcessor.setUnsign(signing.unsign);
-
- if (signing.alias != null && signing.alias.length() > 0 && !signing.alias.startsWith("${")) //$NON-NLS-1$
- jarProcessor.setSign(true);
}
- jarProcessor.setPack(pack);
- jarProcessor.setNormalize(repack);
+
+ jarProcessor.setAlias(signing.alias);
+ jarProcessor.setKeypass(signing.keypass);
+ jarProcessor.setKeystore(signing.keystore);
+ jarProcessor.setStorepass(signing.storepass);
+ jarProcessor.setUnsign(signing.unsign);
+
+ if (signing.alias != null && signing.alias.length() > 0 && !signing.alias.startsWith("${")) //$NON-NLS-1$
+ jarProcessor.setSign(true);
jarProcessor.setInputFolder(new File(repository));
jarProcessor.setProject(getProject());
jarProcessor.execute();
@@ -112,18 +109,6 @@ public void setRepositoryPath(String repository) {
}
}
- @Deprecated(forRemoval = true, since = "2.3.0")
- public void setPack(boolean pack) {
- log("Support for pack200 is scheduled for removal after June 2023.", Project.MSG_WARN); //$NON-NLS-1$
- this.pack = pack;
- }
-
- @Deprecated(forRemoval = true, since = "2.3.0")
- public void setNormalize(boolean normalize) {
- log("Support for pack200 is scheduled for removal after June 2023.", Project.MSG_WARN); //$NON-NLS-1$
- this.repack = normalize;
- }
-
public void addConfiguredSign(SigningOptions options) {
this.signing = options;
}
diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/Repo2RunnableTask.java b/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/Repo2RunnableTask.java
index a448a5ff4e..c6b41e1ebf 100644
--- a/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/Repo2RunnableTask.java
+++ b/bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/Repo2RunnableTask.java
@@ -1,13 +1,13 @@
/*******************************************************************************
* Copyright (c) 2009, 2017 IBM Corporation and others.
*
- * This program and the accompanying materials
+ * This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
- *
+ *
* Contributors:
* IBM Corporation - initial API and implementation
* Red Hat, Inc. - fragment creation
@@ -15,6 +15,7 @@
package org.eclipse.equinox.p2.internal.repository.tools.tasks;
import java.util.List;
+
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.eclipse.core.runtime.IStatus;
@@ -25,12 +26,12 @@
import org.eclipse.osgi.util.NLS;
/**
- * Ant task which calls the "repo to runnable" application. This application takes an
- * existing p2 repository (local or remote), iterates over its list of IUs, and fetches
- * all of the corresponding artifacts to a user-specified location. Once fetched, the
- * artifacts will be in "runnable" form... that is directory-based bundles will be
- * extracted into folders and packed JAR files will be un-packed.
- *
+ * Ant task which calls the "repo to runnable" application. This application
+ * takes an existing p2 repository (local or remote), iterates over its list of
+ * IUs, and fetches all of the corresponding artifacts to a user-specified
+ * location. Once fetched, the artifacts will be in "runnable" form... that is
+ * directory-based bundles will be extracted into folders.
+ *
* @since 1.0
*/
public class Repo2RunnableTask extends AbstractRepositoryTask {
diff --git a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/p2/repository/artifact/IArtifactDescriptor.java b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/p2/repository/artifact/IArtifactDescriptor.java
index 2403402ac9..89c4ea7842 100644
--- a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/p2/repository/artifact/IArtifactDescriptor.java
+++ b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/p2/repository/artifact/IArtifactDescriptor.java
@@ -15,6 +15,7 @@
package org.eclipse.equinox.p2.repository.artifact;
import java.util.Map;
+
import org.eclipse.equinox.p2.metadata.IArtifactKey;
import org.eclipse.equinox.p2.repository.artifact.spi.ArtifactDescriptor;
@@ -89,17 +90,22 @@ public interface IArtifactDescriptor {
String FORMAT = "format"; //$NON-NLS-1$
/**
- * A property value for the {@link #FORMAT} artifact descriptor property (value "packed")
- * indicating the storage format is using pack200 compression.
+ * A property value for the {@link #FORMAT} artifact descriptor property (value
+ * "packed") indicating the storage format is using pack200 compression.
+ *
* @see #FORMAT
* @noreference This field is not intended to be referenced by clients.
- *
- * @deprecated See bug for details.
+ *
+ * @deprecated See bug
+ * for details.
*/
- @Deprecated(forRemoval = true, since = "2.5.0") String FORMAT_PACKED = "packed"; //$NON-NLS-1$
+ @Deprecated(forRemoval = true, since = "2.5.0")
+ String FORMAT_PACKED = "packed"; //$NON-NLS-1$
/**
* Return the key for the artifact described by this descriptor.
+ *
* @return the key associated with this descriptor
*/
IArtifactKey getArtifactKey();
diff --git a/bundles/org.eclipse.equinox.p2.tests/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.tests/META-INF/MANIFEST.MF
index af5b04a9a9..81acd4c83d 100644
--- a/bundles/org.eclipse.equinox.p2.tests/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.tests/META-INF/MANIFEST.MF
@@ -65,7 +65,6 @@ Import-Package: org.eclipse.ant.core,
org.eclipse.ecf.filetransfer,
org.eclipse.equinox.internal.p2.artifact.processors.checksum,
org.eclipse.equinox.internal.p2.artifact.processors.md5,
- org.eclipse.equinox.internal.p2.artifact.processors.pack200,
org.eclipse.equinox.internal.p2.artifact.repository,
org.eclipse.equinox.internal.p2.artifact.repository.simple,
org.eclipse.equinox.internal.p2.core,
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ant/MirrorTaskTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ant/MirrorTaskTest.java
index 6f6b4b43ab..5db1f5cbaa 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ant/MirrorTaskTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ant/MirrorTaskTest.java
@@ -28,6 +28,7 @@
import java.util.Properties;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
+
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.URIUtil;
@@ -57,7 +58,6 @@
public class MirrorTaskTest extends AbstractAntProvisioningTest {
private static final String DOWNLOAD_CHECKSUM = IArtifactDescriptor.DOWNLOAD_CHECKSUM + ".sha-256";
private static final String MIRROR_TASK = "p2.mirror";
- private static final String MIRROR_ARTIFACTS_TASK = "p2.artifact.mirror";
private URI destinationRepo;
private URI artifactRepo, sliceArtifactRepo, sliceRepo, sourceRepo2, zipRepo;
@@ -66,7 +66,7 @@ public void setUp() throws Exception {
super.setUp();
// Get a random location to create a repository
destinationRepo = (new File(getTestFolder(getName()), "destinationRepo")).toURI();
- artifactRepo = getTestData("error loading data", "testData/mirror/mirrorPackedRepo").toURI();
+ artifactRepo = getTestData("error loading data", "testData/mirror/mirrorRepo").toURI();
sourceRepo2 = getTestData("error loading data", "testData/mirror/mirrorSourceRepo2").toURI();
sliceRepo = getTestData("error loading data", "testData/permissiveSlicer").toURI();
sliceArtifactRepo = getTestData("error loading data", "testData/testRepos/updateSite").toURI();
@@ -709,19 +709,6 @@ public void testSlicingInvalid() {
}
}
- public void testMirrorPackedRepo() {
- AntTaskElement mirror = new AntTaskElement(MIRROR_ARTIFACTS_TASK);
- mirror.addAttribute("destination", URIUtil.toUnencodedString(destinationRepo));
- mirror.addAttribute("source", URIUtil.toUnencodedString(artifactRepo));
- addTask(mirror);
- runAntTask();
-
- File repo = new File(destinationRepo);
-
- assertTrue(new File(repo, "plugins/org.eclipse.core.filebuffers_3.4.0.v20080603-2000.jar.pack.gz").exists());
- assertTrue(new File(repo, "plugins/org.eclipse.osgi.services.source_3.1.200.v20071203.jar.pack.gz").exists());
- }
-
/*
* Modified from org.eclipse.equinox.p2.tests.mirror.ArtifactMirrorApplicationTest
*/
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/gc/GCCleanTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/gc/GCCleanTest.java
index e77597a59a..b89a38ed73 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/gc/GCCleanTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/gc/GCCleanTest.java
@@ -16,6 +16,7 @@
import java.io.File;
import java.net.URI;
import java.util.HashMap;
+
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.equinox.internal.p2.garbagecollector.CoreGarbageCollector;
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/generator/GeneratorTests.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/generator/GeneratorTests.java
index e09e8bc4dd..09d64caed9 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/generator/GeneratorTests.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/generator/GeneratorTests.java
@@ -16,6 +16,7 @@
import java.io.File;
import java.io.PrintStream;
import java.util.Map;
+
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.equinox.app.IApplicationContext;
import org.eclipse.equinox.internal.p2.publisher.Messages;
@@ -143,7 +144,11 @@ public void testBasicUpdateSite() throws Exception {
new File(rootFolder, "content.xml").delete();
new File(rootFolder, "artifacts.xml").delete();
- String[] arguments = {"-updateSite", rootFolder.getAbsolutePath(), "-site", new File(rootFolder, "site.xml").getAbsolutePath(), "-metadataRepository", URIUtil.toUnencodedString(rootFolder.toURI()), "-artifactRepository", URIUtil.toUnencodedString(rootFolder.toURI()), "-metadataRepositoryName", "Basic Metadata Test Site", "-artifactRepositoryName", "Basic Artifact Test Site", "-compress", "-reusePack200Files", "-noDefaultIUs"};
+ String[] arguments = { "-updateSite", rootFolder.getAbsolutePath(), "-site",
+ new File(rootFolder, "site.xml").getAbsolutePath(), "-metadataRepository",
+ URIUtil.toUnencodedString(rootFolder.toURI()), "-artifactRepository",
+ URIUtil.toUnencodedString(rootFolder.toURI()), "-metadataRepositoryName", "Basic Metadata Test Site",
+ "-artifactRepositoryName", "Basic Artifact Test Site", "-compress", "-noDefaultIUs" };
TestGeneratorApplication app = new TestGeneratorApplication();
app.go(arguments);
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/ArtifactMirrorApplicationTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/ArtifactMirrorApplicationTest.java
index 25d76981f9..0529e84087 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/ArtifactMirrorApplicationTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/ArtifactMirrorApplicationTest.java
@@ -25,6 +25,7 @@
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
+
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
@@ -826,7 +827,7 @@ public void testExistingArtifactRepoWithNewName() {
*/
public void testArtifactFileCopying() throws MalformedURLException, Exception {
//Setup: load the repository containing packed data
- File packedRepoLocation = getTestData("26.0", "/testData/mirror/mirrorPackedRepo");
+ File packedRepoLocation = getTestData("26.0", "/testData/mirror/mirrorRepo");
basicRunMirrorApplication("26.1", packedRepoLocation.toURL(), destRepoLocation.toURL(), false);
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/NewMirrorApplicationArtifactTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/NewMirrorApplicationArtifactTest.java
index 16ebb46e24..aa1ccf1bd8 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/NewMirrorApplicationArtifactTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/NewMirrorApplicationArtifactTest.java
@@ -26,6 +26,7 @@
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
+
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
@@ -854,7 +855,7 @@ public void testExistingArtifactRepoWithNewName() {
@Test
public void testArtifactFileCopying() throws Exception {
//Setup: load the repository containing packed data
- File packedRepoLocation = getTestData("26.0", "/testData/mirror/mirrorPackedRepo");
+ File packedRepoLocation = getTestData("26.0", "/testData/mirror/mirrorSourceRepo2");
basicRunMirrorApplication("26.1", packedRepoLocation.toURI(), destRepoLocation.toURI(), false, false);
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/mirror/mirrorRepo/artifacts.xml b/bundles/org.eclipse.equinox.p2.tests/testData/mirror/mirrorRepo/artifacts.xml
new file mode 100644
index 0000000000..0e9f2e522b
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/mirror/mirrorRepo/artifacts.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/mirror/mirrorRepo/plugins/org.eclipse.core.filebuffers_3.4.0.v20080603-2000.jar b/bundles/org.eclipse.equinox.p2.tests/testData/mirror/mirrorRepo/plugins/org.eclipse.core.filebuffers_3.4.0.v20080603-2000.jar
new file mode 100644
index 0000000000000000000000000000000000000000..93b7ff38431e25d90c37b0487d0db08e15cf51fa
GIT binary patch
literal 112005
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 |