Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles')
-rw-r--r--bundles/org.eclipse.equinox.frameworkadmin.equinox/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.frameworkadmin.equinox/.settings/org.eclipse.jdt.core.prefs37
-rw-r--r--bundles/org.eclipse.equinox.frameworkadmin.equinox/META-INF/MANIFEST.MF6
-rw-r--r--bundles/org.eclipse.equinox.frameworkadmin.equinox/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.frameworkadmin.equinox/src/org/eclipse/equinox/internal/frameworkadmin/equinox/EclipseLauncherParser.java13
-rw-r--r--bundles/org.eclipse.equinox.frameworkadmin.equinox/src/org/eclipse/equinox/internal/frameworkadmin/equinox/EquinoxManipulatorImpl.java9
-rw-r--r--bundles/org.eclipse.equinox.frameworkadmin.equinox/src/org/eclipse/equinox/internal/frameworkadmin/equinox/ParserUtils.java7
-rw-r--r--bundles/org.eclipse.equinox.frameworkadmin.test/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.frameworkadmin.test/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.frameworkadmin.test/META-INF/MANIFEST.MF7
-rw-r--r--bundles/org.eclipse.equinox.frameworkadmin.test/pom.xml20
-rw-r--r--bundles/org.eclipse.equinox.frameworkadmin/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.frameworkadmin/.settings/org.eclipse.jdt.core.prefs37
-rw-r--r--bundles/org.eclipse.equinox.frameworkadmin/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.frameworkadmin/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.checksums.bouncycastle/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.checksums.bouncycastle/.settings/org.eclipse.jdt.core.prefs10
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.checksums.bouncycastle/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.checksums.bouncycastle/pom.xml7
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.optimizers/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.optimizers/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.optimizers/.settings/org.eclipse.jdt.core.prefs37
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.optimizers/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.optimizers/pom.xml7
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Application.java7
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Messages.java9
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Optimizer.java7
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Pack200OptimizerStep.java6
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.processors/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.processors/.settings/org.eclipse.core.resources.prefs2
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.processors/.settings/org.eclipse.jdt.core.prefs38
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.processors/META-INF/MANIFEST.MF5
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.processors/pom.xml7
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.processors/src/org/eclipse/equinox/internal/p2/artifact/processors/AbstractDeltaProcessorStep.java4
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.processors/src/org/eclipse/equinox/internal/p2/artifact/processors/BundleInfo.java (renamed from bundles/org.eclipse.equinox.p2.artifact.processors/src/org/eclipse/equinox/internal/p2/artifact/processors/Activator.java)20
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.processors/src/org/eclipse/equinox/internal/p2/artifact/processors/jardelta/JarDeltaProcessorStep.java4
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/META-INF/MANIFEST.MF13
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/plugin.xml11
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/pom.xml15
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/schema/artifactChecksums.exsd8
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/checksum/ChecksumUtilities.java26
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/checksum/ChecksumVerifier.java7
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/md5/MD5Verifier.java4
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/md5/Messages.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/md5/messages.properties1
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pack200/Pack200ProcessorStep.java5
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pgp/Messages.java36
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pgp/PGPPublicKeyStore.java127
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pgp/PGPSignatureVerifier.java275
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pgp/messages.properties16
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/Activator.java4
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/Messages.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/MirrorRequest.java6
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/RawMirrorRequest.java13
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/messages.properties5
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/Mapper.java48
-rw-r--r--bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/SimpleArtifactRepository.java51
-rw-r--r--bundles/org.eclipse.equinox.p2.console/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.console/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.console/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.console/Provisioning console.launch22
-rw-r--r--bundles/org.eclipse.equinox.p2.console/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.core/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.core/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.core/META-INF/MANIFEST.MF16
-rw-r--r--bundles/org.eclipse.equinox.p2.core/META-INF/p2.inf5
-rw-r--r--bundles/org.eclipse.equinox.p2.core/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/CollectionUtils.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/FileUtils.java3
-rw-r--r--bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/SecureXMLUtil.java10
-rw-r--r--bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/TarFile.java33
-rw-r--r--bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/p2/core/UIServices.java125
-rw-r--r--bundles/org.eclipse.equinox.p2.director.app/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.director.app/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.director.app/META-INF/MANIFEST.MF9
-rw-r--r--bundles/org.eclipse.equinox.p2.director.app/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.director.app/src/org/eclipse/equinox/internal/p2/director/app/DirectorApplication.java16
-rw-r--r--bundles/org.eclipse.equinox.p2.director/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.director/.settings/org.eclipse.jdt.core.prefs38
-rw-r--r--bundles/org.eclipse.equinox.p2.director/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.director/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/DirectorActivator.java10
-rw-r--r--bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Explanation.java3
-rw-r--r--bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Messages.java1
-rw-r--r--bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/OptimizationFunction.java3
-rw-r--r--bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Projector.java10
-rw-r--r--bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/messages.properties1
-rw-r--r--bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/provisional/p2/director/PlanExecutionHelper.java6
-rw-r--r--bundles/org.eclipse.equinox.p2.directorywatcher/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.directorywatcher/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.directorywatcher/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.directorywatcher/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.discovery.compatibility/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.discovery.compatibility/META-INF/MANIFEST.MF2
-rw-r--r--bundles/org.eclipse.equinox.p2.discovery.compatibility/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.discovery.compatibility/src/org/eclipse/equinox/internal/p2/discovery/compatibility/DirectoryParser.java3
-rw-r--r--bundles/org.eclipse.equinox.p2.discovery/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.discovery/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.discovery/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.discovery/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.engine/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.engine/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.engine/META-INF/MANIFEST.MF11
-rw-r--r--bundles/org.eclipse.equinox.p2.engine/plugin.xml1
-rw-r--r--bundles/org.eclipse.equinox.p2.engine/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.engine/schema/pgp.exsd107
-rw-r--r--bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/DownloadManager.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/InstallableUnitOperand.java9
-rw-r--r--bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/Profile.java6
-rw-r--r--bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/SimpleProfileRegistry.java25
-rw-r--r--bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/messages.properties2
-rw-r--r--bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/phases/CertificateChecker.java508
-rw-r--r--bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/phases/CheckTrust.java23
-rw-r--r--bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/engine/spi/Memento.java14
-rw-r--r--bundles/org.eclipse.equinox.p2.extensionlocation/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.extensionlocation/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.extensionlocation/META-INF/MANIFEST.MF6
-rw-r--r--bundles/org.eclipse.equinox.p2.extensionlocation/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.garbagecollector/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.garbagecollector/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.garbagecollector/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.garbagecollector/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.installer/META-INF/MANIFEST.MF2
-rw-r--r--bundles/org.eclipse.equinox.p2.installer/installer.product15
-rw-r--r--bundles/org.eclipse.equinox.p2.installer/installer.properties4
-rw-r--r--bundles/org.eclipse.equinox.p2.installer/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.jarprocessor/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.jarprocessor/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.jarprocessor/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.jarprocessor/forceQualifierUpdate.txt7
-rw-r--r--bundles/org.eclipse.equinox.p2.jarprocessor/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/Main.java15
-rw-r--r--bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/PackStep.java36
-rw-r--r--bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/PackUnpackStep.java7
-rw-r--r--bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/UnpackStep.java14
-rw-r--r--bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/Utils.java180
-rw-r--r--bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/ZipProcessor.java31
-rw-r--r--bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/verifier/Verifier.java24
-rw-r--r--bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/internal/provisional/equinox/p2/jarprocessor/JarProcessor.java96
-rw-r--r--bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/internal/provisional/equinox/p2/jarprocessor/JarProcessorExecutor.java32
-rw-r--r--bundles/org.eclipse.equinox.p2.jarprocessor/src_ant/org/eclipse/equinox/internal/p2/jarprocessor/ant/JarProcessorTask.java16
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata.repository/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata.repository/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata.repository/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata.repository/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/LocalMetadataRepository.java14
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/InstallableUnit.java15
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/Member.java127
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/expression/SimplePattern.java4
-rw-r--r--bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/query/Collector.java48
-rw-r--r--bundles/org.eclipse.equinox.p2.operations/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.operations/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.operations/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.operations/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher.eclipse/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher.eclipse/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher.eclipse/.settings/org.eclipse.jdt.ui.prefs2
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher.eclipse/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher.eclipse/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/internal/p2/publisher/compatibility/IGeneratorConstants.java7
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/internal/p2/publisher/eclipse/BrandingIron.java46
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/internal/p2/publisher/eclipse/ExecutablesDescriptor.java14
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/BundlesAction.java13
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/ConfigCUsAction.java44
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/EquinoxExecutableAction.java4
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/EquinoxLauncherCUAction.java8
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/FeaturesAction.java9
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/ProductFileAdvice.java161
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/pde/internal/swt/tools/IconExe.java249
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher.eclipse/src_ant/org/eclipse/equinox/internal/p2/publisher/ant/AbstractPublishTask.java29
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher/.settings/.api_filters11
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher/.settings/org.eclipse.jdt.ui.prefs2
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher/META-INF/MANIFEST.MF6
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher/build.properties1
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/AbstractPublisherAction.java248
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/AbstractPublisherApplication.java78
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/IPublisherInfo.java26
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/Publisher.java167
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/actions/JREAction.java146
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/spi/p2/publisher/LocalizationHelper.java42
-rw-r--r--bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/spi/p2/publisher/PublisherHelper.java49
-rw-r--r--bundles/org.eclipse.equinox.p2.reconciler.dropins/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.reconciler.dropins/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.reconciler.dropins/Bootstrap.product12
-rw-r--r--bundles/org.eclipse.equinox.p2.reconciler.dropins/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.reconciler.dropins/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.repository.tools/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.repository.tools/.settings/org.eclipse.jdt.core.prefs38
-rw-r--r--bundles/org.eclipse.equinox.p2.repository.tools/.settings/org.eclipse.jdt.ui.prefs65
-rw-r--r--bundles/org.eclipse.equinox.p2.repository.tools/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.repository.tools/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/comparator/java/ClassFileReader.java13
-rw-r--r--bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/mirroring/Mirroring.java80
-rw-r--r--bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/AbstractApplication.java83
-rw-r--r--bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/Activator.java22
-rw-r--r--bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/MirrorApplication.java49
-rw-r--r--bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/RecreateRepositoryApplication.java18
-rw-r--r--bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/messages.properties4
-rw-r--r--bundles/org.eclipse.equinox.p2.repository.tools/src_ant/org/eclipse/equinox/p2/internal/repository/tools/tasks/ProcessRepoTask.java10
-rw-r--r--bundles/org.eclipse.equinox.p2.repository/.options3
-rw-r--r--bundles/org.eclipse.equinox.p2.repository/META-INF/MANIFEST.MF14
-rw-r--r--bundles/org.eclipse.equinox.p2.repository/OSGI-INF/pgpPublicKeyService.xml8
-rw-r--r--bundles/org.eclipse.equinox.p2.repository/build.properties3
-rw-r--r--bundles/org.eclipse.equinox.p2.repository/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/persistence/XMLWriter.java4
-rw-r--r--bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/CacheManager.java47
-rw-r--r--bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/Messages.java3
-rw-r--r--bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/PGPKeyServiceComponent.java22
-rw-r--r--bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/RepositoryPreferences.java33
-rw-r--r--bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/helpers/AbstractRepositoryManager.java16
-rw-r--r--bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/helpers/DebugHelper.java5
-rw-r--r--bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/messages.properties1
-rw-r--r--bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/provisional/p2/repository/DefaultPGPPublicKeyService.java869
-rw-r--r--bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/p2/repository/artifact/IArtifactDescriptor.java47
-rw-r--r--bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/p2/repository/artifact/spi/IArtifactUIServices.java96
-rw-r--r--bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/p2/repository/spi/PGPPublicKeyService.java243
-rw-r--r--bundles/org.eclipse.equinox.p2.sar/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.sar/.settings/org.eclipse.jdt.core.prefs38
-rw-r--r--bundles/org.eclipse.equinox.p2.sar/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.sar/pom.xml7
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.discovery/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.discovery/.settings/org.eclipse.jdt.core.prefs38
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.discovery/META-INF/MANIFEST.MF6
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.discovery/plugin.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.discovery/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.optimizers/pom.xml3
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.reconciler.product/pom.xml2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.reconciler.product/reconciler.product19
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.ui/All p2 UI tests.launch494
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.ui/META-INF/MANIFEST.MF2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.ui/build.properties1
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.ui/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/importexport/ImportExportRemoteTests.java4
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/importexport/ImportExportTests.java14
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/actions/ElementUtilsTest.java18
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/InstallWithRemediationTest.java300
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/InstallWizardTest.java29
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/operations/InstallOperationTests.java52
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/operations/UpdateOperationTests.java114
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/query/QueryProviderTests.java21
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/query/QueryableArtifactRepositoryManagerTest.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.verifier/META-INF/MANIFEST.MF5
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.verifier/OSGI-INF/l10n/bundle.properties3
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.verifier/build.properties5
-rw-r--r--bundles/org.eclipse.equinox.p2.tests.verifier/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/META-INF/MANIFEST.MF10
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/build.properties1
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/plugin.xml6
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/pom.xml17
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/AbstractProvisioningTest.java4
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/TestData.java40
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/TestLicenseConsistency.java9
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ant/MirrorTaskTest.java6
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ant/Repo2RunnableTaskTests.java10
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/AllTests.java3
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/ChecksumUtilitiesTest.java9
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/ChecksumVerifierTest.java54
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/PGPSignatureVerifierTest.java176
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/Pack200ProcessorTest.java10
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/private_signer1.pgp84
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/private_signer2.pgp84
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/public_signer1.pgp41
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/public_signer2.pgp41
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/signed_by_signer_114
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/signed_by_signer_1_otherArtifact14
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/signed_by_signer_1_tampered14
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/signed_by_signer_214
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/testArtifact1
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/AllTests.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/CompositeArtifactRepositoryTest.java11
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/MirrorSelectorTest.java78
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/PGPVerifierTest.java132
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/SimpleArtifactRepositoryTest.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/TransferTest.java7
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/processing/ProcessingStepHandlerTest.java3
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/core/BackupTest.java384
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/core/ProvisioningAgentTest.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/DirectorApplicationTest.java20
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/IUListFormatterTest.java45
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/CertificateCheckerTest.java245
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/DownloadManagerTest.java13
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/PhaseSetTest.java1
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/ProvisioningEventTest.java39
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/End2EndTest35.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/End2EndTest36.java7
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/End2EndTest37.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/gc/GCCleanTest.java6
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/generator/GeneratorTests.java6
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/jarprocessor/JarProcessorTests.java10
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/metadata/repository/MetadataRepositoryManagerTest.java29
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/metadata/repository/ResumeDownloadTest.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/ArtifactMirrorApplicationTest.java19
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/MetadataMirrorApplicationTest.java8
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/NewMirrorApplicationArtifactTest.java7
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/NewMirrorApplicationMetadataTest.java12
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/AbsolutePlanTest.java1
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/Bug309717.java15
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/TychoUsage.java34
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ANYConfigCUsActionTest.java18
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/AccumulateConfigDataActionTest.java28
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ActionTest.java41
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/AdviceMatcher.java54
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/BundlesActionTest.java211
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/CaptureList.java39
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ConfigCUsActionTest.java18
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/EquinoxExecutableActionTest.java46
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/EquinoxLauncherCUActionTest.java21
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/FeaturesActionTest.java258
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/JREActionTest.java66
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/LocalUpdateSiteActionTest.java18
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/MultiCapture.java96
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductActionCapturingTest.java52
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductActionTest.java165
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductActionTestMac.java41
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductFileAdviceTest.java4
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/RootFilesActionTest.java34
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/RootIUActionTest.java28
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ql/PerformanceTest.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/AbstractReconcilerTest.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/AbstractSharedBundleProductTest.java22
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/repository/FileReaderTest2.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/eclipse/CheckTrustActionTest.java12
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/eclipse/SetLauncherNameActionTest.java6
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/natives/AllTests.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/natives/BackupStoreTest.java189
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/natives/SimpleBackupStoreTest.java166
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/updatesite/SiteXMLActionTest.java24
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/updatesite/UpdateSiteTest.java6
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/CertificateChecker/selfsigned/artifacts.xml16
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/CertificateChecker/selfsigned/content.xml49
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/CertificateChecker/selfsigned/plugins/blah_1.0.0.123456.jarbin0 -> 2101 bytes
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/artifactRepo/corruptedJarRepo/artifacts.xml2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/artifactRepo/corruptedJarRepo/content.xml6
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/artifactRepo/corruptedJarRepo/plugins/org.eclipse.equinox.common_3.15.0.v20210428-1632.jarbin0 -> 142656 bytes
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/artifactRepo/corruptedJarRepo/plugins/org.eclipse.equinox.common_3.5.0.corrupted.jarbin98786 -> 0 bytes
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/generator/Europa/site.xml2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/generator/eclipse3.3/features/org.eclipse.platform.source_3.3.0.v20070612-_19UEkLEzwsdF9jSqQ-G/feature.xml6
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/generator/eclipse3.3/features/org.eclipse.platform_3.3.0.v20070612-_19UEkLEzwsdF9jSqQ-G/feature.xml6
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/generator/eclipse3.3/features/org.eclipse.sdk_3.3.0.v20070607-7M7J-BIolz-OcxWxvWAPSfLPqevO/feature.xml6
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/importexport/unknownformat.p2f2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/metadataRepo/unencodedreporeferences/content.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/mirror/mirrorSourceRepoWithRefs/content.xml8
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pausefeature/artifacts.xml10
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/artifacts.xml36
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/content.xml49
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/plugins/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/plugins/blah_1.0.0.123456.jarbin0 -> 408 bytes
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/plugins/blah_1.0.0.123456.jar.asc14
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/artifacts.xml16
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/content.xml49
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/plugins/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/plugins/blah_1.0.0.123456.jarbin0 -> 408 bytes
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/plugins/blah_1.0.0.123456.jar.asc14
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/artifacts.xml78
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/content.xml49
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/plugins/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/plugins/blah_1.0.0.123456.jarbin0 -> 408 bytes
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/plugins/blah_1.0.0.123456.jar.asc14
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/artifacts.xml25
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/content.xml49
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/plugins/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/plugins/blah_1.0.0.123456.jarbin0 -> 408 bytes
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/plugins/blah_1.0.0.123456.jar.asc14
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/artifacts.xml78
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/content.xml49
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/plugins/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/plugins/blah_1.0.0.123456.jarbin0 -> 408 bytes
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/plugins/blah_1.0.0.123456.jar.asc14
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/artifacts.xml78
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/content.xml49
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/plugins/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/plugins/blah_1.0.0.123456.jarbin0 -> 408 bytes
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/plugins/blah_1.0.0.123456.jar.asc14
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/pgp/signer2-publickey.asc29
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/updatesite/CategoryXMLActionTest/associateSites.xml2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/updatesite/SiteXMLActionTest/associateSites.xml2
-rw-r--r--bundles/org.eclipse.equinox.p2.tests/testData/updatesite/SiteXMLActionTest/site.xml2
-rw-r--r--bundles/org.eclipse.equinox.p2.testserver/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.testserver/.settings/org.eclipse.jdt.core.prefs38
-rw-r--r--bundles/org.eclipse.equinox.p2.testserver/META-INF/MANIFEST.MF6
-rw-r--r--bundles/org.eclipse.equinox.p2.testserver/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.testserver/src/org/eclipse/equinox/p2/testserver/Activator.java6
-rw-r--r--bundles/org.eclipse.equinox.p2.testserver/webfiles/index.html8
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.eclipse/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.eclipse/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.eclipse/META-INF/MANIFEST.MF6
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.eclipse/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.eclipse/src/org/eclipse/equinox/internal/p2/touchpoint/eclipse/actions/ActionConstants.java1
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.eclipse/src/org/eclipse/equinox/internal/p2/touchpoint/eclipse/actions/AddJVMArgumentAction.java9
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.eclipse/src/org/eclipse/equinox/internal/p2/touchpoint/eclipse/actions/CheckTrustAction.java20
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.natives/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.natives/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.natives/META-INF/MANIFEST.MF13
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.natives/META-INF/p2.inf43
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.natives/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/BackupStore.java834
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/LazyBackupStore.java4
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/Messages.java10
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/SimpleBackupStore.java895
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/Util.java72
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/actions/CleanupcopyAction.java9
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/actions/CopyAction.java47
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/actions/UnzipAction.java24
-rw-r--r--bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/messages.properties10
-rw-r--r--bundles/org.eclipse.equinox.p2.transport.ecf/META-INF/MANIFEST.MF2
-rw-r--r--bundles/org.eclipse.equinox.p2.transport.ecf/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/Activator.java15
-rw-r--r--bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/FileInfoReader.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/FileReader.java28
-rw-r--r--bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/RepositoryTransport.java12
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.admin.rcp/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.admin.rcp/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.admin.rcp/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.admin.rcp/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.admin.rcp/rcp.product64
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.admin/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.admin/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.admin/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.admin/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.discovery/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.discovery/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.discovery/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.discovery/src/org/eclipse/equinox/internal/p2/ui/discovery/wizards/CatalogViewer.java2
-rwxr-xr-xbundles/org.eclipse.equinox.p2.ui.importexport/.classpath2
-rwxr-xr-xbundles/org.eclipse.equinox.p2.ui.importexport/.settings/org.eclipse.jdt.core.prefs13
-rwxr-xr-xbundles/org.eclipse.equinox.p2.ui.importexport/META-INF/MANIFEST.MF5
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.importexport/P2 Replication.launch444
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.importexport/forceQualifierUpdate.txt1
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.importexport/icons/obj16/install-handler.pngbin0 -> 764 bytes
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.importexport/icons/obj16/install-handler@2x.pngbin0 -> 1605 bytes
-rwxr-xr-xbundles/org.eclipse.equinox.p2.ui.importexport/plugin.xml6
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.importexport/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/ImportExportActivator.java33
-rwxr-xr-xbundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ExportWizard.java16
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportFromInstallationPage.java8
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportFromInstallationWizard.java17
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportPage.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportWizard.java37
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/META-INF/MANIFEST.MF2
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdateScheduler.java64
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/PreviousConfigurationFinder.java5
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/MigrationPage.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.sdk/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.sdk/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.sdk/META-INF/MANIFEST.MF9
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.sdk/plugin.properties2
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.sdk/plugin.xml12
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.sdk/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/ProvSDKMessages.java27
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/SimpleLicenseManager.java33
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/TrustPreferencePage.java491
-rw-r--r--bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/messages.properties29
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/.settings/org.eclipse.jdt.core.prefs14
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/META-INF/MANIFEST.MF16
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/forceQualifierUpdate.txt1
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/plugin.xml7
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/IProvHelpContextIds.java22
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/KeySigningInfoFactory.java184
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIMessages.java32
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ServiceUIComponent.java5
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ValidationDialogServiceUI.java404
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/PGPPublicKeyViewDialog.java248
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ProvisioningOperationWizard.java9
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/TrustCertificateDialog.java829
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/messages.properties42
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/viewers/CertificateLabelProvider.java33
-rw-r--r--bundles/org.eclipse.equinox.p2.updatechecker/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.updatechecker/.settings/org.eclipse.jdt.core.prefs12
-rw-r--r--bundles/org.eclipse.equinox.p2.updatechecker/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.updatechecker/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.updatesite/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.p2.updatesite/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.p2.updatesite/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.p2.updatesite/build.properties1
-rw-r--r--bundles/org.eclipse.equinox.p2.updatesite/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/DefaultSiteParser.java668
-rw-r--r--bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteBundle.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteModel.java41
-rw-r--r--bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteXMLAction.java2
-rw-r--r--bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/artifact/UpdateSiteArtifactRepositoryFactory.java23
-rw-r--r--bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/metadata/UpdateSiteMetadataRepositoryFactory.java9
-rw-r--r--bundles/org.eclipse.equinox.simpleconfigurator.manipulator/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.simpleconfigurator.manipulator/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.simpleconfigurator.manipulator/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.simpleconfigurator.manipulator/pom.xml4
-rw-r--r--bundles/org.eclipse.equinox.simpleconfigurator/.classpath2
-rw-r--r--bundles/org.eclipse.equinox.simpleconfigurator/.settings/org.eclipse.jdt.core.prefs13
-rw-r--r--bundles/org.eclipse.equinox.simpleconfigurator/META-INF/MANIFEST.MF4
-rw-r--r--bundles/org.eclipse.equinox.simpleconfigurator/pom.xml4
501 files changed, 12553 insertions, 5541 deletions
diff --git a/bundles/org.eclipse.equinox.frameworkadmin.equinox/.classpath b/bundles/org.eclipse.equinox.frameworkadmin.equinox/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.frameworkadmin.equinox/.classpath
+++ b/bundles/org.eclipse.equinox.frameworkadmin.equinox/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.frameworkadmin.equinox/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.frameworkadmin.equinox/.settings/org.eclipse.jdt.core.prefs
index e90eac15c..1819d992f 100644
--- a/bundles/org.eclipse.equinox.frameworkadmin.equinox/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.frameworkadmin.equinox/.settings/org.eclipse.jdt.core.prefs
@@ -17,9 +17,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -36,6 +36,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -89,6 +90,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -125,9 +127,11 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
@@ -135,20 +139,23 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
@@ -238,11 +245,12 @@ org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
@@ -273,6 +281,8 @@ org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
@@ -297,13 +307,17 @@ org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
@@ -351,6 +365,8 @@ org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do no
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
@@ -387,9 +403,12 @@ org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not inser
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
@@ -425,10 +444,14 @@ org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
org.eclipse.jdt.core.incompatibleJDKLevel=ignore
org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.equinox.frameworkadmin.equinox/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.frameworkadmin.equinox/META-INF/MANIFEST.MF
index fbd1d84fd..5ad6e58c5 100644
--- a/bundles/org.eclipse.equinox.frameworkadmin.equinox/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.frameworkadmin.equinox/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.frameworkadmin.equinox;singleton:=true
-Bundle-Version: 1.1.400.qualifier
+Bundle-Version: 1.2.200.qualifier
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Import-Package: org.eclipse.equinox.frameworkadmin;version="[2.0.0,3.0.0)",
@@ -20,8 +20,8 @@ Import-Package: org.eclipse.equinox.frameworkadmin;version="[2.0.0,3.0.0)",
org.osgi.util.tracker;version="1.3.0"
Export-Package: org.eclipse.equinox.internal.frameworkadmin.equinox;x-friends:="org.eclipse.equinox.p2.publisher,org.eclipse.equinox.p2.publisher.eclipse,org.eclipse.equinox.simpleconfigurator.manipulator",
org.eclipse.equinox.internal.frameworkadmin.equinox.utils;x-friends:="org.eclipse.equinox.p2.publisher.eclipse"
-Require-Bundle: org.eclipse.equinox.common
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.eclipse.equinox.common;bundle-version="3.16.000"
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Service-Component: OSGI-INF/fwadmin.xml
Bundle-ActivationPolicy: lazy
Automatic-Module-Name: org.eclipse.equinox.frameworkadmin.equinox
diff --git a/bundles/org.eclipse.equinox.frameworkadmin.equinox/pom.xml b/bundles/org.eclipse.equinox.frameworkadmin.equinox/pom.xml
index 6c83bcaec..c3ecc7ec9 100644
--- a/bundles/org.eclipse.equinox.frameworkadmin.equinox/pom.xml
+++ b/bundles/org.eclipse.equinox.frameworkadmin.equinox/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.frameworkadmin.equinox</artifactId>
- <version>1.1.400-SNAPSHOT</version>
+ <version>1.2.200-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.frameworkadmin.equinox/src/org/eclipse/equinox/internal/frameworkadmin/equinox/EclipseLauncherParser.java b/bundles/org.eclipse.equinox.frameworkadmin.equinox/src/org/eclipse/equinox/internal/frameworkadmin/equinox/EclipseLauncherParser.java
index 1dd81817b..829753a25 100644
--- a/bundles/org.eclipse.equinox.frameworkadmin.equinox/src/org/eclipse/equinox/internal/frameworkadmin/equinox/EclipseLauncherParser.java
+++ b/bundles/org.eclipse.equinox.frameworkadmin.equinox/src/org/eclipse/equinox/internal/frameworkadmin/equinox/EclipseLauncherParser.java
@@ -34,7 +34,7 @@ public class EclipseLauncherParser {
//this figures out the location of the data area on partial data read from the <eclipse>.ini
private URI getOSGiInstallArea(List<String> lines, URI base, LauncherData launcherData) {
//does the eclipse.ini say anything for osgi.install.area?
- File osgiInstallArea = ParserUtils.getOSGiInstallArea(lines, null, base);
+ File osgiInstallArea = ParserUtils.getOSGiInstallArea(lines, null, launcherData.getLauncher(), base);
if (osgiInstallArea == null) {
//otherwise use the launcherData to figure it out
osgiInstallArea = ParserUtils.getOSGiInstallArea(lines, null, launcherData);
@@ -49,12 +49,13 @@ public class EclipseLauncherParser {
ParserUtils.removeArgument(EquinoxConstants.OPTION_INSTALL, lines);
return;
}
+ File folder = ParserUtils.fromOSGiJarToOSGiInstallArea(launcherData.getFwJar().getAbsolutePath());
if (Constants.OS_MACOSX.equals(launcherData.getOS())) {
- if (!new File(ParserUtils.fromOSGiJarToOSGiInstallArea(launcherData.getFwJar().getAbsolutePath()), "../MacOS").equals(launcherFolder)) {
- ParserUtils.setValueForArgument(EquinoxConstants.OPTION_INSTALL, launcherFolder.getAbsolutePath().replace('\\', '/'), lines);
- }
- } else if (!ParserUtils.fromOSGiJarToOSGiInstallArea(launcherData.getFwJar().getAbsolutePath()).equals(launcherFolder)) {
- ParserUtils.setValueForArgument(EquinoxConstants.OPTION_INSTALL, launcherFolder.getAbsolutePath().replace('\\', '/'), lines);
+ folder = new File(folder, "../MacOS");
+ }
+ if (!folder.equals(launcherFolder)) {
+ // Launcher will replace "@launcher.dir" with actual path. See bug 572890.
+ ParserUtils.setValueForArgument(EquinoxConstants.OPTION_INSTALL, "@launcher.dir/", lines);
}
}
diff --git a/bundles/org.eclipse.equinox.frameworkadmin.equinox/src/org/eclipse/equinox/internal/frameworkadmin/equinox/EquinoxManipulatorImpl.java b/bundles/org.eclipse.equinox.frameworkadmin.equinox/src/org/eclipse/equinox/internal/frameworkadmin/equinox/EquinoxManipulatorImpl.java
index 5b73611ae..8e16a04c8 100644
--- a/bundles/org.eclipse.equinox.frameworkadmin.equinox/src/org/eclipse/equinox/internal/frameworkadmin/equinox/EquinoxManipulatorImpl.java
+++ b/bundles/org.eclipse.equinox.frameworkadmin.equinox/src/org/eclipse/equinox/internal/frameworkadmin/equinox/EquinoxManipulatorImpl.java
@@ -328,20 +328,19 @@ public class EquinoxManipulatorImpl implements Manipulator {
BundleInfo[] bInfos = new BundleInfo[bundles.length];
for (int i = 0; i < bundles.length; i++) {
// System.out.println("bundles[" + i + "]=" + bundles[i]);
- try {
+ Optional<File> bundleFile = FileLocator.getBundleFileLocation(bundles[i]);
+ if (bundleFile.isPresent()) {
if (bundles[i].getBundleId() == 0) // SystemBundle
bInfos[i] = new BundleInfo(bundles[i].getSymbolicName(),
bundles[i].getHeaders("").get(Constants.BUNDLE_VERSION), //$NON-NLS-1$
- FileLocator.getBundleFile(bundles[i]).getAbsoluteFile().toURI(), -1, true);
+ bundleFile.get().getAbsoluteFile().toURI(), -1, true);
else {
bInfos[i] = new BundleInfo(bundles[i].getSymbolicName(),
bundles[i].getHeaders("").get(Constants.BUNDLE_VERSION), //$NON-NLS-1$
- FileLocator.getBundleFile(bundles[i]).getAbsoluteFile().toURI(),
+ bundleFile.get().getAbsoluteFile().toURI(),
bundles[i].adapt(BundleStartLevel.class).getStartLevel(),
bundles[i].adapt(BundleStartLevel.class).isPersistentlyStarted());
}
- } catch (IOException e) {
- e.printStackTrace();
}
}
configData.setBundles(bInfos);
diff --git a/bundles/org.eclipse.equinox.frameworkadmin.equinox/src/org/eclipse/equinox/internal/frameworkadmin/equinox/ParserUtils.java b/bundles/org.eclipse.equinox.frameworkadmin.equinox/src/org/eclipse/equinox/internal/frameworkadmin/equinox/ParserUtils.java
index e9a245a1c..a0a72fb01 100644
--- a/bundles/org.eclipse.equinox.frameworkadmin.equinox/src/org/eclipse/equinox/internal/frameworkadmin/equinox/ParserUtils.java
+++ b/bundles/org.eclipse.equinox.frameworkadmin.equinox/src/org/eclipse/equinox/internal/frameworkadmin/equinox/ParserUtils.java
@@ -28,6 +28,7 @@ import org.osgi.service.log.LogService;
public class ParserUtils {
private static final String FILE_PROTOCOL = "file:"; //$NON-NLS-1$
+ private static final String LAUNCHER_DIR = "@launcher.dir"; //$NON-NLS-1$
public static File getOSGiInstallArea(List<String> programArgs, Properties properties, LauncherData launcherData) {
if (launcherData == null)
@@ -38,7 +39,7 @@ public class ParserUtils {
base = launcherData.getLauncher().getParentFile().toURI();
else if (launcherData.getHome() != null)
base = launcherData.getHome().toURI();
- File result = getOSGiInstallArea(programArgs, properties, base);
+ File result = getOSGiInstallArea(programArgs, properties, launcherData.getLauncher(), base);
if (result != null)
return result;
@@ -84,7 +85,7 @@ public class ParserUtils {
}
//This method should only be used to determine the osgi install area when reading the eclipse.ini
- public static File getOSGiInstallArea(List<String> args, Properties properties, URI base) {
+ public static File getOSGiInstallArea(List<String> args, Properties properties, File launcherFile, URI base) {
if (args == null)
return null;
String install = getValueForArgument(EquinoxConstants.OPTION_INSTALL, args);
@@ -94,6 +95,8 @@ public class ParserUtils {
if (install != null) {
if (install.startsWith(FILE_PROTOCOL))
install = install.substring(FILE_PROTOCOL.length() + 1);
+ if (install.startsWith(LAUNCHER_DIR))
+ install = install.replace(LAUNCHER_DIR, launcherFile.getParent().toString());
File installFile = new File(install);
if (installFile.isAbsolute())
return installFile;
diff --git a/bundles/org.eclipse.equinox.frameworkadmin.test/.classpath b/bundles/org.eclipse.equinox.frameworkadmin.test/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.frameworkadmin.test/.classpath
+++ b/bundles/org.eclipse.equinox.frameworkadmin.test/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.frameworkadmin.test/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.frameworkadmin.test/.settings/org.eclipse.jdt.core.prefs
index 1794e8d27..d3982a2b0 100644
--- a/bundles/org.eclipse.equinox.frameworkadmin.test/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.frameworkadmin.test/.settings/org.eclipse.jdt.core.prefs
@@ -17,9 +17,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -35,6 +35,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -88,6 +89,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -123,7 +125,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -137,7 +140,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -258,7 +260,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -329,7 +330,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -474,7 +474,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.frameworkadmin.test/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.frameworkadmin.test/META-INF/MANIFEST.MF
index f9edb43dd..0cb1f4139 100644
--- a/bundles/org.eclipse.equinox.frameworkadmin.test/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.frameworkadmin.test/META-INF/MANIFEST.MF
@@ -2,16 +2,17 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: org.eclipse.equinox.frameworkadmin.test
-Bundle-Version: 1.2.500.qualifier
+Bundle-Version: 1.3.0.qualifier
Bundle-Vendor: %Bundle-Vendor
Require-Bundle: org.eclipse.core.runtime,
org.eclipse.equinox.frameworkadmin,
org.eclipse.equinox.frameworkadmin.equinox;bundle-version="1.0.100",
- org.junit;bundle-version="3.8.0"
+ org.junit;bundle-version="3.8.0",
+ org.eclipse.equinox.simpleconfigurator.manipulator
Bundle-Activator: org.eclipse.equinox.frameworkadmin.tests.Activator
Import-Package: org.osgi.framework;version="1.4.0"
Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Export-Package: org.eclipse.equinox.frameworkadmin.tests
Eclipse-BundleShape: dir
Automatic-Module-Name: org.eclipse.equinox.frameworkadmin.test
diff --git a/bundles/org.eclipse.equinox.frameworkadmin.test/pom.xml b/bundles/org.eclipse.equinox.frameworkadmin.test/pom.xml
index f3db07bfb..d48775cd2 100644
--- a/bundles/org.eclipse.equinox.frameworkadmin.test/pom.xml
+++ b/bundles/org.eclipse.equinox.frameworkadmin.test/pom.xml
@@ -4,11 +4,25 @@
<parent>
<artifactId>org.eclipse.equinox.p2.tests-parent</artifactId>
<groupId>org.eclipse</groupId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../../org.eclipse.equinox.p2.releng/org.eclipse.equinox.p2.tests-parent</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.frameworkadmin.test</artifactId>
- <version>1.2.500-SNAPSHOT</version>
- <packaging>eclipse-plugin</packaging>
+ <version>1.3.0-SNAPSHOT</version>
+ <packaging>eclipse-test-plugin</packaging>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.tycho</groupId>
+ <artifactId>tycho-surefire-plugin</artifactId>
+ <version>${tycho.version}</version>
+ <configuration>
+ <!-- Test execution not compatible with Tycho at the moment -->
+ <skipTests>true</skipTests>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
</project>
diff --git a/bundles/org.eclipse.equinox.frameworkadmin/.classpath b/bundles/org.eclipse.equinox.frameworkadmin/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.frameworkadmin/.classpath
+++ b/bundles/org.eclipse.equinox.frameworkadmin/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.frameworkadmin/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.frameworkadmin/.settings/org.eclipse.jdt.core.prefs
index f0018a393..579521550 100644
--- a/bundles/org.eclipse.equinox.frameworkadmin/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.frameworkadmin/.settings/org.eclipse.jdt.core.prefs
@@ -10,9 +10,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -27,6 +27,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -84,6 +85,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -119,9 +121,11 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
@@ -129,20 +133,23 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
@@ -232,11 +239,12 @@ org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
@@ -267,6 +275,8 @@ org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
@@ -291,13 +301,17 @@ org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
@@ -345,6 +359,8 @@ org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do no
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
@@ -381,9 +397,12 @@ org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not inser
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
@@ -419,9 +438,13 @@ org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/bundles/org.eclipse.equinox.frameworkadmin/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.frameworkadmin/META-INF/MANIFEST.MF
index 1d86ec3b2..d4bb7cb5e 100644
--- a/bundles/org.eclipse.equinox.frameworkadmin/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.frameworkadmin/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.frameworkadmin;singleton:=true
-Bundle-Version: 2.1.400.qualifier
+Bundle-Version: 2.2.0.qualifier
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Import-Package: org.eclipse.osgi.service.pluginconversion;version="1.0.0",
@@ -23,7 +23,7 @@ Export-Package: org.eclipse.equinox.frameworkadmin;version="2.0.0",
org.eclipse.pde.core,
org.eclipse.pde.ui,
org.eclipse.equinox.p2.publisher.eclipse"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Require-Bundle: org.eclipse.equinox.common;bundle-version="3.4.0"
Bundle-ActivationPolicy: lazy
Automatic-Module-Name: org.eclipse.equinox.frameworkadmin
diff --git a/bundles/org.eclipse.equinox.frameworkadmin/pom.xml b/bundles/org.eclipse.equinox.frameworkadmin/pom.xml
index b965e9462..433dcf50f 100644
--- a/bundles/org.eclipse.equinox.frameworkadmin/pom.xml
+++ b/bundles/org.eclipse.equinox.frameworkadmin/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.frameworkadmin</artifactId>
- <version>2.1.400-SNAPSHOT</version>
+ <version>2.2.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.artifact.checksums.bouncycastle/.classpath b/bundles/org.eclipse.equinox.p2.artifact.checksums.bouncycastle/.classpath
index 6de27b66c..bc3587db4 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.checksums.bouncycastle/.classpath
+++ b/bundles/org.eclipse.equinox.p2.artifact.checksums.bouncycastle/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
<classpathentry kind="output" path="bin"/>
</classpath>
diff --git a/bundles/org.eclipse.equinox.p2.artifact.checksums.bouncycastle/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.artifact.checksums.bouncycastle/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 000000000..7adc0fb9a
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.artifact.checksums.bouncycastle/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,10 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.compliance=11
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
diff --git a/bundles/org.eclipse.equinox.p2.artifact.checksums.bouncycastle/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.artifact.checksums.bouncycastle/META-INF/MANIFEST.MF
index 28688b977..b123fba15 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.checksums.bouncycastle/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.artifact.checksums.bouncycastle/META-INF/MANIFEST.MF
@@ -2,10 +2,10 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.artifact.checksums.bouncycastle;singleton:=true
-Bundle-Version: 1.0.0.qualifier
+Bundle-Version: 1.1.0.qualifier
Bundle-Vendor: %providerName
Bundle-Localization: plugin
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Require-Bundle: org.eclipse.equinox.p2.artifact.repository;bundle-version="[1.3.200,2.0.0)"
Import-Package: org.bouncycastle.jce.provider;version="[1.59.0,2.0.0)"
diff --git a/bundles/org.eclipse.equinox.p2.artifact.checksums.bouncycastle/pom.xml b/bundles/org.eclipse.equinox.p2.artifact.checksums.bouncycastle/pom.xml
index 966b6b5ce..72d6db126 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.checksums.bouncycastle/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.artifact.checksums.bouncycastle/pom.xml
@@ -4,14 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.artifact.checksums.bouncycastle</artifactId>
- <version>1.0.0-SNAPSHOT</version>
+ <version>1.1.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
- <properties>
- <skipAPIAnalysis>true</skipAPIAnalysis>
- </properties>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.artifact.optimizers/.classpath b/bundles/org.eclipse.equinox.p2.artifact.optimizers/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.optimizers/.classpath
+++ b/bundles/org.eclipse.equinox.p2.artifact.optimizers/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.artifact.optimizers/.settings/org.eclipse.core.resources.prefs b/bundles/org.eclipse.equinox.p2.artifact.optimizers/.settings/org.eclipse.core.resources.prefs
index c9dc95db0..906f2626d 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.optimizers/.settings/org.eclipse.core.resources.prefs
+++ b/bundles/org.eclipse.equinox.p2.artifact.optimizers/.settings/org.eclipse.core.resources.prefs
@@ -1,3 +1,3 @@
#Wed Nov 14 12:49:29 EST 2007
eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
+encoding/<project>=UTF-8
diff --git a/bundles/org.eclipse.equinox.p2.artifact.optimizers/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.artifact.optimizers/.settings/org.eclipse.jdt.core.prefs
index 01dc9cade..6b5625424 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.optimizers/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.artifact.optimizers/.settings/org.eclipse.jdt.core.prefs
@@ -17,9 +17,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -36,6 +36,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -94,6 +95,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -130,9 +132,11 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
@@ -140,20 +144,23 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
@@ -245,11 +252,12 @@ org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
@@ -280,6 +288,8 @@ org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
@@ -304,13 +314,17 @@ org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
@@ -358,6 +372,8 @@ org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do no
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
@@ -394,9 +410,12 @@ org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not inser
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
@@ -432,10 +451,14 @@ org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
org.eclipse.jdt.core.incompatibleJDKLevel=ignore
org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.equinox.p2.artifact.optimizers/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.artifact.optimizers/META-INF/MANIFEST.MF
index 5450fecb1..c2f216314 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.optimizers/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.artifact.optimizers/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.artifact.optimizers;singleton:=true
-Bundle-Version: 1.1.0.qualifier
+Bundle-Version: 1.2.0.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.artifact.optimizers.Activator
Bundle-Vendor: %providerName
Bundle-Localization: plugin
@@ -11,7 +11,7 @@ Export-Package: org.eclipse.equinox.internal.p2.artifact.optimizers;x-friends:="
org.eclipse.equinox.internal.p2.artifact.optimizers.pack200;x-internal:=true
Require-Bundle: org.eclipse.equinox.common,
org.eclipse.equinox.p2.artifact.repository
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Import-Package: org.eclipse.equinox.app;version="1.0.0",
org.eclipse.equinox.internal.p2.core.helpers,
diff --git a/bundles/org.eclipse.equinox.p2.artifact.optimizers/pom.xml b/bundles/org.eclipse.equinox.p2.artifact.optimizers/pom.xml
index c8c0428e5..8d09d7881 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.optimizers/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.artifact.optimizers/pom.xml
@@ -4,15 +4,12 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.artifact.optimizers</artifactId>
- <version>1.1.0-SNAPSHOT</version>
+ <version>1.2.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
- <properties>
- <skipAPIAnalysis>true</skipAPIAnalysis>
- </properties>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Application.java b/bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Application.java
index 695202da5..0fcaab754 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Application.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Application.java
@@ -22,6 +22,13 @@ import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
import org.eclipse.equinox.p2.repository.artifact.IArtifactRepositoryManager;
+/**
+ * @noextend This class is not intended to be subclassed by clients.
+ * @noreference This class is not intended to be referenced by clients.
+ *
+ * @deprecated See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a> for details.
+ */
+@Deprecated(forRemoval = true, since = "1.2.0")
public class Application extends OptimizerApplication {
// Application return code
private static final Integer NON_WRITTABLE_REPOSITORY = -1;
diff --git a/bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Messages.java b/bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Messages.java
index 6865a727e..24437eb3a 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Messages.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Messages.java
@@ -8,13 +8,20 @@
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
- *
+ *
* Contributors: IBM Corporation - initial API and implementation
******************************************************************************/
package org.eclipse.equinox.internal.p2.artifact.optimizers.pack200;
import org.eclipse.osgi.util.NLS;
+/**
+ * @noextend This class is not intended to be subclassed by clients.
+ * @noreference This class is not intended to be referenced by clients.
+ *
+ * @deprecated See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a> for details.
+ */
+@Deprecated(forRemoval = true, since = "1.2.0")
public class Messages extends NLS {
private static final String BUNDLE_NAME = "org.eclipse.equinox.internal.p2.artifact.optimizers.pack200.messages"; //$NON-NLS-1$
public static String failed_getting_artifact;
diff --git a/bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Optimizer.java b/bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Optimizer.java
index 096885e07..8038c450d 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Optimizer.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Optimizer.java
@@ -27,6 +27,13 @@ import org.eclipse.equinox.p2.repository.artifact.spi.ArtifactDescriptor;
import org.eclipse.equinox.p2.repository.artifact.spi.ProcessingStepDescriptor;
import org.eclipse.osgi.util.NLS;
+/**
+ * @noextend This class is not intended to be subclassed by clients.
+ * @noreference This class is not intended to be referenced by clients.
+ * @noinstantiate This class is not intended to be instantiated by clients.
+ * @deprecated See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a> for details.
+ */
+@Deprecated(forRemoval = true, since = "1.2.0")
public class Optimizer {
private final IArtifactRepository repository;
diff --git a/bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Pack200OptimizerStep.java b/bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Pack200OptimizerStep.java
index f36f9b9df..e4937fa48 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Pack200OptimizerStep.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.optimizers/src/org/eclipse/equinox/internal/p2/artifact/optimizers/pack200/Pack200OptimizerStep.java
@@ -26,7 +26,13 @@ import org.eclipse.internal.provisional.equinox.p2.jarprocessor.JarProcessorExec
/**
* The Pack200Packer expects an input containing normal ".jar" data.
+ *
+ * @noextend This class is not intended to be subclassed by clients.
+ * @noinstantiate This class is not intended to be instantiated by clients.
+ * @noreference This class is not intended to be referenced by clients.
+ * @deprecated See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a> for details.
*/
+@Deprecated(forRemoval = true, since = "1.2.0")
public class Pack200OptimizerStep extends AbstractBufferingStep {
private static final String PACKED_SUFFIX = ".pack.gz"; //$NON-NLS-1$
private File incoming;
diff --git a/bundles/org.eclipse.equinox.p2.artifact.processors/.classpath b/bundles/org.eclipse.equinox.p2.artifact.processors/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.processors/.classpath
+++ b/bundles/org.eclipse.equinox.p2.artifact.processors/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.artifact.processors/.settings/org.eclipse.core.resources.prefs b/bundles/org.eclipse.equinox.p2.artifact.processors/.settings/org.eclipse.core.resources.prefs
index c973c1373..79834331c 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.processors/.settings/org.eclipse.core.resources.prefs
+++ b/bundles/org.eclipse.equinox.p2.artifact.processors/.settings/org.eclipse.core.resources.prefs
@@ -1,3 +1,3 @@
#Wed Nov 14 12:49:38 EST 2007
eclipse.preferences.version=1
-encoding/<project>=ISO-8859-1
+encoding/<project>=UTF-8
diff --git a/bundles/org.eclipse.equinox.p2.artifact.processors/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.artifact.processors/.settings/org.eclipse.jdt.core.prefs
index 0eaaba2e8..9dab61dd4 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.processors/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.artifact.processors/.settings/org.eclipse.jdt.core.prefs
@@ -18,9 +18,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -37,6 +37,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -90,6 +91,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -126,10 +128,11 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
@@ -137,20 +140,23 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
@@ -242,11 +248,12 @@ org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
@@ -277,6 +284,8 @@ org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
@@ -301,13 +310,17 @@ org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
@@ -355,6 +368,8 @@ org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do no
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
@@ -391,9 +406,12 @@ org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not inser
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
@@ -429,10 +447,14 @@ org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
org.eclipse.jdt.core.incompatibleJDKLevel=ignore
org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.equinox.p2.artifact.processors/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.artifact.processors/META-INF/MANIFEST.MF
index 027e628ae..785bd915d 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.processors/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.artifact.processors/META-INF/MANIFEST.MF
@@ -2,15 +2,14 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.artifact.processors;singleton:=true
-Bundle-Version: 1.1.0.qualifier
-Bundle-Activator: org.eclipse.equinox.internal.p2.artifact.processors.Activator
+Bundle-Version: 1.2.0.qualifier
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Export-Package: org.eclipse.equinox.internal.p2.artifact.processors;x-internal:=true,
org.eclipse.equinox.internal.p2.artifact.processors.jardelta;x-internal:=true
Require-Bundle: org.eclipse.equinox.common,
org.eclipse.equinox.p2.artifact.repository
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Import-Package: org.eclipse.equinox.internal.p2.artifact.optimizers,
org.eclipse.equinox.internal.p2.core.helpers,
diff --git a/bundles/org.eclipse.equinox.p2.artifact.processors/pom.xml b/bundles/org.eclipse.equinox.p2.artifact.processors/pom.xml
index 4d6ecd2bc..08e7da3c8 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.processors/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.artifact.processors/pom.xml
@@ -4,15 +4,12 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.artifact.processors</artifactId>
- <version>1.1.0-SNAPSHOT</version>
+ <version>1.2.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
- <properties>
- <skipAPIAnalysis>true</skipAPIAnalysis>
- </properties>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.artifact.processors/src/org/eclipse/equinox/internal/p2/artifact/processors/AbstractDeltaProcessorStep.java b/bundles/org.eclipse.equinox.p2.artifact.processors/src/org/eclipse/equinox/internal/p2/artifact/processors/AbstractDeltaProcessorStep.java
index 5080995ed..6ae23807a 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.processors/src/org/eclipse/equinox/internal/p2/artifact/processors/AbstractDeltaProcessorStep.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.processors/src/org/eclipse/equinox/internal/p2/artifact/processors/AbstractDeltaProcessorStep.java
@@ -49,7 +49,7 @@ public abstract class AbstractDeltaProcessorStep extends AbstractDeltaStep {
return;
IArtifactRepositoryManager repoMgr = agent.getService(IArtifactRepositoryManager.class);
if (repoMgr == null) {
- setStatus(new Status(IStatus.ERROR, Activator.ID, "Could not get artifact repository manager."));
+ setStatus(new Status(IStatus.ERROR, BundleInfo.ID, "Could not get artifact repository manager."));
return;
}
@@ -65,7 +65,7 @@ public abstract class AbstractDeltaProcessorStep extends AbstractDeltaStep {
// just skip unreadable repositories
}
}
- setStatus(new Status(IStatus.ERROR, Activator.ID, "No repository available containing key " + key));
+ setStatus(new Status(IStatus.ERROR, BundleInfo.ID, "No repository available containing key " + key));
}
}
diff --git a/bundles/org.eclipse.equinox.p2.artifact.processors/src/org/eclipse/equinox/internal/p2/artifact/processors/Activator.java b/bundles/org.eclipse.equinox.p2.artifact.processors/src/org/eclipse/equinox/internal/p2/artifact/processors/BundleInfo.java
index 2454b0dc9..bbcf6181a 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.processors/src/org/eclipse/equinox/internal/p2/artifact/processors/Activator.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.processors/src/org/eclipse/equinox/internal/p2/artifact/processors/BundleInfo.java
@@ -14,26 +14,8 @@
package org.eclipse.equinox.internal.p2.artifact.processors;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-
-public class Activator implements BundleActivator {
+public class BundleInfo {
public static final String ID = "org.eclipse.equinox.p2.artifact.processors"; //$NON-NLS-1$
- private static BundleContext _context = null;
-
- public static BundleContext getContext() {
- return _context;
- }
-
- @Override
- public void start(BundleContext context) throws Exception {
- Activator._context = context;
- }
-
- @Override
- public void stop(BundleContext context) throws Exception {
- // nothing to do
- }
}
diff --git a/bundles/org.eclipse.equinox.p2.artifact.processors/src/org/eclipse/equinox/internal/p2/artifact/processors/jardelta/JarDeltaProcessorStep.java b/bundles/org.eclipse.equinox.p2.artifact.processors/src/org/eclipse/equinox/internal/p2/artifact/processors/jardelta/JarDeltaProcessorStep.java
index ac0bd5e13..47345f1a8 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.processors/src/org/eclipse/equinox/internal/p2/artifact/processors/jardelta/JarDeltaProcessorStep.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.processors/src/org/eclipse/equinox/internal/p2/artifact/processors/jardelta/JarDeltaProcessorStep.java
@@ -17,7 +17,7 @@ import java.io.*;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.equinox.internal.p2.artifact.processors.AbstractDeltaProcessorStep;
-import org.eclipse.equinox.internal.p2.artifact.processors.Activator;
+import org.eclipse.equinox.internal.p2.artifact.processors.BundleInfo;
import org.eclipse.equinox.internal.p2.core.helpers.FileUtils;
import org.eclipse.equinox.p2.repository.artifact.spi.ArtifactDescriptor;
@@ -55,7 +55,7 @@ public class JarDeltaProcessorStep extends AbstractDeltaProcessorStep {
InputStream resultStream = new BufferedInputStream(new FileInputStream(resultFile));
FileUtils.copyStream(resultStream, true, getDestination(), false);
} else {
- setStatus(new Status(IStatus.ERROR, Activator.ID, "Empty optimized file: " + resultFile)); //$NON-NLS-1$
+ setStatus(new Status(IStatus.ERROR, BundleInfo.ID, "Empty optimized file: " + resultFile)); //$NON-NLS-1$
}
} finally {
if (resultFile != null)
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/.classpath b/bundles/org.eclipse.equinox.p2.artifact.repository/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/.classpath
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.artifact.repository/.settings/org.eclipse.jdt.core.prefs
index 75bfd5011..f015e9f64 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/.settings/org.eclipse.jdt.core.prefs
@@ -17,9 +17,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -35,6 +35,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -88,6 +89,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -123,7 +125,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -137,7 +140,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -258,7 +260,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -329,7 +330,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -474,7 +474,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
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 a0243631d..05dc70a3c 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
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.artifact.repository;singleton:=true
-Bundle-Version: 1.3.500.qualifier
+Bundle-Version: 1.4.400.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.artifact.repository.Activator
Bundle-Vendor: %providerName
Bundle-Localization: plugin
@@ -10,6 +10,7 @@ Export-Package: org.eclipse.equinox.internal.p2.artifact.processing;x-friends:="
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,
org.eclipse.equinox.p2.reconciler.dropins,
@@ -37,6 +38,14 @@ Require-Bundle: org.eclipse.equinox.common;bundle-version="[3.7.0,4.0.0)",
org.eclipse.equinox.p2.metadata,
org.tukaani.xz;bundle-version="1.3.0"
Import-Package: javax.xml.parsers,
+ org.bouncycastle.bcpg;version="1.65.0",
+ org.bouncycastle.jce.provider;version="1.65.1",
+ org.bouncycastle.openpgp;version="1.65.0",
+ org.bouncycastle.openpgp.bc;version="1.65.0",
+ org.bouncycastle.openpgp.jcajce;version="1.65.0",
+ org.bouncycastle.openpgp.operator;version="1.65.0",
+ org.bouncycastle.openpgp.operator.bc;version="1.65.0",
+ org.bouncycastle.openpgp.operator.jcajce;version="1.65.0",
org.eclipse.core.runtime.jobs,
org.eclipse.equinox.internal.p2.core.helpers,
org.eclipse.equinox.internal.p2.jarprocessor,
@@ -62,5 +71,5 @@ Import-Package: javax.xml.parsers,
org.xml.sax;resolution:=optional
Service-Component: OSGI-INF/repositoryManager.xml
Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Automatic-Module-Name: org.eclipse.equinox.p2.artifact.repository
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/plugin.xml b/bundles/org.eclipse.equinox.p2.artifact.repository/plugin.xml
index bf5778333..4be690540 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/plugin.xml
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/plugin.xml
@@ -41,8 +41,9 @@
<extension
point="org.eclipse.equinox.p2.artifact.repository.artifactChecksums">
<artifactChecksum
- algorithm="MD5"
- id="md5">
+ algorithm="MD5"
+ id="md5"
+ warnInsecure="true">
</artifactChecksum>
</extension>
<extension
@@ -52,4 +53,10 @@
id="sha-256">
</artifactChecksum>
</extension>
+
+ <extension
+ id="org.eclipse.equinox.p2.processing.PGPSignatureCheck"
+ point="org.eclipse.equinox.p2.artifact.repository.processingSteps">
+ <step class="org.eclipse.equinox.internal.p2.artifact.processors.pgp.PGPSignatureVerifier"/>
+ </extension>
</plugin>
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/pom.xml b/bundles/org.eclipse.equinox.p2.artifact.repository/pom.xml
index e96600c7e..bc016ef5a 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/pom.xml
@@ -4,22 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.artifact.repository</artifactId>
- <version>1.3.500-SNAPSHOT</version>
+ <version>1.4.400-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
- <profiles>
- <profile>
- <id>jdk9-or-newer</id>
- <activation>
- <jdk>[9,)</jdk>
- </activation>
- <properties>
- <maven.compiler.release>8</maven.compiler.release>
- </properties>
- </profile>
- </profiles>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/schema/artifactChecksums.exsd b/bundles/org.eclipse.equinox.p2.artifact.repository/schema/artifactChecksums.exsd
index 0f7b4b097..017af5b24 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/schema/artifactChecksums.exsd
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/schema/artifactChecksums.exsd
@@ -76,6 +76,14 @@ As other tools will rely on this id, consider using some well-defined value (i.e
</documentation>
</annotation>
</attribute>
+ <attribute name="warnInsecure" type="boolean">
+ <annotation>
+ <documentation>
+ Since 1.4.300
+Set to true if this algorithm is now considered as insecure. A warning will be logged when this algorithm is used. An artifact that has no checksums or checksums only for insecure algorithms will emit a warning to user.
+ </documentation>
+ </annotation>
+ </attribute>
</complexType>
</element>
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/checksum/ChecksumUtilities.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/checksum/ChecksumUtilities.java
index f45b7f203..ca091e5ea 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/checksum/ChecksumUtilities.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/checksum/ChecksumUtilities.java
@@ -19,12 +19,13 @@ import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.util.*;
import java.util.Map.Entry;
+import java.util.stream.Collectors;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.internal.p2.artifact.repository.Messages;
+import org.eclipse.equinox.internal.p2.core.helpers.LogHelper;
import org.eclipse.equinox.internal.p2.repository.Activator;
import org.eclipse.equinox.internal.p2.repository.helpers.ChecksumHelper;
import org.eclipse.equinox.internal.p2.repository.helpers.ChecksumProducer;
-import org.eclipse.equinox.internal.provisional.p2.artifact.repository.processing.ProcessingStep;
import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor;
import org.eclipse.equinox.p2.repository.artifact.spi.ProcessingStepDescriptor;
import org.eclipse.osgi.util.NLS;
@@ -43,8 +44,9 @@ public class ChecksumUtilities {
* @throws IllegalArgumentException if property neither {@link IArtifactDescriptor#ARTIFACT_CHECKSUM} nor {@link IArtifactDescriptor#DOWNLOAD_CHECKSUM}
* @see ChecksumHelper#getChecksums(IArtifactDescriptor, String)
*/
- public static Collection<ProcessingStep> getChecksumVerifiers(IArtifactDescriptor descriptor, String property, Set<String> checksumsToSkip) throws IllegalArgumentException {
- Collection<ProcessingStep> steps = new ArrayList<>();
+ public static Collection<ChecksumVerifier> getChecksumVerifiers(IArtifactDescriptor descriptor,
+ String property, Set<String> checksumsToSkip) throws IllegalArgumentException {
+ Collection<ChecksumVerifier> steps = new ArrayList<>();
Map<String, String> checksums = ChecksumHelper.getChecksums(descriptor, property);
IConfigurationElement[] checksumVerifierConfigurations = getChecksumComparatorConfigurations();
@@ -58,17 +60,25 @@ public class ChecksumUtilities {
if (checksumEntry.getKey().equals(checksumId)) {
String checksumAlgorithm = checksumVerifierConfiguration.getAttribute("algorithm"); //$NON-NLS-1$
String providerName = checksumVerifierConfiguration.getAttribute("providerName"); //$NON-NLS-1$
- ChecksumVerifier checksumVerifier = new ChecksumVerifier(checksumAlgorithm, providerName, checksumId);
+ boolean insecure = Boolean.parseBoolean(checksumVerifierConfiguration.getAttribute("warnInsecure")); //$NON-NLS-1$
+ ChecksumVerifier checksumVerifier = new ChecksumVerifier(checksumAlgorithm, providerName, checksumId, insecure);
checksumVerifier.initialize(null, new ProcessingStepDescriptor(null, checksumEntry.getValue(), true), descriptor);
- if (checksumVerifier.getStatus().isOK())
+ if (checksumVerifier.getStatus().isOK()) {
steps.add(checksumVerifier);
- else
- // TODO log something?
- continue;
+ } else {
+ LogHelper.log(checksumVerifier.getStatus());
+ }
}
}
}
+ if (!steps.isEmpty() && steps.stream().allMatch(ChecksumVerifier::isInsecureAlgorithm)) {
+ LogHelper.log(new Status(IStatus.WARNING, Activator.ID,
+ NLS.bind(Messages.onlyInsecureDigestAlgorithmUsed,
+ steps.stream().map(ChecksumVerifier::getAlgorithmId).collect(Collectors.joining(",")), //$NON-NLS-1$
+ descriptor.getArtifactKey())));
+ }
+
return steps;
}
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/checksum/ChecksumVerifier.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/checksum/ChecksumVerifier.java
index 4d913c46d..a11041bb4 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/checksum/ChecksumVerifier.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/checksum/ChecksumVerifier.java
@@ -33,12 +33,14 @@ final public class ChecksumVerifier extends MessageDigestProcessingStep {
final private String algorithmName;
final private String providerName;
final private String algorithmId;
+ private final boolean insecureAlgorithm;
// public to access from tests
- public ChecksumVerifier(String digestAlgorithm, String providerName, String algorithmId) {
+ public ChecksumVerifier(String digestAlgorithm, String providerName, String algorithmId, boolean insecure) {
this.algorithmName = digestAlgorithm;
this.providerName = providerName;
this.algorithmId = algorithmId;
+ this.insecureAlgorithm = insecure;
basicInitialize(null);
}
@@ -91,4 +93,7 @@ final public class ChecksumVerifier extends MessageDigestProcessingStep {
return algorithmId;
}
+ public boolean isInsecureAlgorithm() {
+ return insecureAlgorithm;
+ }
}
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/md5/MD5Verifier.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/md5/MD5Verifier.java
index 1128de496..8d7899788 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/md5/MD5Verifier.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/md5/MD5Verifier.java
@@ -70,7 +70,9 @@ public class MD5Verifier extends MessageDigestProcessingStep {
@Override
protected void onClose(String digestString) {
// if the hashes don't line up set the status to error.
- if (!digestString.equals(expectedMD5))
+ if (!digestString.equals(expectedMD5)) {
setStatus(new Status(IStatus.ERROR, Activator.ID, ProvisionException.ARTIFACT_MD5_NOT_MATCH, NLS.bind(Messages.Error_unexpected_hash, expectedMD5, digestString), null));
+ }
+ setStatus(new Status(IStatus.WARNING, Activator.ID, Messages.MD5_deprecated));
}
}
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/md5/Messages.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/md5/Messages.java
index 3a873e912..32636d0b8 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/md5/Messages.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/md5/Messages.java
@@ -23,6 +23,8 @@ public class Messages extends NLS {
public static String Error_MD5_unavailable;
public static String Error_unexpected_hash;
+ public static String MD5_deprecated;
+
static {
// initialize resource bundle
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/md5/messages.properties b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/md5/messages.properties
index ff1415688..1e2c7e843 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/md5/messages.properties
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/md5/messages.properties
@@ -15,3 +15,4 @@
Error_invalid_hash=MD5 value not available or incorrect size, {0}.
Error_MD5_unavailable=Could not create MD5 algorithm.
Error_unexpected_hash=MD5 hash is not as expected. Expected: {0} and found {1}.
+MD5_deprecated=MD5 is a deprecated and unsafe checksum algorithm. Consider abandoning it in favor of safer checksums. \ No newline at end of file
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
index 9d85ac7ac..81089af71 100644
--- 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
@@ -32,7 +32,12 @@ import org.eclipse.internal.provisional.equinox.p2.jarprocessor.JarProcessorExec
/**
* 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 <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a> 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 static boolean detailedResult = false;
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pgp/Messages.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pgp/Messages.java
new file mode 100644
index 000000000..4f522f0a0
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pgp/Messages.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Red Hat Inc. 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
+ *******************************************************************************/
+package org.eclipse.equinox.internal.p2.artifact.processors.pgp;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+ private static final String BUNDLE_NAME = "org.eclipse.equinox.internal.p2.artifact.processors.pgp.messages"; //$NON-NLS-1$
+
+ public static String Error_SignatureAfterKeyExpiration;
+
+ public static String Error_SignatureAfterKeyRevocation;
+
+ public static String Error_SignatureAndFileDontMatch;
+
+ public static String Error_CouldNotLoadSignature;
+
+ public static String Warning_publicKeyNotFound;
+
+ static {
+ // initialize resource bundle
+ NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+ }
+
+ private Messages() {
+ //empty
+ }
+}
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pgp/PGPPublicKeyStore.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pgp/PGPPublicKeyStore.java
new file mode 100644
index 000000000..8f3d15083
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pgp/PGPPublicKeyStore.java
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Red Hat Inc. 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
+ *******************************************************************************/
+package org.eclipse.equinox.internal.p2.artifact.processors.pgp;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+import org.bouncycastle.bcpg.ArmoredOutputStream;
+import org.bouncycastle.openpgp.*;
+import org.bouncycastle.openpgp.jcajce.JcaPGPObjectFactory;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.equinox.internal.p2.artifact.repository.Activator;
+import org.eclipse.equinox.internal.p2.core.helpers.LogHelper;
+import org.eclipse.equinox.p2.repository.spi.PGPPublicKeyService;
+
+public class PGPPublicKeyStore {
+ private Map<String, PGPPublicKey> keys = new LinkedHashMap<>();
+
+ public PGPPublicKey addKey(PGPPublicKey key) {
+ if (key == null) {
+ return null;
+ }
+ PGPPublicKey alreadyStoredKey = keys.putIfAbsent(PGPPublicKeyService.toHexFingerprint(key), key);
+ return alreadyStoredKey == null ? key : alreadyStoredKey;
+ }
+
+ public Collection<PGPPublicKey> getKeys(long id) {
+ return keys.values().stream().filter(key -> key.getKeyID() == id).collect(Collectors.toList());
+ }
+
+ public void addKeys(String... armoredPublicKeys) {
+ for (String armoredKey : armoredPublicKeys) {
+ if (armoredKey != null) {
+ PGPPublicKeyStore.readPublicKeys(armoredKey).forEach(this::addKey);
+ }
+ }
+ }
+
+ /**
+ * Test only
+ */
+ public void clear() {
+ keys.clear();
+ }
+
+ public Collection<PGPPublicKey> all() {
+ return Collections.unmodifiableCollection(keys.values());
+ }
+
+ public boolean isEmpty() {
+ return keys.isEmpty();
+ }
+
+ public String toArmoredString() throws IOException {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ ArmoredOutputStream armoredOut = new ArmoredOutputStream(out);
+ for (PGPPublicKey key : all()) {
+ key.encode(armoredOut);
+ }
+ armoredOut.close();
+ out.close();
+ return new String(out.toByteArray(), StandardCharsets.US_ASCII);
+ }
+
+ public void remove(PGPPublicKey selectedKey) {
+ keys.remove(PGPPublicKeyService.toHexFingerprint(selectedKey));
+ }
+
+ public void add(File file) {
+ try (InputStream stream = new FileInputStream(file)) {
+ readPublicKeys(stream).forEach(this::addKey);
+ } catch (IOException e) {
+ LogHelper.log(new Status(IStatus.ERROR, Activator.ID, "Could not read PGP key from " + file, e)); //$NON-NLS-1$
+ }
+ }
+
+ public static Set<PGPPublicKey> readPublicKeys(InputStream input) throws IOException {
+ return readPublicKeys(new String(input.readAllBytes(), StandardCharsets.US_ASCII));
+ }
+
+ @SuppressWarnings("unchecked")
+ public static Set<PGPPublicKey> readPublicKeys(String armoredPublicKeyring) {
+ if (armoredPublicKeyring == null) {
+ return Set.of();
+ }
+ Set<PGPPublicKey> res = new HashSet<>();
+ try (InputStream stream = PGPUtil.getDecoderStream(new ByteArrayInputStream(
+ PGPSignatureVerifier.unnormalizedPGPProperty(armoredPublicKeyring)
+ .getBytes(StandardCharsets.US_ASCII)))) {
+ new JcaPGPObjectFactory(stream).forEach(o -> {
+ if (o instanceof PGPPublicKeyRingCollection) {
+ collectKeys((PGPPublicKeyRingCollection) o, res::add);
+ }
+ if (o instanceof PGPPublicKeyRing) {
+ collectKeys((PGPPublicKeyRing) o, res::add);
+ }
+ if (o instanceof PGPPublicKey) {
+ res.add((PGPPublicKey) o);
+ }
+ });
+ } catch (IOException | PGPRuntimeOperationException e) {
+ LogHelper.log(new Status(IStatus.ERROR, Activator.ID, e.getMessage(), e));
+ }
+ return res;
+
+ }
+
+ private static void collectKeys(PGPPublicKeyRingCollection pgpPublicKeyRingCollection,
+ Consumer<PGPPublicKey> collector) {
+ pgpPublicKeyRingCollection.forEach(keyring -> collectKeys(keyring, collector));
+ }
+
+ private static void collectKeys(PGPPublicKeyRing pgpPublicKeyRing, Consumer<PGPPublicKey> collector) {
+ pgpPublicKeyRing.getPublicKeys().forEachRemaining(collector::accept);
+ }
+} \ No newline at end of file
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pgp/PGPSignatureVerifier.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pgp/PGPSignatureVerifier.java
new file mode 100644
index 000000000..b994b7740
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pgp/PGPSignatureVerifier.java
@@ -0,0 +1,275 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Red Hat Inc. 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
+ *******************************************************************************/
+package org.eclipse.equinox.internal.p2.artifact.processors.pgp;
+
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import java.util.Map.Entry;
+import org.bouncycastle.bcpg.ArmoredInputStream;
+import org.bouncycastle.openpgp.*;
+import org.bouncycastle.openpgp.bc.BcPGPObjectFactory;
+import org.bouncycastle.openpgp.operator.PGPContentVerifier;
+import org.bouncycastle.openpgp.operator.PGPContentVerifierBuilder;
+import org.bouncycastle.openpgp.operator.bc.BcPGPContentVerifierBuilderProvider;
+import org.eclipse.core.runtime.*;
+import org.eclipse.equinox.internal.p2.artifact.repository.Activator;
+import org.eclipse.equinox.internal.p2.core.helpers.LogHelper;
+import org.eclipse.equinox.internal.provisional.p2.artifact.repository.processing.ProcessingStep;
+import org.eclipse.equinox.p2.core.IProvisioningAgent;
+import org.eclipse.equinox.p2.repository.artifact.*;
+import org.eclipse.equinox.p2.repository.artifact.spi.ArtifactDescriptor;
+import org.eclipse.equinox.p2.repository.spi.PGPPublicKeyService;
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * This processing step verifies PGP signatures are correct (i.e., the artifact
+ * was not tampered during fetch). Note that is does <b>not</b> deal with trust.
+ * Dealing with trusted signers is done as part of CheckTrust and touchpoint
+ * phase.
+ */
+public final class PGPSignatureVerifier extends ProcessingStep {
+
+ /**
+ * ID of the registering
+ * <code>org.eclipse.equinox.p2.artifact.repository.processingSteps</tt>
+ * extension.
+ */
+ public static final String ID = "org.eclipse.equinox.p2.processing.PGPSignatureCheck"; //$NON-NLS-1$
+
+ public static final String PGP_SIGNER_KEYS_PROPERTY_NAME = "pgp.publicKeys"; //$NON-NLS-1$
+
+ public static final String PGP_SIGNATURES_PROPERTY_NAME = "pgp.signatures"; //$NON-NLS-1$
+
+ private PGPPublicKeyService keyService;
+
+ private IArtifactDescriptor sourceDescriptor;
+
+ private Map<PGPSignature, List<PGPContentVerifier>> signaturesToVerify = new LinkedHashMap<>();
+
+ private Map<PGPContentVerifier, PGPPublicKey> verifierKeys = new LinkedHashMap<>();
+
+ private List<OutputStream> signatureVerifiers = new ArrayList<>();
+
+ public PGPSignatureVerifier() {
+ super();
+ link(nullOutputStream(), new NullProgressMonitor()); // this is convenience for tests
+ }
+
+ public static Collection<PGPSignature> getSignatures(IArtifactDescriptor artifact)
+ throws IOException, PGPException {
+ String signatureText = unnormalizedPGPProperty(artifact.getProperty(PGP_SIGNATURES_PROPERTY_NAME));
+ if (signatureText == null) {
+ return Collections.emptyList();
+ }
+ List<PGPSignature> res = new ArrayList<>();
+ try (InputStream in = new ArmoredInputStream(
+ new ByteArrayInputStream(signatureText.getBytes(StandardCharsets.US_ASCII)))) {
+ PGPObjectFactory pgpFactory = new BcPGPObjectFactory(in);
+ Object o = pgpFactory.nextObject();
+ PGPSignatureList signatureList = new PGPSignatureList(new PGPSignature[0]);
+ if (o instanceof PGPCompressedData) {
+ PGPCompressedData pgpCompressData = (PGPCompressedData) o;
+ pgpFactory = new BcPGPObjectFactory(pgpCompressData.getDataStream());
+ signatureList = (PGPSignatureList) pgpFactory.nextObject();
+ } else if (o instanceof PGPSignatureList) {
+ signatureList = (PGPSignatureList) o;
+ }
+ signatureList.iterator().forEachRemaining(res::add);
+ }
+ return res;
+ }
+
+ public static PGPPublicKeyStore getKeys(IArtifactDescriptor artifact) {
+ PGPPublicKeyStore keyStore = new PGPPublicKeyStore();
+ String keyText = artifact.getProperty(PGPSignatureVerifier.PGP_SIGNER_KEYS_PROPERTY_NAME);
+ PGPPublicKeyStore.readPublicKeys(keyText).stream().forEach(keyStore::addKey);
+ return keyStore;
+ }
+
+ @Override
+ public void initialize(IProvisioningAgent agent, IProcessingStepDescriptor descriptor,
+ IArtifactDescriptor context) {
+ super.initialize(agent, descriptor, context);
+
+ sourceDescriptor = context;
+ keyService = agent.getService(PGPPublicKeyService.class);
+
+// 1. verify declared public keys have signature from a trusted key, if so, add to KeyStore
+// 2. verify artifact signature matches signature of given keys, and at least 1 of this key is trusted
+ String signatureText = unnormalizedPGPProperty(context.getProperty(PGP_SIGNATURES_PROPERTY_NAME));
+ if (signatureText == null) {
+ setStatus(Status.OK_STATUS);
+ return;
+ }
+
+ Collection<PGPSignature> signatures;
+ try {
+ signatures = getSignatures(context);
+ } catch (Exception ex) {
+ setStatus(new Status(IStatus.ERROR, Activator.ID, Messages.Error_CouldNotLoadSignature, ex));
+ return;
+ }
+
+ if (signatures.isEmpty()) {
+ setStatus(Status.OK_STATUS);
+ return;
+ }
+
+ IArtifactRepository repository = context.getRepository();
+
+ PGPPublicKeyStore.readPublicKeys(context.getProperty(PGP_SIGNER_KEYS_PROPERTY_NAME))
+ .forEach(keyService::addKey);
+ if (repository != null) {
+ PGPPublicKeyStore.readPublicKeys(repository.getProperty(PGP_SIGNER_KEYS_PROPERTY_NAME))
+ .forEach(keyService::addKey);
+ }
+
+ for (PGPSignature signature : signatures) {
+ long keyID = signature.getKeyID();
+ Collection<PGPPublicKey> keys = keyService.getKeys(keyID);
+ if (keys.isEmpty()) {
+ LogHelper.log(new Status(IStatus.WARNING, Activator.ID,
+ NLS.bind(Messages.Warning_publicKeyNotFound, PGPPublicKeyService.toHex(keyID),
+ context.getArtifactKey().getId())));
+ } else {
+ try {
+ PGPContentVerifierBuilder verifierBuilder = new BcPGPContentVerifierBuilderProvider()
+ .get(signature.getKeyAlgorithm(), signature.getHashAlgorithm());
+ List<PGPContentVerifier> verifiers = new ArrayList<>();
+ signaturesToVerify.put(signature, verifiers);
+ for (PGPPublicKey key : keys) {
+ PGPContentVerifier verifier = verifierBuilder.build(key);
+ verifierKeys.put(verifier, key);
+ verifiers.add(verifier);
+ signatureVerifiers.add(verifier.getOutputStream());
+ }
+ } catch (PGPException ex) {
+ setStatus(new Status(IStatus.ERROR, Activator.ID, ex.getMessage(), ex));
+ return;
+ }
+ }
+ }
+ }
+
+ /**
+ * See // https://www.w3.org/TR/1998/REC-xml-19980210#AVNormalize, newlines
+ * replaced by spaces by parser, needs to be restored
+ *
+ * @param armoredPGPBlock the PGP block, in armored form
+ * @return fixed PGP armored blocks
+ */
+ static String unnormalizedPGPProperty(String armoredPGPBlock) {
+ if (armoredPGPBlock == null) {
+ return null;
+ }
+ if (armoredPGPBlock.contains("\n") || armoredPGPBlock.contains("\r")) { //$NON-NLS-1$ //$NON-NLS-2$
+ return armoredPGPBlock;
+ }
+ return armoredPGPBlock.replace(' ', '\n')
+ .replace("-----BEGIN\nPGP\nSIGNATURE-----", "-----BEGIN PGP SIGNATURE-----") //$NON-NLS-1$ //$NON-NLS-2$
+ .replace("-----END\nPGP\nSIGNATURE-----", "-----END PGP SIGNATURE-----") //$NON-NLS-1$ //$NON-NLS-2$
+ .replace("-----BEGIN\nPGP\nPUBLIC\nKEY\nBLOCK-----", "-----BEGIN PGP PUBLIC KEY BLOCK-----") //$NON-NLS-1$ //$NON-NLS-2$
+ .replace("-----END\nPGP\nPUBLIC\nKEY\nBLOCK-----", "-----END PGP PUBLIC KEY BLOCK-----"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ @Override
+ public void write(int b) throws IOException {
+ getDestination().write(b);
+ for (OutputStream verifier : signatureVerifiers) {
+ verifier.write(b);
+ }
+ }
+
+ @Override
+ public void write(byte[] b, int off, int len) throws IOException {
+ getDestination().write(b, off, len);
+ for (OutputStream verifier : signatureVerifiers) {
+ verifier.write(b, off, len);
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ try {
+ if (!getStatus().isOK()) {
+ return;
+ }
+
+ if (signaturesToVerify.isEmpty()) {
+ return;
+ }
+
+ PGPPublicKeyStore keyStore = new PGPPublicKeyStore();
+ for (Entry<PGPSignature, List<PGPContentVerifier>> entry : signaturesToVerify.entrySet()) {
+ PGPSignature signature = entry.getKey();
+ List<PGPContentVerifier> verifiers = entry.getValue();
+ boolean verified = false;
+ for (PGPContentVerifier verifier : verifiers) {
+ try {
+ verifier.getOutputStream().write(signature.getSignatureTrailer());
+ if (verifier.verify(signature.getSignature())) {
+ PGPPublicKey verifyingKey = verifierKeys.get(verifier);
+ if (!Boolean.FALSE.toString()
+ .equalsIgnoreCase(System.getProperty("p2.pgp.verifyExpiration"))) { //$NON-NLS-1$
+ if (PGPPublicKeyService.compareSignatureTimeToKeyValidityTime(signature,
+ verifyingKey) != 0) {
+ LogHelper.log(new Status(IStatus.WARNING, Activator.ID,
+ NLS.bind(Messages.Error_SignatureAfterKeyExpiration, PGPPublicKeyService
+ .toHexFingerprint(verifyingKey))));
+ }
+ }
+
+ if (!Boolean.FALSE.toString()
+ .equalsIgnoreCase(System.getProperty("p2.pgp.verifyRevocation"))) { //$NON-NLS-1$
+ if (!keyService.isCreatedBeforeRevocation(signature, verifyingKey)) {
+ setStatus(new Status(IStatus.ERROR, Activator.ID,
+ NLS.bind(Messages.Error_SignatureAfterKeyRevocation, PGPPublicKeyService
+ .toHexFingerprint(verifyingKey))));
+ return;
+ }
+ }
+
+ keyStore.addKey(verifyingKey);
+ verified = true;
+ break;
+ }
+ } catch (PGPException ex) {
+ LogHelper.log(new Status(IStatus.ERROR, Activator.ID, ex.getMessage(), ex));
+ }
+ }
+
+ if (!verified) {
+ setStatus(new Status(IStatus.ERROR, Activator.ID, Messages.Error_SignatureAndFileDontMatch));
+ return;
+ }
+ }
+
+ // Update the destination artifact descriptor with the signatures that have been
+ // verified and the keys used for that verification.
+ OutputStream destination = getDestination();
+ if (destination instanceof IAdaptable) {
+ ArtifactDescriptor destinationDescriptor = ((IAdaptable) destination)
+ .getAdapter(ArtifactDescriptor.class);
+ destinationDescriptor.setProperty(PGP_SIGNATURES_PROPERTY_NAME,
+ sourceDescriptor.getProperty(PGP_SIGNATURES_PROPERTY_NAME));
+ destinationDescriptor.setProperty(PGP_SIGNER_KEYS_PROPERTY_NAME, keyStore.toArmoredString());
+ }
+
+ setStatus(Status.OK_STATUS);
+ } finally
+
+ {
+ super.close();
+ }
+ }
+
+}
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pgp/messages.properties b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pgp/messages.properties
new file mode 100644
index 000000000..09a1e7292
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/processors/pgp/messages.properties
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2021 Red Hat Inc. 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
+###############################################################################
+
+Error_SignatureAfterKeyRevocation=The signature is created after the revocation time of the signature's key {0}
+Error_SignatureAfterKeyExpiration=The signature is created after the expiration time of the signature's key {0}
+Error_SignatureAndFileDontMatch=The signature is invalid for current content
+Error_CouldNotLoadSignature=The signatures could not be loaded
+Warning_publicKeyNotFound=A public key with ID {0} needed to verify the signatures of {1} could not be found
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/Activator.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/Activator.java
index 22b65a2e1..a4ae2b92b 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/Activator.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/Activator.java
@@ -14,6 +14,8 @@
*******************************************************************************/
package org.eclipse.equinox.internal.p2.artifact.repository;
+import static java.lang.String.format;
+
import java.io.File;
import java.io.IOException;
import java.net.URI;
@@ -105,7 +107,7 @@ public class Activator implements BundleActivator {
private File getLockFile(URI repositoryLocation) throws IOException {
if (!URIUtil.isFileURI(repositoryLocation)) {
- throw new IOException("Cannot lock a non file based repository"); //$NON-NLS-1$
+ throw new IOException(format("Cannot lock a non file based repository %s", repositoryLocation)); //$NON-NLS-1$
}
URI result = URIUtil.append(repositoryLocation, ".artifactlock"); //$NON-NLS-1$
return URIUtil.toFile(result);
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/Messages.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/Messages.java
index f4eba31a3..993ad714b 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/Messages.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/Messages.java
@@ -71,6 +71,8 @@ public class Messages extends NLS {
public static String calculateChecksum_ok;
public static String calculateChecksum_error;
public static String calculateChecksum_providerError;
+ public static String onlyInsecureDigestAlgorithmUsed;
+ public static String noDigestAlgorithmToVerifyDownload;
static {
// initialize resource bundles
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/MirrorRequest.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/MirrorRequest.java
index 965277d1c..ccd932110 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/MirrorRequest.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/MirrorRequest.java
@@ -151,7 +151,7 @@ public class MirrorRequest extends ArtifactRequest {
return;
}
- IArtifactDescriptor destinationDescriptor = getDestinationDescriptor(descriptor);
+ IArtifactDescriptor destinationDescriptor = getDestinationDescriptor(descriptor, descriptor == canonical);
IStatus status = transfer(destinationDescriptor, descriptor, monitor);
// if ok, cancelled or transfer has already been done with the canonical form return with status set
if (status.getSeverity() == IStatus.CANCEL) {
@@ -176,7 +176,7 @@ public class MirrorRequest extends ArtifactRequest {
return;
}
- IStatus canonicalStatus = transfer(getDestinationDescriptor(canonical), canonical, monitor);
+ IStatus canonicalStatus = transfer(getDestinationDescriptor(canonical, true), canonical, monitor);
// To prevent the optimized transfer status severity from dominating the canonical, only merge
// if the canonical severity is equal to or higher than the optimized transfer severity.
if (canonicalStatus.getSeverity() < status.getSeverity())
@@ -185,7 +185,7 @@ public class MirrorRequest extends ArtifactRequest {
setResult(new MultiStatus(Activator.ID, canonicalStatus.getCode() != 0 ? canonicalStatus.getCode() : status.getCode(), new IStatus[] {status, canonicalStatus}, Messages.MirrorRequest_multipleDownloadProblems, null));
}
- private IArtifactDescriptor getDestinationDescriptor(IArtifactDescriptor sourceDescriptor) {
+ private IArtifactDescriptor getDestinationDescriptor(IArtifactDescriptor sourceDescriptor, boolean isCanonical) {
// Get the descriptor to use to store the artifact
// Since we are mirroring, ensure we clear out data from the original descriptor that may
// not apply in the new repo location.
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/RawMirrorRequest.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/RawMirrorRequest.java
index 3e103e9cc..823bfc647 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/RawMirrorRequest.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/RawMirrorRequest.java
@@ -20,7 +20,10 @@ import java.util.Collection;
import java.util.Collections;
import org.eclipse.core.runtime.*;
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.repository.simple.SimpleArtifactRepository;
+import org.eclipse.equinox.internal.p2.core.helpers.LogHelper;
+import org.eclipse.equinox.internal.p2.repository.Activator;
import org.eclipse.equinox.internal.p2.repository.Transport;
import org.eclipse.equinox.internal.provisional.p2.artifact.repository.processing.ProcessingStep;
import org.eclipse.equinox.internal.provisional.p2.artifact.repository.processing.ProcessingStepHandler;
@@ -57,7 +60,7 @@ public class RawMirrorRequest extends MirrorRequest {
}
IStatus status = transfer(targetDescriptor, sourceDescriptor, monitor);
- // if ok, cancelled or transfer has already been done with the canonical form return with status set
+ // if ok, cancelled or transfer has already been done with the canonical form return with status set
if (status.getSeverity() == IStatus.CANCEL) {
setResult(status);
return;
@@ -85,9 +88,13 @@ public class RawMirrorRequest extends MirrorRequest {
// Perform the mirror operation without any processing steps
@Override
protected IStatus getArtifact(IArtifactDescriptor artifactDescriptor, OutputStream destination, IProgressMonitor monitor) {
-
if (SimpleArtifactRepository.CHECKSUMS_ENABLED) {
- Collection<ProcessingStep> steps = ChecksumUtilities.getChecksumVerifiers(artifactDescriptor, IArtifactDescriptor.DOWNLOAD_CHECKSUM, Collections.emptySet());
+ Collection<ChecksumVerifier> steps = ChecksumUtilities.getChecksumVerifiers(artifactDescriptor,
+ IArtifactDescriptor.DOWNLOAD_CHECKSUM, Collections.emptySet());
+ if (steps.isEmpty()) {
+ LogHelper.log(new Status(IStatus.WARNING, Activator.ID,
+ NLS.bind(Messages.noDigestAlgorithmToVerifyDownload, artifactDescriptor.getArtifactKey())));
+ }
ProcessingStep[] stepArray = steps.toArray(new ProcessingStep[steps.size()]);
// TODO should probably be using createAndLink here
ProcessingStepHandler handler = new ProcessingStepHandler();
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/messages.properties b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/messages.properties
index fa54c3f8c..6a2901ac7 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/messages.properties
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/messages.properties
@@ -62,4 +62,7 @@ calculateChecksum_providerError=Checksum provider id={0} algorithm={1} provider=
exception_unableToCreateParentDir = Unable to create parent directory.
folder_artifact_not_file_repo=Artifact {0} is a folder but the repository is an archive or remote location.
retryRequest=Download of {0} failed on repository {1}. Retrying.
-error_copying_local_file=An error occurred copying file {0}. \ No newline at end of file
+error_copying_local_file=An error occurred copying file {0}.
+
+onlyInsecureDigestAlgorithmUsed = The digest algorithms ({0}) used to verify {1} have severely compromised security. Please report this concern to the artifact provider.
+noDigestAlgorithmToVerifyDownload = No digest algorithm is available to verify download of {0}. \ No newline at end of file
diff --git a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/Mapper.java b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/Mapper.java
index 3301b48ae..8a07be022 100644
--- a/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/Mapper.java
+++ b/bundles/org.eclipse.equinox.p2.artifact.repository/src/org/eclipse/equinox/internal/p2/artifact/repository/simple/Mapper.java
@@ -16,8 +16,7 @@ package org.eclipse.equinox.internal.p2.artifact.repository.simple;
import java.net.URI;
import java.net.URISyntaxException;
-import java.util.Dictionary;
-import java.util.Hashtable;
+import java.util.*;
import org.eclipse.core.runtime.URIUtil;
import org.osgi.framework.*;
@@ -54,34 +53,37 @@ public class Mapper {
}
}
- public URI map(URI repositoryLocation, String classifier, String id, String version, String format) {
+ public URI map(URI repositoryLocation, String classifier, String id, String version, String format,
+ Map<String, String> properties) {
String locationString = URIUtil.toUnencodedString(repositoryLocation);
- Dictionary<String, Object> values = new Hashtable<>(5);
- if (repositoryLocation != null)
- values.put(REPOURL, locationString);
-
- if (classifier != null)
- values.put(CLASSIFIER, classifier);
-
- if (id != null)
- values.put(ID, id);
-
- if (version != null)
- values.put(VERSION, version);
-
- if (format != null)
- values.put(FORMAT, format);
+ Dictionary<String, String> allProperties = new Hashtable<>(properties.size() + 4);
+ if (repositoryLocation != null) {
+ allProperties.put(REPOURL, locationString);
+ }
+ if (classifier != null) {
+ allProperties.put(CLASSIFIER, classifier);
+ }
+ if (id != null) {
+ allProperties.put(ID, id);
+ }
+ if (version != null) {
+ allProperties.put(VERSION, version);
+ }
+ if (format != null) {
+ allProperties.put(FORMAT, format);
+ }
for (int i = 0; i < filters.length; i++) {
- if (filters[i].match(values))
- return doReplacement(outputStrings[i], locationString, classifier, id, version, format);
+ if (filters[i].match(allProperties))
+ return doReplacement(outputStrings[i], locationString, classifier, id, version, format, properties);
}
return null;
}
- private URI doReplacement(String pattern, String repoLocation, String classifier, String id, String version, String format) {
+ private URI doReplacement(String pattern, String repoLocation, String classifier, String id, String version,
+ String format, Map<String, String> properties) {
try {
- // currently our mapping rules assume the repo URL is not "/" terminated.
+ // currently our mapping rules assume the repo URL is not "/" terminated.
// This may be the case for repoURLs in the root of a URL space e.g. root of a jar file or file:/c:/
if (repoLocation.endsWith("/")) //$NON-NLS-1$
repoLocation = repoLocation.substring(0, repoLocation.length() - 1);
@@ -109,6 +111,8 @@ public class Mapper {
varValue = repoLocation;
} else if (varName.equalsIgnoreCase(FORMAT)) {
varValue = format;
+ } else if (properties.containsKey(varName)) {
+ varValue = properties.get(varName);
}
if (varValue == null)
varValue = ""; //$NON-NLS-1$
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 992beed7d..b13c03692 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
@@ -29,9 +29,12 @@ import java.util.jar.JarOutputStream;
import org.eclipse.core.runtime.*;
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.Messages;
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;
import org.eclipse.equinox.internal.p2.metadata.expression.CompoundIterator;
import org.eclipse.equinox.internal.p2.metadata.index.IndexProvider;
@@ -48,8 +51,7 @@ 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.AbstractArtifactRepository;
-import org.eclipse.equinox.p2.repository.artifact.spi.ArtifactDescriptor;
+import org.eclipse.equinox.p2.repository.artifact.spi.*;
import org.eclipse.osgi.service.datalocation.Location;
import org.eclipse.osgi.util.NLS;
@@ -119,7 +121,7 @@ public class SimpleArtifactRepository extends AbstractArtifactRepository impleme
private long cacheTimestamp = 0l;
- public class ArtifactOutputStream extends OutputStream implements IStateful {
+ public class ArtifactOutputStream extends OutputStream implements IStateful, IAdaptable {
private boolean closed;
private long count = 0;
private IArtifactDescriptor descriptor;
@@ -203,6 +205,14 @@ public class SimpleArtifactRepository extends AbstractArtifactRepository impleme
public void setFirstLink(OutputStream value) {
firstLink = value;
}
+
+ @Override
+ public <T> T getAdapter(Class<T> adapter) {
+ if (adapter.isInstance(descriptor)) {
+ return adapter.cast(descriptor);
+ }
+ return null;
+ }
}
// TODO: optimize
@@ -478,6 +488,7 @@ public class SimpleArtifactRepository extends AbstractArtifactRepository impleme
Set<String> skipChecksums = ARTIFACT_MD5_CHECKSUM_ENABLED ? Collections.emptySet() : Collections.singleton(ChecksumHelper.MD5);
addChecksumVerifiers(descriptor, steps, skipChecksums, IArtifactDescriptor.ARTIFACT_CHECKSUM);
+ addPGPSignatureVerifier(descriptor, steps);
if (steps.isEmpty())
return destination;
@@ -486,13 +497,28 @@ public class SimpleArtifactRepository extends AbstractArtifactRepository impleme
return handler.link(stepArray, destination, monitor);
}
+ private void addPGPSignatureVerifier(IArtifactDescriptor descriptor, ArrayList<ProcessingStep> steps) {
+ if (descriptor.getProperties().containsKey(PGPSignatureVerifier.PGP_SIGNATURES_PROPERTY_NAME)) {
+ PGPSignatureVerifier step = new PGPSignatureVerifier();
+ ProcessingStepDescriptor stepDescriptor = new ProcessingStepDescriptor(PGPSignatureVerifier.ID, null, true);
+ step.initialize(getProvisioningAgent(), stepDescriptor, descriptor);
+ steps.add(step);
+ }
+ }
+
private OutputStream addPreSteps(ProcessingStepHandler handler, IArtifactDescriptor descriptor, OutputStream destination, IProgressMonitor monitor) {
ArrayList<ProcessingStep> steps = new ArrayList<>();
if (IArtifactDescriptor.TYPE_ZIP.equals(descriptor.getProperty(IArtifactDescriptor.DOWNLOAD_CONTENTTYPE)))
steps.add(new ZipVerifierStep());
Set<String> skipChecksums = DOWNLOAD_MD5_CHECKSUM_ENABLED ? Collections.emptySet() : Collections.singleton(ChecksumHelper.MD5);
- addChecksumVerifiers(descriptor, steps, skipChecksums, IArtifactDescriptor.DOWNLOAD_CHECKSUM);
+ ArrayList<ProcessingStep> downloadChecksumSteps = new ArrayList<>();
+ addChecksumVerifiers(descriptor, downloadChecksumSteps, skipChecksums, IArtifactDescriptor.DOWNLOAD_CHECKSUM);
+ if (downloadChecksumSteps.isEmpty() && !isLocal()) {
+ LogHelper.log(new Status(IStatus.WARNING, Activator.ID,
+ NLS.bind(Messages.noDigestAlgorithmToVerifyDownload, descriptor.getArtifactKey())));
+ }
+ steps.addAll(downloadChecksumSteps);
// Add steps here if needed
if (steps.isEmpty())
@@ -504,7 +530,8 @@ public class SimpleArtifactRepository extends AbstractArtifactRepository impleme
private void addChecksumVerifiers(IArtifactDescriptor descriptor, ArrayList<ProcessingStep> steps, Set<String> skipChecksums, String property) {
if (CHECKSUMS_ENABLED) {
- Collection<ProcessingStep> checksumVerifiers = ChecksumUtilities.getChecksumVerifiers(descriptor, property, skipChecksums);
+ Collection<ChecksumVerifier> checksumVerifiers = ChecksumUtilities.getChecksumVerifiers(descriptor,
+ property, skipChecksums);
steps.addAll(checksumVerifiers);
}
}
@@ -558,7 +585,8 @@ public class SimpleArtifactRepository extends AbstractArtifactRepository impleme
if (descriptor.getProcessingSteps().length == 0) {
descriptor.setProperty(ARTIFACT_UUID, null);
IArtifactKey key = descriptor.getArtifactKey();
- URI result = mapper.map(getLocation(), key.getClassifier(), key.getId(), key.getVersion().toString(), descriptor.getProperty(IArtifactDescriptor.FORMAT));
+ URI result = mapper.map(getLocation(), key.getClassifier(), key.getId(), key.getVersion().toString(),
+ descriptor.getProperty(IArtifactDescriptor.FORMAT), descriptor.getProperties());
if (result != null) {
if (isFolderBased(descriptor) && URIUtil.lastSegment(result).endsWith(JAR_EXTENSION)) {
return URIUtil.removeFileExtension(result);
@@ -898,6 +926,7 @@ public class SimpleArtifactRepository extends AbstractArtifactRepository impleme
* 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));
}
@@ -907,7 +936,8 @@ public class SimpleArtifactRepository extends AbstractArtifactRepository impleme
*/
private URI getLocationForPackedButFlatArtifacts(IArtifactDescriptor descriptor) {
IArtifactKey key = descriptor.getArtifactKey();
- return mapper.map(getLocation(), key.getClassifier(), key.getId(), key.getVersion().toString(), descriptor.getProperty(IArtifactDescriptor.FORMAT));
+ return mapper.map(getLocation(), key.getClassifier(), key.getId(), key.getVersion().toString(),
+ descriptor.getProperty(IArtifactDescriptor.FORMAT), descriptor.getProperties());
}
public synchronized URI getLocation(IArtifactDescriptor descriptor) {
@@ -936,7 +966,8 @@ public class SimpleArtifactRepository extends AbstractArtifactRepository impleme
// if the descriptor is complete then use the mapping rules...
if (descriptor.getProcessingSteps().length == 0) {
IArtifactKey key = descriptor.getArtifactKey();
- URI result = mapper.map(getLocation(), key.getClassifier(), key.getId(), key.getVersion().toString(), descriptor.getProperty(IArtifactDescriptor.FORMAT));
+ URI result = mapper.map(getLocation(), key.getClassifier(), key.getId(), key.getVersion().toString(),
+ descriptor.getProperty(IArtifactDescriptor.FORMAT), descriptor.getProperties());
if (result != null) {
if (isFolderBased(descriptor) && URIUtil.lastSegment(result).endsWith(JAR_EXTENSION))
return URIUtil.removeFileExtension(result);
@@ -1269,8 +1300,10 @@ public class SimpleArtifactRepository extends AbstractArtifactRepository impleme
boolean found = false;
IStatus[] stepStatusChildren = stepStatus.getChildren();
for (int i = 0; i < stepStatusChildren.length && !found; i++)
- if (stepStatusChildren[i] == status)
+ if (stepStatusChildren[i] == status) {
found = true;
+ break;
+ }
if (!found)
result.merge(status);
}
diff --git a/bundles/org.eclipse.equinox.p2.console/.classpath b/bundles/org.eclipse.equinox.p2.console/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.console/.classpath
+++ b/bundles/org.eclipse.equinox.p2.console/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.console/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.console/.settings/org.eclipse.jdt.core.prefs
index 58ce6826f..71d3a6cc8 100644
--- a/bundles/org.eclipse.equinox.p2.console/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.console/.settings/org.eclipse.jdt.core.prefs
@@ -19,9 +19,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -37,6 +37,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -90,6 +91,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -125,7 +127,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -139,7 +142,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -260,7 +262,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -331,7 +332,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -476,7 +476,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.console/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.console/META-INF/MANIFEST.MF
index e7780bd4a..5fae93979 100644
--- a/bundles/org.eclipse.equinox.p2.console/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.console/META-INF/MANIFEST.MF
@@ -2,12 +2,12 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.console;singleton:=true
-Bundle-Version: 1.1.400.qualifier
+Bundle-Version: 1.2.0.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.console.Activator
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Export-Package: org.eclipse.equinox.internal.p2.console;x-friends:="org.eclipse.equinox.p2.director.app"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Import-Package: org.eclipse.equinox.internal.p2.core.helpers,
org.eclipse.equinox.internal.provisional.p2.director,
org.eclipse.equinox.p2.core;version="[2.0.0,3.0.0)",
diff --git a/bundles/org.eclipse.equinox.p2.console/Provisioning console.launch b/bundles/org.eclipse.equinox.p2.console/Provisioning console.launch
deleted file mode 100644
index 7d927a0b5..000000000
--- a/bundles/org.eclipse.equinox.p2.console/Provisioning console.launch
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.pde.ui.EquinoxLauncher">
-<booleanAttribute key="automaticAdd" value="false"/>
-<booleanAttribute key="automaticValidate" value="false"/>
-<stringAttribute key="bootstrap" value=""/>
-<stringAttribute key="checked" value="[NONE]"/>
-<booleanAttribute key="clearConfig" value="false"/>
-<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/Provisioning console"/>
-<booleanAttribute key="default_auto_start" value="false"/>
-<intAttribute key="default_start_level" value="4"/>
-<booleanAttribute key="includeOptional" value="true"/>
-<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/>
-<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/java-1.6.0-openjdk-1.6.0.0.x86_64"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-console -consolelog -noexit"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
-<stringAttribute key="pde.version" value="3.3"/>
-<booleanAttribute key="show_selected_only" value="false"/>
-<stringAttribute key="target_bundles" value="org.eclipse.osgi.services@default:default,org.eclipse.ecf.ssl@default:false,org.eclipse.equinox.common@2:true,org.eclipse.core.net@default:default,org.eclipse.equinox.security@default:default,org.eclipse.ecf.provider.filetransfer.httpclient@default:default,org.eclipse.core.net.linux.x86_64@default:false,org.eclipse.core.contenttype@default:default,org.apache.commons.codec@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.app@default:default,org.eclipse.ecf@default:default,javax.servlet@default:default,org.eclipse.ecf.provider.filetransfer.ssl@default:false,org.apache.commons.logging@default:default,org.eclipse.ecf.provider.filetransfer@default:default,org.eclipse.equinox.util@default:default,org.eclipse.core.runtime.compatibility.auth@default:default,org.eclipse.core.runtime@default:true,org.eclipse.equinox.preferences@default:default,org.apache.commons.httpclient@default:default,org.eclipse.core.jobs@default:default,org.eclipse.osgi@-1:true,org.eclipse.equinox.registry@default:default,org.eclipse.ecf.filetransfer@default:default,org.eclipse.equinox.concurrent@default:default,org.eclipse.ant.core@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.ecf.identity@default:default,org.eclipse.ecf.provider.filetransfer.httpclient.ssl@default:false,org.eclipse.core.variables@default:default"/>
-<booleanAttribute key="tracing" value="false"/>
-<booleanAttribute key="useDefaultConfigArea" value="true"/>
-<stringAttribute key="workspace_bundles" value="org.eclipse.equinox.p2.touchpoint.osgi@default:default,org.eclipse.equinox.p2.garbagecollector@default:default,org.eclipse.equinox.p2.engine@default:default,org.eclipse.equinox.p2.metadata.generator@default:default,org.eclipse.equinox.p2.core@default:default,org.eclipse.equinox.frameworkadmin@default:default,org.eclipse.equinox.p2.updatesite@default:default,org.eclipse.equinox.frameworkadmin.equinox@default:true,org.eclipse.equinox.p2.metadata@default:default,org.eclipse.equinox.p2.extensionlocation@default:default,org.eclipse.equinox.p2.metadata.repository@default:default,org.sat4j.pb@default:default,org.eclipse.equinox.p2.jarprocessor@default:default,org.eclipse.equinox.p2.publisher@default:default,org.eclipse.equinox.p2.touchpoint.eclipse@default:default,org.eclipse.equinox.p2.exemplarysetup@default:true,org.eclipse.equinox.p2.operations@default:default,org.eclipse.equinox.p2.artifact.optimizers@default:default,ie.wombat.jbdiff@default:default,org.eclipse.equinox.p2.repository@default:default,org.eclipse.equinox.p2.touchpoint.natives@default:default,org.eclipse.equinox.simpleconfigurator.manipulator@default:default,org.eclipse.equinox.p2.director@default:default,org.eclipse.equinox.p2.sar@default:default,org.eclipse.equinox.p2.artifact.processors@default:default,org.eclipse.equinox.p2.console@default:true,org.eclipse.equinox.p2.repository.tools@default:default,org.eclipse.equinox.p2.artifact.repository@default:default,org.eclipse.equinox.p2.directorywatcher@default:default,org.sat4j.core@default:default,org.eclipse.equinox.simpleconfigurator@1:true"/>
-</launchConfiguration>
diff --git a/bundles/org.eclipse.equinox.p2.console/pom.xml b/bundles/org.eclipse.equinox.p2.console/pom.xml
index 70289dd1e..6be37ac24 100644
--- a/bundles/org.eclipse.equinox.p2.console/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.console/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.console</artifactId>
- <version>1.1.400-SNAPSHOT</version>
+ <version>1.2.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.core/.classpath b/bundles/org.eclipse.equinox.p2.core/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.core/.classpath
+++ b/bundles/org.eclipse.equinox.p2.core/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.core/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.core/.settings/org.eclipse.jdt.core.prefs
index 1466d19a2..0c53402c0 100644
--- a/bundles/org.eclipse.equinox.p2.core/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.core/.settings/org.eclipse.jdt.core.prefs
@@ -18,9 +18,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -36,6 +36,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -89,6 +90,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -124,7 +126,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -138,7 +141,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -259,7 +261,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -330,7 +331,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -475,7 +475,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.core/META-INF/MANIFEST.MF
index 6472a2bac..73462bd3e 100644
--- a/bundles/org.eclipse.equinox.p2.core/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.core;singleton:=true
-Bundle-Version: 2.6.300.qualifier
+Bundle-Version: 2.9.100.qualifier
Bundle-ClassPath: .
Bundle-Activator: org.eclipse.equinox.internal.p2.core.Activator
Bundle-Vendor: %providerName
@@ -64,13 +64,17 @@ Export-Package: org.eclipse.equinox.internal.p2.core;x-friends:="org.eclipse.equ
org.eclipse.equinox.p2.updatesite,
org.eclipse.equinox.p2.director.app,
org.eclipse.equinox.p2.transport.ecf",
- org.eclipse.equinox.p2.core;version="2.0.0",
- org.eclipse.equinox.p2.core.spi;version="2.1.0"
-Require-Bundle: org.eclipse.equinox.common;bundle-version="[3.5.0,4.0.0)"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+ org.eclipse.equinox.p2.core;version="2.8.0";uses:="org.eclipse.core.runtime",
+ org.eclipse.equinox.p2.core.spi;version="2.1.0";uses:="org.eclipse.equinox.p2.core"
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Service-Component: OSGI-INF/eventBus.xml, OSGI-INF/agentProvider.xml
-Import-Package: org.eclipse.osgi.framework.eventmgr;version="1.2.0",
+Import-Package: org.bouncycastle.bcpg;version="1.65.0",
+ org.bouncycastle.openpgp;version="1.65.0",
+ org.eclipse.core.runtime;common=split;version="[3.5.0,4.0.0)",
+ org.eclipse.equinox.p2.core;version="[2.8.0,2.9.0)";resolution:=optional,
+ org.eclipse.equinox.p2.core.spi;version="[2.1.0,2.2.0)";resolution:=optional,
+ org.eclipse.osgi.framework.eventmgr;version="1.2.0",
org.eclipse.osgi.framework.log;version="1.0.0",
org.eclipse.osgi.service.debug;version="1.0.0",
org.eclipse.osgi.util;version="1.0.0",
diff --git a/bundles/org.eclipse.equinox.p2.core/META-INF/p2.inf b/bundles/org.eclipse.equinox.p2.core/META-INF/p2.inf
new file mode 100644
index 000000000..0983c41b7
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.core/META-INF/p2.inf
@@ -0,0 +1,5 @@
+# Workaround https://bugs.eclipse.org/bugs/show_bug.cgi?id=525368
+# we hint about which bundle to download at install that is capable of
+# resolving packages
+requires.0.namespace = osgi.bundle
+requires.0.name = org.eclipse.equinox.common \ No newline at end of file
diff --git a/bundles/org.eclipse.equinox.p2.core/pom.xml b/bundles/org.eclipse.equinox.p2.core/pom.xml
index 3d513d619..3913f722d 100644
--- a/bundles/org.eclipse.equinox.p2.core/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.core/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.core</artifactId>
- <version>2.6.300-SNAPSHOT</version>
+ <version>2.9.100-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/CollectionUtils.java b/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/CollectionUtils.java
index 6f15b035a..cb40d0a44 100644
--- a/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/CollectionUtils.java
+++ b/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/CollectionUtils.java
@@ -70,7 +70,7 @@ public class CollectionUtils {
*/
@Override
public ListIterator<E> listIterator() {
- return new ListIterator<E>() {
+ return new ListIterator<>() {
private int index = 0;
@Override
diff --git a/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/FileUtils.java b/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/FileUtils.java
index f97d822e7..1c48c0742 100644
--- a/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/FileUtils.java
+++ b/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/FileUtils.java
@@ -25,8 +25,7 @@ public class FileUtils {
private static File[] untarFile(File source, File outputDir) throws IOException, TarException {
List<File> untarredFiles = new ArrayList<>();
try (TarFile tarFile = new TarFile(source)) {
- for (Enumeration<TarEntry> e = tarFile.entries(); e.hasMoreElements();) {
- TarEntry entry = e.nextElement();
+ for (TarEntry entry : tarFile.entries()) {
try (InputStream input = tarFile.getInputStream(entry)) {
File outFile = createSubPathFile(outputDir, entry.getName());
outFile = outFile.getCanonicalFile(); //bug 266844
diff --git a/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/SecureXMLUtil.java b/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/SecureXMLUtil.java
index 202921c17..0afeb2936 100644
--- a/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/SecureXMLUtil.java
+++ b/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/SecureXMLUtil.java
@@ -16,7 +16,6 @@ package org.eclipse.equinox.internal.p2.core.helpers;
import javax.xml.XMLConstants;
import javax.xml.parsers.*;
import org.xml.sax.*;
-import org.xml.sax.helpers.XMLReaderFactory;
/**
* A utility class for creating an XML-related factories suitable for
@@ -52,10 +51,11 @@ public class SecureXMLUtil {
* Create a new {@link XMLReader}.
*
* @throws SAXException
+ * @throws ParserConfigurationException
*/
- public static XMLReader newSecureXMLReader() throws SAXException {
- XMLReader reader = XMLReaderFactory.createXMLReader();
- reader.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
- return reader;
+ public static XMLReader newSecureXMLReader() throws SAXException, ParserConfigurationException {
+ SAXParserFactory factory = newSecureSAXParserFactory();
+ factory.setNamespaceAware(true);
+ return factory.newSAXParser().getXMLReader();
}
}
diff --git a/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/TarFile.java b/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/TarFile.java
index f53ebff02..e8ccb6cd0 100644
--- a/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/TarFile.java
+++ b/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/internal/p2/core/helpers/TarFile.java
@@ -14,7 +14,8 @@
package org.eclipse.equinox.internal.p2.core.helpers;
import java.io.*;
-import java.util.Enumeration;
+import java.util.Objects;
+import java.util.stream.Stream;
import java.util.zip.GZIPInputStream;
/**
@@ -23,9 +24,7 @@ import java.util.zip.GZIPInputStream;
public class TarFile implements Closeable {
private File file;
private TarInputStream entryEnumerationStream;
- private TarEntry curEntry;
private TarInputStream entryStream;
-
private InputStream internalEntryStream;
/**
@@ -54,7 +53,6 @@ public class TarFile implements Closeable {
in.close();
throw ex;
}
- curEntry = entryEnumerationStream.getNextEntry();
}
/**
@@ -74,26 +72,15 @@ public class TarFile implements Closeable {
*
* @return enumeration of all files in the archive
*/
- public Enumeration<TarEntry> entries() {
- return new Enumeration<TarEntry>() {
- @Override
- public boolean hasMoreElements() {
- return (curEntry != null);
- }
-
- @Override
- public TarEntry nextElement() {
- TarEntry oldEntry = curEntry;
- try {
- curEntry = entryEnumerationStream.getNextEntry();
- } catch (TarException e) {
- curEntry = null;
- } catch (IOException e) {
- curEntry = null;
- }
- return oldEntry;
+ public Iterable<TarEntry> entries() throws TarException, IOException {
+ TarEntry first = entryEnumerationStream.getNextEntry(); // throws if stream is empty
+ return Stream.iterate(first, Objects::nonNull, e -> {
+ try {
+ return entryEnumerationStream.getNextEntry();
+ } catch (TarException | IOException e1) {
+ return null;
}
- };
+ })::iterator;
}
/**
diff --git a/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/p2/core/UIServices.java b/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/p2/core/UIServices.java
index 2e6e2d97b..5be838d4b 100644
--- a/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/p2/core/UIServices.java
+++ b/bundles/org.eclipse.equinox.p2.core/src/org/eclipse/equinox/p2/core/UIServices.java
@@ -15,6 +15,9 @@
package org.eclipse.equinox.p2.core;
import java.security.cert.Certificate;
+import java.util.Collection;
+import java.util.Collections;
+import org.bouncycastle.openpgp.PGPPublicKey;
/**
* Service used for prompting for user information from within lower level code.
@@ -70,15 +73,71 @@ public abstract class UIServices {
}
/**
- * Trust information returned from a trust request. *
+ * Trust information returned from a trust request.
*/
public static class TrustInfo {
private final Certificate[] trustedCertificates;
+ private final Collection<PGPPublicKey> trustedPGPKeys;
private final boolean saveTrustedCertificates;
private final boolean trustUnsigned;
+ private final boolean trustAlways;
+ /**
+ *
+ * @param trusted Trusted certificates
+ * @param save Whether to store trusted certificates or not
+ * @param trustUnsigned Whether to trust unsigned. <code>true</code> if
+ * installation should continue despite unsigned content;
+ * <code>false</code> otherwise.
+ * @deprecated use other constructor
+ */
+ @Deprecated
public TrustInfo(Certificate[] trusted, boolean save, boolean trustUnsigned) {
this.trustedCertificates = trusted;
+ this.trustedPGPKeys = Collections.emptyList();
+ this.saveTrustedCertificates = save;
+ this.trustUnsigned = trustUnsigned;
+ trustAlways = false;
+ }
+
+ /**
+ *
+ * @param trustedCertificates Trusted certificates
+ * @param trustedPGPKeys Trusted PGP public keys
+ * @param save Whether to store trusted certificates and keys or
+ * not.
+ * @param trustUnsigned Whether to trust unsigned. <code>true</code> if
+ * installation should continue despite unsigned
+ * content; <code>false</code> otherwise.
+ * @since 2.8
+ */
+ public TrustInfo(Collection<Certificate> trustedCertificates, Collection<PGPPublicKey> trustedPGPKeys,
+ boolean save,
+ boolean trustUnsigned) {
+ this(trustedCertificates, trustedPGPKeys, save, trustUnsigned, false);
+ }
+
+ /**
+ * @param trustedCertificates Trusted certificates
+ * @param trustedPGPKeys Trusted PGP public keys
+ * @param save Whether to store trusted certificates and keys or
+ * not.
+ * @param trustUnsigned Whether to trust unsigned content.
+ * <code>true</code> if installation should continue
+ * despite unsigned content; <code>false</code>
+ * otherwise.
+ * @param trustAlways Whether to always trust all content regardless of
+ * whether it's signed, regardless of how it's
+ * signed, and regardless of the certificate or key
+ * with which it's signed.
+ *
+ * @since 2.9
+ */
+ public TrustInfo(Collection<Certificate> trustedCertificates, Collection<PGPPublicKey> trustedPGPKeys,
+ boolean save, boolean trustUnsigned, boolean trustAlways) {
+ this.trustAlways = trustAlways;
+ this.trustedCertificates = trustedCertificates.toArray(Certificate[]::new);
+ this.trustedPGPKeys = trustedPGPKeys;
this.saveTrustedCertificates = save;
this.trustUnsigned = trustUnsigned;
}
@@ -95,6 +154,18 @@ public abstract class UIServices {
}
/**
+ *
+ * Return a collection of the keys that should be trusted for the requested
+ * operation.
+ *
+ * @return the trusted PGP keys.
+ * @since 2.8
+ */
+ public Collection<PGPPublicKey> getTrustedPGPKeys() {
+ return trustedPGPKeys;
+ }
+
+ /**
* Return a boolean indicating whether the trusted certificates should
* be persisted for future operations.
*
@@ -115,6 +186,20 @@ public abstract class UIServices {
public boolean trustUnsignedContent() {
return trustUnsigned;
}
+
+ /**
+ * Return a boolean indicating whether to always trust all content regardless of
+ * whether it's signed, regardless of how it's signed, and regardless of the
+ * certificate or key with which it's signed, both during this operation and for
+ * all future operations.
+ *
+ * @return <code>true</code> if all content should always be trusted, and
+ * <code>false</code> otherwise.
+ * @since 2.9
+ */
+ public boolean trustAlways() {
+ return trustAlways;
+ }
}
/**
@@ -138,12 +223,16 @@ public abstract class UIServices {
/**
* Opens a UI prompt to capture information about trusted content.
*
- * @param untrustedChain - an array of certificate chains for which there is no current trust anchor. May be
- * <code>null</code>, which means there are no untrusted certificate chains.
- * @param unsignedDetail - an array of strings, where each String describes content that is not signed.
- * May be <code>null</code>, which means there is no unsigned content
- * @return the TrustInfo that describes the user's choices for trusting certificates and
- * unsigned content.
+ * @param untrustedChain - an array of certificate chains for which there is no
+ * current trust anchor. May be <code>null</code>, which
+ * means there are no untrusted certificate chains.
+ * @param unsignedDetail - an array of strings, where each String describes
+ * content that is not signed. May be <code>null</code>,
+ * which means there is no unsigned content
+ * @return the TrustInfo that describes the user's choices for trusting
+ * certificates and unsigned content.
+ * @implSpec Implementors should also override
+ * {@link #getTrustInfo(Certificate[][], Collection, String[])}.
*/
public abstract TrustInfo getTrustInfo(Certificate[][] untrustedChain, String[] unsignedDetail);
@@ -160,4 +249,26 @@ public abstract class UIServices {
public void showInformationMessage(String title, String text, String linkText) {
System.out.println(text);
}
+
+ /**
+ * Opens a UI prompt to capture information about trusted content.
+ *
+ * @param unTrustedCertificateChains - an array of certificate chains for which
+ * there is no current trust anchor. May be
+ * <code>null</code>, which means there are no
+ * untrusted certificate chains.
+ * @param untrustedPGPKeys Collection of PGP signer keys that are not
+ * trusted
+ * @param unsignedDetail - an array of strings, where each String
+ * describes content that is not signed. May
+ * be <code>null</code>, which means there is
+ * no unsigned content
+ * @return the TrustInfo that describes the user's choices for trusting
+ * certificates and unsigned content.
+ * @since 2.8
+ */
+ public TrustInfo getTrustInfo(Certificate[][] unTrustedCertificateChains, Collection<PGPPublicKey> untrustedPGPKeys,
+ String[] unsignedDetail) {
+ return getTrustInfo(unTrustedCertificateChains, unsignedDetail);
+ }
}
diff --git a/bundles/org.eclipse.equinox.p2.director.app/.classpath b/bundles/org.eclipse.equinox.p2.director.app/.classpath
index 030607499..cc48f9f27 100644
--- a/bundles/org.eclipse.equinox.p2.director.app/.classpath
+++ b/bundles/org.eclipse.equinox.p2.director.app/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" output="bin_ant" path="src_ant"/>
diff --git a/bundles/org.eclipse.equinox.p2.director.app/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.director.app/.settings/org.eclipse.jdt.core.prefs
index 563e5c11a..c70fa9628 100644
--- a/bundles/org.eclipse.equinox.p2.director.app/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.director.app/.settings/org.eclipse.jdt.core.prefs
@@ -17,9 +17,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -35,6 +35,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -88,6 +89,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -123,7 +125,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -137,7 +140,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -258,7 +260,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -329,7 +330,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -474,7 +474,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.director.app/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.director.app/META-INF/MANIFEST.MF
index 14a13fa91..7cbc86f19 100644
--- a/bundles/org.eclipse.equinox.p2.director.app/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.director.app/META-INF/MANIFEST.MF
@@ -2,22 +2,23 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.director.app;singleton:=true
-Bundle-Version: 1.1.600.qualifier
+Bundle-Version: 1.2.100.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.director.app.Activator
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Export-Package: org.eclipse.equinox.internal.p2.director.app;x-internal:=true
Require-Bundle: org.eclipse.equinox.common;bundle-version="[3.5.0,4.0.0)"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
-Import-Package: org.eclipse.equinox.app,
+Import-Package: org.bouncycastle.openpgp,
+ org.eclipse.equinox.app,
org.eclipse.equinox.internal.p2.core.helpers,
org.eclipse.equinox.internal.p2.director,
org.eclipse.equinox.internal.p2.engine,
org.eclipse.equinox.internal.provisional.p2.core.eventbus,
org.eclipse.equinox.internal.provisional.p2.director,
org.eclipse.equinox.internal.provisional.p2.repository,
- org.eclipse.equinox.p2.core;version="[2.0.0,3.0.0)",
+ org.eclipse.equinox.p2.core;version="[2.8.0,3.0.0)",
org.eclipse.equinox.p2.core.spi;version="[2.1.0,3.0.0)",
org.eclipse.equinox.p2.engine;version="[2.0.0,3.0.0)",
org.eclipse.equinox.p2.engine.query;version="[2.0.0,3.0.0)",
diff --git a/bundles/org.eclipse.equinox.p2.director.app/pom.xml b/bundles/org.eclipse.equinox.p2.director.app/pom.xml
index 50c06b68d..44f4bde1c 100644
--- a/bundles/org.eclipse.equinox.p2.director.app/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.director.app/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.director.app</artifactId>
- <version>1.1.600-SNAPSHOT</version>
+ <version>1.2.100-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.director.app/src/org/eclipse/equinox/internal/p2/director/app/DirectorApplication.java b/bundles/org.eclipse.equinox.p2.director.app/src/org/eclipse/equinox/internal/p2/director/app/DirectorApplication.java
index d163af047..4710d4cc1 100644
--- a/bundles/org.eclipse.equinox.p2.director.app/src/org/eclipse/equinox/internal/p2/director/app/DirectorApplication.java
+++ b/bundles/org.eclipse.equinox.p2.director.app/src/org/eclipse/equinox/internal/p2/director/app/DirectorApplication.java
@@ -32,6 +32,7 @@ import java.util.*;
import java.util.Map.Entry;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
+import org.bouncycastle.openpgp.PGPPublicKey;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;
@@ -85,6 +86,21 @@ public class DirectorApplication implements IApplication, ProvisioningListener {
}
return new TrustInfo(trusted, false, true);
}
+
+ @Override
+ public TrustInfo getTrustInfo(Certificate[][] untrustedChains, Collection<PGPPublicKey> untrustedPGPKeys,
+ String[] unsignedDetail) {
+ final Collection<Certificate> trusted;
+ if (untrustedChains == null) {
+ trusted = List.of();
+ } else {
+ trusted = new ArrayList<>(untrustedChains.length);
+ for (Certificate[] untrustedChain : untrustedChains) {
+ trusted.add(untrustedChain[0]);
+ }
+ }
+ return new TrustInfo(trusted, untrustedPGPKeys, false, true);
+ }
}
class LocationQueryable implements IQueryable<IInstallableUnit> {
diff --git a/bundles/org.eclipse.equinox.p2.director/.classpath b/bundles/org.eclipse.equinox.p2.director/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.director/.classpath
+++ b/bundles/org.eclipse.equinox.p2.director/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.director/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.director/.settings/org.eclipse.jdt.core.prefs
index 3bb5d9f8c..74183576f 100644
--- a/bundles/org.eclipse.equinox.p2.director/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.director/.settings/org.eclipse.jdt.core.prefs
@@ -17,9 +17,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -36,6 +36,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -89,6 +90,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -126,13 +128,14 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
@@ -140,21 +143,24 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
@@ -246,11 +252,12 @@ org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
@@ -281,6 +288,8 @@ org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
@@ -305,13 +314,17 @@ org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
@@ -359,6 +372,8 @@ org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do no
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
@@ -395,9 +410,12 @@ org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not inser
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
@@ -436,10 +454,14 @@ org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
org.eclipse.jdt.core.incompatibleJDKLevel=ignore
org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.equinox.p2.director/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.director/META-INF/MANIFEST.MF
index 3aad47093..8b2a73e25 100644
--- a/bundles/org.eclipse.equinox.p2.director/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.director/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.director;singleton:=true
-Bundle-Version: 2.4.700.qualifier
+Bundle-Version: 2.5.200.qualifier
Bundle-ClassPath: .
Bundle-Activator: org.eclipse.equinox.internal.p2.director.DirectorActivator
Bundle-Vendor: %providerName
@@ -27,7 +27,7 @@ Require-Bundle: org.eclipse.equinox.common;bundle-version="[3.3.0,4.0.0)",
org.eclipse.equinox.p2.metadata;bundle-version="[2.0.0,3.0.0)",
org.sat4j.core;bundle-version="[2.3.5,3.0.0)",
org.sat4j.pb;bundle-version="[2.3.5,3.0.0)"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Service-Component: OSGI-INF/director.xml, OSGI-INF/planner.xml
Import-Package: org.eclipse.equinox.internal.p2.core.helpers,
diff --git a/bundles/org.eclipse.equinox.p2.director/pom.xml b/bundles/org.eclipse.equinox.p2.director/pom.xml
index 1c00320fc..0a32c8db0 100644
--- a/bundles/org.eclipse.equinox.p2.director/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.director/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.director</artifactId>
- <version>2.4.700-SNAPSHOT</version>
+ <version>2.5.200-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/DirectorActivator.java b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/DirectorActivator.java
index 7d331936f..a2960e384 100644
--- a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/DirectorActivator.java
+++ b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/DirectorActivator.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2017 IBM Corporation and others.
+ * Copyright (c) 2007, 2022 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,24 +10,26 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
+ * Christoph Läubrich - access activator static singelton in a safe way
*******************************************************************************/
package org.eclipse.equinox.internal.p2.director;
+import java.util.Optional;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
public class DirectorActivator implements BundleActivator {
public static final String PI_DIRECTOR = "org.eclipse.equinox.p2.director"; //$NON-NLS-1$
- public static BundleContext context;
+ public static volatile Optional<BundleContext> context = Optional.empty();
@Override
public void start(BundleContext ctx) throws Exception {
- context = ctx;
+ context = Optional.of(ctx);
}
@Override
public void stop(BundleContext ctx) throws Exception {
- DirectorActivator.context = null;
+ DirectorActivator.context = Optional.empty();
}
}
diff --git a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Explanation.java b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Explanation.java
index c24960dc6..780dd229e 100644
--- a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Explanation.java
+++ b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Explanation.java
@@ -89,7 +89,8 @@ public abstract class Explanation implements Comparable<Explanation> {
@Override
public String toString() {
- return NLS.bind(Messages.Explanation_hardDependency, iu, req);
+ return NLS.bind(req.getMax() == 0 ? Messages.Explanation_hardDependencyNegative
+ : Messages.Explanation_hardDependency, iu, req);
}
@Override
diff --git a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Messages.java b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Messages.java
index 87e08a7ec..7a5b2c3d3 100644
--- a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Messages.java
+++ b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Messages.java
@@ -43,6 +43,7 @@ public class Messages extends NLS {
public static String Explanation_from;
public static String Explanation_fromPatch;
public static String Explanation_hardDependency;
+ public static String Explanation_hardDependencyNegative;
public static String Explanation_patchedHardDependency;
public static String Explanation_missingRequired;
public static String Explanation_missingRootRequired;
diff --git a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/OptimizationFunction.java b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/OptimizationFunction.java
index 1d3cc1e80..42672c6e9 100644
--- a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/OptimizationFunction.java
+++ b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/OptimizationFunction.java
@@ -28,7 +28,6 @@ public class OptimizationFunction {
private IQueryable<IInstallableUnit> picker;
private IInstallableUnit selectionContext;
protected Map<String, Map<Version, IInstallableUnit>> slice; //The IUs that have been considered to be part of the problem
- private int numberOfInstalledIUs; //TODO this should be renamed to consideredIUs or sliceSize
private IQueryable<IInstallableUnit> lastState;
private List<AbstractVariable> optionalRequirementVariable;
@@ -42,7 +41,7 @@ public class OptimizationFunction {
//Create an optimization function favoring the highest version of each IU
public List<WeightedObject<? extends Object>> createOptimizationFunction(IInstallableUnit metaIu, Collection<IInstallableUnit> newRoots) {
- numberOfInstalledIUs = sizeOf(lastState);
+ int numberOfInstalledIUs = sizeOf(lastState);
List<WeightedObject<? extends Object>> weightedObjects = new ArrayList<>();
Set<IInstallableUnit> transitiveClosure; //The transitive closure of the IUs we are adding (this also means updating)
diff --git a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Projector.java b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Projector.java
index 808c70e83..458a8fb86 100644
--- a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Projector.java
+++ b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/Projector.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2020 IBM Corporation and others.
+ * Copyright (c) 2007, 2022 IBM Corporation and others.
*
* This
* program and the accompanying materials are made available under the terms of
@@ -17,6 +17,7 @@
* Sonatype, Inc. - ongoing development
* Rapicorp, Inc. - split the optimization function
* Red Hat, Inc. - support for remediation page
+ * Christoph Läubrich - access activator static singelton in a safe way
******************************************************************************/
package org.eclipse.equinox.internal.p2.director;
@@ -207,7 +208,8 @@ public class Projector {
// allow the user to specify a longer timeout.
// only set the value if it is a positive integer larger than the default.
// see https://bugs.eclipse.org/336967
- timeoutString = DirectorActivator.context.getProperty(PROP_PROJECTOR_TIMEOUT);
+ timeoutString = DirectorActivator.context.map(ctx -> ctx.getProperty(PROP_PROJECTOR_TIMEOUT))
+ .orElse(null);
if (timeoutString != null)
timeout = Math.max(timeout, Integer.parseInt(timeoutString));
} catch (Exception e) {
@@ -299,7 +301,7 @@ public class Projector {
if (weightedObjects == null)
return;
if (DEBUG) {
- StringBuffer b = new StringBuffer();
+ StringBuilder b = new StringBuilder();
for (WeightedObject<? extends Object> object : weightedObjects) {
if (b.length() > 0)
b.append(", "); //$NON-NLS-1$
@@ -926,7 +928,7 @@ public class Projector {
private void createAtMostOne(IInstallableUnit[] ius) throws ContradictionException {
if (DEBUG) {
- StringBuffer b = new StringBuffer();
+ StringBuilder b = new StringBuilder();
for (IInstallableUnit iu : ius) {
b.append(iu.toString());
}
diff --git a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/messages.properties b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/messages.properties
index 1aba20a2e..17fb47c7a 100644
--- a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/messages.properties
+++ b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/p2/director/messages.properties
@@ -28,6 +28,7 @@ Explanation_alreadyInstalled=Software currently installed: {0}
Explanation_from=From: {0}
Explanation_fromPatch=From Patch: {0}
Explanation_hardDependency=Cannot satisfy dependency: {0} depends on: {1}
+Explanation_hardDependencyNegative=Cannot satisfy dependency: {0} conflicts with: {1}
Explanation_patchedHardDependency=Cannot satisfy patched ({0}) dependency: {1} depends on: {2}
Explanation_missingRequired=Missing requirement: {0} requires ''{1}'' but it could not be found
Explanation_missingRootRequired=You requested to install ''{0}'' but it could not be found
diff --git a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/provisional/p2/director/PlanExecutionHelper.java b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/provisional/p2/director/PlanExecutionHelper.java
index 4c51ca1a9..83ac500b7 100644
--- a/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/provisional/p2/director/PlanExecutionHelper.java
+++ b/bundles/org.eclipse.equinox.p2.director/src/org/eclipse/equinox/internal/provisional/p2/director/PlanExecutionHelper.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2015 IBM Corporation and others.
+ * Copyright (c) 2009, 2022 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -11,6 +11,7 @@
* Contributors:
* IBM Corporation - initial API and implementation
* Red Hat Inc. - Bug 460967
+ * Christoph Läubrich - access activator static singelton in a safe way
*******************************************************************************/
package org.eclipse.equinox.internal.provisional.p2.director;
@@ -36,7 +37,8 @@ public class PlanExecutionHelper {
.getService(IEngine.class).perform(result.getInstallerPlan(), phaseSet, progress);
if (!installerPlanStatus.isOK())
return installerPlanStatus;
- Configurator configChanger = ServiceHelper.getService(DirectorActivator.context, Configurator.class);
+ Configurator configChanger = DirectorActivator.context
+ .map(ctx -> ServiceHelper.getService(ctx, Configurator.class)).orElse(null);
try {
configChanger.applyConfiguration();
} catch (IOException e) {
diff --git a/bundles/org.eclipse.equinox.p2.directorywatcher/.classpath b/bundles/org.eclipse.equinox.p2.directorywatcher/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.directorywatcher/.classpath
+++ b/bundles/org.eclipse.equinox.p2.directorywatcher/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.directorywatcher/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.directorywatcher/.settings/org.eclipse.jdt.core.prefs
index 4e79b56c0..26df1a4b1 100644
--- a/bundles/org.eclipse.equinox.p2.directorywatcher/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.directorywatcher/.settings/org.eclipse.jdt.core.prefs
@@ -16,9 +16,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -35,6 +35,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -88,6 +89,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -124,7 +126,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -138,7 +141,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -259,7 +261,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -330,7 +331,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -475,7 +475,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.directorywatcher/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.directorywatcher/META-INF/MANIFEST.MF
index 559c6bfae..a91060a0f 100644
--- a/bundles/org.eclipse.equinox.p2.directorywatcher/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.directorywatcher/META-INF/MANIFEST.MF
@@ -2,12 +2,12 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.directorywatcher;singleton:=true
-Bundle-Version: 1.2.500.qualifier
+Bundle-Version: 1.3.0.qualifier
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Export-Package: org.eclipse.equinox.internal.provisional.p2.directorywatcher;x-friends:="org.eclipse.equinox.p2.reconciler.dropins,org.eclipse.equinox.p2.extensionlocation"
Require-Bundle: org.eclipse.equinox.common;bundle-version="[3.7.0,4.0)"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Import-Package: org.eclipse.equinox.internal.p2.artifact.repository.simple,
org.eclipse.equinox.internal.p2.core.helpers,
diff --git a/bundles/org.eclipse.equinox.p2.directorywatcher/pom.xml b/bundles/org.eclipse.equinox.p2.directorywatcher/pom.xml
index a27e22786..ece589593 100644
--- a/bundles/org.eclipse.equinox.p2.directorywatcher/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.directorywatcher/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.directorywatcher</artifactId>
- <version>1.2.500-SNAPSHOT</version>
+ <version>1.3.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.discovery.compatibility/.classpath b/bundles/org.eclipse.equinox.p2.discovery.compatibility/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.discovery.compatibility/.classpath
+++ b/bundles/org.eclipse.equinox.p2.discovery.compatibility/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.discovery.compatibility/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.discovery.compatibility/META-INF/MANIFEST.MF
index 337507969..fbfa7e023 100644
--- a/bundles/org.eclipse.equinox.p2.discovery.compatibility/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.discovery.compatibility/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: org.eclipse.equinox.p2.discovery.compatibility;singleton:=true
-Bundle-Version: 1.2.0.qualifier
+Bundle-Version: 1.2.200.qualifier
Bundle-Vendor: %Bundle-Vendor
Bundle-RequiredExecutionEnvironment: JavaSE-11
Require-Bundle: org.eclipse.core.runtime;bundle-version="3.3.0",
diff --git a/bundles/org.eclipse.equinox.p2.discovery.compatibility/pom.xml b/bundles/org.eclipse.equinox.p2.discovery.compatibility/pom.xml
index b6d368ee0..b926dd577 100644
--- a/bundles/org.eclipse.equinox.p2.discovery.compatibility/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.discovery.compatibility/pom.xml
@@ -14,11 +14,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.discovery.compatibility</artifactId>
- <version>1.2.0-SNAPSHOT</version>
+ <version>1.2.200-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.discovery.compatibility/src/org/eclipse/equinox/internal/p2/discovery/compatibility/DirectoryParser.java b/bundles/org.eclipse.equinox.p2.discovery.compatibility/src/org/eclipse/equinox/internal/p2/discovery/compatibility/DirectoryParser.java
index 97a21448c..9cbb8d0a3 100644
--- a/bundles/org.eclipse.equinox.p2.discovery.compatibility/src/org/eclipse/equinox/internal/p2/discovery/compatibility/DirectoryParser.java
+++ b/bundles/org.eclipse.equinox.p2.discovery.compatibility/src/org/eclipse/equinox/internal/p2/discovery/compatibility/DirectoryParser.java
@@ -16,6 +16,7 @@ package org.eclipse.equinox.internal.p2.discovery.compatibility;
import java.io.IOException;
import java.io.Reader;
+import javax.xml.parsers.ParserConfigurationException;
import org.eclipse.equinox.internal.p2.core.helpers.SecureXMLUtil;
import org.eclipse.equinox.internal.p2.discovery.compatibility.Directory.Entry;
import org.eclipse.equinox.internal.p2.discovery.compatibility.util.DefaultSaxErrorHandler;
@@ -42,7 +43,7 @@ public class DirectoryParser {
XMLReader xmlReader;
try {
xmlReader = SecureXMLUtil.newSecureXMLReader();
- } catch (SAXException e) {
+ } catch (SAXException | ParserConfigurationException e) {
throw new IOWithCauseException(e.getMessage(), e);
}
xmlReader.setErrorHandler(new DefaultSaxErrorHandler());
diff --git a/bundles/org.eclipse.equinox.p2.discovery/.classpath b/bundles/org.eclipse.equinox.p2.discovery/.classpath
index 5f1595b77..f57eddd9b 100644
--- a/bundles/org.eclipse.equinox.p2.discovery/.classpath
+++ b/bundles/org.eclipse.equinox.p2.discovery/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
<accessrules>
<accessrule kind="accessible" pattern="org/eclipse/equinox/internal/p2/core/**"/>
diff --git a/bundles/org.eclipse.equinox.p2.discovery/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.discovery/.settings/org.eclipse.jdt.core.prefs
index c7bd22b57..456e7b09f 100644
--- a/bundles/org.eclipse.equinox.p2.discovery/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.discovery/.settings/org.eclipse.jdt.core.prefs
@@ -17,9 +17,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -35,6 +35,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -88,6 +89,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -123,7 +125,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -137,7 +140,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -258,7 +260,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -329,7 +330,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -474,7 +474,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.discovery/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.discovery/META-INF/MANIFEST.MF
index 2e89a36de..3ed751bd4 100644
--- a/bundles/org.eclipse.equinox.p2.discovery/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.discovery/META-INF/MANIFEST.MF
@@ -2,9 +2,9 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: org.eclipse.equinox.p2.discovery;singleton:=true
-Bundle-Version: 1.1.200.qualifier
+Bundle-Version: 1.2.0.qualifier
Bundle-Vendor: %Bundle-Vendor
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Require-Bundle: org.eclipse.core.runtime;bundle-version="3.3.0",
org.eclipse.equinox.p2.core;bundle-version="2.0.0"
Export-Package: org.eclipse.equinox.internal.p2.discovery;x-friends:="org.eclipse.equinox.p2.discovery.compatibility,org.eclipse.equinox.p2.ui.discovery,org.eclipse.equinox.p2.discovery.repository",
diff --git a/bundles/org.eclipse.equinox.p2.discovery/pom.xml b/bundles/org.eclipse.equinox.p2.discovery/pom.xml
index a2f21a825..08c1a9a53 100644
--- a/bundles/org.eclipse.equinox.p2.discovery/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.discovery/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.discovery</artifactId>
- <version>1.1.200-SNAPSHOT</version>
+ <version>1.2.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.engine/.classpath b/bundles/org.eclipse.equinox.p2.engine/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.engine/.classpath
+++ b/bundles/org.eclipse.equinox.p2.engine/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.engine/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.engine/.settings/org.eclipse.jdt.core.prefs
index 1d2db97da..ae545cfe9 100644
--- a/bundles/org.eclipse.equinox.p2.engine/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.engine/.settings/org.eclipse.jdt.core.prefs
@@ -17,9 +17,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -35,6 +35,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -88,6 +89,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -123,7 +125,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -137,7 +140,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -258,7 +260,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -329,7 +330,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -474,7 +474,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.engine/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.engine/META-INF/MANIFEST.MF
index 5bd54376a..561283093 100644
--- a/bundles/org.eclipse.equinox.p2.engine/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.engine/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.engine;singleton:=true
-Bundle-Version: 2.6.700.qualifier
+Bundle-Version: 2.7.300.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.engine.EngineActivator
Bundle-Vendor: %providerName
Bundle-Localization: plugin
@@ -14,7 +14,7 @@ Export-Package: org.eclipse.equinox.internal.p2.engine;
org.eclipse.equinox.p2.ui.sdk.scheduler,
org.eclipse.pde.build,
org.eclipse.equinox.p2.director.app",
- org.eclipse.equinox.internal.p2.engine.phases;x-friends:="org.eclipse.equinox.p2.director.app,org.eclipse.equinox.p2.repository.tools,org.eclipse.equinox.p2.ui.sdk.scheduler",
+ org.eclipse.equinox.internal.p2.engine.phases;x-friends:="org.eclipse.equinox.p2.director.app,org.eclipse.equinox.p2.repository.tools,org.eclipse.equinox.p2.ui.sdk,org.eclipse.equinox.p2.ui.sdk.scheduler,org.eclipse.equinox.p2.touchpoint.eclipse",
org.eclipse.equinox.p2.engine;version="2.2.0",
org.eclipse.equinox.p2.engine.query;version="2.0.0",
org.eclipse.equinox.p2.engine.spi;version="2.0.0"
@@ -22,12 +22,14 @@ Require-Bundle: org.eclipse.equinox.common,
org.eclipse.equinox.registry,
org.eclipse.core.jobs;bundle-version="[3.4.0,4.0.0)"
Eclipse-RegisterBuddy: org.eclipse.equinox.p2.metadata.repository
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Service-Component: OSGI-INF/profileRegistry.xml, OSGI-INF/engine.xml
Import-Package: javax.xml.parsers,
+ org.bouncycastle.openpgp;version="1.65.0",
org.eclipse.core.internal.preferences,
org.eclipse.core.runtime.preferences,
+ org.eclipse.equinox.internal.p2.artifact.processors.pgp,
org.eclipse.equinox.internal.p2.core.helpers,
org.eclipse.equinox.internal.p2.metadata,
org.eclipse.equinox.internal.p2.metadata.index,
@@ -44,9 +46,10 @@ Import-Package: javax.xml.parsers,
org.eclipse.equinox.p2.query;version="[2.0.0,3.0.0)",
org.eclipse.equinox.p2.repository;version="[2.0.0,3.0.0)",
org.eclipse.equinox.p2.repository.artifact;version="[2.0.0,3.0.0)",
+ org.eclipse.equinox.p2.repository.artifact.spi;version="[2.0.0,3.0.0)",
org.eclipse.equinox.p2.repository.metadata;version="[2.0.0,3.0.0)",
org.eclipse.equinox.p2.repository.metadata.spi;version="[2.0.0,3.0.0)",
- org.eclipse.equinox.p2.repository.spi;version="2.0.0",
+ org.eclipse.equinox.p2.repository.spi;version="[2.0.0,3.0.0)",
org.eclipse.osgi.service.datalocation;version="1.0.0",
org.eclipse.osgi.service.debug;version="1.1.0",
org.eclipse.osgi.service.security;version="1.0.0",
diff --git a/bundles/org.eclipse.equinox.p2.engine/plugin.xml b/bundles/org.eclipse.equinox.p2.engine/plugin.xml
index 3d469f492..cee2c3856 100644
--- a/bundles/org.eclipse.equinox.p2.engine/plugin.xml
+++ b/bundles/org.eclipse.equinox.p2.engine/plugin.xml
@@ -4,6 +4,7 @@
<extension-point id="touchpoints" name="Touchpoints" schema="schema/touchpoints.exsd"/>
<extension-point id="actions" name="Actions" schema="schema/actions.exsd"/>
+<extension-point id="pgp" name="PGP" schema="schema/pgp.exsd"/>
<extension
id="metadataRepository"
point="org.eclipse.equinox.p2.metadata.repository.metadataRepositories">
diff --git a/bundles/org.eclipse.equinox.p2.engine/pom.xml b/bundles/org.eclipse.equinox.p2.engine/pom.xml
index 350550471..eb9562492 100644
--- a/bundles/org.eclipse.equinox.p2.engine/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.engine/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.engine</artifactId>
- <version>2.6.700-SNAPSHOT</version>
+ <version>2.7.300-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.engine/schema/pgp.exsd b/bundles/org.eclipse.equinox.p2.engine/schema/pgp.exsd
new file mode 100644
index 000000000..fcb06d04a
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.engine/schema/pgp.exsd
@@ -0,0 +1,107 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.equinox.p2.engine" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+ <appInfo>
+ <meta.schema plugin="org.eclipse.equinox.p2.engine" id="pgp" name="PGP"/>
+ </appInfo>
+ <documentation>
+ Configure PGP keys and trust for p2 operations
+ </documentation>
+ </annotation>
+
+ <element name="extension">
+ <annotation>
+ <appInfo>
+ <meta.element />
+ </appInfo>
+ </annotation>
+ <complexType>
+ <sequence minOccurs="0" maxOccurs="unbounded">
+ <element ref="trustedKeys"/>
+ </sequence>
+ <attribute name="point" type="string" use="required">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="id" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ </annotation>
+ </attribute>
+ <attribute name="name" type="string">
+ <annotation>
+ <documentation>
+
+ </documentation>
+ <appInfo>
+ <meta.attribute translatable="true"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <element name="trustedKeys">
+ <annotation>
+ <documentation>
+ PGP Keys that are trusted by default.
+ </documentation>
+ </annotation>
+ <complexType>
+ <attribute name="path" type="string">
+ <annotation>
+ <documentation>
+ Path to a file containing PGP keys in armored form.
+ </documentation>
+ <appInfo>
+ <meta.attribute kind="resource"/>
+ </appInfo>
+ </annotation>
+ </attribute>
+ </complexType>
+ </element>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="since"/>
+ </appInfo>
+ <documentation>
+ 2.7.300
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="examples"/>
+ </appInfo>
+ <documentation>
+ [Enter extension point usage example here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="apiinfo"/>
+ </appInfo>
+ <documentation>
+ [Enter API information here.]
+ </documentation>
+ </annotation>
+
+ <annotation>
+ <appInfo>
+ <meta.section type="implementation"/>
+ </appInfo>
+ <documentation>
+ [Enter information about supplied implementation of this extension point.]
+ </documentation>
+ </annotation>
+
+
+</schema>
diff --git a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/DownloadManager.java b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/DownloadManager.java
index cc923859b..b67af3ad9 100644
--- a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/DownloadManager.java
+++ b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/DownloadManager.java
@@ -35,7 +35,7 @@ public class DownloadManager {
* TODO: This is copied from the ProvisioningContext class. Can we combine them?
* See https://bugs.eclipse.org/335153.
*/
- private static final Comparator<IArtifactRepository> LOCAL_FIRST_COMPARATOR = new Comparator<IArtifactRepository>() {
+ private static final Comparator<IArtifactRepository> LOCAL_FIRST_COMPARATOR = new Comparator<>() {
private static final String FILE_PROTOCOL = "file"; //$NON-NLS-1$
@Override
diff --git a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/InstallableUnitOperand.java b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/InstallableUnitOperand.java
index 6fea6e340..8b91ed338 100644
--- a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/InstallableUnitOperand.java
+++ b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/InstallableUnitOperand.java
@@ -27,7 +27,7 @@ public class InstallableUnitOperand extends Operand {
* Creates a new operand that represents replacing an installable unit
* with another. At least one of the provided installable units must be
* non-null.
- *
+ *
* @param first The installable unit being removed, or <code>null</code>
* @param second The installable unit being added, or <code>null</code>
*/
@@ -38,10 +38,17 @@ public class InstallableUnitOperand extends Operand {
this.second = second;
}
+ /**
+ *
+ * @return The installable unit being removed, or <code>null</code>
+ */
public IInstallableUnit first() {
return first;
}
+ /**
+ * @return The installable unit being added, or <code>null</code>
+ */
public IInstallableUnit second() {
return second;
}
diff --git a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/Profile.java b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/Profile.java
index f551eb287..e7dab0b35 100644
--- a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/Profile.java
+++ b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/Profile.java
@@ -8,11 +8,11 @@
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
- *
+ *
* Contributors:
* IBM Corporation - initial API and implementation
* Cloudsmith Inc. - query indexes
- *
+ *
******************************************************************************/
package org.eclipse.equinox.internal.p2.engine;
@@ -407,6 +407,6 @@ public class Profile extends IndexProvider<IInstallableUnit> implements IProfile
*/
@Override
public String toString() {
- return "Profile(" + getProfileId() + ')'; //$NON-NLS-1$
+ return "Profile(" + getProfileId() + ", timestamp: " + getTimestamp() + ')'; //$NON-NLS-1$ //$NON-NLS-2$
}
}
diff --git a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/SimpleProfileRegistry.java b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/SimpleProfileRegistry.java
index ef16bf4f9..f016c9408 100644
--- a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/SimpleProfileRegistry.java
+++ b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/SimpleProfileRegistry.java
@@ -56,6 +56,8 @@ public class SimpleProfileRegistry implements IProfileRegistry, IAgentService {
//Internal constant used to keep track of the newly created timestamp
private static final String SERVICE_SHARED_INSTALL_NEW_TIMESTAMP = IProfileRegistry.class.getName() + '_' + "NEW_SELF_TIMESTAMP"; //$NON-NLS-1$
+ private static long lastTimeMillis = System.currentTimeMillis();
+
protected final IProvisioningAgent agent;
/**
@@ -489,7 +491,8 @@ public class SimpleProfileRegistry implements IProfileRegistry, IAgentService {
if (profiles != null) {
IProfile profile = getProfile(id);
if (profile != null && profile.getTimestamp() == timestamp)
- throw new ProvisionException(Messages.SimpleProfileRegistry_CannotRemoveCurrentSnapshot);
+ throw new ProvisionException(
+ NLS.bind(Messages.SimpleProfileRegistry_CannotRemoveCurrentSnapshot, profile));
}
File profileDirectory = getProfileFolder(id);
@@ -527,6 +530,7 @@ public class SimpleProfileRegistry implements IProfileRegistry, IAgentService {
// protect against NPE
if (profileDirectories == null) {
parser.getProfileMap();
+ return Collections.emptyMap();
}
for (File profileDirectorie : profileDirectories) {
String directoryName = profileDirectorie.getName();
@@ -587,9 +591,10 @@ public class SimpleProfileRegistry implements IProfileRegistry, IAgentService {
profileDirectory.mkdir();
long previousTimestamp = profile.getTimestamp();
- long currentTimestamp = System.currentTimeMillis();
- if (currentTimestamp <= previousTimestamp)
- currentTimestamp = previousTimestamp + 1;
+ long currentTimestamp = currentTimeInMillis(lastTimeMillis);
+ if (currentTimestamp <= previousTimestamp) {
+ currentTimestamp = currentTimeInMillis(previousTimestamp);
+ }
boolean shouldGzipFile = shouldGzipFile(profile);
File profileFile = new File(profileDirectory, Long.toString(currentTimestamp) + (shouldGzipFile ? PROFILE_GZ_EXT : PROFILE_EXT));
@@ -621,6 +626,16 @@ public class SimpleProfileRegistry implements IProfileRegistry, IAgentService {
}
}
+ /**
+ * Returns current time in millis that is guaranteed to grow and higher as given
+ * value
+ */
+ private static synchronized long currentTimeInMillis(long lastCurrentTime) {
+ long newTime = Math.max(lastCurrentTime + 1, lastTimeMillis + 1);
+ lastTimeMillis = Math.max(newTime, System.currentTimeMillis());
+ return lastTimeMillis;
+ }
+
public void setEventBus(IProvisioningEventBus bus) {
this.eventBus = bus;
}
@@ -890,7 +905,7 @@ public class SimpleProfileRegistry implements IProfileRegistry, IAgentService {
return false;
}
- long currentTimestamp = (timestamps.length == 0) ? -1 : timestamps[timestamps.length - 1];
+ long currentTimestamp = timestamps[timestamps.length - 1];
if (profile.getTimestamp() != currentTimestamp) {
if (DebugHelper.DEBUG_PROFILE_REGISTRY)
DebugHelper.debug(PROFILE_REGISTRY, "check timestamp: expected " + profile.getTimestamp() + " but was " + currentTimestamp); //$NON-NLS-1$ //$NON-NLS-2$
diff --git a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/messages.properties b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/messages.properties
index 6bbfb785f..615e06d27 100644
--- a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/messages.properties
+++ b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/messages.properties
@@ -43,7 +43,7 @@ SimpleProfileRegistry_Profile_in_use=The profile is currently in use.
SimpleProfileRegistry_Profile_not_locked=The profile is not locked.
SimpleProfileRegistry_Profile_not_locked_due_to_exception=Profile not locked due to exception: {0}
SimpleProfileRegistry_Bad_profile_location=Bad profile location: {0}
-SimpleProfileRegistry_CannotRemoveCurrentSnapshot=Cannot remove the current profile timestamp
+SimpleProfileRegistry_CannotRemoveCurrentSnapshot=Cannot remove current profile: {0}
SimpleProfileRegistry_States_Error_Reading_File=Error reading profile state properties.
SimpleProfileRegistry_States_Error_Writing_File=Error writing profile state properties.
SimpleProfileRegistry_state_not_found=State {0} for profile {1} not found.
diff --git a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/phases/CertificateChecker.java b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/phases/CertificateChecker.java
index 7e1e729a8..3a1589f8b 100644
--- a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/phases/CertificateChecker.java
+++ b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/phases/CertificateChecker.java
@@ -13,33 +13,88 @@
*******************************************************************************/
package org.eclipse.equinox.internal.p2.engine.phases;
-import java.io.File;
-import java.io.IOException;
+import java.io.*;
+import java.net.URL;
+import java.nio.ByteBuffer;
import java.security.GeneralSecurityException;
-import java.security.cert.Certificate;
+import java.security.cert.*;
import java.util.*;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
+import java.util.Map.Entry;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import org.bouncycastle.openpgp.PGPPublicKey;
+import org.eclipse.core.runtime.*;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.equinox.internal.p2.artifact.processors.pgp.PGPPublicKeyStore;
+import org.eclipse.equinox.internal.p2.artifact.processors.pgp.PGPSignatureVerifier;
import org.eclipse.equinox.internal.p2.engine.*;
-import org.eclipse.equinox.p2.core.IProvisioningAgent;
-import org.eclipse.equinox.p2.core.UIServices;
+import org.eclipse.equinox.p2.core.*;
import org.eclipse.equinox.p2.core.UIServices.TrustInfo;
+import org.eclipse.equinox.p2.engine.IProfile;
+import org.eclipse.equinox.p2.engine.ProfileScope;
+import org.eclipse.equinox.p2.metadata.IArtifactKey;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor;
+import org.eclipse.equinox.p2.repository.artifact.spi.IArtifactUIServices;
+import org.eclipse.equinox.p2.repository.spi.PGPPublicKeyService;
import org.eclipse.osgi.service.security.TrustEngine;
import org.eclipse.osgi.signedcontent.*;
import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
+import org.osgi.framework.*;
+import org.osgi.service.prefs.BackingStoreException;
import org.osgi.util.tracker.ServiceTracker;
/**
- * Checks the certificates on a set of files or artifacts and reports back any problems
- * with unsigned artifacts, untrusted certificates, or tampered content.
+ * Checks the certificates or PGP signatures on a set of files or artifacts and
+ * reports back any problems with unsigned artifacts, untrusted certificates, or
+ * tampered content.
*/
public class CertificateChecker {
private static final String DEBUG_PREFIX = "certificate checker"; //$NON-NLS-1$
- private ArrayList<File> artifacts;
+ public static final String TRUST_ALWAYS_PROPERTY = "trustAlways"; //$NON-NLS-1$
+
+ public static final String TRUSTED_KEY_STORE_PROPERTY = "pgp.trustedPublicKeys"; //$NON-NLS-1$
+
+ public static final String TRUSTED_CERTIFICATES_PROPERTY = "trustedCertificates"; //$NON-NLS-1$
+
+ /***
+ * Store the optional profile for PGP key handling
+ */
+ private IProfile profile;
+
+ /**
+ * Stores artifacts to check
+ */
+ private Map<IArtifactDescriptor, File> artifacts = new HashMap<>();
private final IProvisioningAgent agent;
+ private final PGPPublicKeyService keyService;
+
+ // Lazily loading
+ private Supplier<PGPPublicKeyStore> trustedKeys = new Supplier<>() {
+ private PGPPublicKeyStore cache = null;
+
+ public PGPPublicKeyStore get() {
+ if (cache == null) {
+ cache = getPreferenceTrustedKeys();
+ getContributedTrustedKeys().keySet().forEach(cache::addKey);
+ }
+ return cache;
+ }
+ };
+
+ // Lazily loading in case we ever add an extension point for registering
+ // certificates.
+ private Supplier<Collection<? extends Certificate>> additionalTrustedCertificates = new Supplier<>() {
+ private Collection<? extends Certificate> cache = null;
+
+ public Collection<? extends Certificate> get() {
+ if (cache == null) {
+ cache = getPreferenceTrustedCertificates();
+ }
+ return cache;
+ }
+ };
public CertificateChecker() {
this(null);
@@ -47,12 +102,15 @@ public class CertificateChecker {
public CertificateChecker(IProvisioningAgent agent) {
this.agent = agent;
- artifacts = new ArrayList<>();
+ artifacts = new HashMap<>();
+ keyService = agent.getService(PGPPublicKeyService.class);
+
}
public IStatus start() {
final BundleContext context = EngineActivator.getContext();
- ServiceReference<SignedContentFactory> contentFactoryRef = context.getServiceReference(SignedContentFactory.class);
+ ServiceReference<SignedContentFactory> contentFactoryRef = context
+ .getServiceReference(SignedContentFactory.class);
SignedContentFactory verifierFactory = context.getService(contentFactoryRef);
try {
return checkCertificates(verifierFactory);
@@ -62,159 +120,257 @@ public class CertificateChecker {
}
private IStatus checkCertificates(SignedContentFactory verifierFactory) {
+ if (artifacts.isEmpty()) {
+ return Status.OK_STATUS;
+ }
+
+ // If unsigned content is allowed then the flood gates are open so there is no
+ // point in checking for unrooted certificates nor for not-yet-trusted keys.
+ // https://bugs.eclipse.org/bugs/show_bug.cgi?id=578583
+ String policy = getUnsignedContentPolicy();
+ if (EngineActivator.UNSIGNED_ALLOW.equals(policy)) {
+ return Status.OK_STATUS;
+ }
+
UIServices serviceUI = agent.getService(UIServices.class);
- SignedContent content = null;
- SignerInfo[] signerInfo = null;
- ArrayList<Certificate> untrusted = new ArrayList<>();
- ArrayList<File> unsigned = new ArrayList<>();
- ArrayList<Certificate[]> untrustedChain = new ArrayList<>();
- Map<Certificate, Collection<File>> untrustedArtifacts = new HashMap<>();
- IStatus status = Status.OK_STATUS;
- if (artifacts.size() == 0 || serviceUI == null)
- return status;
- checkArtifacts: for (File artifact : artifacts) {
- try {
- content = verifierFactory.getSignedContent(artifact);
- if (!content.isSigned()) {
- unsigned.add(artifact);
- continue;
- }
- signerInfo = content.getSignerInfos();
- } catch (GeneralSecurityException e) {
- return new Status(IStatus.ERROR, EngineActivator.ID, Messages.CertificateChecker_SignedContentError, e);
- } catch (IOException e) {
- return new Status(IStatus.ERROR, EngineActivator.ID, Messages.CertificateChecker_SignedContentIOError, e);
- }
+ if (serviceUI == null) {
+ return Status.OK_STATUS;
+ }
- // Determine if any element is trusted.
- for (SignerInfo element : signerInfo) {
- if (element.isTrusted()) {
- continue checkArtifacts;
- }
- }
+ if (isTrustAlways()) {
+ return Status.OK_STATUS;
+ }
- // Only record the untrusted elements if there are no trusted elements.
- for (SignerInfo element : signerInfo) {
- if (!element.isTrusted()) {
- Certificate[] certificateChain = element.getCertificateChain();
- if (!untrusted.contains(certificateChain[0])) {
- untrusted.add(certificateChain[0]);
- untrustedChain.add(certificateChain);
+ IArtifactUIServices artifactServiceUI = serviceUI instanceof IArtifactUIServices
+ ? (IArtifactUIServices) serviceUI
+ : (untrustedCertificateChains, untrustedPGPKeys, unsignedArtifacts,
+ artifactFiles) -> IArtifactUIServices.getTrustInfo(serviceUI, untrustedCertificateChains,
+ untrustedPGPKeys, unsignedArtifacts, artifactFiles);
+
+ Map<List<Certificate>, Set<IArtifactKey>> untrustedCertificates = new LinkedHashMap<>();
+ Map<PGPPublicKey, Set<IArtifactKey>> untrustedPGPKeys = new LinkedHashMap<>();
+ Set<IArtifactKey> unsignedArtifacts = new LinkedHashSet<>();
+ Set<PGPPublicKey> trustedKeySet = new HashSet<>();
+ boolean isTrustedKeySetInitialized = false;
+ Map<IArtifactKey, File> artifactFiles = new LinkedHashMap<>();
+ for (Entry<IArtifactDescriptor, File> artifact : artifacts.entrySet()) {
+ IArtifactDescriptor artifactDescriptor = artifact.getKey();
+ IArtifactKey artifactKey = artifactDescriptor.getArtifactKey();
+ File artifactFile = artifact.getValue();
+ artifactFiles.put(artifactKey, artifactFile);
+ try {
+ SignedContent content = verifierFactory.getSignedContent(artifactFile);
+ if (content.isSigned()) {
+ SignerInfo[] signerInfo = content.getSignerInfos();
+ // Only record the untrusted elements if there are no trusted elements.
+ // Also check previously trusted certificates from the preferences.
+ if (Arrays.stream(signerInfo).noneMatch(SignerInfo::isTrusted)
+ && Arrays.stream(signerInfo).map(SignerInfo::getCertificateChain).flatMap(Arrays::stream)
+ .noneMatch(cert -> additionalTrustedCertificates.get().contains(cert))) {
+ for (SignerInfo element : signerInfo) {
+ if (!element.isTrusted()) {
+ List<Certificate> certificateChain = Arrays.asList(element.getCertificateChain());
+ untrustedCertificates.computeIfAbsent(certificateChain, key -> new LinkedHashSet<>())
+ .add(artifactKey);
+ }
+ }
}
- if (DebugHelper.DEBUG_CERTIFICATE_CHECKER_UNTRUSTED) {
- if (untrustedArtifacts.containsKey(certificateChain[0])) {
- untrustedArtifacts.get(certificateChain[0]).add(artifact);
- } else {
- untrustedArtifacts.put(certificateChain[0], new ArrayList<>(Arrays.asList(artifact)));
+ } else {
+ // The keys are in this destination artifact's properties if and only if the
+ // PGPSignatureVerifier verified the signatures against these keys.
+ List<PGPPublicKey> verifiedKeys = PGPPublicKeyStore
+ .readPublicKeys(
+ artifactDescriptor.getProperty(PGPSignatureVerifier.PGP_SIGNER_KEYS_PROPERTY_NAME))
+ .stream().map(keyService::addKey).collect(Collectors.toList());
+ if (!verifiedKeys.isEmpty()) {
+ if (!isTrustedKeySetInitialized) {
+ isTrustedKeySetInitialized = true;
+ trustedKeySet.addAll(trustedKeys.get().all());
}
+ // Only record the untrusted keys if none of the keys are trusted.
+ if (verifiedKeys.stream().noneMatch(trustedKeySet::contains)) {
+ verifiedKeys.forEach(key -> untrustedPGPKeys
+ .computeIfAbsent(key, k -> new LinkedHashSet<>()).add(artifactKey));
+ }
+ } else {
+ unsignedArtifacts.add(artifactKey);
}
}
+ } catch (GeneralSecurityException e) {
+ return new Status(IStatus.ERROR, EngineActivator.ID, Messages.CertificateChecker_SignedContentError, e);
+ } catch (IOException e) {
+ return new Status(IStatus.ERROR, EngineActivator.ID, Messages.CertificateChecker_SignedContentIOError,
+ e);
}
}
// log the unsigned artifacts if requested
- if (DebugHelper.DEBUG_CERTIFICATE_CHECKER_UNSIGNED && !unsigned.isEmpty()) {
+ if (DebugHelper.DEBUG_CERTIFICATE_CHECKER_UNSIGNED && !unsignedArtifacts.isEmpty()) {
StringBuilder message = new StringBuilder("The following artifacts are unsigned:\n"); //$NON-NLS-1$
- for (File file : unsigned) {
- message.append(NLS.bind(" {0}\n", file.getPath())); //$NON-NLS-1$
+ for (IArtifactKey key : unsignedArtifacts) {
+ message.append(NLS.bind(" {0}\n", artifactFiles.get(key).getPath())); //$NON-NLS-1$
}
DebugHelper.debug(DEBUG_PREFIX, message.toString());
}
// log the untrusted certificates if requested
- if (DebugHelper.DEBUG_CERTIFICATE_CHECKER_UNTRUSTED && !untrusted.isEmpty()) {
+ if (DebugHelper.DEBUG_CERTIFICATE_CHECKER_UNTRUSTED && !untrustedCertificates.isEmpty()) {
StringBuilder message = new StringBuilder("The following certificates are untrusted:\n"); //$NON-NLS-1$
- for (Certificate cert : untrustedArtifacts.keySet()) {
- message.append(cert.toString() + "\n"); //$NON-NLS-1$
+ for (Map.Entry<List<Certificate>, Set<IArtifactKey>> entry : untrustedCertificates.entrySet()) {
+ message.append(entry.getKey().get(0).toString() + "\n"); //$NON-NLS-1$
message.append(" used by the following artifacts:\n"); //$NON-NLS-1$
- for (File file : untrustedArtifacts.get(cert)) {
- message.append(NLS.bind(" {0}\n", file.getPath())); //$NON-NLS-1$
+ for (IArtifactKey key : entry.getValue()) {
+ message.append(NLS.bind(" {0}\n", artifactFiles.get(key).getPath())); //$NON-NLS-1$
}
+
}
DebugHelper.debug(DEBUG_PREFIX, message.toString());
}
- String policy = getUnsignedContentPolicy();
- //if there is unsigned content and we should never allow it, then fail without further checking certificates
- if (!unsigned.isEmpty() && EngineActivator.UNSIGNED_FAIL.equals(policy))
- return new Status(IStatus.ERROR, EngineActivator.ID, NLS.bind(Messages.CertificateChecker_UnsignedNotAllowed, unsigned));
-
- String[] details;
- // If we always allow unsigned content, or we don't have any, we don't prompt the user about it
- if (EngineActivator.UNSIGNED_ALLOW.equals(policy) || unsigned.isEmpty())
- details = null;
- else {
- details = new String[unsigned.size()];
- for (int i = 0; i < details.length; i++) {
- details[i] = unsigned.get(i).toString();
+ if (DebugHelper.DEBUG_CERTIFICATE_CHECKER_UNTRUSTED && !untrustedPGPKeys.isEmpty()) {
+ StringBuilder message = new StringBuilder("The following PGP Keys are untrusted:\n"); //$NON-NLS-1$
+ for (Map.Entry<PGPPublicKey, Set<IArtifactKey>> entry : untrustedPGPKeys.entrySet()) {
+ message.append(Long.toHexString(entry.getKey().getKeyID()) + "\n"); //$NON-NLS-1$
+ message.append(" used by the following artifacts:\n"); //$NON-NLS-1$
+ for (IArtifactKey key : entry.getValue()) {
+ message.append(NLS.bind(" {0}\n", key)); //$NON-NLS-1$
+ }
}
+ DebugHelper.debug(DEBUG_PREFIX, message.toString());
}
- Certificate[][] unTrustedCertificateChains;
- if (untrusted.isEmpty()) {
- unTrustedCertificateChains = null;
- } else {
- unTrustedCertificateChains = new Certificate[untrustedChain.size()][];
- for (int i = 0; i < untrustedChain.size(); i++) {
- unTrustedCertificateChains[i] = untrustedChain.get(i);
- }
+
+ // if there is unsigned content and we should never allow it, then fail without
+ // further checking certificates
+ if (!unsignedArtifacts.isEmpty() && EngineActivator.UNSIGNED_FAIL.equals(policy)) {
+ return new Status(IStatus.ERROR, EngineActivator.ID, NLS.bind(
+ Messages.CertificateChecker_UnsignedNotAllowed,
+ unsignedArtifacts.stream().map(key -> artifactFiles.get(key)).collect(Collectors.toList())));
}
// If there was no unsigned content, and nothing untrusted, no need to prompt.
- if (details == null && unTrustedCertificateChains == null)
- return status;
+ if (unsignedArtifacts.isEmpty() && untrustedCertificates.isEmpty() && untrustedPGPKeys.isEmpty()) {
+ return Status.OK_STATUS;
+ }
- TrustInfo trustInfo = serviceUI.getTrustInfo(unTrustedCertificateChains, details);
+ TrustInfo trustInfo = artifactServiceUI.getTrustInfo(untrustedCertificates, untrustedPGPKeys, unsignedArtifacts,
+ artifactFiles);
- // If user doesn't trust unsigned content, cancel the operation
- if (!trustInfo.trustUnsignedContent())
- return Status.CANCEL_STATUS;
+ setTrustAlways(trustInfo.trustAlways());
- Certificate[] trustedCertificates = trustInfo.getTrustedCertificates();
- // If we had untrusted chains and nothing was trusted, cancel the operation
- if (unTrustedCertificateChains != null && trustedCertificates == null) {
- return new Status(IStatus.CANCEL, EngineActivator.ID, Messages.CertificateChecker_CertificateRejected);
- }
- // Anything that was trusted should be removed from the untrusted list
- if (trustedCertificates != null) {
- for (Certificate trustedCertificate : trustedCertificates) {
- untrusted.remove(trustedCertificate);
+ if (!trustInfo.trustAlways()) {
+ // If there is unsigned content and user doesn't trust unsigned content, cancel
+ // the operation.
+ if (!unsignedArtifacts.isEmpty() && !trustInfo.trustUnsignedContent()) {
+ return Status.CANCEL_STATUS;
+ }
+
+ Certificate[] trustedCertificates = trustInfo.getTrustedCertificates();
+ // If we had untrusted chains and nothing was trusted, cancel the operation
+ if (!untrustedCertificates.isEmpty() && trustedCertificates == null) {
+ return new Status(IStatus.CANCEL, EngineActivator.ID, Messages.CertificateChecker_CertificateRejected);
+ }
+
+ // Anything that was trusted should be removed from the untrusted list
+ if (trustedCertificates != null) {
+ List<Certificate> trustedCertificateList = Arrays.asList(trustedCertificates);
+ untrustedCertificates.keySet().removeIf(it -> trustedCertificateList.contains(it.get(0)));
+ }
+
+ trustedKeySet.addAll(trustInfo.getTrustedPGPKeys());
+
+ Set<IArtifactKey> trustedArtifactKeys = trustedKeySet.stream().map(untrustedPGPKeys::get)
+ .filter(Objects::nonNull).flatMap(Set::stream).collect(Collectors.toSet());
+ untrustedPGPKeys.values().forEach(it -> it.removeAll(trustedArtifactKeys));
+ untrustedPGPKeys.values().removeIf(Collection::isEmpty);
+
+ // If there is still untrusted content, cancel the operation
+ if (!untrustedCertificates.isEmpty() || !untrustedPGPKeys.isEmpty()) {
+ return new Status(IStatus.CANCEL, EngineActivator.ID, Messages.CertificateChecker_CertificateRejected);
}
}
- // If there is still untrusted content, cancel the operation
- if (untrusted.size() > 0)
- return new Status(IStatus.CANCEL, EngineActivator.ID, Messages.CertificateChecker_CertificateRejected);
- // If we should persist the trusted certificates, add them to the trust engine
- if (trustInfo.persistTrust())
- return persistTrustedCertificates(trustedCertificates);
+ // If we should persist the trusted certificates and keys.
+ if (trustInfo.persistTrust()) {
+ List<IStatus> statuses = new ArrayList<>();
+
+ Set<Certificate> unsavedCertificates = new LinkedHashSet<>();
+ if (trustInfo.getTrustedCertificates() != null) {
+ unsavedCertificates.addAll(Arrays.asList(trustInfo.getTrustedCertificates()));
+ }
+
+ if (!unsavedCertificates.isEmpty()) {
+ // Try to save to the trust engine first.
+ IStatus status = persistTrustedCertificatesInTrustEngine(unsavedCertificates);
+ if (status != null && !status.isOK()) {
+ statuses.add(status);
+ }
+
+ // If we couldn't save them in the trust engine, save them in the preferences.
+ if (!unsavedCertificates.isEmpty()) {
+ // Be sure we add the new certificates to the previously saved certificates.
+ unsavedCertificates.addAll(getPreferenceTrustedCertificates());
+ IStatus preferenceStatus = persistTrustedCertificates(unsavedCertificates);
+ if (preferenceStatus != null && !preferenceStatus.isOK()) {
+ statuses.add(preferenceStatus);
+ }
+ }
+ }
- return status;
+ if (!trustInfo.getTrustedPGPKeys().isEmpty()) {
+ // Be sure we add the new keys to the previously saved keys.
+ PGPPublicKeyStore keyStore = getPreferenceTrustedKeys();
+ trustInfo.getTrustedPGPKeys().forEach(keyStore::addKey);
+ IStatus status = persistTrustedKeys(keyStore);
+ if (status != null && !status.isOK()) {
+ statuses.add(status);
+ }
+ }
+
+ if (!statuses.isEmpty()) {
+ if (statuses.size() == 1) {
+ return statuses.get(1);
+ }
+ String message = statuses.stream().map(IStatus::getMessage).collect(Collectors.joining("\n")); //$NON-NLS-1$
+ return new MultiStatus(getClass(), IStatus.OK, statuses.toArray(IStatus[]::new), message, null);
+ }
+ }
+
+ return Status.OK_STATUS;
}
- private IStatus persistTrustedCertificates(Certificate[] trustedCertificates) {
- if (trustedCertificates == null)
- // I'm pretty sure this would be a bug; trustedCertificates should never be null here.
- return new Status(IStatus.INFO, EngineActivator.ID, Messages.CertificateChecker_CertificateRejected);
- ServiceTracker<TrustEngine, TrustEngine> trustEngineTracker = new ServiceTracker<>(EngineActivator.getContext(), TrustEngine.class, null);
+ /**
+ * This modifies the argument collection to remove the certificates that were
+ * successfully saved. Often no certificates are saved because this tries to
+ * store in the Java runtime cacerts and those are typically read-only.
+ */
+ private IStatus persistTrustedCertificatesInTrustEngine(
+ Collection<? extends Certificate> unsavedTrustedCertificates) {
+ ServiceTracker<TrustEngine, TrustEngine> trustEngineTracker = new ServiceTracker<>(EngineActivator.getContext(),
+ TrustEngine.class, null);
trustEngineTracker.open();
Object[] trustEngines = trustEngineTracker.getServices();
try {
if (trustEngines == null)
return null;
- for (Certificate trustedCertificate : trustedCertificates) {
+ for (Iterator<? extends Certificate> it = unsavedTrustedCertificates.iterator(); it.hasNext();) {
+ Certificate trustedCertificate = it.next();
for (Object engine : trustEngines) {
TrustEngine trustEngine = (TrustEngine) engine;
if (trustEngine.isReadOnly())
continue;
try {
trustEngine.addTrustAnchor(trustedCertificate, trustedCertificate.toString());
- // this should mean we added an anchor successfully; continue to next certificate
+ // this should mean we added an anchor successfully; continue to next
+ // certificate
+ it.remove();
break;
} catch (IOException e) {
- //just return an INFO so the user can proceed with the install
- return new Status(IStatus.INFO, EngineActivator.ID, Messages.CertificateChecker_KeystoreConnectionError, e);
+ // just return an INFO so the user can proceed with the install
+ return new Status(IStatus.INFO, EngineActivator.ID,
+ Messages.CertificateChecker_KeystoreConnectionError, e);
} catch (GeneralSecurityException e) {
- return new Status(IStatus.INFO, EngineActivator.ID, Messages.CertificateChecker_CertificateError, e);
+ return new Status(IStatus.INFO, EngineActivator.ID,
+ Messages.CertificateChecker_CertificateError, e);
}
}
}
@@ -224,6 +380,43 @@ public class CertificateChecker {
return Status.OK_STATUS;
}
+ public IStatus persistTrustedCertificates(Collection<? extends Certificate> trustedCertificates) {
+ if (profile != null) {
+ ProfileScope profileScope = new ProfileScope(agent.getService(IAgentLocation.class),
+ profile.getProfileId());
+ IEclipsePreferences node = profileScope.getNode(EngineActivator.ID);
+ try {
+ CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); //$NON-NLS-1$
+ CertPath certPath = certificateFactory.generateCertPath(new ArrayList<>(trustedCertificates));
+ byte[] encoded = certPath.getEncoded("PKCS7"); //$NON-NLS-1$
+ node.putByteArray(TRUSTED_CERTIFICATES_PROPERTY, encoded);
+ node.flush();
+ } catch (BackingStoreException | CertificateException ex) {
+ return new Status(IStatus.ERROR, EngineActivator.ID, ex.getMessage(), ex);
+ }
+ }
+ return Status.OK_STATUS;
+ }
+
+ public Set<? extends Certificate> getPreferenceTrustedCertificates() {
+ if (profile != null) {
+ ProfileScope profileScope = new ProfileScope(agent.getService(IAgentLocation.class),
+ profile.getProfileId());
+ IEclipsePreferences node = profileScope.getNode(EngineActivator.ID);
+ try {
+ byte[] encoded = node.getByteArray(TRUSTED_CERTIFICATES_PROPERTY, null);
+ if (encoded != null) {
+ CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); //$NON-NLS-1$
+ CertPath certPath = certificateFactory.generateCertPath(new ByteArrayInputStream(encoded), "PKCS7"); //$NON-NLS-1$
+ return new LinkedHashSet<>(certPath.getCertificates());
+ }
+ } catch (CertificateException ex) {
+ DebugHelper.debug(DEBUG_PREFIX, ex.getMessage());
+ }
+ }
+ return Set.of();
+ }
+
/**
* Return the policy on unsigned content.
*/
@@ -235,14 +428,87 @@ public class CertificateChecker {
}
- public void add(File toAdd) {
- artifacts.add(toAdd);
+ public void setProfile(IProfile profile) {
+ this.profile = profile;
+ }
+
+ public void add(Map<IArtifactDescriptor, File> toAdd) {
+ artifacts.putAll(toAdd);
+ }
+
+ public Map<PGPPublicKey, Set<Bundle>> getContributedTrustedKeys() {
+ // Build the map based on fingerprints to properly avoid duplicates as we
+ // accumulate the full set of keys.
+ Map<ByteBuffer, Set<Bundle>> keys = new LinkedHashMap<>();
+
+ // Load from the extension registry.
+ for (IConfigurationElement extension : RegistryFactory.getRegistry()
+ .getConfigurationElementsFor(EngineActivator.ID, "pgp")) { //$NON-NLS-1$
+ if ("trustedKeys".equals(extension.getName())) { //$NON-NLS-1$
+ String pathInBundle = extension.getAttribute("path"); //$NON-NLS-1$
+ if (pathInBundle != null) {
+ String name = extension.getContributor().getName();
+ Stream.of(EngineActivator.getContext().getBundles())
+ .filter(bundle -> bundle.getSymbolicName().equals(name)).findAny().ifPresent(bundle -> {
+ URL keyURL = bundle.getEntry(pathInBundle);
+ try (InputStream stream = keyURL.openStream()) {
+ PGPPublicKeyStore.readPublicKeys(stream).stream().map(keyService::addKey)
+ .forEach(key -> keys.computeIfAbsent(ByteBuffer.wrap(key.getFingerprint()),
+ k -> new LinkedHashSet<>()).add(bundle));
+ } catch (IOException e) {
+ DebugHelper.debug(DEBUG_PREFIX, e.getMessage());
+ }
+ });
+ }
+ }
+ }
+
+ Map<PGPPublicKey, Set<Bundle>> result = keys.entrySet().stream()
+ .collect(Collectors.toMap(entry -> keyService.getKey(entry.getKey().array()), Map.Entry::getValue));
+ return result;
+ }
+
+ public boolean isTrustAlways() {
+ if (profile != null) {
+ ProfileScope profileScope = new ProfileScope(agent.getService(IAgentLocation.class),
+ profile.getProfileId());
+ return profileScope.getNode(EngineActivator.ID).getBoolean(TRUST_ALWAYS_PROPERTY, false);
+ }
+ return false;
+ }
+
+ public void setTrustAlways(boolean trustAlways) {
+ if (profile != null) {
+ ProfileScope profileScope = new ProfileScope(agent.getService(IAgentLocation.class),
+ profile.getProfileId());
+ profileScope.getNode(EngineActivator.ID).putBoolean(TRUST_ALWAYS_PROPERTY, trustAlways);
+ }
}
- public void add(Object[] toAdd) {
- for (Object element : toAdd) {
- if (element instanceof File)
- add((File) element);
+ public PGPPublicKeyStore getPreferenceTrustedKeys() {
+ PGPPublicKeyStore trustStore = new PGPPublicKeyStore();
+ if (profile != null) {
+ ProfileScope profileScope = new ProfileScope(agent.getService(IAgentLocation.class),
+ profile.getProfileId());
+ PGPPublicKeyStore
+ .readPublicKeys(profileScope.getNode(EngineActivator.ID).get(TRUSTED_KEY_STORE_PROPERTY, null))
+ .stream().map(keyService::addKey).forEach(trustStore::addKey);
}
+ return trustStore;
+ }
+
+ public IStatus persistTrustedKeys(PGPPublicKeyStore trustStore) {
+ if (profile != null) {
+ ProfileScope profileScope = new ProfileScope(agent.getService(IAgentLocation.class),
+ profile.getProfileId());
+ IEclipsePreferences node = profileScope.getNode(EngineActivator.ID);
+ try {
+ node.put(TRUSTED_KEY_STORE_PROPERTY, trustStore.toArmoredString());
+ node.flush();
+ } catch (IOException | BackingStoreException ex) {
+ return new Status(IStatus.ERROR, EngineActivator.ID, ex.getMessage(), ex);
+ }
+ }
+ return Status.OK_STATUS;
}
}
diff --git a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/phases/CheckTrust.java b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/phases/CheckTrust.java
index 531f95331..5b81e7ba3 100644
--- a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/phases/CheckTrust.java
+++ b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/internal/p2/engine/phases/CheckTrust.java
@@ -7,7 +7,7 @@
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
- *
+ *
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
@@ -25,6 +25,7 @@ import org.eclipse.equinox.p2.engine.PhaseSetFactory;
import org.eclipse.equinox.p2.engine.spi.ProvisioningAction;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.metadata.ITouchpointType;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor;
/**
* An install phase that checks if the certificates used to sign the artifacts
@@ -32,7 +33,13 @@ import org.eclipse.equinox.p2.metadata.ITouchpointType;
*/
public class CheckTrust extends InstallableUnitPhase {
- public static final String PARM_ARTIFACT_FILES = "artifactFiles"; //$NON-NLS-1$
+ /**
+ * Parameter used to populate/get artifacts to check trust. The value for this
+ * property is <code>Map&lt;IArtifactDescriptor, File></code>.
+ *
+ * @see org.eclipse.equinox.internal.p2.touchpoint.eclipse.actions.CheckTrustAction
+ */
+ public static final String PARM_ARTIFACTS = "artifacts"; //$NON-NLS-1$
public CheckTrust(int weight) {
super(PhaseSetFactory.PHASE_CHECK_TRUST, weight);
@@ -46,15 +53,15 @@ public class CheckTrust extends InstallableUnitPhase {
@Override
protected IStatus completePhase(IProgressMonitor monitor, IProfile profile, Map<String, Object> parameters) {
@SuppressWarnings("unchecked")
- Collection<File> artifactRequests = (Collection<File>) parameters.get(PARM_ARTIFACT_FILES);
+ Map<IArtifactDescriptor, File> artifactRequests = (Map<IArtifactDescriptor, File>) parameters
+ .get(PARM_ARTIFACTS);
IProvisioningAgent agent = (IProvisioningAgent) parameters.get(PARM_AGENT);
// Instantiate a check trust manager
CertificateChecker certificateChecker = new CertificateChecker(agent);
- certificateChecker.add(artifactRequests.toArray());
- IStatus status = certificateChecker.start();
-
- return status;
+ certificateChecker.add(artifactRequests);
+ certificateChecker.setProfile(profile);
+ return certificateChecker.start();
}
@Override
@@ -86,7 +93,7 @@ public class CheckTrust extends InstallableUnitPhase {
@Override
protected IStatus initializePhase(IProgressMonitor monitor, IProfile profile, Map<String, Object> parameters) {
- parameters.put(PARM_ARTIFACT_FILES, new ArrayList<File>());
+ parameters.put(PARM_ARTIFACTS, new HashMap<IArtifactDescriptor, File>());
return super.initializePhase(monitor, profile, parameters);
}
diff --git a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/engine/spi/Memento.java b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/engine/spi/Memento.java
index 5b1082881..eb82f08d8 100644
--- a/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/engine/spi/Memento.java
+++ b/bundles/org.eclipse.equinox.p2.engine/src/org/eclipse/equinox/p2/engine/spi/Memento.java
@@ -51,19 +51,7 @@ public final class Memento {
}
public Enumeration<String> getKeys() {
- return new Enumeration<String>() {
- Iterator<String> keysIterator = mementoMap.keySet().iterator();
-
- @Override
- public boolean hasMoreElements() {
- return keysIterator.hasNext();
- }
-
- @Override
- public String nextElement() {
- return keysIterator.next();
- }
- };
+ return Collections.enumeration(mementoMap.keySet());
}
private static void validateValue(Object value) {
diff --git a/bundles/org.eclipse.equinox.p2.extensionlocation/.classpath b/bundles/org.eclipse.equinox.p2.extensionlocation/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.extensionlocation/.classpath
+++ b/bundles/org.eclipse.equinox.p2.extensionlocation/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.extensionlocation/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.extensionlocation/.settings/org.eclipse.jdt.core.prefs
index ffc318ade..2688c8dd5 100644
--- a/bundles/org.eclipse.equinox.p2.extensionlocation/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.extensionlocation/.settings/org.eclipse.jdt.core.prefs
@@ -17,9 +17,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -36,6 +36,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -89,6 +90,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -125,7 +127,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -139,7 +142,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -260,7 +262,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -331,7 +332,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -476,7 +476,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.extensionlocation/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.extensionlocation/META-INF/MANIFEST.MF
index 2a2096d6c..290732d27 100644
--- a/bundles/org.eclipse.equinox.p2.extensionlocation/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.extensionlocation/META-INF/MANIFEST.MF
@@ -2,14 +2,14 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.extensionlocation;singleton:=true
-Bundle-Version: 1.3.400.qualifier
+Bundle-Version: 1.4.100.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.extensionlocation.Activator
Bundle-Vendor: %providerName
Bundle-Localization: plugin
-Export-Package: org.eclipse.equinox.internal.p2.extensionlocation;x-friends:="org.eclipse.equinox.p2.reconciler.dropins,org.eclipse.equinox.p2.ui.importexport"
+Export-Package: org.eclipse.equinox.internal.p2.extensionlocation;x-friends:="org.eclipse.equinox.p2.reconciler.dropins,org.eclipse.equinox.p2.ui,org.eclipse.equinox.p2.ui.importexport"
Require-Bundle: org.eclipse.equinox.common;bundle-version="[3.5.0,4.0.0)",
org.eclipse.equinox.p2.metadata
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Import-Package: org.eclipse.equinox.internal.p2.artifact.repository.simple,
org.eclipse.equinox.internal.p2.core.helpers,
diff --git a/bundles/org.eclipse.equinox.p2.extensionlocation/pom.xml b/bundles/org.eclipse.equinox.p2.extensionlocation/pom.xml
index 1ec7264ff..2cadcc0b2 100644
--- a/bundles/org.eclipse.equinox.p2.extensionlocation/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.extensionlocation/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.extensionlocation</artifactId>
- <version>1.3.400-SNAPSHOT</version>
+ <version>1.4.100-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.garbagecollector/.classpath b/bundles/org.eclipse.equinox.p2.garbagecollector/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.garbagecollector/.classpath
+++ b/bundles/org.eclipse.equinox.p2.garbagecollector/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.garbagecollector/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.garbagecollector/.settings/org.eclipse.jdt.core.prefs
index 4e79b56c0..26df1a4b1 100644
--- a/bundles/org.eclipse.equinox.p2.garbagecollector/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.garbagecollector/.settings/org.eclipse.jdt.core.prefs
@@ -16,9 +16,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -35,6 +35,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -88,6 +89,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -124,7 +126,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -138,7 +141,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -259,7 +261,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -330,7 +331,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -475,7 +475,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.garbagecollector/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.garbagecollector/META-INF/MANIFEST.MF
index 89e6d2e65..5001cdab1 100644
--- a/bundles/org.eclipse.equinox.p2.garbagecollector/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.garbagecollector/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.garbagecollector;singleton:=true
-Bundle-Version: 1.1.400.qualifier
+Bundle-Version: 1.2.0.qualifier
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Export-Package: org.eclipse.equinox.internal.p2.garbagecollector;x-friends:="org.eclipse.equinox.p2.touchpoint.eclipse,org.eclipse.pde.core,org.eclipse.equinox.p2.ui.sdk.scheduler"
@@ -24,5 +24,5 @@ Import-Package: org.eclipse.core.runtime.preferences,
org.osgi.service.prefs;version="1.1.0"
Service-Component: OSGI-INF/garbagecollector.xml
Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Automatic-Module-Name: org.eclipse.equinox.p2.garbagecollector
diff --git a/bundles/org.eclipse.equinox.p2.garbagecollector/pom.xml b/bundles/org.eclipse.equinox.p2.garbagecollector/pom.xml
index 9f2143e6c..ee0e4278b 100644
--- a/bundles/org.eclipse.equinox.p2.garbagecollector/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.garbagecollector/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.garbagecollector</artifactId>
- <version>1.1.400-SNAPSHOT</version>
+ <version>1.2.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.installer/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.installer/META-INF/MANIFEST.MF
index e16b1b60c..63f6c3707 100644
--- a/bundles/org.eclipse.equinox.p2.installer/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.installer/META-INF/MANIFEST.MF
@@ -4,7 +4,7 @@ Bundle-SymbolicName: org.eclipse.equinox.p2.installer;singleton:=true
Bundle-Name: %pluginName
Bundle-Vendor: %providerName
Bundle-Localization: plugin
-Bundle-Version: 1.3.0.qualifier
+Bundle-Version: 1.3.300.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.installer.InstallerActivator
Bundle-ActivationPolicy: lazy
Require-Bundle: org.eclipse.osgi;bundle-version="[3.7.0,4.0.0)",
diff --git a/bundles/org.eclipse.equinox.p2.installer/installer.product b/bundles/org.eclipse.equinox.p2.installer/installer.product
index 7a6917f60..83b557986 100644
--- a/bundles/org.eclipse.equinox.p2.installer/installer.product
+++ b/bundles/org.eclipse.equinox.p2.installer/installer.product
@@ -35,10 +35,12 @@
<plugin id="org.apache.commons.codec"/>
<plugin id="org.apache.commons.httpclient"/>
<plugin id="org.apache.commons.logging"/>
+ <plugin id="org.apache.felix.scr"/>
<plugin id="org.eclipse.core.contenttype"/>
<plugin id="org.eclipse.core.expressions"/>
<plugin id="org.eclipse.core.jobs"/>
<plugin id="org.eclipse.core.net"/>
+ <plugin id="org.eclipse.core.net.linux" fragment="true"/>
<plugin id="org.eclipse.core.runtime"/>
<plugin id="org.eclipse.core.runtime.compatibility.registry" fragment="true"/>
<plugin id="org.eclipse.ecf"/>
@@ -51,11 +53,13 @@
<plugin id="org.eclipse.ecf.ssl" fragment="true"/>
<plugin id="org.eclipse.equinox.app"/>
<plugin id="org.eclipse.equinox.common"/>
- <plugin id="org.eclipse.equinox.ds"/>
+ <plugin id="org.eclipse.equinox.concurrent"/>
<plugin id="org.eclipse.equinox.frameworkadmin"/>
<plugin id="org.eclipse.equinox.frameworkadmin.equinox"/>
<plugin id="org.eclipse.equinox.launcher"/>
- <plugin id="org.eclipse.equinox.launcher.cocoa.macosx" fragment="true"/>
+ <plugin id="org.eclipse.equinox.launcher.cocoa.macosx.x86_64" fragment="true"/>
+ <plugin id="org.eclipse.equinox.launcher.cocoa.macosx.aarch64" fragment="true"/>
+ <plugin id="org.eclipse.equinox.launcher.gtk.linux.x86_64" fragment="true"/>
<plugin id="org.eclipse.equinox.p2.artifact.repository"/>
<plugin id="org.eclipse.equinox.p2.core"/>
<plugin id="org.eclipse.equinox.p2.director"/>
@@ -72,23 +76,28 @@
<plugin id="org.eclipse.equinox.preferences"/>
<plugin id="org.eclipse.equinox.registry"/>
<plugin id="org.eclipse.equinox.security"/>
+ <plugin id="org.eclipse.equinox.security.linux" fragment="true"/>
<plugin id="org.eclipse.equinox.security.macosx" fragment="true"/>
<plugin id="org.eclipse.equinox.simpleconfigurator"/>
<plugin id="org.eclipse.equinox.simpleconfigurator.manipulator"/>
<plugin id="org.eclipse.equinox.transforms.hook" fragment="true"/>
<plugin id="org.eclipse.equinox.util"/>
<plugin id="org.eclipse.osgi"/>
+ <plugin id="org.eclipse.osgi.compatibility.state" fragment="true"/>
<plugin id="org.eclipse.osgi.services"/>
+ <plugin id="org.eclipse.osgi.util"/>
<plugin id="org.eclipse.swt"/>
<plugin id="org.eclipse.swt.cocoa.macosx" fragment="true"/>
+ <plugin id="org.eclipse.swt.gtk.linux.x86_64" fragment="true"/>
<plugin id="org.sat4j.core"/>
<plugin id="org.sat4j.pb"/>
+ <plugin id="org.tukaani.xz"/>
</plugins>
<configurations>
+ <plugin id="org.apache.felix.scr" autoStart="true" startLevel="2" />
<plugin id="org.eclipse.equinox.app" autoStart="true" startLevel="4" />
<plugin id="org.eclipse.equinox.common" autoStart="true" startLevel="2" />
- <plugin id="org.eclipse.equinox.ds" autoStart="true" startLevel="2" />
<plugin id="org.eclipse.equinox.frameworkadmin.equinox" autoStart="true" startLevel="3" />
<plugin id="org.eclipse.equinox.registry" autoStart="true" startLevel="3" />
<plugin id="org.eclipse.equinox.simpleconfigurator" autoStart="true" startLevel="1" />
diff --git a/bundles/org.eclipse.equinox.p2.installer/installer.properties b/bundles/org.eclipse.equinox.p2.installer/installer.properties
index c28de9f82..ef00a4347 100644
--- a/bundles/org.eclipse.equinox.p2.installer/installer.properties
+++ b/bundles/org.eclipse.equinox.p2.installer/installer.properties
@@ -11,8 +11,8 @@
# Contributors:
# IBM Corporation - initial API and implementation
###############################################################################
-eclipse.p2.metadata=http://download.eclipse.org/eclipse/updates/3.5
-eclipse.p2.artifacts=http://download.eclipse.org/eclipse/updates/3.5
+eclipse.p2.metadata=https://download.eclipse.org/eclipse/updates/3.5
+eclipse.p2.artifacts=https://download.eclipse.org/eclipse/updates/3.5
eclipse.p2.flavor=tooling
eclipse.p2.profileName=Eclipse SDK
eclipse.p2.launcherName=eclipse
diff --git a/bundles/org.eclipse.equinox.p2.installer/pom.xml b/bundles/org.eclipse.equinox.p2.installer/pom.xml
index 0341ca0f1..27ae673d5 100644
--- a/bundles/org.eclipse.equinox.p2.installer/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.installer/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.installer</artifactId>
- <version>1.3.0-SNAPSHOT</version>
+ <version>1.3.300-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.jarprocessor/.classpath b/bundles/org.eclipse.equinox.p2.jarprocessor/.classpath
index 030607499..cc48f9f27 100644
--- a/bundles/org.eclipse.equinox.p2.jarprocessor/.classpath
+++ b/bundles/org.eclipse.equinox.p2.jarprocessor/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" output="bin_ant" path="src_ant"/>
diff --git a/bundles/org.eclipse.equinox.p2.jarprocessor/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.jarprocessor/.settings/org.eclipse.jdt.core.prefs
index 54666e7f7..e8117dca4 100644
--- a/bundles/org.eclipse.equinox.p2.jarprocessor/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.jarprocessor/.settings/org.eclipse.jdt.core.prefs
@@ -16,9 +16,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -35,6 +35,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -88,6 +89,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -125,7 +127,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -139,7 +142,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -260,7 +262,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -331,7 +332,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -476,7 +476,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.jarprocessor/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.jarprocessor/META-INF/MANIFEST.MF
index b356a0d06..283bf2bb4 100644
--- a/bundles/org.eclipse.equinox.p2.jarprocessor/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.jarprocessor/META-INF/MANIFEST.MF
@@ -4,8 +4,8 @@ Bundle-SymbolicName: org.eclipse.equinox.p2.jarprocessor;singleton:=true
Bundle-Name: %pluginName
Bundle-Vendor: %providerName
Bundle-Localization: plugin
-Bundle-Version: 1.1.700.qualifier
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-Version: 1.2.300.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Main-Class: org.eclipse.equinox.internal.p2.jarprocessor.Main
Export-Package: org.eclipse.equinox.internal.p2.jarprocessor;x-friends:="org.eclipse.equinox.p2.artifact.repository,org.eclipse.pde.build",
org.eclipse.equinox.internal.p2.jarprocessor.unsigner;x-internal:=true,
diff --git a/bundles/org.eclipse.equinox.p2.jarprocessor/forceQualifierUpdate.txt b/bundles/org.eclipse.equinox.p2.jarprocessor/forceQualifierUpdate.txt
index 7b44375cc..1519a409d 100644
--- a/bundles/org.eclipse.equinox.p2.jarprocessor/forceQualifierUpdate.txt
+++ b/bundles/org.eclipse.equinox.p2.jarprocessor/forceQualifierUpdate.txt
@@ -3,4 +3,9 @@ Bug 403352 - Update all parent versions to match our build stream
Bug 465620 - jar processor needs 'touch'
Bug 534597 - Unanticipated comparator errors in I20180511-2000
comparator errors on new infra
-Bug 566668 - Comparator errors in I20200904-0210 \ No newline at end of file
+Bug 566668 - Comparator errors in I20200904-0210
+Bug 571555 - Comparator errors in I20210226-1800
+Bug 571731 - Comparator errors in I20210305-0820
+Bug 575841 - Comparator errors in I20210906-1000
+Bug 578351 - Lambda generation order is unstable in ecj
+Bug 579126 - 4.24 I-Build: I20220307-0340 - Comparator Errors Found \ No newline at end of file
diff --git a/bundles/org.eclipse.equinox.p2.jarprocessor/pom.xml b/bundles/org.eclipse.equinox.p2.jarprocessor/pom.xml
index 314e14a27..7064c875d 100644
--- a/bundles/org.eclipse.equinox.p2.jarprocessor/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.jarprocessor/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.jarprocessor</artifactId>
- <version>1.1.700-SNAPSHOT</version>
+ <version>1.2.300-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/Main.java b/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/Main.java
index cffbf0ce5..9ce534b08 100644
--- a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/Main.java
+++ b/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/Main.java
@@ -35,6 +35,7 @@ public class Main {
System.out.println("-verbose verbose mode "); //$NON-NLS-1$
}
+ @SuppressWarnings("removal")
public static JarProcessorExecutor.Options processArguments(String[] args) {
if (args.length == 0) {
printUsage();
@@ -64,9 +65,9 @@ public class Main {
options.outputDir = args[++i];
} else if (args[i].equals("-verbose")) { //$NON-NLS-1$
options.verbose = true;
- } else if (args[i].equals("-processAll")) { //$NON-NLS-1$
+ } else if (args[i].equals("-processAll")) { //$NON-NLS-1$
options.processAll = true;
- }
+ }
}
options.input = new File(args[i]);
@@ -76,19 +77,19 @@ public class Main {
if (options.unpack) {
if (!JarProcessor.canPerformUnpack()) {
problemMessage = "The unpack200 command cannot be found."; //$NON-NLS-1$
- } else if (options.input.isFile() && !inputName.endsWith(".zip") && !inputName.endsWith(".pack.gz")) { //$NON-NLS-1$ //$NON-NLS-2$
+ } else if (options.input.isFile() && !inputName.endsWith(".zip") && !inputName.endsWith(".pack.gz")) { //$NON-NLS-1$ //$NON-NLS-2$
problemMessage = "Input file is not a pack.gz file."; //$NON-NLS-1$
- } else if (options.pack || options.repack || options.signCommand != null) {
+ } else if (options.pack || options.repack || options.signCommand != null) {
problemMessage = "Pack, repack or sign cannot be specified with unpack."; //$NON-NLS-1$
}
} else {
if (options.input.isFile() && !inputName.endsWith(".zip") && !inputName.endsWith(".jar")) { //$NON-NLS-1$ //$NON-NLS-2$
problemMessage = "Input file is not a jar file."; //$NON-NLS-1$
- } else if ((options.pack || options.repack) && !JarProcessor.canPerformPack()) {
+ } else if ((options.pack || options.repack) && !JarProcessor.canPerformPack()) {
problemMessage = "The pack200 command can not be found."; //$NON-NLS-1$
}
}
- if(problemMessage != null){
+ if (problemMessage != null) {
System.out.println(problemMessage);
System.out.println();
printUsage();
@@ -97,7 +98,7 @@ public class Main {
return options;
}
-
+
/**
* @param args
*/
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
index da41e546a..1456f7f91 100644
--- 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
@@ -17,6 +17,13 @@ import java.io.File;
import java.io.IOException;
import java.util.*;
+/**
+ * @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 <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a> for details.
+ */
+@Deprecated(forRemoval = true, since = "1.2.0")
public class PackStep extends CommandStep {
protected static String packCommand = null;
@@ -40,7 +47,7 @@ public class PackStep extends CommandStep {
if (location == null) {
continue;
}
- result = execute(new String[]{location, "-V"}); //$NON-NLS-1$
+ result = execute(new String[] { location, "-V" }); //$NON-NLS-1$
if (result == 0) {
packCommand = location;
canPack = Boolean.TRUE;
@@ -98,7 +105,7 @@ public class PackStep extends CommandStep {
}
protected boolean shouldPack(File input, List<Properties> containers, Properties inf) {
- //1: exclude by containers
+ // 1: exclude by containers
// innermost jar is first on the list, it can override outer jars
for (Properties container : containers) {
if (container.containsKey(Utils.MARK_EXCLUDE_CHILDREN_PACK)) {
@@ -111,8 +118,9 @@ public class PackStep extends CommandStep {
}
}
- //2: excluded by self
- if (inf != null && inf.containsKey(Utils.MARK_EXCLUDE_PACK) && Boolean.parseBoolean(inf.getProperty(Utils.MARK_EXCLUDE_PACK))) {
+ // 2: excluded by self
+ if (inf != null && inf.containsKey(Utils.MARK_EXCLUDE_PACK)
+ && Boolean.parseBoolean(inf.getProperty(Utils.MARK_EXCLUDE_PACK))) {
if (verbose)
System.out.println("Excluding " + input.getName() + " from " + getStepName()); //$NON-NLS-1$ //$NON-NLS-2$
return false;
@@ -121,7 +129,8 @@ public class PackStep extends CommandStep {
return true;
}
- protected String[] getCommand(File input, File outputFile, Properties inf, List<Properties> containers) throws IOException {
+ protected String[] getCommand(File input, File outputFile, Properties inf, List<Properties> containers)
+ throws IOException {
String[] cmd = null;
String arguments = getArguments(input, inf, containers);
if (arguments != null && arguments.length() > 0) {
@@ -132,32 +141,32 @@ public class PackStep extends CommandStep {
cmd[cmd.length - 2] = outputFile.getCanonicalPath();
cmd[cmd.length - 1] = input.getCanonicalPath();
} else {
- cmd = new String[] {packCommand, outputFile.getCanonicalPath(), input.getCanonicalPath()};
+ cmd = new String[] { packCommand, outputFile.getCanonicalPath(), input.getCanonicalPath() };
}
return cmd;
}
protected String getArguments(File input, Properties inf, List<Properties> containers) {
- //1: Explicitly marked in our .inf file
+ // 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
+ // 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
+ // 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
+ // 4: Set by default in outside pack.properties file
if (options.containsKey(Utils.DEFAULT_PACK_ARGS)) {
return options.getProperty(Utils.DEFAULT_PACK_ARGS);
}
@@ -175,7 +184,7 @@ public class PackStep extends CommandStep {
if (input == null || inf == null)
return false;
- //don't be verbose to check if we should mark the inf
+ // don't be verbose to check if we should mark the inf
boolean v = verbose;
verbose = false;
if (!shouldPack(input, containers, inf)) {
@@ -184,12 +193,13 @@ public class PackStep extends CommandStep {
}
verbose = v;
- //mark as conditioned if not previously marked. A signed jar is assumed to be previously conditioned.
+ // 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
+ // record arguments used
String arguments = inf.getProperty(Utils.PACK_ARGS);
if (arguments == null) {
arguments = getArguments(input, inf, containers);
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
index f9e9b6398..fe15d241b 100644
--- 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
@@ -18,9 +18,12 @@ import java.io.IOException;
import java.util.*;
/**
- * @author aniefer@ca.ibm.com
- *
+ * @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 <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a> for details.
*/
+@Deprecated(forRemoval = true, since = "1.2.0")
public class PackUnpackStep extends PackStep {
private Set<String> exclusions = null;
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
index 894bf7c00..915f5598b 100644
--- 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
@@ -18,6 +18,13 @@ import java.io.IOException;
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 <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a> 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$
private static Boolean canUnpack = null;
@@ -39,7 +46,7 @@ public class UnpackStep extends CommandStep {
if (location == null) {
continue;
}
- result = execute(new String[]{location, "-V"}); //$NON-NLS-1$
+ result = execute(new String[] { location, "-V" }); //$NON-NLS-1$
if (result == 0) {
unpackCommand = location;
canUnpack = Boolean.TRUE;
@@ -82,9 +89,10 @@ public class UnpackStep extends CommandStep {
String options = getOptions().getProperty(input.getName() + ".unpack.args"); //$NON-NLS-1$
String[] cmd = null;
if (options != null) {
- cmd = new String[] {unpackCommand, options, input.getCanonicalPath(), unpacked.getCanonicalPath()};
+ cmd = new String[] { unpackCommand, options, input.getCanonicalPath(),
+ unpacked.getCanonicalPath() };
} else {
- cmd = new String[] {unpackCommand, input.getCanonicalPath(), unpacked.getCanonicalPath()};
+ cmd = new String[] { unpackCommand, input.getCanonicalPath(), unpacked.getCanonicalPath() };
}
int result = execute(cmd, verbose);
if (result != 0 && verbose)
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 74f4f8382..d24dbc30d 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
@@ -30,51 +30,108 @@ public class Utils {
/*
* Properties found in outer pack.properties file
*/
- //comma separated list of jars to exclude from sigining
+ // 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
+ // comma separated list of jars to exlclude from packing
+ /**
+ * @noreference This field is not intended to be referenced by clients.
+ * @deprecated See <a href=
+ * "https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a>
+ * 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
+ // 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 <a href=
+ * "https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a>
+ * 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
+ // 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 <a href=
+ * "https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a>
+ * 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
+ // This jar has been conditioned with pack200
+ /**
+ * @noreference This field is not intended to be referenced by clients.
+ * @deprecated See <a href=
+ * "https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a>
+ * 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
+ // Exclude this jar from processing
public static final String MARK_EXCLUDE = "jarprocessor.exclude"; //$NON-NLS-1$
- //Exclude this jar from pack200
+ // Exclude this jar from pack200
public static final String MARK_EXCLUDE_PACK = "jarprocessor.exclude.pack"; //$NON-NLS-1$
- //Exclude this jar from signing
+ // 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
+ // 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
+ // 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
+ // 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
+ // Arguments used in pack200 for this jar
+ /**
+ * @noreference This field is not intended to be referenced by clients.
+ * @deprecated See <a href=
+ * "https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a>
+ * 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 <a href=
+ * "https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a>
+ * 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 <a href=
+ * "https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a>
+ * 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$
-
- public static final FileFilter PACK_GZ_FILTER = pathname -> pathname.isFile() && pathname.getName().endsWith(JarProcessor.PACKED_SUFFIX);
+ /**
+ * @noreference This field is not intended to be referenced by clients.
+ * @deprecated See <a href=
+ * "https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a>
+ * 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) {
@@ -86,46 +143,54 @@ public class Utils {
else if (stream instanceof JarFile)
((JarFile) stream).close();
} catch (IOException e) {
- //ignore
+ // ignore
}
}
}
/**
- * get the set of commands to try to execute pack/unpack
+ * get the set of commands to try to execute pack/unpack
+ *
* @param cmd the command, either "pack200" or "unpack200"
* @return String [] or null
+ *
+ * @noreference This method is not intended to be referenced by clients.
+ * @deprecated See <a href=
+ * "https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a>
+ * for details.
*/
+ @Deprecated(forRemoval = true, since = "1.2.0")
public static String[] getPack200Commands(String cmd) {
String[] locations = null;
String prop = System.getProperty(PACK200_PROPERTY);
String javaHome = System.getProperty("java.home"); //$NON-NLS-1$
if (null == prop) {
- locations = new String[] {javaHome + "/bin/" + cmd, cmd}; //$NON-NLS-1$
- } else switch (prop) {
+ locations = new String[] { javaHome + "/bin/" + cmd, cmd }; //$NON-NLS-1$
+ } else
+ switch (prop) {
case NONE:
return null;
case JRE:
- locations = new String[] {javaHome + "/bin/" + cmd}; //$NON-NLS-1$
+ locations = new String[] { javaHome + "/bin/" + cmd }; //$NON-NLS-1$
break;
case PATH:
- locations = new String[] {cmd};
+ locations = new String[] { cmd };
break;
default:
- locations = new String[] {prop + "/" + cmd}; //$NON-NLS-1$
+ locations = new String[] { prop + "/" + cmd }; //$NON-NLS-1$
break;
- }
+ }
return locations;
}
/**
- * Transfers all available bytes from the given input stream to the given
- * output stream. Closes both streams if close == true, regardless of failure.
- * Flushes the destination stream if close == false
+ * Transfers all available bytes from the given input stream to the given output
+ * stream. Closes both streams if close == true, regardless of failure. Flushes
+ * the destination stream if close == false
*
* @param source
* @param destination
- * @param close
+ * @param close
* @throws IOException
*/
public static void transferStreams(InputStream source, OutputStream destination, boolean close) throws IOException {
@@ -151,9 +216,9 @@ public class Utils {
/**
* Deletes all the files and directories from the given root down (inclusive).
- * Returns false if we could not delete some file or an exception occurred
- * at any point in the deletion.
- * Even if an exception occurs, a best effort is made to continue deleting.
+ * Returns false if we could not delete some file or an exception occurred at
+ * any point in the deletion. Even if an exception occurs, a best effort is made
+ * to continue deleting.
*/
public static boolean clear(java.io.File root) {
boolean result = clearChildren(root);
@@ -167,26 +232,32 @@ public class Utils {
}
/**
- * Deletes all the files and directories from the given root down, except for
- * the root itself.
- * Returns false if we could not delete some file or an exception occurred
- * at any point in the deletion.
- * Even if an exception occurs, a best effort is made to continue deleting.
+ * Deletes all the files and directories from the given root down, except for
+ * the root itself. Returns false if we could not delete some file or an
+ * exception occurred at any point in the deletion. Even if an exception occurs,
+ * a best effort is made to continue deleting.
*/
public static boolean clearChildren(java.io.File root) {
boolean result = true;
if (root.isDirectory()) {
String[] list = root.list();
- // for some unknown reason, list() can return null.
+ // for some unknown reason, list() can return null.
// Just skip the children If it does.
if (list != null)
for (String list1 : list) {
result &= clear(new java.io.File(root, list1));
- }
+ }
}
return result;
}
+ /**
+ * @noreference This method is not intended to be referenced by clients.
+ * @deprecated See <a href=
+ * "https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a>
+ * for details.
+ */
+ @Deprecated(forRemoval = true, since = "1.2.0")
public static Set<String> getPackExclusions(Properties properties) {
if (properties == null)
return Collections.emptySet();
@@ -219,13 +290,8 @@ public class Utils {
}
public static String concat(String[] array) {
- StringBuilder buffer = new StringBuilder();
- for (int i = 0; i < array.length; i++) {
- if (i > 0)
- buffer.append(' ');
- buffer.append(array[i]);
- }
- return buffer.toString();
+ String buffer = String.join(String.valueOf(' '), array);
+ return buffer;
}
public static String[] toStringArray(String input, String separator) {
@@ -239,8 +305,10 @@ public class Utils {
}
/**
- * Get the properties from the eclipse.inf file from the given jar. If the file is not a jar, null is returned.
- * If the file is a jar, but does not contain an eclipse.inf file, an empty Properties object is returned.
+ * Get the properties from the eclipse.inf file from the given jar. If the file
+ * is not a jar, null is returned. If the file is a jar, but does not contain an
+ * eclipse.inf file, an empty Properties object is returned.
+ *
* @param jarFile
* @return The eclipse.inf properties for the given jar file
*/
@@ -263,7 +331,7 @@ public class Utils {
}
return new Properties();
} catch (ZipException e) {
- //not a jar, don't bother logging this.
+ // not a jar, don't bother logging this.
return null;
} catch (IOException e) {
if (verbose) {
@@ -279,27 +347,29 @@ public class Utils {
public static boolean shouldSkipJar(File input, boolean processAll, boolean verbose) {
Properties inf = getEclipseInf(input, verbose);
if (inf == null) {
- //not a jar, could be a pack.gz
+ // not a jar, could be a pack.gz
return false;
}
String exclude = inf.getProperty(MARK_EXCLUDE);
- //was marked as exclude, we should skip
+ // was marked as exclude, we should skip
if (exclude != null && Boolean.parseBoolean(exclude))
return true;
- //process all was set, don't skip
+ // process all was set, don't skip
if (processAll)
return false;
- //otherwise, we skip if not marked marked
+ // otherwise, we skip if not marked marked
String marked = inf.getProperty(MARK_PROPERTY);
return !Boolean.parseBoolean(marked);
}
/**
- * Stores the given properties in the output stream. We store the properties
- * in sorted order so that the signing hash doesn't change if the properties didn't change.
+ * Stores the given properties in the output stream. We store the properties in
+ * sorted order so that the signing hash doesn't change if the properties didn't
+ * change.
+ *
* @param props
* @param stream
*/
diff --git a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/ZipProcessor.java b/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/ZipProcessor.java
index a055ac66e..3242b1c9a 100644
--- a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/ZipProcessor.java
+++ b/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/equinox/internal/p2/jarprocessor/ZipProcessor.java
@@ -47,10 +47,12 @@ public class ZipProcessor {
return workingDirectory;
}
+ @SuppressWarnings("removal")
private boolean repacking() {
return options.repack || (options.pack && options.signCommand != null);
}
+ @SuppressWarnings("removal")
public void processZip(File zipFile) throws ZipException, IOException {
if (options.verbose)
System.out.println("Processing " + zipFile.getPath()); //$NON-NLS-1$
@@ -74,7 +76,9 @@ public class ZipProcessor {
try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(outputFile))) {
Enumeration<? extends ZipEntry> entries = zip.entries();
if (entries.hasMoreElements()) {
- for (ZipEntry entry = entries.nextElement(); entry != null; entry = entries.hasMoreElements() ? (ZipEntry) entries.nextElement() : null) {
+ for (ZipEntry entry = entries.nextElement(); entry != null; entry = entries.hasMoreElements()
+ ? (ZipEntry) entries.nextElement()
+ : null) {
String name = entry.getName();
InputStream entryStream = zip.getInputStream(entry);
@@ -98,14 +102,15 @@ public class ZipProcessor {
boolean skip = Utils.shouldSkipJar(extractedFile, options.processAll, options.verbose);
if (skip) {
- //skipping this file
+ // skipping this file
entryStream = new FileInputStream(extractedFile);
if (options.verbose)
System.out.println(entry.getName() + " is not marked, skipping."); //$NON-NLS-1$
} else {
if (options.unpack) {
File result = processor.processJar(extractedFile);
- name = name.substring(0, name.length() - extractedFile.getName().length()) + result.getName();
+ name = name.substring(0, name.length() - extractedFile.getName().length())
+ + result.getName();
extractedFile = result;
} else {
if (repack || sign) {
@@ -122,22 +127,27 @@ public class ZipProcessor {
File modifiedFile = processor.processJar(extractedFile);
if (modifiedFile.exists()) {
try {
- String newName = name.substring(0, name.length() - extractedFile.getName().length()) + modifiedFile.getName();
+ String newName = name.substring(0,
+ name.length() - extractedFile.getName().length())
+ + modifiedFile.getName();
if (options.verbose) {
- System.out.println("Adding " + newName + " to " + outputFile.getPath()); //$NON-NLS-1$ //$NON-NLS-2$
+ System.out.println(
+ "Adding " + newName + " to " + outputFile.getPath()); //$NON-NLS-1$ //$NON-NLS-2$
System.out.println();
}
ZipEntry zipEntry = new ZipEntry(newName);
entryStream = new FileInputStream(modifiedFile);
zipOut.putNextEntry(zipEntry);
- Utils.transferStreams(entryStream, zipOut, false); //we want to keep zipOut open
+ Utils.transferStreams(entryStream, zipOut, false); // we want to keep
+ // zipOut open
entryStream.close();
Utils.clear(modifiedFile);
} catch (IOException e) {
Utils.close(entryStream);
if (options.verbose) {
e.printStackTrace();
- System.out.println("Warning: Problem reading " + modifiedFile.getPath() + "."); //$NON-NLS-1$//$NON-NLS-2$
+ System.out.println(
+ "Warning: Problem reading " + modifiedFile.getPath() + "."); //$NON-NLS-1$//$NON-NLS-2$
}
}
entryStream = null;
@@ -152,7 +162,8 @@ public class ZipProcessor {
} catch (IOException e) {
if (options.verbose) {
e.printStackTrace();
- System.out.println("Warning: Problem reading " + extractedFile.getPath() + "."); //$NON-NLS-1$//$NON-NLS-2$
+ System.out.println(
+ "Warning: Problem reading " + extractedFile.getPath() + "."); //$NON-NLS-1$//$NON-NLS-2$
}
}
}
@@ -170,7 +181,8 @@ public class ZipProcessor {
zipOut.closeEntry();
} catch (ZipException e) {
if (options.verbose) {
- System.out.println("Warning: " + name + " already exists in " + outputFile.getName() + ". Skipping."); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
+ System.out.println("Warning: " + name + " already exists in " + outputFile.getName() //$NON-NLS-1$//$NON-NLS-2$
+ + ". Skipping."); //$NON-NLS-1$
}
}
entryStream.close();
@@ -205,6 +217,7 @@ public class ZipProcessor {
return result;
}
+ @SuppressWarnings("removal")
private void initialize(ZipFile zip) {
ZipEntry entry = zip.getEntry("pack.properties"); //$NON-NLS-1$
properties = new Properties();
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 03f1c61fd..d21aea9a6 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
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2017 IBM Corporation and others.
+ * Copyright (c) 2007, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -21,11 +21,14 @@ import org.eclipse.equinox.internal.p2.jarprocessor.UnpackStep;
import org.eclipse.equinox.internal.p2.jarprocessor.Utils;
import org.eclipse.internal.provisional.equinox.p2.jarprocessor.*;
+@SuppressWarnings("removal")
public class Verifier extends JarProcessorExecutor {
private static void printUsage() {
- System.out.println("This tool verifies that unpacking a pack.gz file with the jarprocessor results in a valid jar file."); //$NON-NLS-1$
- System.out.println("Usage: java -cp jarprocessor.jar org.eclipse.update.internal.jarprocessor.verifier.Verifier -dir <workingDirectory> input [input]"); //$NON-NLS-1$
+ System.out.println(
+ "This tool verifies that unpacking a pack.gz file with the jarprocessor results in a valid jar file."); //$NON-NLS-1$
+ System.out.println(
+ "Usage: java -cp jarprocessor.jar org.eclipse.update.internal.jarprocessor.verifier.Verifier -dir <workingDirectory> 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$
@@ -44,7 +47,7 @@ public class Verifier extends JarProcessorExecutor {
if (args.length == 0) {
workingDirectory = "."; //$NON-NLS-1$
- input = new String[] {"."}; //$NON-NLS-1$
+ input = new String[] { "." }; //$NON-NLS-1$
} else {
int idx = 0;
if (args[0] == "-help") { //$NON-NLS-1$
@@ -85,8 +88,10 @@ public class Verifier extends JarProcessorExecutor {
Properties properties = new Properties();
- /* There is no need to use a full processor to do the verification unless we want to verify nested jars as well.
- * So for now, use a custom processor to just call the verify step directly.
+ /*
+ * There is no need to use a full processor to do the verification unless we
+ * want to verify nested jars as well. So for now, use a custom processor to
+ * just call the verify step directly.
*/
final VerifyStep verifyStep = new VerifyStep(properties, false);
JarProcessor verifier = new JarProcessor() {
@@ -95,7 +100,7 @@ public class Verifier extends JarProcessorExecutor {
Iterator<IProcessStep> iterator = getStepIterator();
if (iterator.hasNext() && iterator.next() instanceof VerifyStep)
return verifyStep.postProcess(inputFile, workingDirectory, null);
- //else we are unpacking, call super
+ // else we are unpacking, call super
return super.processJar(inputFile);
}
};
@@ -115,11 +120,14 @@ public class Verifier extends JarProcessorExecutor {
}
@Override
- public void addPackStep(JarProcessor processor, Properties properties, JarProcessorExecutor.Options processOptions) {
+ @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 19c0868c3..5605876ca 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
@@ -19,6 +19,11 @@ import java.util.jar.*;
import org.eclipse.equinox.internal.p2.jarprocessor.*;
public class JarProcessor {
+ /**
+ * @noreference This field is not intended to be referenced by clients.
+ * @deprecated See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a> for details.
+ */
+ @Deprecated(forRemoval = true, since = "1.2.0")
public static final String PACKED_SUFFIX = "pack.gz"; //$NON-NLS-1$
private List<IProcessStep> steps = new ArrayList<>();
@@ -28,6 +33,11 @@ public class JarProcessor {
private boolean processAll = false;
private LinkedList<Properties> containingInfs = new LinkedList<>();
+ /**
+ * @noreference This method is not intended to be referenced by clients.
+ * @deprecated See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a> for details.
+ */
+ @Deprecated(forRemoval = true, since = "1.2.0")
static public JarProcessor getUnpackProcessor(Properties properties) {
if (!canPerformUnpack())
throw new UnsupportedOperationException();
@@ -36,6 +46,11 @@ public class JarProcessor {
return processor;
}
+ /**
+ * @noreference This method is not intended to be referenced by clients.
+ * @deprecated See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a> for details.
+ */
+ @Deprecated(forRemoval = true, since = "1.2.0")
static public JarProcessor getPackProcessor(Properties properties) {
if (!canPerformPack())
throw new UnsupportedOperationException();
@@ -44,10 +59,20 @@ public class JarProcessor {
return processor;
}
+ /**
+ * @noreference This method is not intended to be referenced by clients.
+ * @deprecated See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a> for details.
+ */
+ @Deprecated(forRemoval = true, since = "1.2.0")
static public boolean canPerformPack() {
return PackStep.canPack();
}
+ /**
+ * @noreference This method is not intended to be referenced by clients.
+ * @deprecated See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a> for details.
+ */
+ @Deprecated(forRemoval = true, since = "1.2.0")
static public boolean canPerformUnpack() {
return UnpackStep.canUnpack();
}
@@ -82,21 +107,24 @@ public class JarProcessor {
}
/**
- * Recreate a jar file. The replacements map specifies entry names to be replaced, the replacements are
- * expected to be found in directory.
+ * Recreate a jar file. The replacements map specifies entry names to be
+ * replaced, the replacements are expected to be found in directory.
*
- * @param jar - The input jar
- * @param outputJar - the output
+ * @param jar - The input jar
+ * @param outputJar - the output
* @param replacements - map of entryName -> new entryName
- * @param directory - location to find file for new entryName
+ * @param directory - location to find file for new entryName
* @throws IOException
*/
- private void recreateJar(JarFile jar, JarOutputStream outputJar, Map<String, String> replacements, File directory, Properties inf) throws IOException {
+ private void recreateJar(JarFile jar, JarOutputStream outputJar, Map<String, String> replacements, File directory,
+ Properties inf) throws IOException {
InputStream in = null;
boolean marked = false;
try {
Enumeration<JarEntry> entries = jar.entries();
- for (JarEntry entry = entries.nextElement(); entry != null; entry = entries.hasMoreElements() ? (JarEntry) entries.nextElement() : null) {
+ for (JarEntry entry = entries.nextElement(); entry != null; entry = entries.hasMoreElements()
+ ? (JarEntry) entries.nextElement()
+ : null) {
File replacement = null;
JarEntry newEntry = null;
if (replacements.containsKey(entry.getName())) {
@@ -110,11 +138,13 @@ public class JarProcessor {
} catch (Exception e) {
if (verbose) {
e.printStackTrace();
- System.out.println("Warning: Problem reading " + replacement.getPath() + ", using " + jar.getName() + File.separator + entry.getName() + " instead."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ System.out.println("Warning: Problem reading " + replacement.getPath() + ", using " //$NON-NLS-1$ //$NON-NLS-2$
+ + jar.getName() + File.separator + entry.getName() + " instead."); //$NON-NLS-1$
}
}
} else if (verbose) {
- System.out.println("Warning: " + replacement.getPath() + " not found, using " + jar.getName() + File.separator + entry.getName() + " instead."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ System.out.println("Warning: " + replacement.getPath() + " not found, using " //$NON-NLS-1$ //$NON-NLS-2$
+ + jar.getName() + File.separator + entry.getName() + " instead."); //$NON-NLS-1$
}
}
}
@@ -133,7 +163,8 @@ public class JarProcessor {
newEntry.setTime(entry.getTime());
outputJar.putNextEntry(newEntry);
if (entry.getName().equals(Utils.MARK_FILE_NAME)) {
- //The eclipse.inf file was read in earlier, don't need to reread it, just write it out now
+ // The eclipse.inf file was read in earlier, don't need to reread it, just write
+ // it out now
Utils.storeProperties(inf, outputJar);
marked = true;
} else {
@@ -142,7 +173,7 @@ public class JarProcessor {
outputJar.closeEntry();
in.close();
- //delete the nested jar file
+ // delete the nested jar file
if (replacement != null) {
replacement.delete();
}
@@ -170,9 +201,10 @@ public class JarProcessor {
return result;
}
- private void extractEntries(JarFile jar, File tempDir, Map<String, String> data, Properties inf) throws IOException {
+ private void extractEntries(JarFile jar, File tempDir, Map<String, String> data, Properties inf)
+ throws IOException {
if (inf != null) {
- //skip if excluding children
+ // skip if excluding children
if (inf.containsKey(Utils.MARK_EXCLUDE_CHILDREN)) {
String excludeChildren = inf.getProperty(Utils.MARK_EXCLUDE_CHILDREN);
if (Boolean.parseBoolean(excludeChildren))
@@ -187,7 +219,9 @@ public class JarProcessor {
Enumeration<JarEntry> entries = jar.entries();
if (entries.hasMoreElements()) {
- for (JarEntry entry = entries.nextElement(); entry != null; entry = entries.hasMoreElements() ? (JarEntry) entries.nextElement() : null) {
+ for (JarEntry entry = entries.nextElement(); entry != null; entry = entries.hasMoreElements()
+ ? (JarEntry) entries.nextElement()
+ : null) {
String name = entry.getName();
String newName = recursionEffect(name);
if (newName != null) {
@@ -196,7 +230,7 @@ public class JarProcessor {
System.out.print(" "); //$NON-NLS-1$
System.out.println("Processing nested file: " + name); //$NON-NLS-1$
}
- //extract entry to temp directory
+ // extract entry to temp directory
File extracted = ZipProcessor.createSubPathFile(tempDir, name);
File parentDir = extracted.getParentFile();
if (!parentDir.exists())
@@ -207,14 +241,14 @@ public class JarProcessor {
try {
in = jar.getInputStream(entry);
out = new BufferedOutputStream(new FileOutputStream(extracted));
- Utils.transferStreams(in, out, true); //this will close both streams
+ Utils.transferStreams(in, out, true); // this will close both streams
} finally {
Utils.close(in);
Utils.close(out);
}
extracted.setLastModified(entry.getTime());
- //recurse
+ // recurse
String dir = getWorkingDirectory();
try {
containingInfs.addFirst(inf);
@@ -227,7 +261,7 @@ public class JarProcessor {
containingInfs.removeFirst();
}
- //delete the extracted item leaving the recursion result
+ // delete the extracted item leaving the recursion result
if (!name.equals(newName))
extracted.delete();
}
@@ -277,7 +311,7 @@ public class JarProcessor {
if (skip)
System.out.println("Skipping " + input.getPath()); //$NON-NLS-1$
else {
- System.out.print("Running "); //$NON-NLS-1$
+ System.out.print("Running "); //$NON-NLS-1$
for (IProcessStep step : steps) {
System.out.print(step.getStepName() + " "); //$NON-NLS-1$
}
@@ -286,14 +320,15 @@ public class JarProcessor {
}
if (skip) {
- //This jar was not marked as conditioned, and we are only processing conditioned jars, so do nothing
+ // This jar was not marked as conditioned, and we are only processing
+ // conditioned jars, so do nothing
return input;
}
- //pre
+ // pre
File workingFile = preProcess(input, workingDir);
- //Extract entries from jar and recurse on them
+ // Extract entries from jar and recurse on them
if (depth == 0) {
tempDir = new File(workingDir, "temp." + workingFile.getName()); //$NON-NLS-1$
} else {
@@ -312,8 +347,9 @@ public class JarProcessor {
if (inf != null)
infAdjusted = adjustInf(workingFile, inf);
- //Recreate the jar with replacements.
- //This is not strictly necessary if we didn't change the inf file and didn't change any content
+ // Recreate the jar with replacements.
+ // This is not strictly necessary if we didn't change the inf file and didn't
+ // change any content
if (!replacements.isEmpty() || infAdjusted) {
File tempJar = null;
tempJar = new File(tempDir, workingFile.getName());
@@ -338,10 +374,10 @@ public class JarProcessor {
Utils.close(jar);
}
- //post
+ // post
File result = postProcess(workingFile, workingDir);
- //have to normalize after the post steps
+ // have to normalize after the post steps
normalize(result, workingDir);
// If the original input is where we ended up, just return it
@@ -369,7 +405,7 @@ public class JarProcessor {
private void normalize(File input, File directory) {
if (input.getName().endsWith(JarProcessor.PACKED_SUFFIX)) {
- //not a jar
+ // not a jar
return;
}
try {
@@ -381,7 +417,9 @@ public class JarProcessor {
jar = new JarFile(input, false);
jarOut = new JarOutputStream(new BufferedOutputStream(new FileOutputStream(tempJar)));
Enumeration<JarEntry> entries = jar.entries();
- for (JarEntry entry = entries.nextElement(); entry != null; entry = entries.hasMoreElements() ? (JarEntry) entries.nextElement() : null) {
+ for (JarEntry entry = entries.nextElement(); entry != null; entry = entries.hasMoreElements()
+ ? (JarEntry) entries.nextElement()
+ : null) {
JarEntry newEntry = new JarEntry(entry.getName());
newEntry.setTime(entry.getTime());
jarIn = new BufferedInputStream(jar.getInputStream(entry));
@@ -391,7 +429,7 @@ public class JarProcessor {
jarIn.close();
}
} catch (JarException e) {
- //not a jar
+ // not a jar
return;
} finally {
Utils.close(jarOut);
diff --git a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/internal/provisional/equinox/p2/jarprocessor/JarProcessorExecutor.java b/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/internal/provisional/equinox/p2/jarprocessor/JarProcessorExecutor.java
index 499961491..d1d3f2a0e 100644
--- a/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/internal/provisional/equinox/p2/jarprocessor/JarProcessorExecutor.java
+++ b/bundles/org.eclipse.equinox.p2.jarprocessor/src/org/eclipse/internal/provisional/equinox/p2/jarprocessor/JarProcessorExecutor.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2009 IBM Corporation and others.
+ * Copyright (c) 2007, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -24,8 +24,11 @@ public class JarProcessorExecutor {
public static class Options {
public String outputDir = "."; //$NON-NLS-1$
public String signCommand = null;
+ @Deprecated(forRemoval = true, since = "1.2.0")
public boolean pack = false;
+ @Deprecated(forRemoval = true, since = "1.2.0")
public boolean repack = false;
+ @Deprecated(forRemoval = true, since = "1.2.0")
public boolean unpack = false;
public boolean verbose = false;
public boolean processAll = false;
@@ -36,6 +39,7 @@ public class JarProcessorExecutor {
private Set<String> packExclusions = null;
private Set<String> signExclusions = null;
+ @SuppressWarnings("removal")
public void runJarProcessor(Options processOptions) {
this.options = processOptions;
if (options.input.isFile() && options.input.getName().endsWith(".zip")) { //$NON-NLS-1$
@@ -59,7 +63,7 @@ public class JarProcessorExecutor {
processor.setProcessAll(options.processAll);
processor.setVerbose(options.verbose);
- //load options file
+ // load options file
Properties properties = new Properties();
if (options.input.isDirectory()) {
File packProperties = new File(options.input, "pack.properties"); //$NON-NLS-1$
@@ -90,6 +94,7 @@ public class JarProcessorExecutor {
}
}
+ @SuppressWarnings("removal")
protected FileFilter createFileFilter(Options processOptions) {
return processOptions.unpack ? Utils.PACK_GZ_FILTER : Utils.JAR_FILTER;
}
@@ -142,7 +147,8 @@ public class JarProcessorExecutor {
return packExclusions == null ? true : !packExclusions.contains(name);
}
- protected void process(File input, FileFilter filter, boolean verbose, JarProcessor processor, Properties packProperties) throws FileNotFoundException {
+ protected void process(File input, FileFilter filter, boolean verbose, JarProcessor processor,
+ Properties packProperties) throws FileNotFoundException {
if (!input.exists())
throw new FileNotFoundException();
@@ -150,7 +156,7 @@ public class JarProcessorExecutor {
if (input.isDirectory()) {
files = input.listFiles();
} else if (filter.accept(input)) {
- files = new File[] {input};
+ files = new File[] { input };
} else
return;
for (int i = 0; i < files.length; i++) {
@@ -190,7 +196,8 @@ public class JarProcessorExecutor {
}
}
- protected void processDirectory(File input, FileFilter filter, boolean verbose, JarProcessor processor, Properties packProperties) throws FileNotFoundException {
+ protected void processDirectory(File input, FileFilter filter, boolean verbose, JarProcessor processor,
+ Properties packProperties) throws FileNotFoundException {
if (!input.isDirectory())
return;
String dir = processor.getWorkingDirectory();
@@ -199,19 +206,26 @@ public class JarProcessorExecutor {
processor.setWorkingDirectory(dir);
}
- public void addPackUnpackStep(JarProcessor processor, Properties properties, JarProcessorExecutor.Options processOptions) {
+ @Deprecated(forRemoval = true, since = "1.2.0")
+ public void addPackUnpackStep(JarProcessor processor, Properties properties,
+ JarProcessorExecutor.Options processOptions) {
processor.addProcessStep(new PackUnpackStep(properties, processOptions.verbose));
}
- public void addSignStep(JarProcessor processor, Properties properties, JarProcessorExecutor.Options processOptions) {
+ public void addSignStep(JarProcessor processor, Properties properties,
+ JarProcessorExecutor.Options processOptions) {
processor.addProcessStep(new SignCommandStep(properties, processOptions.signCommand, processOptions.verbose));
}
- public void addPackStep(JarProcessor processor, Properties properties, JarProcessorExecutor.Options processOptions) {
+ @Deprecated(forRemoval = true, since = "1.2.0")
+ public void addPackStep(JarProcessor processor, Properties properties,
+ JarProcessorExecutor.Options processOptions) {
processor.addProcessStep(new PackStep(properties, processOptions.verbose));
}
- public void addUnpackStep(JarProcessor processor, Properties properties, JarProcessorExecutor.Options processOptions) {
+ @Deprecated(forRemoval = true, since = "1.2.0")
+ public void addUnpackStep(JarProcessor processor, Properties properties,
+ JarProcessorExecutor.Options processOptions) {
processor.addProcessStep(new UnpackStep(properties, processOptions.verbose));
}
}
diff --git a/bundles/org.eclipse.equinox.p2.jarprocessor/src_ant/org/eclipse/equinox/internal/p2/jarprocessor/ant/JarProcessorTask.java b/bundles/org.eclipse.equinox.p2.jarprocessor/src_ant/org/eclipse/equinox/internal/p2/jarprocessor/ant/JarProcessorTask.java
index e70ffb4fe..475b33fed 100644
--- a/bundles/org.eclipse.equinox.p2.jarprocessor/src_ant/org/eclipse/equinox/internal/p2/jarprocessor/ant/JarProcessorTask.java
+++ b/bundles/org.eclipse.equinox.p2.jarprocessor/src_ant/org/eclipse/equinox/internal/p2/jarprocessor/ant/JarProcessorTask.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2017 IBM Corporation and others.
+ * Copyright (c) 2007, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -21,9 +21,8 @@ import org.apache.tools.ant.types.FileSet;
import org.eclipse.internal.provisional.equinox.p2.jarprocessor.JarProcessorExecutor.Options;
/**
- * This task provides massaging facilities for jar files.
- * It supports: signing, unsigning, normalization, packing
- * -
+ * This task provides massaging facilities for jar files. It supports: signing,
+ * unsigning, normalization, packing -
*/
public class JarProcessorTask extends Task {
private final Options options = new Options();
@@ -66,11 +65,15 @@ public class JarProcessorTask extends Task {
signArgs.setProperty(KEYPASS, keypass);
}
+ @Deprecated(forRemoval = true, since = "1.2.0")
public void setPack(boolean pack) {
+ log("Support for pack200 is scheduled for removal after June 2023.", Project.MSG_WARN); //$NON-NLS-1$
options.pack = pack;
}
+ @Deprecated(forRemoval = true, since = "1.2.0")
public void setNormalize(boolean normalize) {
+ log("Support for pack200 is scheduled for removal after June 2023.", Project.MSG_WARN); //$NON-NLS-1$
options.repack = normalize;
}
@@ -88,12 +91,13 @@ public class JarProcessorTask extends Task {
}
}
+ @SuppressWarnings("removal")
private void adjustAndValidateConfiguration() {
- //Sign and pack implies a normalization
+ // Sign and pack implies a normalization
if (options.signCommand != null && options.pack)
options.repack = true;
- //Check that alias, and storepass are set
+ // Check that alias, and storepass are set
if (options.signCommand != null && signArgs.getProperty(UNSIGN) == null) {
if (signArgs.getProperty(ALIAS) == null)
throw new BuildException("Alias must be set"); //$NON-NLS-1$
diff --git a/bundles/org.eclipse.equinox.p2.metadata.repository/.classpath b/bundles/org.eclipse.equinox.p2.metadata.repository/.classpath
index 030607499..cc48f9f27 100644
--- a/bundles/org.eclipse.equinox.p2.metadata.repository/.classpath
+++ b/bundles/org.eclipse.equinox.p2.metadata.repository/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" output="bin_ant" path="src_ant"/>
diff --git a/bundles/org.eclipse.equinox.p2.metadata.repository/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.metadata.repository/.settings/org.eclipse.jdt.core.prefs
index f7e77d791..c9e5b47b7 100644
--- a/bundles/org.eclipse.equinox.p2.metadata.repository/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.metadata.repository/.settings/org.eclipse.jdt.core.prefs
@@ -16,9 +16,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -34,6 +34,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -87,6 +88,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -122,7 +124,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -136,7 +139,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -257,7 +259,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -328,7 +329,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -473,7 +473,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.metadata.repository/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.metadata.repository/META-INF/MANIFEST.MF
index 1fc6599e3..a1e7379eb 100644
--- a/bundles/org.eclipse.equinox.p2.metadata.repository/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.metadata.repository/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.metadata.repository;singleton:=true
-Bundle-Version: 1.3.400.qualifier
+Bundle-Version: 1.4.0.qualifier
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Export-Package: org.eclipse.equinox.internal.p2.metadata.repository;
@@ -44,5 +44,5 @@ Import-Package: javax.xml.parsers,
org.xml.sax
Service-Component: OSGI-INF/repositoryManager.xml
Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Automatic-Module-Name: org.eclipse.equinox.p2.metadata.repository
diff --git a/bundles/org.eclipse.equinox.p2.metadata.repository/pom.xml b/bundles/org.eclipse.equinox.p2.metadata.repository/pom.xml
index 4b129a182..4058eb8f1 100644
--- a/bundles/org.eclipse.equinox.p2.metadata.repository/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.metadata.repository/pom.xml
@@ -14,11 +14,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.metadata.repository</artifactId>
- <version>1.3.400-SNAPSHOT</version>
+ <version>1.4.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/LocalMetadataRepository.java b/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/LocalMetadataRepository.java
index 06707e85a..e679ea682 100644
--- a/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/LocalMetadataRepository.java
+++ b/bundles/org.eclipse.equinox.p2.metadata.repository/src/org/eclipse/equinox/internal/p2/metadata/repository/LocalMetadataRepository.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2018 IBM Corporation and others.
+ * Copyright (c) 2007, 2020 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -11,6 +11,7 @@
* Contributors:
* IBM Corporation - initial API and implementation
* Prashant Deva - Bug 194674 [prov] Provide write access to metadata repository
+ * Christoph Läubrich - Bug 481443 - CLassCastException While Downloading Repository that loads fine in RCP target
*******************************************************************************/
package org.eclipse.equinox.internal.p2.metadata.repository;
@@ -296,11 +297,14 @@ public class LocalMetadataRepository extends AbstractMetadataRepository implemen
return oldValue;
save();
}
- //force repository manager to reload this repository because it caches properties
- MetadataRepositoryManager manager = (MetadataRepositoryManager) getProvisioningAgent()
+ IMetadataRepositoryManager manager = getProvisioningAgent()
.getService(IMetadataRepositoryManager.class);
- if (manager.removeRepository(getLocation()))
- manager.addRepository(this);
+ if (manager instanceof MetadataRepositoryManager) {
+ // force repository manager to reload this repository because it caches
+ // properties
+ if (manager.removeRepository(getLocation()))
+ ((MetadataRepositoryManager) manager).addRepository(this);
+ }
return oldValue;
} finally {
if (monitor != null)
diff --git a/bundles/org.eclipse.equinox.p2.metadata/.classpath b/bundles/org.eclipse.equinox.p2.metadata/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.metadata/.classpath
+++ b/bundles/org.eclipse.equinox.p2.metadata/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.metadata/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.metadata/.settings/org.eclipse.jdt.core.prefs
index 90e10df7d..b9b3eb020 100644
--- a/bundles/org.eclipse.equinox.p2.metadata/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.metadata/.settings/org.eclipse.jdt.core.prefs
@@ -18,9 +18,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -37,6 +37,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -94,6 +95,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -130,7 +132,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -144,7 +147,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -265,7 +267,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -336,7 +337,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -481,7 +481,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.metadata/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.metadata/META-INF/MANIFEST.MF
index 86573a6fe..115163dbf 100644
--- a/bundles/org.eclipse.equinox.p2.metadata/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.metadata/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.metadata;singleton:=true
-Bundle-Version: 2.5.100.qualifier
+Bundle-Version: 2.6.100.qualifier
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Export-Package: org.eclipse.equinox.internal.p2.metadata;
@@ -85,5 +85,5 @@ Import-Package: org.eclipse.osgi.service.localization;version="1.0.0",
org.eclipse.osgi.util,
org.osgi.framework;version="1.6.0"
Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Automatic-Module-Name: org.eclipse.equinox.p2.metadata
diff --git a/bundles/org.eclipse.equinox.p2.metadata/pom.xml b/bundles/org.eclipse.equinox.p2.metadata/pom.xml
index 22a62ed32..bf0807827 100644
--- a/bundles/org.eclipse.equinox.p2.metadata/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.metadata/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.metadata</artifactId>
- <version>2.5.100-SNAPSHOT</version>
+ <version>2.6.100-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/InstallableUnit.java b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/InstallableUnit.java
index e1fdaa4b3..7d49b306d 100644
--- a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/InstallableUnit.java
+++ b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/InstallableUnit.java
@@ -41,7 +41,7 @@ import org.eclipse.equinox.p2.metadata.expression.IMemberProvider;
public class InstallableUnit implements IInstallableUnit, IMemberProvider {
@SuppressWarnings("serial")
- private static final Map<IFilterExpression, IMatchExpression<IInstallableUnit>> filterCache = new LinkedHashMap<IFilterExpression, IMatchExpression<IInstallableUnit>>() {
+ private static final Map<IFilterExpression, IMatchExpression<IInstallableUnit>> filterCache = new LinkedHashMap<>() {
@Override
public boolean removeEldestEntry(Map.Entry<IFilterExpression, IMatchExpression<IInstallableUnit>> expr) {
return size() > 64;
@@ -73,7 +73,8 @@ public class InstallableUnit implements IInstallableUnit, IMemberProvider {
static {
IExpressionFactory factory = ExpressionUtil.getFactory();
- filterWrap = factory.matches(factory.member(factory.thisVariable(), MEMBER_PROPERTIES), factory.indexedParameter(0));
+ filterWrap = factory.matches(factory.member(factory.thisVariable(), MEMBER_PROPERTIES),
+ factory.indexedParameter(0));
}
private IArtifactKey[] artifacts = NO_ARTIFACTS;
@@ -108,7 +109,7 @@ public class InstallableUnit implements IInstallableUnit, IMemberProvider {
public void addTouchpointData(ITouchpointData newData) {
int tl = touchpointData.length;
if (tl == 0)
- touchpointData = new ITouchpointData[] {newData};
+ touchpointData = new ITouchpointData[] { newData };
else {
ITouchpointData[] newDatas = new ITouchpointData[tl + 1];
System.arraycopy(touchpointData, 0, newDatas, 0, tl);
@@ -168,8 +169,8 @@ public class InstallableUnit implements IInstallableUnit, IMemberProvider {
}
/**
- * Get an <i>unmodifiable copy</i> of the properties
- * associated with the installable unit.
+ * Get an <i>unmodifiable copy</i> of the properties associated with the
+ * installable unit.
*
* @return an <i>unmodifiable copy</i> of the IU properties.
*/
@@ -310,7 +311,7 @@ public class InstallableUnit implements IInstallableUnit, IMemberProvider {
if (capabilities.length == 0) {
this.requires = NO_REQUIRES;
} else {
- //copy array for safety
+ // copy array for safety
this.requires = capabilities.clone();
}
}
@@ -388,7 +389,7 @@ public class InstallableUnit implements IInstallableUnit, IMemberProvider {
if (metaReqs.length == 0) {
this.metaRequires = NO_REQUIRES;
} else {
- //copy array for safety
+ // copy array for safety
this.metaRequires = metaReqs.clone();
}
}
diff --git a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/Member.java b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/Member.java
index 16079f8ea..36d09904c 100644
--- a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/Member.java
+++ b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/Member.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2017 Cloudsmith Inc. and others.
+ * Copyright (c) 2009, 2021 Cloudsmith Inc. and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -13,29 +13,36 @@
*******************************************************************************/
package org.eclipse.equinox.internal.p2.metadata.expression;
-import java.lang.reflect.*;
-import java.util.*;
-import org.eclipse.equinox.p2.metadata.expression.*;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Queue;
+import org.eclipse.equinox.p2.metadata.expression.IEvaluationContext;
+import org.eclipse.equinox.p2.metadata.expression.IExpressionVisitor;
+import org.eclipse.equinox.p2.metadata.expression.IMemberProvider;
/**
- * <p>An expression that performs member calls to obtain some value
- * from some object instance. It uses standard bean semantics so
- * that an attempt to obtain &quot;value&quot; will cause an
- * attempt to call <code>getValue()</code> and if no such method
- * exists, <code>isValue()</code> and if that doesn't work either,
- * <code>value()</code>.</p>
+ * <p>
+ * An expression that performs member calls to obtain some value from some
+ * object instance. It uses standard bean semantics so that an attempt to obtain
+ * &quot;value&quot; will cause an attempt to call <code>getValue()</code> and
+ * if no such method exists, <code>isValue()</code> and if that doesn't work
+ * either, <code>value()</code>.
+ * </p>
*/
public abstract class Member extends Unary {
public static final class DynamicMember extends Member {
private static final String GET_PREFIX = "get"; //$NON-NLS-1$
private static final String IS_PREFIX = "is"; //$NON-NLS-1$
- private static final Class<?>[] NO_ARG_TYPES = new Class[0];
- private Class<?> lastClass;
-
- private transient Method method;
- private transient String methodName;
+ private transient Method lastMethod;
DynamicMember(Expression operand, String name) {
super(operand, name, Expression.emptyArray);
@@ -53,44 +60,14 @@ public abstract class Member extends Unary {
if (self == null)
throw new IllegalArgumentException("Cannot access member \'" + name + "\' in null"); //$NON-NLS-1$//$NON-NLS-2$
- Class<?> c = self.getClass();
synchronized (this) {
- if (methodName == null) {
- String n = name;
- if (!(n.startsWith(GET_PREFIX) || n.startsWith(IS_PREFIX)))
- n = GET_PREFIX + Character.toUpperCase(n.charAt(0)) + n.substring(1);
- methodName = n;
- }
- if (lastClass == null || !lastClass.isAssignableFrom(c)) {
- Method m;
- for (;;) {
- try {
- m = c.getMethod(methodName, NO_ARG_TYPES);
- if (!Modifier.isPublic(m.getModifiers()))
- throw new NoSuchMethodException();
- break;
- } catch (NoSuchMethodException e) {
- if (methodName.startsWith(GET_PREFIX))
- // Switch from using getXxx() to isXxx()
- methodName = IS_PREFIX + Character.toUpperCase(name.charAt(0)) + name.substring(1);
- else if (methodName.startsWith(IS_PREFIX))
- // Switch from using isXxx() to xxx()
- methodName = name;
- else
- throw new IllegalArgumentException("Cannot find a public member \'" + name + "\' in a " + self.getClass().getName()); //$NON-NLS-1$//$NON-NLS-2$
- }
- }
-
- // Since we already checked that it's public. This will speed
- // up the calls a bit.
- m.setAccessible(true);
- lastClass = c;
- method = m;
- }
-
+ final Method method = (lastMethod != null && lastMethod.getDeclaringClass().isInstance(self))
+ ? lastMethod
+ : findAccessibleMethod(self, name);
+ this.lastMethod = method;
Exception checked;
try {
- return method.invoke(self, NO_ARGS);
+ return method.invoke(self);
} catch (IllegalArgumentException e) {
throw e;
} catch (IllegalAccessException e) {
@@ -103,8 +80,54 @@ public abstract class Member extends Unary {
throw (Error) cause;
checked = (Exception) cause;
}
- throw new RuntimeException("Problem invoking " + methodName + " on a " + self.getClass().getName(), checked); //$NON-NLS-1$ //$NON-NLS-2$
+ throw new RuntimeException(
+ "Problem invoking " + method.getName() + " on a " + self.getClass().getName(), //$NON-NLS-1$ //$NON-NLS-2$
+ checked);
+ }
+ }
+
+ private Collection<String> getMethodNames(String propertyName) {
+ Collection<String> res = new ArrayList<>(3);
+ String n = propertyName;
+ res.add(propertyName); // obj.value()
+ if (!(n.startsWith(GET_PREFIX) || n.startsWith(IS_PREFIX))) {
+ res.add(GET_PREFIX + Character.toUpperCase(n.charAt(0)) + n.substring(1)); // obj.getValue()
+ res.add(IS_PREFIX + Character.toUpperCase(n.charAt(0)) + n.substring(1)); // obj.isValue()
+ }
+ return res;
+ }
+
+ private Method findAccessibleMethod(Object self, String propertyName) {
+ Collection<String> methodNamesToTry = getMethodNames(propertyName);
+ Queue<Class<?>> typesToTry = new LinkedList<>();
+ typesToTry.add(self.getClass());
+ while (!typesToTry.isEmpty()) {
+ Class<?> currentClass = typesToTry.poll();
+ for (String methodName : methodNamesToTry) {
+ try {
+ Method m = currentClass.getMethod(methodName);
+ if (!m.canAccess(self)) {
+ try {
+ // force accessible if possible.
+ // this seems necessary when invoking objects from
+ // nested class and "downstream" bundles
+ m.setAccessible(true);
+ } catch (Exception e) {
+ // ignore possible non-blocking case
+ }
+ }
+ if (m.canAccess(self)) {
+ return m;
+ }
+ } catch (NoSuchMethodException e) {
+ // ignore not found method
+ }
+ }
+ Optional.ofNullable(currentClass.getSuperclass()).ifPresent(typesToTry::add);
+ typesToTry.addAll(Arrays.asList(currentClass.getInterfaces()));
}
+ throw new IllegalArgumentException("Cannot find accessor method for property \'" + name + "\' in a " //$NON-NLS-1$//$NON-NLS-2$
+ + self.getClass().getName());
}
}
@@ -153,8 +176,6 @@ public abstract class Member extends Unary {
}
}
- static final Object[] NO_ARGS = new Object[0];
-
static Member createDynamicMember(Expression operand, String name) {
return new DynamicMember(operand, name);
}
diff --git a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/expression/SimplePattern.java b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/expression/SimplePattern.java
index 2b088c077..b844ee817 100644
--- a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/expression/SimplePattern.java
+++ b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/metadata/expression/SimplePattern.java
@@ -182,7 +182,7 @@ public class SimplePattern implements Serializable, Comparable<SimplePattern> {
private static Node parse(String pattern, int pos) {
int top = pattern.length();
- StringBuffer bld = null;
+ StringBuilder bld = null;
Node parsedNode = null;
while (pos < top) {
char c = pattern.charAt(pos);
@@ -201,7 +201,7 @@ public class SimplePattern implements Serializable, Comparable<SimplePattern> {
// fall through
default :
if (bld == null)
- bld = new StringBuffer();
+ bld = new StringBuilder();
bld.append(c);
++pos;
continue;
diff --git a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/query/Collector.java b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/query/Collector.java
index 5be87df5b..ffa0d6f47 100644
--- a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/query/Collector.java
+++ b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/p2/query/Collector.java
@@ -25,20 +25,21 @@ import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.equinox.internal.p2.metadata.Messages;
/**
- * A collector is a generic visitor that collects objects passed to it,
- * and can then express the result of the visit in various forms. The collector
- * can also short-circuit a traversal by returning <code>false</code> from
- * its {@link #accept(Object)} method.
+ * A collector is a generic visitor that collects objects passed to it, and can
+ * then express the result of the visit in various forms. The collector can also
+ * short-circuit a traversal by returning <code>false</code> from its
+ * {@link #accept(Object)} method.
* <p>
- * This default collector just accepts all objects passed to it. Clients may subclass
- * to perform different processing on the objects passed to it.
+ * This default collector just accepts all objects passed to it. Clients may
+ * subclass to perform different processing on the objects passed to it.
+ *
* @param <T> The type of object accepted by this collector
* @since 2.0
*/
public class Collector<T> implements IQueryResult<T> {
private Set<T> collected = null;
- public static final Collector<?> EMPTY_COLLECTOR = new Collector<Object>() {
+ public static final Collector<?> EMPTY_COLLECTOR = new Collector<>() {
@Override
public boolean accept(Object val) {
return false;
@@ -60,14 +61,14 @@ public class Collector<T> implements IQueryResult<T> {
/**
* Accepts an object.
* <p>
- * This default implementation adds the objects to a list. Clients may
- * override this method to perform additional filtering, add different objects
- * to the list, short-circuit the traversal, or process the objects directly without
+ * This default implementation adds the objects to a list. Clients may override
+ * this method to perform additional filtering, add different objects to the
+ * list, short-circuit the traversal, or process the objects directly without
* collecting them.
*
* @param object the object to collect or visit
- * @return <code>true</code> if the traversal should continue,
- * or <code>false</code> to indicate the traversal should stop.
+ * @return <code>true</code> if the traversal should continue, or
+ * <code>false</code> to indicate the traversal should stop.
*/
public boolean accept(T object) {
getCollection().add(object);
@@ -76,6 +77,7 @@ public class Collector<T> implements IQueryResult<T> {
/**
* Adds the elements from one collector to this collector
+ *
* @param queryResult The collector from which the elements should be retrieved
*/
public void addAll(IQueryResult<T> queryResult) {
@@ -86,10 +88,10 @@ public class Collector<T> implements IQueryResult<T> {
}
/**
- * Returns the collection that is being used to collect results. Unlike {@linkplain #toSet()},
- * this returns the actual modifiable collection that is being used to store results. The
- * return value is only intended to be used within subclasses and should not be exposed
- * outside of a collection class.
+ * Returns the collection that is being used to collect results. Unlike
+ * {@linkplain #toSet()}, this returns the actual modifiable collection that is
+ * being used to store results. The return value is only intended to be used
+ * within subclasses and should not be exposed outside of a collection class.
*
* @return the collection being used to collect results.
*/
@@ -101,8 +103,9 @@ public class Collector<T> implements IQueryResult<T> {
/**
* Returns whether this collector is empty.
- * @return <code>true</code> if this collector has accepted any results,
- * and <code>false</code> otherwise.
+ *
+ * @return <code>true</code> if this collector has accepted any results, and
+ * <code>false</code> otherwise.
*/
@Override
public boolean isEmpty() {
@@ -116,7 +119,7 @@ public class Collector<T> implements IQueryResult<T> {
*/
@Override
public Iterator<T> iterator() {
- return collected == null ? Collections.<T> emptyList().iterator() : collected.iterator();
+ return collected == null ? Collections.<T>emptyList().iterator() : collected.iterator();
}
/**
@@ -131,8 +134,9 @@ public class Collector<T> implements IQueryResult<T> {
*
* @param clazz The type of array to return
* @return The array of results
- * @throws ArrayStoreException the runtime type of the specified array is
- * not a super-type of the runtime type of every collected object
+ * @throws ArrayStoreException the runtime type of the specified array is not a
+ * super-type of the runtime type of every collected
+ * object
*/
@Override
public T[] toArray(Class<T> clazz) {
@@ -155,7 +159,7 @@ public class Collector<T> implements IQueryResult<T> {
}
/**
- * Performs a query on this results of this collector.
+ * Performs a query on this results of this collector.
*/
@Override
public IQueryResult<T> query(IQuery<T> query, IProgressMonitor monitor) {
diff --git a/bundles/org.eclipse.equinox.p2.operations/.classpath b/bundles/org.eclipse.equinox.p2.operations/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.operations/.classpath
+++ b/bundles/org.eclipse.equinox.p2.operations/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.operations/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.operations/.settings/org.eclipse.jdt.core.prefs
index b6ee06ea1..3c15076cc 100644
--- a/bundles/org.eclipse.equinox.p2.operations/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.operations/.settings/org.eclipse.jdt.core.prefs
@@ -17,9 +17,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -36,6 +36,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -89,6 +90,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -125,7 +127,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -139,7 +142,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -260,7 +262,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -331,7 +332,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -476,7 +476,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.operations/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.operations/META-INF/MANIFEST.MF
index 8c7f57e68..acddebfb1 100644
--- a/bundles/org.eclipse.equinox.p2.operations/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.operations/META-INF/MANIFEST.MF
@@ -2,14 +2,14 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.operations;singleton:=true
-Bundle-Version: 2.5.1000.qualifier
+Bundle-Version: 2.6.0.qualifier
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Export-Package: org.eclipse.equinox.internal.p2.operations;x-friends:="org.eclipse.pde.ui,org.eclipse.equinox.p2.ui",
org.eclipse.equinox.p2.operations;version="2.0.0"
Require-Bundle: org.eclipse.equinox.common;bundle-version="3.6.0",
org.eclipse.core.jobs;bundle-version="3.5.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Import-Package: org.eclipse.equinox.internal.p2.core.helpers,
org.eclipse.equinox.internal.p2.director,
diff --git a/bundles/org.eclipse.equinox.p2.operations/pom.xml b/bundles/org.eclipse.equinox.p2.operations/pom.xml
index eed0c146a..ed63d9000 100644
--- a/bundles/org.eclipse.equinox.p2.operations/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.operations/pom.xml
@@ -14,11 +14,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.operations</artifactId>
- <version>2.5.1000-SNAPSHOT</version>
+ <version>2.6.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.publisher.eclipse/.classpath b/bundles/org.eclipse.equinox.p2.publisher.eclipse/.classpath
index 030607499..cc48f9f27 100644
--- a/bundles/org.eclipse.equinox.p2.publisher.eclipse/.classpath
+++ b/bundles/org.eclipse.equinox.p2.publisher.eclipse/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" output="bin_ant" path="src_ant"/>
diff --git a/bundles/org.eclipse.equinox.p2.publisher.eclipse/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.publisher.eclipse/.settings/org.eclipse.jdt.core.prefs
index aac18542e..3fefd7217 100644
--- a/bundles/org.eclipse.equinox.p2.publisher.eclipse/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.publisher.eclipse/.settings/org.eclipse.jdt.core.prefs
@@ -17,9 +17,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -35,6 +35,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -92,6 +93,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -127,7 +129,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -141,7 +144,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -262,7 +264,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -333,7 +334,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -478,7 +478,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.publisher.eclipse/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.equinox.p2.publisher.eclipse/.settings/org.eclipse.jdt.ui.prefs
index 708515333..d3d075e63 100644
--- a/bundles/org.eclipse.equinox.p2.publisher.eclipse/.settings/org.eclipse.jdt.ui.prefs
+++ b/bundles/org.eclipse.equinox.p2.publisher.eclipse/.settings/org.eclipse.jdt.ui.prefs
@@ -23,7 +23,7 @@ sp_cleanup.always_use_this_for_non_static_method_access=false
sp_cleanup.convert_to_enhanced_for_loop=false
sp_cleanup.correct_indentation=false
sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.format_source_code_changes_only=true
sp_cleanup.make_local_variable_final=false
sp_cleanup.make_parameters_final=false
sp_cleanup.make_private_fields_final=true
diff --git a/bundles/org.eclipse.equinox.p2.publisher.eclipse/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.publisher.eclipse/META-INF/MANIFEST.MF
index 41619bd23..0a8d62359 100644
--- a/bundles/org.eclipse.equinox.p2.publisher.eclipse/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.publisher.eclipse/META-INF/MANIFEST.MF
@@ -2,12 +2,12 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %bundleName
Bundle-SymbolicName: org.eclipse.equinox.p2.publisher.eclipse;singleton:=true
-Bundle-Version: 1.3.700.qualifier
+Bundle-Version: 1.4.2.qualifier
Bundle-Activator: org.eclipse.pde.internal.publishing.Activator
Bundle-ActivationPolicy: lazy
Bundle-Vendor: %providerName
Bundle-Localization: plugin
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Import-Package: org.eclipse.equinox.app;version="[1.0.0,2.0.0)",
org.eclipse.equinox.frameworkadmin;version="[2.0.0,3.0.0)",
org.eclipse.equinox.internal.frameworkadmin.equinox,
diff --git a/bundles/org.eclipse.equinox.p2.publisher.eclipse/pom.xml b/bundles/org.eclipse.equinox.p2.publisher.eclipse/pom.xml
index 76cab8c0e..cf46b80e9 100644
--- a/bundles/org.eclipse.equinox.p2.publisher.eclipse/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.publisher.eclipse/pom.xml
@@ -4,12 +4,12 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.publisher.eclipse</artifactId>
- <version>1.3.700-SNAPSHOT</version>
+ <version>1.4.2-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/internal/p2/publisher/compatibility/IGeneratorConstants.java b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/internal/p2/publisher/compatibility/IGeneratorConstants.java
index b2c980f8d..b81373dc0 100644
--- a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/internal/p2/publisher/compatibility/IGeneratorConstants.java
+++ b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/internal/p2/publisher/compatibility/IGeneratorConstants.java
@@ -21,7 +21,7 @@ package org.eclipse.equinox.internal.p2.publisher.compatibility;
public interface IGeneratorConstants {
public static final String DASH = "-"; //$NON-NLS-1$
- //arguments understood by the old metadata generator application
+ // arguments understood by the old metadata generator application
public static final String PUBLISH_ARTIFACTS = "-publishArtifacts"; //$NON-NLS-1$
public static final String PA = "-pa"; //$NON-NLS-1$
public static final String PUBLISH_ATIFACT_REPOSITORY = "-publishArtifactRepository"; //$NON-NLS-1$
@@ -29,6 +29,11 @@ public interface IGeneratorConstants {
public static final String APPEND = "-append"; //$NON-NLS-1$
public static final String NO_DEFAULT_IUS = "-noDefaultIUs"; //$NON-NLS-1$
public static final String COMPRESS = "-compress"; //$NON-NLS-1$
+ /**
+ * @noreference This field is not intended to be referenced by clients.
+ * @deprecated See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a> 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$
diff --git a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/internal/p2/publisher/eclipse/BrandingIron.java b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/internal/p2/publisher/eclipse/BrandingIron.java
index b1114b4c7..a6c14f134 100644
--- a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/internal/p2/publisher/eclipse/BrandingIron.java
+++ b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/internal/p2/publisher/eclipse/BrandingIron.java
@@ -315,9 +315,11 @@ public class BrandingIron {
descriptor.addFile(targetLauncher);
}
- private File findLauncher(File root) {
- for (String launcherName : new String[] { "launcher", "eclipse" }) { //$NON-NLS-1$ //$NON-NLS-2$
- File launcher = new File(root, launcherName);
+ private File findLauncher(File root, String... candidates) {
+ if (candidates.length == 0)
+ candidates = new String[] { "launcher", "eclipse" }; //$NON-NLS-1$ //$NON-NLS-2$
+ for (String candidate : candidates) {
+ File launcher = new File(root, candidate);
if (launcher.exists())
return launcher;
}
@@ -359,26 +361,38 @@ public class BrandingIron {
private void brandWindows(ExecutablesDescriptor descriptor) throws Exception {
File root = descriptor.getLocation();
- File templateLauncher = new File(root, name + ".exe"); //$NON-NLS-1$
- if (!templateLauncher.exists())
- templateLauncher = new File(root, "launcher.exe"); //$NON-NLS-1$
- if (!templateLauncher.exists())
- templateLauncher = new File(root, "eclipse.exe"); //$NON-NLS-1$
- if (brandIcons) {
- if (templateLauncher.exists()) {
+ String binary = name + ".exe"; //$NON-NLS-1$
+ File templateLauncher = findLauncher(root, binary, "launcher.exe", "eclipse.exe"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (templateLauncher != null) {
+ if (brandIcons) {
String[] args = new String[icons.length + 1];
args[0] = templateLauncher.getAbsolutePath();
System.arraycopy(icons, 0, args, 1, icons.length);
IconExe.main(args);
- } else {
- LogHelper.log(new Status(IStatus.ERROR, Activator.ID, "Could not find executable to brand", null)); //$NON-NLS-1$
}
+
+ if (!templateLauncher.getName().equals(binary)) {
+ File targetLauncher = new File(root, binary);
+ templateLauncher.renameTo(targetLauncher);
+ descriptor.replace(templateLauncher, targetLauncher);
+ }
+ } else {
+ LogHelper.log(new Status(IStatus.ERROR, Activator.ID, "Could not find executable to brand", null)); //$NON-NLS-1$
}
- File targetLauncher = new File(root, name + ".exe"); //$NON-NLS-1$
- if (templateLauncher.exists() && !templateLauncher.getName().equals(name + ".exe")) { //$NON-NLS-1$
- templateLauncher.renameTo(targetLauncher);
- descriptor.replace(templateLauncher, targetLauncher);
+
+ // Handle console application
+ binary = name + "c.exe"; //$NON-NLS-1$
+ templateLauncher = findLauncher(root, binary, "launcherc.exe", "eclipsec.exe"); //$NON-NLS-1$ //$NON-NLS-2$
+ if (templateLauncher != null) {
+ if (!templateLauncher.getName().equals(binary)) {
+ File targetLauncher = new File(root, binary);
+ templateLauncher.renameTo(targetLauncher);
+ descriptor.replace(templateLauncher, targetLauncher);
+ }
+ } else {
+ LogHelper.log(new Status(IStatus.ERROR, Activator.ID, "Could not find console executable to brand", null)); //$NON-NLS-1$
}
+
descriptor.setExecutableName(name, true);
}
diff --git a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/internal/p2/publisher/eclipse/ExecutablesDescriptor.java b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/internal/p2/publisher/eclipse/ExecutablesDescriptor.java
index 353aab166..5b1c6f82e 100644
--- a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/internal/p2/publisher/eclipse/ExecutablesDescriptor.java
+++ b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/internal/p2/publisher/eclipse/ExecutablesDescriptor.java
@@ -245,10 +245,6 @@ public class ExecutablesDescriptor {
private void updateExecutableName(String newName) {
if (newName.equalsIgnoreCase(executableName))
return;
- String targetIni = executableName + ".ini"; //$NON-NLS-1$
- String targetExecutable = executableName;
- String executableExtension = Constants.OS_WIN32.equals(os) ? ".exe" : ""; //$NON-NLS-1$ //$NON-NLS-2$
- targetExecutable = executableName + executableExtension;
Set<File> filesCopy = new HashSet<>(files);
for (File file : filesCopy) {
String base = file.getParent();
@@ -257,9 +253,13 @@ public class ExecutablesDescriptor {
base = base == null ? "" : base + "/"; //$NON-NLS-1$ //$NON-NLS-2$
if (Constants.OS_MACOSX.equals(os) && base.startsWith(executableName + ".app")) //$NON-NLS-1$
base = newName + ".app" + base.substring(executableName.length() + 4); //$NON-NLS-1$
- if (file.getName().equalsIgnoreCase(targetExecutable))
- replace(file, new File(base + newName + executableExtension));
- else if (file.getName().equalsIgnoreCase(targetIni))
+ if (file.getName().equalsIgnoreCase(executableName))
+ replace(file, new File(base + newName));
+ else if (file.getName().equalsIgnoreCase(executableName + ".exe")) //$NON-NLS-1$
+ replace(file, new File(base + newName + ".exe")); //$NON-NLS-1$
+ else if (file.getName().equalsIgnoreCase(executableName + "c.exe")) //$NON-NLS-1$
+ replace(file, new File(base + newName + "c.exe")); //$NON-NLS-1$
+ else if (file.getName().equalsIgnoreCase(executableName + ".ini")) //$NON-NLS-1$
replace(file, new File(base + newName + ".ini")); //$NON-NLS-1$
else if (Constants.OS_MACOSX.equals(os))
replace(file, new File(base + file.getName()));
diff --git a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/BundlesAction.java b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/BundlesAction.java
index aabf3db8b..f05207712 100644
--- a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/BundlesAction.java
+++ b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/BundlesAction.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2018 Code 9 and others.
+ * Copyright (c) 2008, 2021 Code 9 and others.
*
* This
* program and the accompanying materials are made available under the terms of
@@ -14,6 +14,7 @@
* IBM - ongoing development
* SAP AG - make optional dependencies non-greedy by default; allow setting greedy through directive (bug 247099)
* Red Hat Inc. - Bug 460967
+ * Christoph Läubrich - Bug 574952 p2 should distinguish between "product plugins" and "configuration plugins" (gently sponsored by Compart AG)
******************************************************************************/
package org.eclipse.equinox.p2.publisher.eclipse;
@@ -136,6 +137,13 @@ public class BundlesAction extends AbstractPublisherAction {
public static IInstallableUnit createBundleConfigurationUnit(String hostId, Version cuVersion,
boolean isBundleFragment, GeneratorBundleInfo configInfo, String configurationFlavor,
IMatchExpression<IInstallableUnit> filter) {
+ return createBundleConfigurationUnit(hostId, cuVersion, isBundleFragment, configInfo, configurationFlavor,
+ filter, false);
+ }
+
+ static IInstallableUnit createBundleConfigurationUnit(String hostId, Version cuVersion,
+ boolean isBundleFragment, GeneratorBundleInfo configInfo, String configurationFlavor,
+ IMatchExpression<IInstallableUnit> filter, boolean configOnly) {
if (configInfo == null)
return null;
@@ -145,7 +153,7 @@ public class BundlesAction extends AbstractPublisherAction {
cu.setVersion(cuVersion);
// Indicate the IU to which this CU apply
- Version hostVersion = Version.parseVersion(configInfo.getVersion());
+ Version hostVersion = configOnly ? Version.emptyVersion : Version.parseVersion(configInfo.getVersion());
VersionRange range = hostVersion == Version.emptyVersion ? VersionRange.emptyRange
: new VersionRange(hostVersion, true, Version.MAX_VERSION, true);
cu.setHost(new IRequirement[] { //
@@ -932,6 +940,7 @@ public class BundlesAction extends AbstractPublisherAction {
if (reuse && (publisherInfo.getArtifactOptions() & IPublisherInfo.A_PUBLISH) > 0) {
File packFile = new Path(jarFile.getAbsolutePath()).addFileExtension("pack.gz").toFile(); //$NON-NLS-1$
if (packFile.exists()) {
+ @SuppressWarnings("removal")
IArtifactDescriptor ad200 = createPack200ArtifactDescriptor(descriptor.getArtifactKey(), packFile,
descriptor.getProperty(IArtifactDescriptor.ARTIFACT_SIZE));
publishArtifact(ad200, packFile, publisherInfo);
diff --git a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/ConfigCUsAction.java b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/ConfigCUsAction.java
index 823000c2b..ba349e047 100644
--- a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/ConfigCUsAction.java
+++ b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/ConfigCUsAction.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2017 Code 9 and others.
+ * Copyright (c) 2008, 2021 Code 9 and others.
*
* This
* program and the accompanying materials are made available under the terms of
@@ -13,12 +13,14 @@
* Code 9 - initial API and implementation
* IBM - ongoing development
* Rapicorp - ongoing development
+ * Christoph Läubrich - Bug 574952 p2 should distinguish between "product plugins" and "configuration plugins" (gently sponsored by Compart AG)
******************************************************************************/
package org.eclipse.equinox.p2.publisher.eclipse;
import java.io.File;
import java.util.*;
import java.util.Map.Entry;
+import java.util.stream.Collectors;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.frameworkadmin.BundleInfo;
import org.eclipse.equinox.internal.p2.metadata.TouchpointInstruction;
@@ -106,7 +108,12 @@ public class ConfigCUsAction extends AbstractPublisherAction {
String configSpec = configSpec1;
Collection<IConfigAdvice> configAdvice = publisherInfo.getAdvice(configSpec, false, id, version, IConfigAdvice.class);
BundleInfo[] bundles = fillInBundles(configAdvice, results);
- publishBundleCUs(publisherInfo, bundles, configSpec, innerResult);
+ Set<String> configBundles = configAdvice.stream().filter(ProductFileAdvice.class::isInstance)
+ .map(ProductFileAdvice.class::cast).flatMap(pca -> pca.getBundles(true))
+ .map(BundleInfo::getSymbolicName).filter(Objects::nonNull)
+ .distinct()
+ .collect(Collectors.toSet());
+ publishBundleCUs(publisherInfo, bundles, configSpec, innerResult, configBundles);
publishConfigIUs(configAdvice, innerResult, configSpec);
Collection<IExecutableAdvice> launchingAdvice = publisherInfo.getAdvice(configSpec, false, id, version, IExecutableAdvice.class);
publishIniIUs(launchingAdvice, innerResult, configSpec);
@@ -324,10 +331,13 @@ public class ConfigCUsAction extends AbstractPublisherAction {
}
/**
- * Publish the CUs related to the given set of bundles. This generally covers the start-level and
- * and whether or not the bundle is to be started.
+ * Publish the CUs related to the given set of bundles. This generally covers
+ * the start-level and and whether or not the bundle is to be started.
+ *
+ * @param configBundles
*/
- protected void publishBundleCUs(IPublisherInfo publisherInfo, BundleInfo[] bundles, String configSpec, IPublisherResult result) {
+ protected void publishBundleCUs(IPublisherInfo publisherInfo, BundleInfo[] bundles, String configSpec,
+ IPublisherResult result, Set<String> configBundles) {
if (bundles == null)
return;
@@ -338,24 +348,28 @@ public class ConfigCUsAction extends AbstractPublisherAction {
filter = createFilterSpec(configSpec);
}
- for (BundleInfo bundle1 : bundles) {
- GeneratorBundleInfo bundle = createGeneratorBundleInfo(bundle1, result);
- if (bundle == null)
+ for (BundleInfo bundleInfo : bundles) {
+ GeneratorBundleInfo generatorBundle = createGeneratorBundleInfo(bundleInfo, result);
+ if (generatorBundle == null)
continue;
- IInstallableUnit iu = bundle.getIU();
+ IInstallableUnit iu = generatorBundle.getIU();
// If there is no host, or the filters don't match, skip this one.
if (iu == null || !filterMatches(iu.getFilter(), configSpec))
continue;
- if (bundle.getStartLevel() == BundleInfo.NO_LEVEL && !bundle.isMarkedAsStarted()) {
+ if (generatorBundle.getStartLevel() == BundleInfo.NO_LEVEL && !generatorBundle.isMarkedAsStarted()) {
// this bundle does not require any particular configuration, the plug-in
// default IU will handle installing it
continue;
}
- IInstallableUnit cu = null;
- if (this.version != null && !this.version.equals(Version.emptyVersion))
- cu = BundlesAction.createBundleConfigurationUnit(bundle.getSymbolicName(), this.version, false, bundle, flavor + cuIdPrefix, filter);
- else
- cu = BundlesAction.createBundleConfigurationUnit(bundle.getSymbolicName(), Version.parseVersion(bundle.getVersion()), false, bundle, flavor + cuIdPrefix, filter);
+ IInstallableUnit cu;
+ if (configBundles.contains(bundleInfo.getSymbolicName())) {
+ cu = BundlesAction.createBundleConfigurationUnit(generatorBundle.getSymbolicName(), this.version, false, generatorBundle,
+ flavor + cuIdPrefix, filter, true);
+ } else if (this.version != null && !this.version.equals(Version.emptyVersion)) {
+ cu = BundlesAction.createBundleConfigurationUnit(generatorBundle.getSymbolicName(), this.version, false, generatorBundle, flavor + cuIdPrefix, filter);
+ } else {
+ cu = BundlesAction.createBundleConfigurationUnit(generatorBundle.getSymbolicName(), Version.parseVersion(generatorBundle.getVersion()), false, generatorBundle, flavor + cuIdPrefix, filter);
+ }
if (cu != null) {
// Product Query will run against the repo, make sure these CUs are in before then
// TODO review the aggressive addition to the metadata repo. perhaps the query can query the result as well.
diff --git a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/EquinoxExecutableAction.java b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/EquinoxExecutableAction.java
index 0e8fa0dd7..e3ec91b39 100644
--- a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/EquinoxExecutableAction.java
+++ b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/EquinoxExecutableAction.java
@@ -292,6 +292,10 @@ public class EquinoxExecutableAction extends AbstractPublisherAction {
File newFile = new File(file.getParentFile(), "eclipse.exe"); //$NON-NLS-1$
file.renameTo(newFile);
descriptor.replace(file, newFile);
+ } else if (file.getName().equals("launcherc.exe")) { //$NON-NLS-1$
+ File newFile = new File(file.getParentFile(), "eclipsec.exe"); //$NON-NLS-1$
+ file.renameTo(newFile);
+ descriptor.replace(file, newFile);
}
}
}
diff --git a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/EquinoxLauncherCUAction.java b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/EquinoxLauncherCUAction.java
index 0d15c6408..1c22d094e 100644
--- a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/EquinoxLauncherCUAction.java
+++ b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/EquinoxLauncherCUAction.java
@@ -24,7 +24,6 @@ import org.eclipse.equinox.p2.metadata.Version;
import org.eclipse.equinox.p2.metadata.expression.IMatchExpression;
import org.eclipse.equinox.p2.publisher.*;
import org.eclipse.equinox.p2.publisher.actions.IVersionAdvice;
-import org.eclipse.osgi.service.environment.Constants;
/**
* Create CUs for all Equinox launcher related IUs for the given set of configurations
@@ -63,12 +62,7 @@ public class EquinoxLauncherCUAction extends AbstractPublisherAction {
for (String configSpec : configSpecs) {
String[] specs = Utils.getTokens(configSpec, "."); //$NON-NLS-1$
if (specs.length > 0 && !AbstractPublisherAction.CONFIG_ANY.equalsIgnoreCase(specs[0])) {
- if (specs.length > 2 && Constants.OS_MACOSX.equals(specs[1]) && !Constants.ARCH_X86_64.equals(specs[2])) {
- //launcher fragment for mac only has arch for x86_64
- id = ORG_ECLIPSE_EQUINOX_LAUNCHER + '.' + specs[0] + '.' + specs[1];
- } else {
- id = ORG_ECLIPSE_EQUINOX_LAUNCHER + '.' + configSpec;
- }
+ id = ORG_ECLIPSE_EQUINOX_LAUNCHER + '.' + configSpec;
publishCU(id, configSpec, results);
}
}
diff --git a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/FeaturesAction.java b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/FeaturesAction.java
index cbc41b8c6..d11aaa39d 100644
--- a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/FeaturesAction.java
+++ b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/FeaturesAction.java
@@ -614,7 +614,14 @@ public class FeaturesAction extends AbstractPublisherAction {
// artifact per feature IU.
Collection<IArtifactKey> artifacts = featureIU.getArtifacts();
for (IArtifactKey artifactKey : artifacts) {
- File file = new File(feature.getLocation());
+ String location = feature.getLocation();
+ if (location == null) {
+ if (PublisherHelper.isArtifactPublish(publisherInfo)) {
+ throw new IllegalArgumentException(NLS.bind(Messages.exception_sourcePath, feature.getId()));
+ }
+ continue;
+ }
+ File file = new File(location);
ArtifactDescriptor ad = (ArtifactDescriptor) PublisherHelper.createArtifactDescriptor(info, artifactKey, file);
processArtifactPropertiesAdvice(featureIU, ad, publisherInfo);
ad.setProperty(IArtifactDescriptor.DOWNLOAD_CONTENTTYPE, IArtifactDescriptor.TYPE_ZIP);
diff --git a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/ProductFileAdvice.java b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/ProductFileAdvice.java
index 551796a7a..19258375b 100644
--- a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/ProductFileAdvice.java
+++ b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/equinox/p2/publisher/eclipse/ProductFileAdvice.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2017 Code 9 and others.
+ * Copyright (c) 2008, 2021 Code 9 and others.
*
* This
* program and the accompanying materials are made available under the terms of
@@ -14,11 +14,14 @@
* EclipseSource - ongoing development
* IBM Corporation - ongoing development
* Rapicorp - additional features
+ * Christoph Läubrich - Bug 574952 p2 should distinguish between "product plugins" and "configuration plugins" (gently sponsored by Compart AG)
******************************************************************************/
package org.eclipse.equinox.p2.publisher.eclipse;
import java.io.File;
import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
import org.eclipse.equinox.frameworkadmin.BundleInfo;
import org.eclipse.equinox.internal.p2.core.helpers.CollectionUtils;
import org.eclipse.equinox.internal.p2.publisher.eclipse.DataLoader;
@@ -32,10 +35,11 @@ import org.eclipse.equinox.p2.publisher.actions.ILicenseAdvice;
import org.eclipse.equinox.p2.repository.IRepositoryReference;
/**
- * Provide advice derived from the .product file. The product can give some info on
- * launching as well as the configuration (bundles, properties, ...)
+ * Provide advice derived from the .product file. The product can give some info
+ * on launching as well as the configuration (bundles, properties, ...)
*/
-public class ProductFileAdvice extends AbstractAdvice implements ILicenseAdvice, IExecutableAdvice, IConfigAdvice, IBrandingAdvice {
+public class ProductFileAdvice extends AbstractAdvice
+ implements ILicenseAdvice, IExecutableAdvice, IConfigAdvice, IBrandingAdvice {
private final static String OSGI_SPLASH_PATH = "osgi.splashPath"; //$NON-NLS-1$
private final static String SPLASH_PREFIX = "platform:/base/plugins/"; //$NON-NLS-1$
private final IProductDescriptor product;
@@ -43,7 +47,7 @@ public class ProductFileAdvice extends AbstractAdvice implements ILicenseAdvice,
private String ws;
private String os;
private String arch;
- private ConfigData configData = null;
+ private final ProductConfigData configData;
@Override
protected String getId() {
@@ -56,12 +60,9 @@ public class ProductFileAdvice extends AbstractAdvice implements ILicenseAdvice,
}
/**
- * Constructs a new ProductFileAdvice for a given product file and a
- * particular configuration. Configurations are
- * specified as: ws.os.arch where:
- * ws is the windowing system
- * os is the operating system
- * arch is the architecture
+ * Constructs a new ProductFileAdvice for a given product file and a particular
+ * configuration. Configurations are specified as: ws.os.arch where: ws is the
+ * windowing system os is the operating system arch is the architecture
*/
public ProductFileAdvice(IProductDescriptor product, String configSpec) {
this.product = product;
@@ -82,7 +83,7 @@ public class ProductFileAdvice extends AbstractAdvice implements ILicenseAdvice,
}
/**
- * Returns the program arguments for this product.
+ * Returns the program arguments for this product.
*/
@Override
public String[] getProgramArguments() {
@@ -99,32 +100,34 @@ public class ProductFileAdvice extends AbstractAdvice implements ILicenseAdvice,
return AbstractPublisherAction.getArrayFromString(line, " "); //$NON-NLS-1$
}
- /**
- * Returns the Bundles that constitute this product. These
- * bundles may be specified in the .product file, .product file configuration
- * area, config.ini file, or a combination of these three places.
- */
@Override
public BundleInfo[] getBundles() {
- return configData.getBundles();
+ return Stream.concat(getBundles(false), getBundles(true))
+ .toArray(BundleInfo[]::new);
+ }
+
+ Stream<BundleInfo> getBundles(boolean configOnly) {
+ if (configOnly) {
+ return configData.configBundles.stream();
+ }
+ return Arrays.stream(configData.data.getBundles());
}
/**
- * Returns the properties associated with this product. These
- * properties may be defined in the .product file, the config.ini
- * file, or both.
+ * Returns the properties associated with this product. These properties may be
+ * defined in the .product file, the config.ini file, or both.
*/
@Override
public Map<String, String> getProperties() {
Map<String, String> result = new HashMap<>();
- CollectionUtils.putAll(configData.getProperties(), result);
+ CollectionUtils.putAll(configData.data.getProperties(), result);
result.putAll(product.getConfigurationProperties(os, arch));
return result;
}
/**
- * Returns the name of the launcher. This should be the OS-independent
- * name. That is, ".exe" etc. should not be included.
+ * Returns the name of the launcher. This should be the OS-independent name.
+ * That is, ".exe" etc. should not be included.
*
* @return the name of the branded launcher or <code>null</code> if none.
*/
@@ -179,16 +182,18 @@ public class ProductFileAdvice extends AbstractAdvice implements ILicenseAdvice,
return product.getRepositoryEntries();
}
- private ConfigData getConfigData() {
+ private ProductConfigData getConfigData() {
DataLoader loader = createDataLoader();
ConfigData result;
if (loader != null) {
result = loader.getConfigData();
- } else
+ } else {
result = generateConfigData();
-
- addProductFileBundles(result); // these are the bundles specified in the <plugins/> tag
- addProductFileConfigBundles(result); // these are the bundles specified in the <configurations> tag in the product file
+ }
+ ProductConfigData data = new ProductConfigData(result);
+ addProductFileBundles(data); // these are the bundles specified in the <plugins/> tag
+ addProductFileConfigBundles(data); // these are the bundles specified in the <configurations> tag in the
+ // product file
if (product.getProductId() != null)
result.setProperty("eclipse.product", product.getProductId()); //$NON-NLS-1$
if (product.getApplication() != null)
@@ -196,70 +201,42 @@ public class ProductFileAdvice extends AbstractAdvice implements ILicenseAdvice,
String location = getSplashLocation();
if (location != null)
result.setProperty(OSGI_SPLASH_PATH, SPLASH_PREFIX + location);
- return result;
+ return data;
}
- private void addProductFileConfigBundles(ConfigData data) {
- Set<BundleInfo> versionBoundBundles = new HashSet<>();
- Map<String, List<BundleInfo>> unboundedBundles = new HashMap<>();
-
- BundleInfo[] bundles = data.getBundles();
- for (BundleInfo bundleInfo : bundles) {
- // For each bundle we know about, cache it. If the bundle doesn't have a version
- // add it to a list of bundles by name
- if (bundleInfo.getVersion().equals(BundleInfo.EMPTY_VERSION)) {
- addUnboundedBundle(unboundedBundles, bundleInfo);
+ private void addProductFileConfigBundles(ProductConfigData productConfigData) {
+ Map<String, List<BundleInfo>> configBundleMap = Arrays.stream(productConfigData.data.getBundles())
+ .collect(Collectors.groupingBy(BundleInfo::getSymbolicName));
+ for (BundleInfo configBundleInfo : product.getBundleInfos()) {
+ List<BundleInfo> matches = configBundleMap.get(configBundleInfo.getSymbolicName());
+ if (matches == null || matches.isEmpty()) {
+ // if there is no match in the ConfigData (e.g. plugin or mixed type product)
+ // simply add this to the list of config bundles
+ productConfigData.configBundles.add(configBundleInfo);
} else {
- versionBoundBundles.add(bundleInfo);
- addUnboundedBundle(unboundedBundles, bundleInfo);
+ // otherwise just update the existing data
+ for (BundleInfo target : matches) {
+ target.setStartLevel(configBundleInfo.getStartLevel());
+ target.setMarkedAsStarted(configBundleInfo.isMarkedAsStarted());
+ }
}
}
-
- List<BundleInfo> bundleInfos = product.getBundleInfos();
- for (BundleInfo bundleInfo : bundleInfos) {
- // For each bundle that has configuration information, if the bundle is in the
- // bundles bound by version, add the "configured" bundle instead
- // If the bundle is not bound to a version, then replace all bounded versions
- // with this one. Otherwise, just add this one (don't replace)
- if (versionBoundBundles.contains(bundleInfo)) {
- // If we found a version with the same name and version, replace it with the "configured" bundle
- data.removeBundle(bundleInfo);
- data.addBundle(bundleInfo);
- } else if (bundleInfo.getVersion().equals(BundleInfo.EMPTY_VERSION)) {
- // If we don't have a version number, look for all bundles that match by name
- List<BundleInfo> list = unboundedBundles.get(bundleInfo.getSymbolicName());
- if (list == null)
- data.addBundle(bundleInfo);
- else
- for (BundleInfo target : list) {
- target.setStartLevel(bundleInfo.getStartLevel());
- target.setMarkedAsStarted(bundleInfo.isMarkedAsStarted());
- }
- } else {
- // Otherwise we have a version, but we could not match it, so just add this one.
- data.addBundle(bundleInfo);
- }
-
- }
- }
-
- private void addUnboundedBundle(Map<String, List<BundleInfo>> data, BundleInfo bundleInfo) {
- if (!data.containsKey(bundleInfo.getSymbolicName()))
- data.put(bundleInfo.getSymbolicName(), new LinkedList<BundleInfo>());
- data.get(bundleInfo.getSymbolicName()).add(bundleInfo);
}
- private void addProductFileBundles(ConfigData data) {
+ private void addProductFileBundles(ProductConfigData productConfigData) {
+ if (product.useFeatures()) {
+ return;
+ }
List<IVersionedId> bundles = product.getBundles(true);
Set<BundleInfo> set = new HashSet<>();
- set.addAll(Arrays.asList(data.getBundles()));
+ set.addAll(Arrays.asList(productConfigData.data.getBundles()));
for (IVersionedId vid : bundles) {
BundleInfo bundleInfo = new BundleInfo();
bundleInfo.setSymbolicName(vid.getId());
bundleInfo.setVersion(vid.getVersion().toString());
if (!set.contains(bundleInfo))
- data.addBundle(bundleInfo);
+ productConfigData.data.addBundle(bundleInfo);
}
}
@@ -268,7 +245,7 @@ public class ProductFileAdvice extends AbstractAdvice implements ILicenseAdvice,
if (product.useFeatures())
return result;
- // Add all the bundles here. We replace / update them later
+ // Add all the bundles here. We replace / update them later
// if we find configuration information
List<IVersionedId> bundles = product.getBundles(true);
for (IVersionedId vid : bundles) {
@@ -295,21 +272,24 @@ public class ProductFileAdvice extends AbstractAdvice implements ILicenseAdvice,
String targetWS = AbstractPublisherAction.parseConfigSpec(spec)[0];
if (targetWS == null)
targetWS = AbstractPublisherAction.CONFIG_ANY;
- if (!ws.equals(targetWS) && !ws.equals(AbstractPublisherAction.CONFIG_ANY) && !targetWS.equals(AbstractPublisherAction.CONFIG_ANY)) {
+ if (!ws.equals(targetWS) && !ws.equals(AbstractPublisherAction.CONFIG_ANY)
+ && !targetWS.equals(AbstractPublisherAction.CONFIG_ANY)) {
return false;
}
String targetOS = AbstractPublisherAction.parseConfigSpec(spec)[1];
if (targetOS == null)
targetOS = AbstractPublisherAction.CONFIG_ANY;
- if (!os.equals(targetOS) && !os.equals(AbstractPublisherAction.CONFIG_ANY) && !targetOS.equals(AbstractPublisherAction.CONFIG_ANY)) {
+ if (!os.equals(targetOS) && !os.equals(AbstractPublisherAction.CONFIG_ANY)
+ && !targetOS.equals(AbstractPublisherAction.CONFIG_ANY)) {
return false;
}
String targetArch = AbstractPublisherAction.parseConfigSpec(spec)[2];
if (targetArch == null)
targetArch = AbstractPublisherAction.CONFIG_ANY;
- if (!arch.equals(targetArch) && !arch.equals(AbstractPublisherAction.CONFIG_ANY) && !targetArch.equals(AbstractPublisherAction.CONFIG_ANY)) {
+ if (!arch.equals(targetArch) && !arch.equals(AbstractPublisherAction.CONFIG_ANY)
+ && !targetArch.equals(AbstractPublisherAction.CONFIG_ANY)) {
return false;
}
}
@@ -325,16 +305,29 @@ public class ProductFileAdvice extends AbstractAdvice implements ILicenseAdvice,
File configFile = new File(location);
// We are assuming we are always relative from the product file
- // However PDE tooling puts us relative from the workspace, that "relative" path also looks like an absolute path on linux
+ // However PDE tooling puts us relative from the workspace, that "relative" path
+ // also looks like an absolute path on linux
// Build may have copied the file to the correct place for us
if (!configFile.isAbsolute() || !configFile.exists())
configFile = new File(product.getLocation().getParentFile(), location);
- //We don't really have an executable location, get something reasonable based on the config.ini location
+ // We don't really have an executable location, get something reasonable based
+ // on the config.ini location
File parent = configFile.getParentFile();
if (parent.getName().equals("configuration") && parent.getParentFile() != null) //$NON-NLS-1$
parent = parent.getParentFile();
return new DataLoader(configFile, parent);
}
+ private static final class ProductConfigData {
+
+ private final List<BundleInfo> configBundles = new ArrayList<>();
+ private final ConfigData data;
+
+ public ProductConfigData(ConfigData data) {
+ this.data = data;
+ }
+
+ }
+
}
diff --git a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/pde/internal/swt/tools/IconExe.java b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/pde/internal/swt/tools/IconExe.java
index 64d908d60..0ba53b888 100644
--- a/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/pde/internal/swt/tools/IconExe.java
+++ b/bundles/org.eclipse.equinox.p2.publisher.eclipse/src/org/eclipse/pde/internal/swt/tools/IconExe.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
+ * Copyright (c) 2000, 2019 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -10,11 +10,14 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
+ * Christoph Läubrich - refactor to use a more consistent API that allows error propagation to the caller
*******************************************************************************/
package org.eclipse.pde.internal.swt.tools;
import java.io.*;
+import java.text.MessageFormat;
import java.util.*;
+import java.util.function.Consumer;
/**
* Customize the icon of a Windows exe
@@ -70,24 +73,14 @@ public class IconExe {
System.err.println("Usage: IconExe <windows executable> <ico file>"); //$NON-NLS-1$
return;
}
- ImageLoader loader = new ImageLoader();
+ File[] iconFiles = new File[args.length - 1];
+ for (int i = 0; i < iconFiles.length; i++) {
+ iconFiles[i] = new File(args[i + 1]);
- List<ImageData> images = new ArrayList<>();
- for (int i = 1; i < args.length; i++) {
- try {
- //An ICO should contain 7 images, a BMP will contain 1
- ImageData[] current = loader.load(args[i]);
- for (ImageData id : current) {
- images.add(id);
- }
- } catch (RuntimeException e) {
- //ignore so that we process the other images
- }
}
- ImageData[] data = new ImageData[images.size()];
- data = images.toArray(data);
+ ImageData[] data = loadImages(iconFiles, System.err::println);
- List<IconResInfo> unchangedIcons = unloadIcons(args[0], data);
+ Collection<IconResInfo> unchangedIcons = replaceIcons(new File(args[0]), data, System.err::println);
if (unchangedIcons.size() != 0) {
System.err.println(String.format("[IconExe] Error - %d original icon(s) not replaced in %s:", unchangedIcons.size(), args[0])); //$NON-NLS-1$
for (IconResInfo icon : unchangedIcons) {
@@ -98,45 +91,39 @@ public class IconExe {
}
}
- /* Implementation */
-
- /**
- * Retrieve the Desktop icons provided in the Windows executable program.
- * These icons are typically shown in various places of the Windows desktop.
+ /**
+ * Loads images from files so they are prepared for used in replacing icons in a
+ * launcher executable
*
- * Note. The Eclipse 3.4 launcher returns the following 7 images (in any order).
- * 1. 48x48, 32 bit (RGB / Alpha Channel)
- * 2. 32x32, 32 bit (RGB / Alpha Channel)
- * 3. 16x16, 32 bit (RGB / Alpha Channel)
- * 4. 48x48, 8 bit (256 colors)
- * 5. 32x32, 8 bit (256 colors)
- * 6. 24x24, 8 bit (256 colors)
- * 7. 16x16, 8 bit (256 colors)
- *
- * Note 1. The Eclipse 4.2 launcher requires an .ico file with the following 7 images (in any order).
- * 1. 256x256, 32 bit (RGB / Alpha Channel)
- * 2. 48x48, 32 bit (RGB / Alpha Channel)
- * 3. 32x32, 32 bit (RGB / Alpha Channel)
- * 4. 16x16, 32 bit (RGB / Alpha Channel)
- * 5. 48x48, 8 bit (256 colors)
- * 6. 32x32, 8 bit (256 colors)
- * 7. 16x16, 8 bit (256 colors)
- *
- * @param program the Windows executable e.g c:/eclipse/eclipse.exe
+ * @param icons the icons to loader
+ * @param errorMessageConsumer a consumer that is informed about skipable errors
+ * while loading icons
+ * @return an array of image data that could be used to replace launcher icons
+ * @throws IOException if reading of files fails on the I/O level
*/
- static ImageData[] loadIcons(String program) throws FileNotFoundException, IOException {
- ImageData[] data;
- try (RandomAccessFile raf = new RandomAccessFile(program, "r") //$NON-NLS-1$
- ) {
- IconExe iconExe = new IconExe();
- IconResInfo[] iconInfo = iconExe.getIcons(raf);
- data = new ImageData[iconInfo.length];
- for (int i = 0; i < data.length; i++)
- data[i] = iconInfo[i].data;
+ public static ImageData[] loadImages(File[] icons, Consumer<String> errorMessageConsumer) throws IOException {
+ ImageLoader loader = new ImageLoader();
+ List<ImageData> images = new ArrayList<>();
+ for (File file : icons) {
+ if (!file.exists()) {
+ errorMessageConsumer.accept(MessageFormat.format("The specified icon file {0} does not exits", file)); //$NON-NLS-1$
+ continue;
+ }
+ try (FileInputStream stream = new FileInputStream(file)) {
+ try {
+ ImageData[] imageDatas = loader.load(stream);
+ images.addAll(Arrays.asList(imageDatas));
+ } catch (RuntimeException e) {
+ errorMessageConsumer
+ .accept(MessageFormat.format("Loading of image {0} failed: {1}", file, e.getMessage())); //$NON-NLS-1$
+ }
+ }
}
- return data;
+ return images.toArray(new ImageData[0]);
}
+ /* Implementation */
+
/**
* Replace the Desktop icons provided in the Windows executable program
* with icons provided by the user.
@@ -173,19 +160,21 @@ public class IconExe {
* Note 4. This function modifies the content of the executable program and may cause
* its corruption.
*
- * @param program the Windows executable e.g c:/eclipse/eclipse.exe
+ * @param launcherFile the Windows executable e.g c:/eclipse/eclipse.exe
* @param icons to write to the given executable
* @return the list of icons from the original program that were not successfully replaced (empty if success)
*/
- static List<IconResInfo> unloadIcons(String program, ImageData[] icons) throws FileNotFoundException, IOException {
- List<IconResInfo> iconInfo;
- try (RandomAccessFile raf = new RandomAccessFile(program, "rw") //$NON-NLS-1$
+ public static Collection<IconResInfo> replaceIcons(File launcherFile, ImageData[] icons,
+ Consumer<String> errorMessageConsumer)
+ throws FileNotFoundException, IOException {
+ Collection<IconResInfo> iconInfo;
+ try (RandomAccessFile raf = new RandomAccessFile(launcherFile, "rw") //$NON-NLS-1$
) {
- IconExe iconExe = new IconExe();
- iconInfo = new ArrayList<>(Arrays.asList(iconExe.getIcons(raf)));
+ iconInfo = getIcons(raf);
// Display an error if no icons found in target executable.
if (iconInfo.isEmpty()) {
- System.err.println("Warning - no icons detected in \"" + program + "\"."); //$NON-NLS-1$ //$NON-NLS-2$
+ errorMessageConsumer
+ .accept(MessageFormat.format("no icons detected in {0}.", launcherFile.getAbsolutePath())); //$NON-NLS-1$
raf.close();
return Collections.emptyList();
}
@@ -218,26 +207,46 @@ public class IconExe {
int size;
}
- IconResInfo[] iconInfo = null;
- int iconCnt;
+ /**
+ * Retrieve the Desktop icons provided in the Windows executable program.
+ * These icons are typically shown in various places of the Windows desktop.
+ *
+ * Note. The Eclipse 3.4 launcher returns the following 7 images (in any order).
+ * 1. 48x48, 32 bit (RGB / Alpha Channel)
+ * 2. 32x32, 32 bit (RGB / Alpha Channel)
+ * 3. 16x16, 32 bit (RGB / Alpha Channel)
+ * 4. 48x48, 8 bit (256 colors)
+ * 5. 32x32, 8 bit (256 colors)
+ * 6. 24x24, 8 bit (256 colors)
+ * 7. 16x16, 8 bit (256 colors)
+ *
+ * Note 1. The Eclipse 4.2 launcher requires an .ico file with the following 7 images (in any order).
+ * 1. 256x256, 32 bit (RGB / Alpha Channel)
+ * 2. 48x48, 32 bit (RGB / Alpha Channel)
+ * 3. 32x32, 32 bit (RGB / Alpha Channel)
+ * 4. 16x16, 32 bit (RGB / Alpha Channel)
+ * 5. 48x48, 8 bit (256 colors)
+ * 6. 32x32, 8 bit (256 colors)
+ * 7. 16x16, 8 bit (256 colors)
+ *
+ * @param raf RandomAccessFile for the the Windows executable e.g c:/eclipse/eclipse.exe
+ */
+ static Collection<IconResInfo> getIcons(RandomAccessFile raf) throws IOException {
- IconResInfo[] getIcons(RandomAccessFile raf) throws IOException {
- iconInfo = new IconResInfo[4];
- iconCnt = 0;
IMAGE_DOS_HEADER imageDosHeader = new IMAGE_DOS_HEADER();
read(raf, imageDosHeader);
if (imageDosHeader.e_magic != IMAGE_DOS_SIGNATURE)
- return new IconResInfo[0];
+ return Collections.emptyList();
int imageNtHeadersOffset = imageDosHeader.e_lfanew;
raf.seek(imageNtHeadersOffset);
IMAGE_NT_HEADERS imageNtHeaders = new IMAGE_NT_HEADERS();
read(raf, imageNtHeaders);
if (imageNtHeaders.Signature != IMAGE_NT_SIGNATURE)
- return new IconResInfo[0];
+ return Collections.emptyList();
// DumpResources
int resourcesRVA = imageNtHeaders.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress;
if (resourcesRVA == 0)
- return new IconResInfo[0];
+ return Collections.emptyList();
if (DEBUG)
System.out.println("* Resources (RVA= " + resourcesRVA + ")"); //$NON-NLS-1$ //$NON-NLS-2$
IMAGE_SECTION_HEADER imageSectionHeader = new IMAGE_SECTION_HEADER();
@@ -253,19 +262,16 @@ public class IconExe {
}
}
if (!found)
- return new IconResInfo[0];
+ return Collections.emptyList();
int delta = imageSectionHeader.VirtualAddress - imageSectionHeader.PointerToRawData;
int imageResourceDirectoryOffset = resourcesRVA - delta;
- dumpResourceDirectory(raf, imageResourceDirectoryOffset, imageResourceDirectoryOffset, delta, 0, 0, false);
- if (iconCnt < iconInfo.length) {
- IconResInfo[] newArray = new IconResInfo[iconCnt];
- System.arraycopy(iconInfo, 0, newArray, 0, iconCnt);
- iconInfo = newArray;
- }
- return iconInfo;
+ return dumpResourceDirectory(raf, imageResourceDirectoryOffset, imageResourceDirectoryOffset, delta, 0, 0,
+ false);
}
- void dumpResourceDirectory(RandomAccessFile raf, int imageResourceDirectoryOffset, int resourceBase, int delta, int type, int level, boolean rt_icon_root) throws IOException {
+ static Collection<IconResInfo> dumpResourceDirectory(RandomAccessFile raf, int imageResourceDirectoryOffset,
+ int resourceBase, int delta, int type, int level, boolean rt_icon_root) throws IOException {
+ Collection<IconResInfo> iconInfo = new ArrayList<>();
if (DEBUG)
System.out.println("** LEVEL " + level); //$NON-NLS-1$
@@ -293,7 +299,9 @@ public class IconExe {
}
for (IMAGE_RESOURCE_DIRECTORY_ENTRY imageResourceDirectoryEntry : imageResourceDirectoryEntries) {
if (imageResourceDirectoryEntry.DataIsDirectory) {
- dumpResourceDirectory(raf, imageResourceDirectoryEntry.OffsetToDirectory + resourceBase, resourceBase, delta, imageResourceDirectoryEntry.Id, level + 1, rt_icon_root ? true : type == RT_ICON);
+ iconInfo.addAll(dumpResourceDirectory(raf, imageResourceDirectoryEntry.OffsetToDirectory + resourceBase,
+ resourceBase, delta, imageResourceDirectoryEntry.Id, level + 1,
+ rt_icon_root ? true : type == RT_ICON));
} else {
// Resource found
/// pResDirEntry->Name
@@ -304,21 +312,15 @@ public class IconExe {
if (DEBUG)
System.out.println("Resource Id " + irde.Id + " Data Offset RVA " + data.OffsetToData + ", Size " + data.Size); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
if (rt_icon_root) {
- if (DEBUG)
- System.out.println("iconcnt " + iconCnt + " |" + iconInfo.length); //$NON-NLS-1$ //$NON-NLS-2$
- iconInfo[iconCnt] = new IconResInfo();
- iconInfo[iconCnt].data = parseIcon(raf, data.OffsetToData - delta, data.Size);
- iconInfo[iconCnt].offset = data.OffsetToData - delta;
- iconInfo[iconCnt].size = data.Size;
- iconCnt++;
- if (iconCnt == iconInfo.length) {
- IconResInfo[] newArray = new IconResInfo[iconInfo.length + 4];
- System.arraycopy(iconInfo, 0, newArray, 0, iconInfo.length);
- iconInfo = newArray;
- }
+ IconResInfo resInfo = new IconResInfo();
+ resInfo.data = parseIcon(raf, data.OffsetToData - delta, data.Size);
+ resInfo.offset = data.OffsetToData - delta;
+ resInfo.size = data.Size;
+ iconInfo.add(resInfo);
}
}
}
+ return iconInfo;
}
static ImageData parseIcon(RandomAccessFile raf, int offset, int size) throws IOException {
@@ -748,14 +750,14 @@ public class IconExe {
}
static long read8(RandomAccessFile raf) throws IOException {
- int b0 = raf.readByte() & 0xFF;
- int b1 = raf.readByte() & 0xFF;
- int b2 = raf.readByte() & 0xFF;
- int b3 = raf.readByte() & 0xFF;
- int b4 = raf.readByte() & 0xFF;
- int b5 = raf.readByte() & 0xFF;
- int b6 = raf.readByte() & 0xFF;
- int b7 = raf.readByte() & 0xFF;
+ long b0 = raf.readByte() & 0xFF;
+ long b1 = raf.readByte() & 0xFF;
+ long b2 = raf.readByte() & 0xFF;
+ long b3 = raf.readByte() & 0xFF;
+ long b4 = raf.readByte() & 0xFF;
+ long b5 = raf.readByte() & 0xFF;
+ long b6 = raf.readByte() & 0xFF;
+ long b7 = raf.readByte() & 0xFF;
return b7 << 56 | b6 << 48 | b5 << 40 | b4 << 32 | b3 << 24 | b2 << 16 | b1 << 8 | b0;
}
@@ -1282,49 +1284,12 @@ public class IconExe {
*/
public ImageData[] load(InputStream stream) {
if (stream == null)
- SWT.error(SWT.ERROR_NULL_ARGUMENT);
+ throw new NullPointerException("stream can't be null"); //$NON-NLS-1$
reset();
data = FileFormat.load(stream, this);
return data;
}
- /**
- * Loads an array of <code>ImageData</code> objects from the
- * file with the specified name. Throws an error if either
- * an error occurs while loading the images, or if the images are
- * not of a supported type. Returns the loaded image data array.
- *
- * @param filename the name of the file to load the images from
- * @return an array of <code>ImageData</code> objects loaded from the specified file
- *
- * @exception IllegalArgumentException <ul>
- * <li>ERROR_NULL_ARGUMENT - if the file name is null</li>
- * </ul>
- * @exception RuntimeException <ul>
- * <li>ERROR_INVALID_IMAGE - if the image file contains invalid data</li>
- * <li>ERROR_IO - if an IO error occurs while reading data</li>
- * <li>ERROR_UNSUPPORTED_FORMAT - if the image file contains an unrecognized format</li>
- * </ul>
- */
- public ImageData[] load(String filename) {
- if (filename == null)
- SWT.error(SWT.ERROR_NULL_ARGUMENT);
- InputStream stream = null;
- try {
- stream = new BufferedInputStream(new FileInputStream(filename));
- return load(stream);
- } catch (IOException e) {
- SWT.error(SWT.ERROR_IO, e);
- } finally {
- try {
- if (stream != null)
- stream.close();
- } catch (IOException e) {
- // Ignore error
- }
- }
- return null;
- }
}
static class ImageData {
@@ -1576,7 +1541,7 @@ public class IconExe {
* <code>ImageLoader.load()</code>.
* </p>
*
- * @param filename the name of the file to load the image from (must not be null)
+ * @param data the image data to use
*
* @exception IllegalArgumentException <ul>
* <li>ERROR_NULL_ARGUMENT - if the file name is null</li>
@@ -1587,8 +1552,7 @@ public class IconExe {
* <li>ERROR_UNSUPPORTED_FORMAT - if the image file contains an unrecognized format</li>
* </ul>
*/
- public ImageData(String filename) {
- ImageData[] data = new ImageLoader().load(filename);
+ public ImageData(ImageData[] data) {
if (data.length < 1)
SWT.error(SWT.ERROR_INVALID_IMAGE);
ImageData i = data[0];
@@ -2839,13 +2803,8 @@ public class IconExe {
abstract ImageData[] loadFromByteStream();
public ImageData[] loadFromStream(LEDataInputStream stream) {
- try {
- inputStream = stream;
- return loadFromByteStream();
- } catch (Exception e) {
- SWT.error(SWT.ERROR_IO, e);
- return null;
- }
+ inputStream = stream;
+ return loadFromByteStream();
}
public static ImageData[] load(InputStream is, ImageLoader loader) {
@@ -2882,7 +2841,9 @@ public class IconExe {
SWT.error(SWT.ERROR_INVALID_IMAGE);
return;
}
- SWT.error(SWT.ERROR_INVALID_IMAGE);
+ throw new IllegalArgumentException(MessageFormat.format(
+ "only BMP_RLE8_COMPRESSION(cmp=1) or BMP_RLE4_COMPRESSION(cmp=2) compression is currently supported (given cmp={0})", //$NON-NLS-1$
+ cmp));
}
int decompressRLE4Data(byte[] src, int numBytes, int stride, byte[] dest, int destSize) {
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 bb67873dd..c9a149b4e 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
@@ -41,10 +41,10 @@ public abstract class AbstractPublishTask extends Task {
/**
* Support nested repository elements that looking something like
- * <repo location="file:/foo" metadata="true" artifact="true" />
- * Both metadata and artifact are optional:
- * 1) if neither are set, the repo is used for both metadata and artifacts
- * 2) if only one is true, the repo is that type and not the other
+ * <repo location="file:/foo" metadata="true" artifact="true" /> Both metadata
+ * and artifact are optional: 1) if neither are set, the repo is used for both
+ * metadata and artifacts 2) if only one is true, the repo is that type and not
+ * the other
*/
static public class RepoEntry {
private URI repoLocation;
@@ -52,7 +52,7 @@ public abstract class AbstractPublishTask extends Task {
private Boolean artifact = null;
/**
- * If not set, default is true if we aren't set as an artifact repo
+ * If not set, default is true if we aren't set as an artifact repo
*/
public boolean isMetadataRepository() {
if (metadata != null)
@@ -61,7 +61,7 @@ public abstract class AbstractPublishTask extends Task {
}
/**
- * If not set, default is true if we aren't set as a metadata repo
+ * If not set, default is true if we aren't set as a metadata repo
*/
public boolean isArtifactRepository() {
if (artifact != null)
@@ -117,14 +117,18 @@ public abstract class AbstractPublishTask extends Task {
protected void initializeRepositories(PublisherInfo info) throws ProvisionException {
if (artifactLocation != null) {
- IArtifactRepository repo = Publisher.createArtifactRepository(getProvisioningAgent(), artifactLocation, artifactRepoName, compress, reusePackedFiles);
+ @SuppressWarnings("removal")
+ IArtifactRepository repo = Publisher.createArtifactRepository(getProvisioningAgent(), artifactLocation,
+ artifactRepoName, compress, reusePackedFiles);
if (!append && !isEmpty(repo)) {
File repoLocation = URIUtil.toFile(artifactLocation);
if (repoLocation != null && source != null) {
if (repoLocation.isFile())
repoLocation = repoLocation.getParentFile();
if (repoLocation.equals(new File(source)))
- throw new IllegalArgumentException(NLS.bind(Messages.exception_artifactRepoNoAppendDestroysInput, URIUtil.toUnencodedString(artifactLocation)));
+ throw new IllegalArgumentException(
+ NLS.bind(Messages.exception_artifactRepoNoAppendDestroysInput,
+ URIUtil.toUnencodedString(artifactLocation)));
}
repo.removeAll(new NullProgressMonitor());
}
@@ -133,11 +137,14 @@ public abstract class AbstractPublishTask extends Task {
throw new ProvisionException(createConfigurationEror(Messages.exception_noArtifactRepo));
if (metadataLocation == null)
throw new ProvisionException(createConfigurationEror(Messages.exception_noMetadataRepo));
- info.setMetadataRepository(Publisher.createMetadataRepository(getProvisioningAgent(), metadataLocation, metadataRepoName, append, compress));
+ info.setMetadataRepository(Publisher.createMetadataRepository(getProvisioningAgent(), metadataLocation,
+ metadataRepoName, append, compress));
if (contextRepositories.size() > 0) {
- CompositeMetadataRepository contextMetadata = CompositeMetadataRepository.createMemoryComposite(getProvisioningAgent());
- CompositeArtifactRepository contextArtifact = CompositeArtifactRepository.createMemoryComposite(getProvisioningAgent());
+ CompositeMetadataRepository contextMetadata = CompositeMetadataRepository
+ .createMemoryComposite(getProvisioningAgent());
+ CompositeArtifactRepository contextArtifact = CompositeArtifactRepository
+ .createMemoryComposite(getProvisioningAgent());
for (RepoEntry entry : contextRepositories) {
if (contextMetadata != null && entry.isMetadataRepository())
diff --git a/bundles/org.eclipse.equinox.p2.publisher/.classpath b/bundles/org.eclipse.equinox.p2.publisher/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.publisher/.classpath
+++ b/bundles/org.eclipse.equinox.p2.publisher/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.publisher/.settings/.api_filters b/bundles/org.eclipse.equinox.p2.publisher/.settings/.api_filters
new file mode 100644
index 000000000..5fbae6834
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.publisher/.settings/.api_filters
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<component id="org.eclipse.equinox.p2.publisher" version="2">
+ <resource path="META-INF/MANIFEST.MF">
+ <filter id="926941240">
+ <message_arguments>
+ <message_argument value="1.7.0"/>
+ <message_argument value="1.6.200"/>
+ </message_arguments>
+ </filter>
+ </resource>
+</component>
diff --git a/bundles/org.eclipse.equinox.p2.publisher/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.publisher/.settings/org.eclipse.jdt.core.prefs
index fe0819f9a..cb0db2a19 100644
--- a/bundles/org.eclipse.equinox.p2.publisher/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.publisher/.settings/org.eclipse.jdt.core.prefs
@@ -16,9 +16,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -35,6 +35,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -88,6 +89,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -124,7 +126,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -138,7 +141,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -268,7 +270,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -342,7 +343,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -501,7 +501,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.publisher/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.equinox.p2.publisher/.settings/org.eclipse.jdt.ui.prefs
index 5df378ce1..cdf4ca19e 100644
--- a/bundles/org.eclipse.equinox.p2.publisher/.settings/org.eclipse.jdt.ui.prefs
+++ b/bundles/org.eclipse.equinox.p2.publisher/.settings/org.eclipse.jdt.ui.prefs
@@ -24,7 +24,7 @@ sp_cleanup.convert_functional_interfaces=false
sp_cleanup.convert_to_enhanced_for_loop=false
sp_cleanup.correct_indentation=false
sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.format_source_code_changes_only=true
sp_cleanup.insert_inferred_type_arguments=false
sp_cleanup.make_local_variable_final=false
sp_cleanup.make_parameters_final=false
diff --git a/bundles/org.eclipse.equinox.p2.publisher/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.publisher/META-INF/MANIFEST.MF
index 4642b7f92..693d9e66b 100644
--- a/bundles/org.eclipse.equinox.p2.publisher/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.publisher/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %bundleName
Bundle-SymbolicName: org.eclipse.equinox.p2.publisher;singleton:=true
-Bundle-Version: 1.5.400.qualifier
+Bundle-Version: 1.7.0.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.publisher.Activator
Bundle-Vendor: %providerName
Bundle-Localization: plugin
@@ -16,17 +16,15 @@ Export-Package: org.eclipse.equinox.internal.p2.publisher;
x-friends:="org.eclipse.equinox.p2.directorywatcher,
org.eclipse.equinox.p2.touchpoint.eclipse,
org.eclipse.equinox.p2.updatesite,
- org.eclipse.pde.publishing,
org.eclipse.equinox.p2.publisher.eclipse",
org.eclipse.equinox.p2.publisher.actions;
x-friends:="org.eclipse.equinox.p2.updatesite,
org.eclipse.equinox.p2.directorywatcher,
- org.eclipse.pde.publishing,
org.eclipse.equinox.p2.publisher.eclipse",
org.eclipse.equinox.spi.p2.publisher;x-friends:="org.eclipse.equinox.p2.updatesite,org.eclipse.equinox.p2.publisher.eclipse"
Require-Bundle: org.eclipse.equinox.common;bundle-version="[3.5.0,4.0.0)",
org.eclipse.osgi;bundle-version="3.8.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Import-Package: org.eclipse.equinox.app;version="1.0.0";resolution:=optional,
org.eclipse.equinox.internal.p2.artifact.processors.checksum,
diff --git a/bundles/org.eclipse.equinox.p2.publisher/build.properties b/bundles/org.eclipse.equinox.p2.publisher/build.properties
index 3e2e49a0d..adbece45b 100644
--- a/bundles/org.eclipse.equinox.p2.publisher/build.properties
+++ b/bundles/org.eclipse.equinox.p2.publisher/build.properties
@@ -19,5 +19,4 @@ bin.includes = META-INF/,\
.,\
about.html,\
plugin.properties
-javacWarnings..=+unusedThrown
src.includes = about.html
diff --git a/bundles/org.eclipse.equinox.p2.publisher/pom.xml b/bundles/org.eclipse.equinox.p2.publisher/pom.xml
index f6a7ddac3..b16ba1bd1 100644
--- a/bundles/org.eclipse.equinox.p2.publisher/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.publisher/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.publisher</artifactId>
- <version>1.5.400-SNAPSHOT</version>
+ <version>1.7.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
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 f5d890b08..5f1dc9d42 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
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2017 Code 9 and others.
+ * Copyright (c) 2008, 2017 Code 9 and others.
*
* This
* program and the accompanying materials are made available under the terms of
@@ -8,8 +8,8 @@
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
+ *
+ * Contributors:
* Code 9 - initial API and implementation
* IBM - ongoing development
* SAP - ongoing development
@@ -63,6 +63,7 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
/**
* Returns a string array of { ws, os, arch } as parsed from the given string
+ *
* @param configSpec the string to parse
* @return the ws, os, arch form of the given string
*/
@@ -85,10 +86,11 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
/**
* Returns the canonical form of config spec with the given ws, os and arch.
- * Note that the result is intended to be machine readable (i.e., parseConfigSpec
- * will parse the the result).
- * @param ws the window system
- * @param os the operating system
+ * Note that the result is intended to be machine readable (i.e.,
+ * parseConfigSpec will parse the the result).
+ *
+ * @param ws the window system
+ * @param os the operating system
* @param arch the machine architecture
* @return the machine readable format of the given config spec
*/
@@ -97,15 +99,16 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
}
protected void addSelfCapability(InstallableUnitDescription root) {
- root.setCapabilities(new IProvidedCapability[] {createSelfCapability(root.getId(), root.getVersion())});
+ root.setCapabilities(new IProvidedCapability[] { createSelfCapability(root.getId(), root.getVersion()) });
}
/**
- * Returns the LDAP filter form that matches the given config spec. Returns
- * an empty String if the spec does not identify an ws, os or arch.
+ * Returns the LDAP filter form that matches the given config spec. Returns an
+ * empty String if the spec does not identify an ws, os or arch.
+ *
* @param configSpec a config spec to filter
- * @return the LDAP filter for the given spec. <code>null</code> if the given spec does not
- * parse into a filter.
+ * @return the LDAP filter for the given spec. <code>null</code> if the given
+ * spec does not parse into a filter.
*/
protected IMatchExpression<IInstallableUnit> createFilterSpec(String configSpec) {
String ldap = createLDAPString(configSpec);
@@ -117,9 +120,15 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
protected String createLDAPString(String configSpec) {
String[] config = parseConfigSpec(configSpec);
if (config[0] != null || config[1] != null || config[2] != null) {
- String filterWs = config[0] != null && !CONFIG_ANY.equalsIgnoreCase(config[0]) ? "(osgi.ws=" + config[0] + ")" : ""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- String filterOs = config[1] != null && !CONFIG_ANY.equalsIgnoreCase(config[1]) ? "(osgi.os=" + config[1] + ")" : ""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- String filterArch = config[2] != null && !CONFIG_ANY.equalsIgnoreCase(config[2]) ? "(osgi.arch=" + config[2] + ")" : ""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ String filterWs = config[0] != null && !CONFIG_ANY.equalsIgnoreCase(config[0])
+ ? "(osgi.ws=" + config[0] + ")" //$NON-NLS-1$ //$NON-NLS-2$
+ : ""; //$NON-NLS-1$
+ String filterOs = config[1] != null && !CONFIG_ANY.equalsIgnoreCase(config[1])
+ ? "(osgi.os=" + config[1] + ")" //$NON-NLS-1$ //$NON-NLS-2$
+ : ""; //$NON-NLS-1$
+ String filterArch = config[2] != null && !CONFIG_ANY.equalsIgnoreCase(config[2])
+ ? "(osgi.arch=" + config[2] + ")" //$NON-NLS-1$ //$NON-NLS-2$
+ : ""; //$NON-NLS-1$
if (filterWs.length() == 0 && filterOs.length() == 0 && filterArch.length() == 0)
return null;
return "(& " + filterWs + filterOs + filterArch + ")"; //$NON-NLS-1$ //$NON-NLS-2$
@@ -136,9 +145,10 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
}
/**
- * Returns the normalized string form of the given config spec. This is useful for putting
- * in IU ids etc. Note that the result is not intended to be machine readable (i.e., parseConfigSpec
- * may not work on the result).
+ * Returns the normalized string form of the given config spec. This is useful
+ * for putting in IU ids etc. Note that the result is not intended to be machine
+ * readable (i.e., parseConfigSpec may not work on the result).
+ *
* @param configSpec the config spec to format
* @return the readable format of the given config spec
*/
@@ -152,9 +162,10 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
}
/**
- * Creates and returns a collection of RequiredCapabilities for the IUs represented
- * by the given collection. The collection may include a mixture of IInstallableUnits
- * or VersionedNames.
+ * Creates and returns a collection of RequiredCapabilities for the IUs
+ * represented by the given collection. The collection may include a mixture of
+ * IInstallableUnits or VersionedNames.
+ *
* @param children descriptions of the IUs on which requirements are to be made
* @return a collection of RequiredCapabilities representing the given IUs
*/
@@ -164,12 +175,15 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
if (next instanceof IInstallableUnit) {
IInstallableUnit iu = (IInstallableUnit) next;
VersionRange range = new VersionRange(iu.getVersion(), true, iu.getVersion(), true);
- result.add(MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, iu.getId(), range, iu.getFilter() == null ? null : iu.getFilter(), false, false));
+ result.add(MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, iu.getId(), range,
+ iu.getFilter() == null ? null : iu.getFilter(), false, false));
} else {
Version version = next.getVersion();
- VersionRange range = (version == null || Version.emptyVersion.equals(version)) ? VersionRange.emptyRange : new VersionRange(version, true, version, true);
+ VersionRange range = (version == null || Version.emptyVersion.equals(version)) ? VersionRange.emptyRange
+ : new VersionRange(version, true, version, true);
IMatchExpression<IInstallableUnit> filter = getFilterAdvice(next);
- result.add(MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, next.getId(), range, filter, false, false));
+ result.add(MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, next.getId(), range,
+ filter, false, false));
}
}
return result;
@@ -178,7 +192,8 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
private IMatchExpression<IInstallableUnit> getFilterAdvice(IVersionedId name) {
if (info == null)
return null;
- Collection<IFilterAdvice> filterAdvice = info.getAdvice(CONFIG_ANY, true, name.getId(), name.getVersion(), IFilterAdvice.class);
+ Collection<IFilterAdvice> filterAdvice = info.getAdvice(CONFIG_ANY, true, name.getId(), name.getVersion(),
+ IFilterAdvice.class);
for (IFilterAdvice advice : filterAdvice) {
IMatchExpression<IInstallableUnit> result = advice.getFilter(name.getId(), name.getVersion(), false);
if (result != null)
@@ -194,43 +209,55 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
return root;
}
- protected IArtifactDescriptor createPack200ArtifactDescriptor(IArtifactKey key, File pathOnDisk, String installSize) {
- ArtifactDescriptor result = (ArtifactDescriptor) PublisherHelper.createArtifactDescriptor(info, key, pathOnDisk);
- //TODO this size calculation is bogus
+ /**
+ * @noreference This method is not intended to be referenced by clients.
+ * @deprecated See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a> 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()));
}
- IProcessingStepDescriptor[] steps = new IProcessingStepDescriptor[] {new ProcessingStepDescriptor("org.eclipse.equinox.p2.processing.Pack200Unpacker", null, true)}; //$NON-NLS-1$
+ IProcessingStepDescriptor[] steps = new IProcessingStepDescriptor[] {
+ new ProcessingStepDescriptor("org.eclipse.equinox.p2.processing.Pack200Unpacker", null, true) }; //$NON-NLS-1$
result.setProcessingSteps(steps);
result.setProperty(IArtifactDescriptor.FORMAT, IArtifactDescriptor.FORMAT_PACKED);
return result;
}
- protected InstallableUnitDescription createParentIU(Collection<? extends IVersionedId> children, String id, Version version) {
+ protected InstallableUnitDescription createParentIU(Collection<? extends IVersionedId> children, String id,
+ Version version) {
InstallableUnitDescription root = createIUShell(id, version);
root.addRequirements(createIURequirements(children));
addSelfCapability(root);
return root;
}
- //This is to hide FileUtils from other actions
+ // This is to hide FileUtils from other actions
protected IPathComputer createParentPrefixComputer(int segmentsToKeep) {
return FileUtils.createParentPrefixComputer(segmentsToKeep);
}
- //This is to hide FileUtils from other actions
+ // This is to hide FileUtils from other actions
protected IPathComputer createRootPrefixComputer(final File root) {
return FileUtils.createRootPathComputer(root);
}
protected IProvidedCapability createSelfCapability(String installableUnitId, Version installableUnitVersion) {
- return MetadataFactory.createProvidedCapability(PublisherHelper.IU_NAMESPACE, installableUnitId, installableUnitVersion);
+ return MetadataFactory.createProvidedCapability(PublisherHelper.IU_NAMESPACE, installableUnitId,
+ installableUnitVersion);
}
- protected static InstallableUnitDescription[] processAdditionalInstallableUnitsAdvice(IInstallableUnit iu, IPublisherInfo publisherInfo) {
- Collection<IAdditionalInstallableUnitAdvice> advice = publisherInfo.getAdvice(null, false, iu.getId(), iu.getVersion(), IAdditionalInstallableUnitAdvice.class);
+ protected static InstallableUnitDescription[] processAdditionalInstallableUnitsAdvice(IInstallableUnit iu,
+ IPublisherInfo publisherInfo) {
+ Collection<IAdditionalInstallableUnitAdvice> advice = publisherInfo.getAdvice(null, false, iu.getId(),
+ iu.getVersion(), IAdditionalInstallableUnitAdvice.class);
if (advice.isEmpty())
return null;
@@ -244,16 +271,20 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
}
/**
- * Add all of the advised artifact properties for the given IU and artifact descriptor.
- * @param iu the IU
+ * Add all of the advised artifact properties for the given IU and artifact
+ * descriptor.
+ *
+ * @param iu the IU
* @param descriptor the descriptor to decorate
- * @param info the publisher info supplying the advice
+ * @param info the publisher info supplying the advice
*/
- protected static void processArtifactPropertiesAdvice(IInstallableUnit iu, IArtifactDescriptor descriptor, IPublisherInfo info) {
+ protected static void processArtifactPropertiesAdvice(IInstallableUnit iu, IArtifactDescriptor descriptor,
+ IPublisherInfo info) {
if (!(descriptor instanceof SimpleArtifactDescriptor))
return;
- Collection<IPropertyAdvice> advice = info.getAdvice(null, false, iu.getId(), iu.getVersion(), IPropertyAdvice.class);
+ Collection<IPropertyAdvice> advice = info.getAdvice(null, false, iu.getId(), iu.getVersion(),
+ IPropertyAdvice.class);
for (IPropertyAdvice entry : advice) {
Map<String, String> props = entry.getArtifactProperties(iu, descriptor);
if (props == null)
@@ -266,11 +297,13 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
/**
* Add all of the advised IU properties for the given IU.
- * @param iu the IU to decorate
+ *
+ * @param iu the IU to decorate
* @param info the publisher info supplying the advice
*/
protected static void processInstallableUnitPropertiesAdvice(InstallableUnitDescription iu, IPublisherInfo info) {
- Collection<IPropertyAdvice> advice = info.getAdvice(null, false, iu.getId(), iu.getVersion(), IPropertyAdvice.class);
+ Collection<IPropertyAdvice> advice = info.getAdvice(null, false, iu.getId(), iu.getVersion(),
+ IPropertyAdvice.class);
for (IPropertyAdvice entry : advice) {
Map<String, String> props = entry.getInstallableUnitProperties(iu);
if (props == null)
@@ -283,17 +316,19 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
/**
* Add any update descriptor advice to the given IU
- * @param iu the IU to decorate
+ *
+ * @param iu the IU to decorate
* @param info the publisher info supplying the advice
*/
protected static void processUpdateDescriptorAdvice(InstallableUnitDescription iu, IPublisherInfo info) {
- Collection<IUpdateDescriptorAdvice> advice = info.getAdvice(null, false, iu.getId(), iu.getVersion(), IUpdateDescriptorAdvice.class);
+ Collection<IUpdateDescriptorAdvice> advice = info.getAdvice(null, false, iu.getId(), iu.getVersion(),
+ IUpdateDescriptorAdvice.class);
if (advice.isEmpty())
return;
for (IUpdateDescriptorAdvice entry : advice) {
- //process the IU Descriptor
+ // process the IU Descriptor
IUpdateDescriptor updateDescriptor = entry.getUpdateDescriptor(iu);
if (updateDescriptor != null) {
iu.setUpdateDescriptor(updateDescriptor);
@@ -302,23 +337,27 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
}
/**
- * Add all of the advised provided and required capabilities for the given installable unit.
- * @param iu the IU to decorate
+ * Add all of the advised provided and required capabilities for the given
+ * installable unit.
+ *
+ * @param iu the IU to decorate
* @param info the publisher info supplying the advice
*/
protected static void processCapabilityAdvice(InstallableUnitDescription iu, IPublisherInfo info) {
- Collection<ICapabilityAdvice> advice = info.getAdvice(null, false, iu.getId(), iu.getVersion(), ICapabilityAdvice.class);
+ Collection<ICapabilityAdvice> advice = info.getAdvice(null, false, iu.getId(), iu.getVersion(),
+ ICapabilityAdvice.class);
if (advice.isEmpty())
return;
for (ICapabilityAdvice entry : advice) {
- //process required capabilities
+ // process required capabilities
IRequirement[] requiredAdvice = entry.getRequiredCapabilities(iu);
if (requiredAdvice != null) {
List<IRequirement> current = iu.getRequirements();
Set<IRequirement> resultRequiredCapabilities = new HashSet<>(current);
- // remove current required capabilities that match (same name and namespace) advice.
+ // remove current required capabilities that match (same name and namespace)
+ // advice.
for (IRequirement currReq : current) {
IRequiredCapability currentRequiredCapability = toRequiredCapability(currReq);
if (currentRequiredCapability == null) {
@@ -331,7 +370,8 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
continue;
}
- if (requiredCapability.getNamespace().equals(currentRequiredCapability.getNamespace()) && requiredCapability.getName().equals(currentRequiredCapability.getName())) {
+ if (requiredCapability.getNamespace().equals(currentRequiredCapability.getNamespace())
+ && requiredCapability.getName().equals(currentRequiredCapability.getName())) {
resultRequiredCapabilities.remove(currentRequiredCapability);
break;
}
@@ -339,16 +379,18 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
}
// add all advice
resultRequiredCapabilities.addAll(Arrays.asList(requiredAdvice));
- iu.setRequirements(resultRequiredCapabilities.toArray(new IRequirement[resultRequiredCapabilities.size()]));
+ iu.setRequirements(
+ resultRequiredCapabilities.toArray(new IRequirement[resultRequiredCapabilities.size()]));
}
- //process meta required capabilities
+ // process meta required capabilities
IRequirement[] metaRequiredAdvice = entry.getMetaRequiredCapabilities(iu);
if (metaRequiredAdvice != null) {
Collection<IRequirement> current = iu.getMetaRequirements();
Set<IRequirement> resultMetaRequiredCapabilities = new HashSet<>(current);
- // remove current meta-required capabilities that match (same name and namespace) advice.
+ // remove current meta-required capabilities that match (same name and
+ // namespace) advice.
for (IRequirement currMetaReq : current) {
IRequiredCapability currentMetaRequiredCapability = toRequiredCapability(currMetaReq);
if (currentMetaRequiredCapability == null) {
@@ -361,7 +403,8 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
continue;
}
- if (metaRequiredCapability.getNamespace().equals(currentMetaRequiredCapability.getNamespace()) && metaRequiredCapability.getName().equals(currentMetaRequiredCapability.getName())) {
+ if (metaRequiredCapability.getNamespace().equals(currentMetaRequiredCapability.getNamespace())
+ && metaRequiredCapability.getName().equals(currentMetaRequiredCapability.getName())) {
resultMetaRequiredCapabilities.remove(currentMetaRequiredCapability);
break;
}
@@ -370,24 +413,27 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
// add all advice
resultMetaRequiredCapabilities.addAll(Arrays.asList(metaRequiredAdvice));
- iu.setMetaRequirements(resultMetaRequiredCapabilities.toArray(new IRequirement[resultMetaRequiredCapabilities.size()]));
+ iu.setMetaRequirements(resultMetaRequiredCapabilities
+ .toArray(new IRequirement[resultMetaRequiredCapabilities.size()]));
}
- //process provided capabilities
+ // process provided capabilities
IProvidedCapability[] providedAdvice = entry.getProvidedCapabilities(iu);
if (providedAdvice != null) {
Collection<IProvidedCapability> current = iu.getProvidedCapabilities();
Set<IProvidedCapability> resultProvidedCapabilities = new HashSet<>(current);
for (IProvidedCapability currentProvidedCapability : current) {
for (IProvidedCapability providedCapability : providedAdvice) {
- if (providedCapability.getNamespace().equals(currentProvidedCapability.getNamespace()) && providedCapability.getName().equals(currentProvidedCapability.getName())) {
+ if (providedCapability.getNamespace().equals(currentProvidedCapability.getNamespace())
+ && providedCapability.getName().equals(currentProvidedCapability.getName())) {
resultProvidedCapabilities.remove(currentProvidedCapability);
break;
}
}
}
resultProvidedCapabilities.addAll(Arrays.asList(providedAdvice));
- iu.setCapabilities(resultProvidedCapabilities.toArray(new IProvidedCapability[resultProvidedCapabilities.size()]));
+ iu.setCapabilities(
+ resultProvidedCapabilities.toArray(new IProvidedCapability[resultProvidedCapabilities.size()]));
}
}
}
@@ -407,16 +453,21 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
/**
* Adds all applicable touchpoint advice to the given installable unit.
- * @param iu The installable unit to add touchpoint advice to
- * @param currentInstructions The set of touchpoint instructions assembled for this IU so far
- * @param info The publisher info
+ *
+ * @param iu The installable unit to add touchpoint advice to
+ * @param currentInstructions The set of touchpoint instructions assembled for
+ * this IU so far
+ * @param info The publisher info
*/
- protected static void processTouchpointAdvice(InstallableUnitDescription iu, Map<String, ? extends Object> currentInstructions, IPublisherInfo info) {
+ protected static void processTouchpointAdvice(InstallableUnitDescription iu,
+ Map<String, ? extends Object> currentInstructions, IPublisherInfo info) {
processTouchpointAdvice(iu, currentInstructions, info, null);
}
- protected static void processTouchpointAdvice(InstallableUnitDescription iu, Map<String, ? extends Object> currentInstructions, IPublisherInfo info, String configSpec) {
- Collection<ITouchpointAdvice> advice = info.getAdvice(configSpec, false, iu.getId(), iu.getVersion(), ITouchpointAdvice.class);
+ protected static void processTouchpointAdvice(InstallableUnitDescription iu,
+ Map<String, ? extends Object> currentInstructions, IPublisherInfo info, String configSpec) {
+ Collection<ITouchpointAdvice> advice = info.getAdvice(configSpec, false, iu.getId(), iu.getVersion(),
+ ITouchpointAdvice.class);
if (currentInstructions == null) {
if (advice == null || advice.isEmpty())
return;
@@ -433,10 +484,13 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
}
/**
- * Publishes the artifact by zipping the <code>files</code> using <code>root</code>
- * as a base for relative paths. Then copying the zip into the repository.
- * @param descriptor used to identify the zip.
- * @param inclusion the file to be published. files can be <code>null</code> but no action is taken.
+ * Publishes the artifact by zipping the <code>files</code> using
+ * <code>root</code> as a base for relative paths. Then copying the zip into the
+ * repository.
+ *
+ * @param descriptor used to identify the zip.
+ * @param inclusion the file to be published. files can be <code>null</code>
+ * but no action is taken.
* @param publisherInfo the publisher info.
*/
protected void publishArtifact(IArtifactDescriptor descriptor, File inclusion, IPublisherInfo publisherInfo) {
@@ -448,13 +502,15 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
if (destination == null || destination.contains(descriptor))
return;
- // if all we are doing is indexing things then add the descriptor and get on with it
- if ((publisherInfo.getArtifactOptions() & IPublisherInfo.A_PUBLISH) == 0) {
+ // if all we are doing is indexing things then add the descriptor and get on
+ // with it
+ if (!PublisherHelper.isArtifactPublish(publisherInfo)) {
destination.addDescriptor(descriptor, new NullProgressMonitor());
return;
}
- // if the file is already in the same location the repo will put it, just add the descriptor and exit
+ // if the file is already in the same location the repo will put it, just add
+ // the descriptor and exit
if (destination instanceof IFileArtifactRepository) {
File descriptorFile = ((IFileArtifactRepository) destination).getArtifactFile(descriptor);
if (inclusion.equals(descriptorFile)) {
@@ -477,15 +533,20 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
}
/**
- * Publishes the artifact by zipping the <code>files</code> using <code>root</code>
- * as a base for relative paths. Then copying the zip into the repository.
- * @param descriptor used to identify the zip.
- * @param inclusions and folders to be included in the zip. files can be null.
- * @param exclusions and folders to be excluded in the zip. files can be null.
- * @param publisherInfo the publisher info.
+ * Publishes the artifact by zipping the <code>files</code> using
+ * <code>root</code> as a base for relative paths. Then copying the zip into the
+ * repository.
+ *
+ * @param descriptor used to identify the zip.
+ * @param inclusions and folders to be included in the zip. files can be
+ * null.
+ * @param exclusions and folders to be excluded in the zip. files can be
+ * null.
+ * @param publisherInfo the publisher info.
* @param prefixComputer
*/
- protected void publishArtifact(IArtifactDescriptor descriptor, File[] inclusions, File[] exclusions, IPublisherInfo publisherInfo, IPathComputer prefixComputer) {
+ protected void publishArtifact(IArtifactDescriptor descriptor, File[] inclusions, File[] exclusions,
+ IPublisherInfo publisherInfo, IPathComputer prefixComputer) {
// no files to publish so this is done.
if (inclusions == null || inclusions.length < 1)
return;
@@ -493,15 +554,18 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
IArtifactRepository destination = publisherInfo.getArtifactRepository();
if (destination == null || destination.contains(descriptor))
return;
- // if all we are doing is indexing things then add the descriptor and get on with it
- if ((publisherInfo.getArtifactOptions() & IPublisherInfo.A_PUBLISH) == 0) {
+ // if all we are doing is indexing things then add the descriptor and get on
+ // with it
+ if (!PublisherHelper.isArtifactPublish(publisherInfo)) {
destination.addDescriptor(descriptor, new NullProgressMonitor());
return;
}
// TODO need to implement the overwrite story in the repos
- // boolean overwrite = (info.getArtifactOptions() & IPublisherInfo.A_OVERWRITE) > 0;
- // if there is just one file and the mode is as-is, just copy the file into the repo
+ // boolean overwrite = (info.getArtifactOptions() & IPublisherInfo.A_OVERWRITE)
+ // > 0;
+ // if there is just one file and the mode is as-is, just copy the file into the
+ // repo
// otherwise, zip up the files and copy the zip into the repo
File tempFile = null;
try {
@@ -525,9 +589,10 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
}
/**
- * Loop over the known metadata repositories looking for the given IU.
- * Return the first IU found.
- * @param iuId the id of the IU to look for
+ * Loop over the known metadata repositories looking for the given IU. Return
+ * the first IU found.
+ *
+ * @param iuId the id of the IU to look for
* @return the first matching IU or <code>null</code> if none.
*/
protected IInstallableUnit queryForIU(IPublisherResult publisherResult, String iuId, Version version) {
@@ -549,13 +614,16 @@ public abstract class AbstractPublisherAction implements IPublisherAction {
}
/**
- * Loop over the known metadata repositories looking for the given IU within a particular range
+ * Loop over the known metadata repositories looking for the given IU within a
+ * particular range
+ *
* @param publisherResult
- * @param iuId the id of the IU to look for
- * @param versionRange the version range to consider
+ * @param iuId the id of the IU to look for
+ * @param versionRange the version range to consider
* @return The the IUs with the matching ids in the given range
*/
- protected IQueryResult<IInstallableUnit> queryForIUs(IPublisherResult publisherResult, String iuId, VersionRange versionRange) {
+ protected IQueryResult<IInstallableUnit> queryForIUs(IPublisherResult publisherResult, String iuId,
+ VersionRange versionRange) {
IQuery<IInstallableUnit> query = null;
IQueryResult<IInstallableUnit> queryResult = Collector.emptyCollector();
query = QueryUtil.createIUQuery(iuId, versionRange);
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 5a380a8e2..6f2dee301 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
@@ -7,7 +7,7 @@
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
- *
+ *
* Contributors:
* IBM Corporation - initial API and implementation
* EclipseSource - ongoing development
@@ -37,14 +37,19 @@ import org.osgi.framework.ServiceReference;
public abstract class AbstractPublisherApplication implements IApplication {
- // The mapping rules for in-place generation need to construct paths into the structure
- // of an eclipse installation; in the future the default artifact mapping declared in
- // SimpleArtifactRepository may change, for example, to not have a 'bundles' directory
- // instead of a 'plugins' directory, so a separate constant is defined and used here.
- static final protected 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$
+ // The mapping rules for in-place generation need to construct paths into the
+ // structure
+ // of an eclipse installation; in the future the default artifact mapping
+ // declared in
+ // SimpleArtifactRepository may change, for example, to not have a 'bundles'
+ // directory
+ // instead of a 'plugins' directory, so a separate constant is defined and used
+ // here.
+ static final protected 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$
static final public String PUBLISH_PACK_FILES_AS_SIBLINGS = "publishPackFilesAsSiblings"; //$NON-NLS-1$
@@ -56,7 +61,7 @@ public abstract class AbstractPublisherApplication implements IApplication {
protected String artifactRepoName;
protected URI[] contextMetadataRepositories;
protected URI[] contextArtifactRepositories;
- //whether repository xml files should be compressed
+ // whether repository xml files should be compressed
protected boolean compress = false;
protected boolean inplace = false;
protected boolean append = false;
@@ -69,8 +74,8 @@ public abstract class AbstractPublisherApplication implements IApplication {
protected IProvisioningAgent agent;
/**
- * Returns the error message for this application, or the empty string
- * if the application terminated successfully.
+ * Returns the error message for this application, or the empty string if the
+ * application terminated successfully.
*/
public IStatus getStatus() {
return status;
@@ -83,7 +88,8 @@ public abstract class AbstractPublisherApplication implements IApplication {
metadataLocation = location.toURI();
if (artifactLocation == null)
artifactLocation = location.toURI();
- publisherInfo.setArtifactOptions(publisherInfo.getArtifactOptions() | IPublisherInfo.A_INDEX | IPublisherInfo.A_PUBLISH);
+ publisherInfo.setArtifactOptions(
+ publisherInfo.getArtifactOptions() | IPublisherInfo.A_INDEX | IPublisherInfo.A_PUBLISH);
}
initializeRepositories(publisherInfo);
}
@@ -99,14 +105,18 @@ public abstract class AbstractPublisherApplication implements IApplication {
protected void initializeRepositories(PublisherInfo publisherInfo) throws ProvisionException {
if (artifactLocation != null) {
- IArtifactRepository repo = Publisher.createArtifactRepository(agent, artifactLocation, artifactRepoName, compress, reusePackedFiles);
+ @SuppressWarnings("removal")
+ IArtifactRepository repo = Publisher.createArtifactRepository(agent, artifactLocation, artifactRepoName,
+ compress, reusePackedFiles);
if (!append && !isEmpty(repo)) {
File repoLocation = URIUtil.toFile(artifactLocation);
if (repoLocation != null && source != null) {
if (repoLocation.isFile())
repoLocation = repoLocation.getParentFile();
if (repoLocation.equals(new File(source)))
- throw new IllegalArgumentException(NLS.bind(Messages.exception_artifactRepoNoAppendDestroysInput, URIUtil.toUnencodedString(artifactLocation)));
+ throw new IllegalArgumentException(
+ NLS.bind(Messages.exception_artifactRepoNoAppendDestroysInput,
+ URIUtil.toUnencodedString(artifactLocation)));
}
repo.removeAll(new NullProgressMonitor());
}
@@ -115,7 +125,8 @@ public abstract class AbstractPublisherApplication implements IApplication {
throw new ProvisionException(createConfigurationEror(Messages.exception_noArtifactRepo));
if (metadataLocation == null)
throw new ProvisionException(createConfigurationEror(Messages.exception_noMetadataRepo));
- publisherInfo.setMetadataRepository(Publisher.createMetadataRepository(agent, metadataLocation, metadataRepoName, append, compress));
+ publisherInfo.setMetadataRepository(
+ Publisher.createMetadataRepository(agent, metadataLocation, metadataRepoName, append, compress));
if (contextMetadataRepositories != null && contextMetadataRepositories.length > 0) {
CompositeMetadataRepository contextMetadata = CompositeMetadataRepository.createMemoryComposite(agent);
@@ -147,8 +158,10 @@ public abstract class AbstractPublisherApplication implements IApplication {
// check for args without parameters (i.e., a flag arg)
processFlag(args[i], publisherInfo);
- // check for args with parameters. If we are at the last argument or if the next one
- // has a '-' as the first character, then we can't have an arg with a parm so continue.
+ // check for args with parameters. If we are at the last argument or if the next
+ // one
+ // has a '-' as the first character, then we can't have an arg with a parm so
+ // continue.
if (i == args.length - 1 || args[i + 1].startsWith("-")) //$NON-NLS-1$
continue;
processParameter(args[i], args[++i], publisherInfo);
@@ -157,9 +170,11 @@ public abstract class AbstractPublisherApplication implements IApplication {
/**
* Process application arguments.
+ *
* @throws URISyntaxException thrown by subclasses
*/
- protected void processParameter(String arg, String parameter, PublisherInfo publisherInfo) throws URISyntaxException {
+ protected void processParameter(String arg, String parameter, PublisherInfo publisherInfo)
+ throws URISyntaxException {
try {
if (arg.equalsIgnoreCase("-metadataRepository") || arg.equalsIgnoreCase("-mr")) //$NON-NLS-1$ //$NON-NLS-2$
metadataLocation = URIUtil.fromString(parameter);
@@ -174,8 +189,10 @@ public abstract class AbstractPublisherApplication implements IApplication {
metadataRepoName = parameter;
if (arg.equalsIgnoreCase("-source")) { //$NON-NLS-1$
- // check here to see if the location actually exists so we can fail gracefully now rather than unpredictably later
- // see bug 272956 where we would fail with an NPE if someone gave us a URL instead of a file-system path
+ // check here to see if the location actually exists so we can fail gracefully
+ // now rather than unpredictably later
+ // see bug 272956 where we would fail with an NPE if someone gave us a URL
+ // instead of a file-system path
if (!new File(parameter).exists())
throw new IllegalArgumentException(NLS.bind(Messages.exception_sourcePath, parameter));
source = parameter;
@@ -204,7 +221,7 @@ public abstract class AbstractPublisherApplication implements IApplication {
for (String uri : list) {
try {
result.add(URIUtil.fromString(uri));
- }catch (URISyntaxException e) {
+ } catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
@@ -220,7 +237,7 @@ public abstract class AbstractPublisherApplication implements IApplication {
if (arg.equalsIgnoreCase("-publishArtifactRepository") || arg.equalsIgnoreCase("-par")) //$NON-NLS-1$ //$NON-NLS-2$
publisherInfo.setArtifactOptions(publisherInfo.getArtifactOptions() | IPublisherInfo.A_INDEX);
- if (arg.equalsIgnoreCase("-overwriteArtifacts")) //$NON-NLS-1$
+ if (arg.equalsIgnoreCase("-overwriteArtifacts")) //$NON-NLS-1$
publisherInfo.setArtifactOptions(publisherInfo.getArtifactOptions() | IPublisherInfo.A_OVERWRITE);
if (arg.equalsIgnoreCase("-append")) //$NON-NLS-1$
@@ -243,13 +260,14 @@ public abstract class AbstractPublisherApplication implements IApplication {
if (agent != null)
return;
}
- ServiceReference<IProvisioningAgentProvider> providerRef = Activator.getContext().getServiceReference(IProvisioningAgentProvider.class);
+ ServiceReference<IProvisioningAgentProvider> providerRef = Activator.getContext()
+ .getServiceReference(IProvisioningAgentProvider.class);
if (providerRef == null)
throw new RuntimeException("No provisioning agent provider is available"); //$NON-NLS-1$
IProvisioningAgentProvider provider = Activator.getContext().getService(providerRef);
if (provider == null)
throw new RuntimeException("No provisioning agent provider is available"); //$NON-NLS-1$
- //obtain agent for currently running system
+ // obtain agent for currently running system
agent = provider.createAgent(null);
Activator.getContext().ungetService(providerRef);
}
@@ -304,7 +322,8 @@ public abstract class AbstractPublisherApplication implements IApplication {
}
}
if (!result.matches(IStatus.ERROR | IStatus.CANCEL)) {
- System.out.println(NLS.bind(Messages.message_generationCompleted, String.valueOf((after - before) / 1000)));
+ System.out.println(
+ NLS.bind(Messages.message_generationCompleted, String.valueOf((after - before) / 1000)));
return IApplication.EXIT_OK;
}
} catch (ProvisionException e) {
@@ -343,6 +362,13 @@ public abstract class AbstractPublisherApplication implements IApplication {
this.metadataLocation = location;
}
+ /**
+ * @noreference This method is not intended to be referenced by clients.
+ * @deprecated See <a href=
+ * "https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a>
+ * for details.
+ */
+ @Deprecated(forRemoval = true, since = "1.6.0")
public boolean reuseExistingPack200Files() {
return reusePackedFiles;
}
diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/IPublisherInfo.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/IPublisherInfo.java
index 0e88610aa..33796f507 100644
--- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/IPublisherInfo.java
+++ b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/IPublisherInfo.java
@@ -8,8 +8,8 @@
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
+ *
+ * Contributors:
* Code 9 - initial API and implementation
* IBM - ongoing development
******************************************************************************/
@@ -40,7 +40,7 @@ public interface IPublisherInfo {
public static final int A_OVERWRITE = 4;
/**
- * A bitwise flag indicating that MD5 hash should not be generated when
+ * A bitwise flag indicating that MD5 hash should not be generated when
* publishing an artifact. When this flag is not specified the MD5 hash will
* be generated by default.
*/
@@ -61,9 +61,9 @@ public interface IPublisherInfo {
public IMetadataRepository getMetadataRepository();
/**
- * Returns whether or not artifacts themselves should be published.
- * @return <code>true</code> if artifacts should be published.
- * <code>false</code> otherwise.
+ * Returns a bitflag that controls the publish operation, what is a bitwhise OR
+ * of {@link #A_INDEX},{@value #A_PUBLISH}, {@link #A_NO_MD5},
+ * {@link #A_OVERWRITE} or <code>0</code> if no flags are set.
*/
public int getArtifactOptions();
@@ -80,7 +80,7 @@ public interface IPublisherInfo {
public <T extends IPublisherAdvice> Collection<T> getAdvice(String configSpec, boolean includeDefault, String id, Version version, Class<T> type);
/**
- * Add the given advice to the set of publishing advices.
+ * Add the given advice to the set of publishing advices.
* @param advice the advice to retain
*/
public void addAdvice(IPublisherAdvice advice);
@@ -95,19 +95,19 @@ public interface IPublisherInfo {
public String[] getConfigurations();
/**
- * Returns the artifact repository given to the publisher as context for
- * the publisher actions. May be <code>null</code>. Note that multiple
+ * Returns the artifact repository given to the publisher as context for
+ * the publisher actions. May be <code>null</code>. Note that multiple
* repositories may be represented as one composite repository.
- *
+ *
* @return the context artifact repository or <code>null</code> if none.
*/
public IArtifactRepository getContextArtifactRepository();
/**
- * Returns the metadata repository given to the publisher as context for
- * the publisher actions. May be <code>null</code>. Note that multiple
+ * Returns the metadata repository given to the publisher as context for
+ * the publisher actions. May be <code>null</code>. Note that multiple
* repositories may be represented as one composite repository.
- *
+ *
* @return the context metadata repository or <code>null</code> if none.
*/
public IMetadataRepository getContextMetadataRepository();
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 9fcd96efd..ebbdde5ea 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
@@ -8,8 +8,8 @@
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
+ *
+ * Contributors:
* Code 9 - initial API and implementation
* IBM - ongoing development
******************************************************************************/
@@ -37,18 +37,21 @@ public class Publisher {
private IPublisherResult results;
/**
- * Returns a metadata 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
+ * Returns a metadata 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 append whether or not the repository should appended or cleared
+ * @param name the name of the repository
+ * @param append whether or not the repository should appended or cleared
* @param compress whether or not to compress the repository index
* @return the discovered or created repository
* @throws ProvisionException
*/
- public static IMetadataRepository createMetadataRepository(IProvisioningAgent agent, URI location, String name, boolean append, boolean compress) throws ProvisionException {
+ public static IMetadataRepository createMetadataRepository(IProvisioningAgent agent, URI location, String name,
+ boolean append, boolean compress) throws ProvisionException {
try {
IMetadataRepository result = loadMetadataRepository(agent, location, true, true);
if (result != null && result.isModifiable()) {
@@ -58,54 +61,75 @@ public class Publisher {
return result;
}
} catch (ProvisionException e) {
- //fall through and create a new repository
+ // fall through and create a new repository
}
- // the given repo location is not an existing repo so we have to create something
+ // the given repo location is not an existing repo so we have to create
+ // something
IMetadataRepositoryManager manager = getService(agent, IMetadataRepositoryManager.SERVICE_NAME);
String repositoryName = name == null ? location + " - metadata" : name; //$NON-NLS-1$
- IMetadataRepository result = manager.createRepository(location, repositoryName, IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, null);
+ IMetadataRepository result = manager.createRepository(location, repositoryName,
+ IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, null);
if (result != null) {
manager.removeRepository(result.getLocation());
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
+ // 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.metadata.repository.Messages.repoMan_internalError;
- throw new ProvisionException(new Status(IStatus.ERROR, Activator.ID, ProvisionException.INTERNAL_ERROR, msg, null));
+ throw new ProvisionException(
+ new Status(IStatus.ERROR, Activator.ID, ProvisionException.INTERNAL_ERROR, msg, null));
}
/**
* Load a metadata repository from the given location.
- * @param location the URI location of the repository
- * @param modifiable whether to ask the manager for a modifiable repository
- * @param removeFromManager remove the loaded repository from the manager if it wasn't already loaded
+ *
+ * @param location the URI location of the repository
+ * @param modifiable whether to ask the manager for a modifiable
+ * repository
+ * @param removeFromManager remove the loaded repository from the manager if it
+ * wasn't already loaded
* @return the loaded repository
* @throws ProvisionException
*/
- public static IMetadataRepository loadMetadataRepository(IProvisioningAgent agent, URI location, boolean modifiable, boolean removeFromManager) throws ProvisionException {
+ public static IMetadataRepository loadMetadataRepository(IProvisioningAgent agent, URI location, boolean modifiable,
+ boolean removeFromManager) throws ProvisionException {
IMetadataRepositoryManager manager = getService(agent, IMetadataRepositoryManager.SERVICE_NAME);
boolean existing = manager.contains(location);
- IMetadataRepository result = manager.loadRepository(location, modifiable ? IRepositoryManager.REPOSITORY_HINT_MODIFIABLE : 0, null);
+ IMetadataRepository result = manager.loadRepository(location,
+ modifiable ? IRepositoryManager.REPOSITORY_HINT_MODIFIABLE : 0, null);
if (!existing && removeFromManager)
manager.removeRepository(location);
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
+ * 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 <a href=
+ * "https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a>
+ * for details. Use
+ * {@link #createArtifactRepository(IprovisioningAgent, URI, String, boolean)}
+ * instead.
*/
- public static IArtifactRepository createArtifactRepository(IProvisioningAgent agent, URI location, String name, boolean compress, boolean reusePackedFiles) throws ProvisionException {
+ @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()) {
@@ -115,12 +139,13 @@ public class Publisher {
return result;
}
} catch (ProvisionException e) {
- //fall through and create a new repository
+ // 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);
+ IArtifactRepository result = manager.createRepository(location, repositoryName,
+ IArtifactRepositoryManager.TYPE_SIMPLE_REPOSITORY, null);
if (result != null) {
manager.removeRepository(result.getLocation());
if (reusePackedFiles)
@@ -128,24 +153,73 @@ public class Publisher {
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
+ // 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
+ * 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
+ * @return the discovered or created repository
+ * @throws ProvisionException
+ */
+ @Deprecated(forRemoval = true, since = "2.3.0")
+ public static IArtifactRepository createArtifactRepository(IProvisioningAgent agent, URI location, String name,
+ boolean compress) 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$
+ 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());
+ 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));
+ throw new ProvisionException(
+ new Status(IStatus.ERROR, Activator.ID, ProvisionException.INTERNAL_ERROR, msg, null));
}
/**
* Load an artifact repository from the given location.
- * @param location the URI location of the repository
- * @param modifiable whether to ask the manager for a modifiable repository
- * @param removeFromManager remove the loaded repository from the manager if it wasn't already loaded
+ *
+ * @param location the URI location of the repository
+ * @param modifiable whether to ask the manager for a modifiable
+ * repository
+ * @param removeFromManager remove the loaded repository from the manager if it
+ * wasn't already loaded
* @return the loaded repository
* @throws ProvisionException
*/
- public static IArtifactRepository loadArtifactRepository(IProvisioningAgent agent, URI location, boolean modifiable, boolean removeFromManager) throws ProvisionException {
+ public static IArtifactRepository loadArtifactRepository(IProvisioningAgent agent, URI location, boolean modifiable,
+ boolean removeFromManager) throws ProvisionException {
IArtifactRepositoryManager manager = getService(agent, IArtifactRepositoryManager.SERVICE_NAME);
boolean existing = manager.contains(location);
- IArtifactRepository result = manager.loadRepository(location, modifiable ? IRepositoryManager.REPOSITORY_HINT_MODIFIABLE : 0, null);
+ IArtifactRepository result = manager.loadRepository(location,
+ modifiable ? IRepositoryManager.REPOSITORY_HINT_MODIFIABLE : 0, null);
if (!existing && removeFromManager)
manager.removeRepository(location);
return result;
@@ -157,12 +231,13 @@ public class Publisher {
}
/**
- * Obtains a service from the agent, waiting for a reasonable timeout period
- * if the service is not yet available. This method never returns <code>null</code>;
- * an exception is thrown if the service could not be obtained.
- *
- * @param <T> The type of the service to return
- * @param agent The agent to obtain the service from
+ * Obtains a service from the agent, waiting for a reasonable timeout period if
+ * the service is not yet available. This method never returns
+ * <code>null</code>; an exception is thrown if the service could not be
+ * obtained.
+ *
+ * @param <T> The type of the service to return
+ * @param agent The agent to obtain the service from
* @param serviceName The name of the service to obtain
* @return The service instance
*/
@@ -176,13 +251,13 @@ public class Publisher {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
- //ignore and keep waiting
+ // ignore and keep waiting
}
service = (T) agent.getService(serviceName);
if (service != null)
return service;
} while ((System.currentTimeMillis() - start) < SERVICE_TIMEOUT);
- //could not obtain the service
+ // could not obtain the service
throw new IllegalStateException("Unable to obtain required service: " + serviceName); //$NON-NLS-1$
}
@@ -236,7 +311,7 @@ public class Publisher {
if (info.getArtifactRepository() != null) {
finalStatus = info.getArtifactRepository().executeBatch(artifactProcess, sub);
if (!finalStatus.matches(IStatus.ERROR | IStatus.CANCEL))
- // If the batch process didn't report any errors, then
+ // If the batch process didn't report any errors, then
// Use the status from our actions
finalStatus = artifactProcess.getStatus();
} else {
diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/actions/JREAction.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/actions/JREAction.java
index 55bf28314..f9c52621f 100644
--- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/actions/JREAction.java
+++ b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/p2/publisher/actions/JREAction.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2018 Code 9 and others.
+ * Copyright (c) 2008, 2021 Code 9 and others.
*
* This
* program and the accompanying materials are made available under the terms of
@@ -17,7 +17,10 @@
package org.eclipse.equinox.p2.publisher.actions;
import java.io.*;
+import java.lang.module.ModuleDescriptor;
+import java.lang.module.ModuleDescriptor.Exports;
import java.net.URL;
+import java.nio.file.Files;
import java.util.*;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.internal.p2.core.helpers.CollectionUtils;
@@ -38,8 +41,8 @@ import org.osgi.framework.*;
public class JREAction extends AbstractPublisherAction {
private static final String DEFAULT_JRE_NAME = "a.jre"; //$NON-NLS-1$
- private static final Version DEFAULT_JRE_VERSION = Version.parseVersion("9.0"); //$NON-NLS-1$
- private static final String DEFAULT_PROFILE = "JavaSE-9"; //$NON-NLS-1$
+ private static final Version DEFAULT_JRE_VERSION = Version.parseVersion("11.0"); //$NON-NLS-1$
+ private static final String DEFAULT_PROFILE = "JavaSE-11"; //$NON-NLS-1$
private static final String PROFILE_LOCATION = "jre.action.profile.location"; //$NON-NLS-1$
private static final String PROFILE_NAME = "osgi.java.profile.name"; //$NON-NLS-1$
private static final String PROFILE_TARGET_VERSION = "org.eclipse.jdt.core.compiler.codegen.targetPlatform"; //$NON-NLS-1$
@@ -102,7 +105,8 @@ public class JREAction extends AbstractPublisherAction {
cu.setId(configId);
cu.setVersion(iu.getVersion());
VersionRange range = iu.getVersion() == Version.emptyVersion ? VersionRange.emptyRange : new VersionRange(iu.getVersion(), true, Version.MAX_VERSION, true);
- cu.setHost(new IRequirement[] {MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, iu.getId(), range, null, false, false)});
+ cu.setHost(MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, iu.getId(), range, null, false,
+ false));
cu.setProperty(InstallableUnitDescription.PROP_TYPE_FRAGMENT, Boolean.TRUE.toString());
cu.setCapabilities(new IProvidedCapability[] {PublisherHelper.createSelfCapability(configId, iu.getVersion())});
cu.setTouchpointType(PublisherHelper.TOUCHPOINT_NATIVE);
@@ -195,10 +199,8 @@ public class JREAction extends AbstractPublisherAction {
for (String namespace : namespaces) {
if (NAMESPACE_OSGI_EE.equals(namespace)) { // this is the OSGi capability namespace "osgi.ee"
parseEECapability(systemCapability, parsingStatus, parsingResult);
-
} else {
parsingStatus.add(newWarningStatus(NLS.bind(Messages.message_eeIgnoringNamespace, namespace)));
- continue;
}
}
}
@@ -297,8 +299,22 @@ public class JREAction extends AbstractPublisherAction {
}
private void initialize(IPublisherInfo publisherInfo) {
+ File runtimeProfile = null;
this.info = publisherInfo;
-
+ if (jreLocation == null && environment == null) {
+ // create a runtime profile
+ StringBuilder buffer = createDefaultProfileFromRunningJvm();
+ try {
+ File tempDirectory = Files.createTempDirectory("JREAction").toFile(); //$NON-NLS-1$
+ runtimeProfile = new File(tempDirectory, DEFAULT_PROFILE + ".profile"); //$NON-NLS-1$
+ try (FileWriter writer = new FileWriter(runtimeProfile)) {
+ writer.write(buffer.toString());
+ }
+ jreLocation = runtimeProfile;
+ } catch (IOException e) {
+ // ignore
+ }
+ }
if (jreLocation != null) {
File javaProfile = null;
@@ -322,6 +338,122 @@ public class JREAction extends AbstractPublisherAction {
URL profileURL = getResouceFromSystemBundle(profileFile);
profileProperties = loadProfile(profileURL);
}
+ if (runtimeProfile != null) {
+ runtimeProfile.delete();
+ runtimeProfile.getParentFile().delete();
+ }
+ }
+
+ /*
+ * Copied from org.eclipse.osgi.storage.Storage.calculateVMPackages and adopted
+ * to Java 11
+ */
+ private String calculateVMPackages() {
+ try {
+ List<String> packages = new ArrayList<>();
+ ModuleLayer bootLayer = ModuleLayer.boot();
+ Set<Module> bootModules = bootLayer.modules();
+ for (Module m : bootModules) {
+ ModuleDescriptor descriptor = m.getDescriptor();
+ if (descriptor.isAutomatic()) {
+ /*
+ * Automatic modules are supposed to export all their packages. However,
+ * java.lang.module.ModuleDescriptor::exports returns an empty set for them. Add
+ * all their packages (as returned by
+ * java.lang.module.ModuleDescriptor::packages) to the list of VM supplied
+ * packages.
+ */
+ packages.addAll(descriptor.packages());
+ } else {
+ for (Exports export : descriptor.exports()) {
+ String pkg = export.source();
+ if (!export.isQualified()) {
+ packages.add(pkg);
+ }
+ }
+ }
+ }
+ Collections.sort(packages);
+ StringBuilder result = new StringBuilder();
+ for (String pkg : packages) {
+ if (result.length() != 0) {
+ result.append(',').append(' ');
+ }
+ result.append(pkg);
+ }
+ return result.toString();
+ } catch (Exception e) {
+
+ return null;
+ }
+ }
+
+ /**
+ * Creates default profile with minumum version as stated by
+ * {@link #DEFAULT_PROFILE} and adds packages observed on currently used JVM.
+ *
+ * @return generated profile content
+ */
+ @SuppressWarnings("nls")
+ private StringBuilder createDefaultProfileFromRunningJvm() {
+ StringBuilder buffer = new StringBuilder();
+ final String NEWLINE = System.lineSeparator();
+ // add systempackages
+ buffer.append("org.osgi.framework.system.packages = \\");
+ buffer.append(NEWLINE);
+ buffer.append(' ');
+ String calculateVMPackages = calculateVMPackages();
+ if (calculateVMPackages != null) {
+ String[] pack;
+ pack = calculateVMPackages.split(",");
+ for (int i = 0; i < pack.length; i++) {
+ buffer.append(pack[i]);
+ if (i != pack.length - 1) {
+ buffer.append(',');
+ buffer.append("\\");
+ }
+ buffer.append(NEWLINE);
+ }
+ }
+ // add EE
+ buffer.append("org.osgi.framework.executionenvironment = \\\n" + " OSGi/Minimum-1.0,\\\n"
+ + " OSGi/Minimum-1.1,\\\n" + " OSGi/Minimum-1.2,\\\n" + " JavaSE/compact1-1.8,\\\n"
+ + " JavaSE/compact2-1.8,\\\n" + " JavaSE/compact3-1.8,\\\n" + " JRE-1.1,\\\n" + " J2SE-1.2,\\\n"
+ + " J2SE-1.3,\\\n" + " J2SE-1.4,\\\n" + " J2SE-1.5,\\\n" + " JavaSE-1.6,\\\n" + " JavaSE-1.7,\\\n"
+ + " JavaSE-1.8,\\\n");
+ String version = DEFAULT_PROFILE.substring(DEFAULT_PROFILE.indexOf('-') + 1);
+ int ver = Integer.parseInt(version);
+ for (int i = 9; i < ver; i++) {
+ buffer.append(" JavaSE-" + String.valueOf(i) + ",\\\n");
+ }
+ buffer.append(" JavaSE-" + String.valueOf(ver));
+ buffer.append(NEWLINE);
+
+ // add capabilities
+ StringBuilder versionList = new StringBuilder();
+ versionList.append("1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8");
+ for (int i = 9; i <= ver; i++) {
+ versionList.append(", " + String.valueOf(i) + ".0");
+ }
+ buffer.append("org.osgi.framework.system.capabilities = \\\n"
+ + " osgi.ee; osgi.ee=\"OSGi/Minimum\"; version:List<Version>=\"1.0, 1.1, 1.2\",\\\n"
+ + " osgi.ee; osgi.ee=\"JRE\"; version:List<Version>=\"1.0, 1.1\",\\\n"
+ + " osgi.ee; osgi.ee=\"JavaSE\"; version:List<Version>=\"" + versionList.toString() + "\",\\\n"
+ + " osgi.ee; osgi.ee=\"JavaSE/compact1\"; version:List<Version>=\"1.8," + String.valueOf(ver)
+ + ".0\",\\\n" + " osgi.ee; osgi.ee=\"JavaSE/compact2\"; version:List<Version>=\"1.8,"
+ + String.valueOf(ver) + ".0\",\\\n"
+ + " osgi.ee; osgi.ee=\"JavaSE/compact3\"; version:List<Version>=\"1.8," + String.valueOf(ver) + ".0\"");
+ buffer.append(NEWLINE);
+
+ // add profile name and compiler options
+ buffer.append("osgi.java.profile.name = " + DEFAULT_PROFILE + "\n" + "org.eclipse.jdt.core.compiler.compliance="
+ + String.valueOf(ver) + "\n" + "org.eclipse.jdt.core.compiler.source=" + String.valueOf(ver) + "\n"
+ + "org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled\n"
+ + "org.eclipse.jdt.core.compiler.codegen.targetPlatform=" + String.valueOf(ver) + "\n"
+ + "org.eclipse.jdt.core.compiler.problem.assertIdentifier=error\n"
+ + "org.eclipse.jdt.core.compiler.problem.enumIdentifier=error");
+ buffer.append(NEWLINE);
+ return buffer;
}
private static URL getResouceFromSystemBundle(String entry) {
diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/spi/p2/publisher/LocalizationHelper.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/spi/p2/publisher/LocalizationHelper.java
index f969d1766..4c9062946 100644
--- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/spi/p2/publisher/LocalizationHelper.java
+++ b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/spi/p2/publisher/LocalizationHelper.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2018 IBM Corporation and others.
+ * Copyright (c) 2008, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -22,15 +22,13 @@ import java.util.zip.ZipFile;
import org.eclipse.equinox.internal.p2.core.helpers.CollectionUtils;
/**
- * Helper functions supporting the processing of localized
- * property files.
+ * Helper functions supporting the processing of localized property files.
*
*/
public final class LocalizationHelper {
private static final String PROPERTIES_FILE_EXTENSION = ".properties"; //$NON-NLS-1$
private static final Locale DEFAULT_LOCALE = new Locale("df", "LT"); //$NON-NLS-1$//$NON-NLS-2$
- private static LocalizationHelper instance = new LocalizationHelper();
// Extract the locale string from the properties file with the given filename
// where the locale string follows the given prefix. For example, return "zh_HK"
@@ -39,7 +37,8 @@ public final class LocalizationHelper {
String localeString = null;
if (filename.startsWith(prefix) && filename.endsWith(PROPERTIES_FILE_EXTENSION)) {
if (filename.length() > prefix.length() + PROPERTIES_FILE_EXTENSION.length()) {
- localeString = filename.substring(prefix.length() + 1, filename.length() - PROPERTIES_FILE_EXTENSION.length());
+ localeString = filename.substring(prefix.length() + 1,
+ filename.length() - PROPERTIES_FILE_EXTENSION.length());
} else {
localeString = ""; //$NON-NLS-1$
}
@@ -58,9 +57,11 @@ public final class LocalizationHelper {
return locale;
}
- // For the given root directory and path to localization files within that directory
+ // For the given root directory and path to localization files within that
+ // directory
// get a map from locale to property set for the localization property files.
- public static Map<Locale, Map<String, String>> getDirPropertyLocalizations(File root, String localizationPath, Locale defaultLocale, String[] propertyKeys) {
+ public static Map<Locale, Map<String, String>> getDirPropertyLocalizations(File root, String localizationPath,
+ Locale defaultLocale, String[] propertyKeys) {
File fullPath = new File(root, localizationPath);
File localizationDir = fullPath.getParentFile();
final String localizationFile = fullPath.getName();
@@ -91,7 +92,8 @@ public final class LocalizationHelper {
return localizations;
}
- public static Map<Locale, Map<String, String>> getJarPropertyLocalizations(File root, String localizationPath, Locale defaultLocale, String[] propertyKeys) {
+ public static Map<Locale, Map<String, String>> getJarPropertyLocalizations(File root, String localizationPath,
+ Locale defaultLocale, String[] propertyKeys) {
Map<Locale, Map<String, String>> localizations = new HashMap<>(4);
try (ZipFile jarFile = new ZipFile(root, ZipFile.OPEN_READ)) {
for (Enumeration<? extends ZipEntry> entries = jarFile.entries(); entries.hasMoreElements();) {
@@ -103,7 +105,8 @@ public final class LocalizationHelper {
Locale nextLocale = LocalizationHelper.getLocale(localeString);
try (InputStream stream = jarFile.getInputStream(nextEntry)) {
Map<String, String> properties = CollectionUtils.loadProperties(stream);
- Map<String, String> localizedStrings = LocalizationHelper.getLocalizedProperties(propertyKeys, properties);
+ Map<String, String> localizedStrings = LocalizationHelper.getLocalizedProperties(propertyKeys,
+ properties);
if (localizedStrings.size() > 0) {
localizations.put(nextLocale, localizedStrings);
if (DEFAULT_LOCALE.equals(nextLocale) && defaultLocale != null) {
@@ -128,7 +131,8 @@ public final class LocalizationHelper {
if (root.isDirectory())
propertyStream = new FileInputStream(new File(root, propertyFilename));
else {
- URLConnection connection = new URL("jar:" + root.toURL().toExternalForm() + "!/" + propertyFilename).openConnection(); //$NON-NLS-1$ //$NON-NLS-2$
+ URLConnection connection = new URL("jar:" + root.toURL().toExternalForm() + "!/" + propertyFilename) //$NON-NLS-1$ //$NON-NLS-2$
+ .openConnection();
connection.setUseCaches(false);
propertyStream = connection.getInputStream();
}
@@ -158,22 +162,8 @@ public final class LocalizationHelper {
}
public static String[] getLocalizationFiles(File localizationDir, final String filenamePrefix) {
- return localizationDir.list(instance.new FileFilter() {
- @Override
- public boolean accept(File directory, String filename) {
- return (getLocaleString(filename, filenamePrefix) != null ? true : false);
- }
- });
- }
-
- private abstract class FileFilter implements FilenameFilter {
-
- public FileFilter() {
- // Nothing to do
- }
-
- @Override
- public abstract boolean accept(File directory, String filename);
+ return localizationDir
+ .list((directory, filename) -> (getLocaleString(filename, filenamePrefix) != null ? true : false));
}
private LocalizationHelper() {
diff --git a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/spi/p2/publisher/PublisherHelper.java b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/spi/p2/publisher/PublisherHelper.java
index 1af645601..f074794b7 100644
--- a/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/spi/p2/publisher/PublisherHelper.java
+++ b/bundles/org.eclipse.equinox.p2.publisher/src/org/eclipse/equinox/spi/p2/publisher/PublisherHelper.java
@@ -112,7 +112,7 @@ public class PublisherHelper {
descriptor.setProperty(IArtifactDescriptor.ARTIFACT_SIZE, Long.toString(pathOnDisk.length()));
descriptor.setProperty(IArtifactDescriptor.DOWNLOAD_SIZE, Long.toString(pathOnDisk.length()));
- boolean generateChecksums = info == null || (info.getArtifactOptions() & IPublisherInfo.A_NO_MD5) == 0;
+ boolean generateChecksums = info == null || isArtifactGenerateChecksums(info);
if (generateChecksums) {
calculateChecksums(pathOnDisk, descriptor);
}
@@ -224,7 +224,7 @@ public class PublisherHelper {
if (version == null) {
return Version.MAX_VERSION;
}
- if (version.getMajor() == Integer.MAX_VALUE && version.getMicro() == Integer.MAX_VALUE && version.getMicro() == Integer.MAX_VALUE) {
+ if (version.getMajor() == Integer.MAX_VALUE && version.getMinor() == Integer.MAX_VALUE && version.getMicro() == Integer.MAX_VALUE) {
return Version.MAX_VERSION;
}
return Version.createOSGi(version.getMajor(), version.getMinor(), version.getMicro(), version.getQualifier());
@@ -252,4 +252,49 @@ public class PublisherHelper {
return new VersionRange(min, includeMin, max, includeMax);
}
+
+ /**
+ *
+ * @return <code>true</code> if md5 sums should be generated <code>false</code>
+ * otherwise
+ * @since 1.7.0
+ */
+ public static boolean isArtifactGenerateChecksums(IPublisherInfo publisherInfo) {
+ if ((publisherInfo.getArtifactOptions() & IPublisherInfo.A_NO_MD5) != 0) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ *
+ * @return <code>true</code> if existing artifacts should be overwritten
+ * <code>false</code> otherwise
+ * @since 1.7.0
+ */
+ public static boolean isArtifactOverwrite(IPublisherInfo publisherInfo) {
+ return (publisherInfo.getArtifactOptions() & IPublisherInfo.A_OVERWRITE) != 0;
+ }
+
+ /**
+ *
+ * @return <code>true</code> if artifacts should published <code>false</code>
+ * otherwise
+ * @since 1.7.0
+ */
+ public static boolean isArtifactPublish(IPublisherInfo publisherInfo) {
+ int artifactOptions = publisherInfo.getArtifactOptions();
+ return artifactOptions == 0 || (artifactOptions & IPublisherInfo.A_PUBLISH) != 0;
+ }
+
+ /**
+ *
+ * @return <code>true</code> if the artifact index should be updated
+ * <code>false</code> otherwise
+ * @since 1.7.0
+ */
+ public static boolean isArtifactIndex(IPublisherInfo publisherInfo) {
+ int artifactOptions = publisherInfo.getArtifactOptions();
+ return artifactOptions == 0 || (artifactOptions & IPublisherInfo.A_INDEX) != 0;
+ }
}
diff --git a/bundles/org.eclipse.equinox.p2.reconciler.dropins/.classpath b/bundles/org.eclipse.equinox.p2.reconciler.dropins/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.reconciler.dropins/.classpath
+++ b/bundles/org.eclipse.equinox.p2.reconciler.dropins/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.reconciler.dropins/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.reconciler.dropins/.settings/org.eclipse.jdt.core.prefs
index daddac459..83ab682e5 100644
--- a/bundles/org.eclipse.equinox.p2.reconciler.dropins/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.reconciler.dropins/.settings/org.eclipse.jdt.core.prefs
@@ -18,9 +18,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -37,6 +37,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -90,6 +91,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -126,7 +128,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -140,7 +143,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -261,7 +263,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -332,7 +333,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -477,7 +477,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.reconciler.dropins/Bootstrap.product b/bundles/org.eclipse.equinox.p2.reconciler.dropins/Bootstrap.product
index 0b8e0c2b2..f48bab7f0 100644
--- a/bundles/org.eclipse.equinox.p2.reconciler.dropins/Bootstrap.product
+++ b/bundles/org.eclipse.equinox.p2.reconciler.dropins/Bootstrap.product
@@ -3,6 +3,9 @@
<product name="p2 bootstrap" id="org.eclipse.equinox.p2.reconciler.dropins.product" application="org.eclipse.equinox.p2.reconciler.application" version="1.3.0.qualifier" useFeatures="false" includeLaunchers="true">
+ <configIni>
+ </configIni>
+
<launcherArgs>
<vmArgs>-Dorg.eclipse.equinox.p2.reconciler.noConfig=true
</vmArgs>
@@ -22,10 +25,12 @@
</vm>
<plugins>
+ <plugin id="org.apache.felix.scr"/>
<plugin id="org.eclipse.core.contenttype"/>
<plugin id="org.eclipse.core.expressions"/>
<plugin id="org.eclipse.core.jobs"/>
<plugin id="org.eclipse.core.net"/>
+ <plugin id="org.eclipse.core.net.linux" fragment="true"/>
<plugin id="org.eclipse.core.runtime"/>
<plugin id="org.eclipse.core.runtime.compatibility.registry" fragment="true"/>
<plugin id="org.eclipse.ecf"/>
@@ -36,7 +41,7 @@
<plugin id="org.eclipse.ecf.ssl" fragment="true"/>
<plugin id="org.eclipse.equinox.app"/>
<plugin id="org.eclipse.equinox.common"/>
- <plugin id="org.eclipse.equinox.ds"/>
+ <plugin id="org.eclipse.equinox.concurrent"/>
<plugin id="org.eclipse.equinox.frameworkadmin"/>
<plugin id="org.eclipse.equinox.frameworkadmin.equinox"/>
<plugin id="org.eclipse.equinox.p2.artifact.repository"/>
@@ -50,6 +55,7 @@
<plugin id="org.eclipse.equinox.p2.metadata"/>
<plugin id="org.eclipse.equinox.p2.metadata.repository"/>
<plugin id="org.eclipse.equinox.p2.publisher"/>
+ <plugin id="org.eclipse.equinox.p2.publisher.eclipse"/>
<plugin id="org.eclipse.equinox.p2.reconciler.dropins"/>
<plugin id="org.eclipse.equinox.p2.repository"/>
<plugin id="org.eclipse.equinox.p2.touchpoint.eclipse"/>
@@ -58,13 +64,17 @@
<plugin id="org.eclipse.equinox.preferences"/>
<plugin id="org.eclipse.equinox.registry"/>
<plugin id="org.eclipse.equinox.security"/>
+ <plugin id="org.eclipse.equinox.security.linux" fragment="true"/>
<plugin id="org.eclipse.equinox.simpleconfigurator"/>
<plugin id="org.eclipse.equinox.simpleconfigurator.manipulator"/>
<plugin id="org.eclipse.equinox.util"/>
<plugin id="org.eclipse.osgi"/>
+ <plugin id="org.eclipse.osgi.compatibility.state" fragment="true"/>
<plugin id="org.eclipse.osgi.services"/>
+ <plugin id="org.eclipse.osgi.util"/>
<plugin id="org.sat4j.core"/>
<plugin id="org.sat4j.pb"/>
+ <plugin id="org.tukaani.xz"/>
</plugins>
diff --git a/bundles/org.eclipse.equinox.p2.reconciler.dropins/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.reconciler.dropins/META-INF/MANIFEST.MF
index 72e0795b4..104fdb8d6 100644
--- a/bundles/org.eclipse.equinox.p2.reconciler.dropins/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.reconciler.dropins/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.reconciler.dropins;singleton:=true
-Bundle-Version: 1.3.400.qualifier
+Bundle-Version: 1.4.100.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.reconciler.dropins.Activator
Bundle-Vendor: %providerName
Bundle-Localization: plugin
@@ -10,7 +10,7 @@ Export-Package: org.eclipse.equinox.internal.p2.reconciler.dropins;x-internal:=t
Require-Bundle: org.eclipse.equinox.common;bundle-version="[3.5.0,4.0.0)",
org.eclipse.equinox.p2.touchpoint.eclipse;bundle-version="1.0.0",
org.eclipse.equinox.p2.metadata
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Import-Package: org.eclipse.equinox.app;version="1.0.0",
org.eclipse.equinox.internal.p2.artifact.repository,
org.eclipse.equinox.internal.p2.core.helpers,
diff --git a/bundles/org.eclipse.equinox.p2.reconciler.dropins/pom.xml b/bundles/org.eclipse.equinox.p2.reconciler.dropins/pom.xml
index 08a3bbb46..d2362a506 100644
--- a/bundles/org.eclipse.equinox.p2.reconciler.dropins/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.reconciler.dropins/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.reconciler.dropins</artifactId>
- <version>1.3.400-SNAPSHOT</version>
+ <version>1.4.100-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/.classpath b/bundles/org.eclipse.equinox.p2.repository.tools/.classpath
index 030607499..cc48f9f27 100644
--- a/bundles/org.eclipse.equinox.p2.repository.tools/.classpath
+++ b/bundles/org.eclipse.equinox.p2.repository.tools/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" output="bin_ant" path="src_ant"/>
diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.repository.tools/.settings/org.eclipse.jdt.core.prefs
index 2e78065b1..cc029895e 100644
--- a/bundles/org.eclipse.equinox.p2.repository.tools/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.repository.tools/.settings/org.eclipse.jdt.core.prefs
@@ -17,9 +17,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -36,6 +36,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -89,6 +90,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -125,10 +127,11 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
@@ -136,20 +139,23 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
@@ -241,11 +247,12 @@ org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
@@ -276,6 +283,8 @@ org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
@@ -300,13 +309,17 @@ org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
@@ -354,6 +367,8 @@ org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do no
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
@@ -390,9 +405,12 @@ org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not inser
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
@@ -428,10 +446,14 @@ org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
org.eclipse.jdt.core.incompatibleJDKLevel=ignore
org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.equinox.p2.repository.tools/.settings/org.eclipse.jdt.ui.prefs
index 9a640320c..b0c22ad5e 100644
--- a/bundles/org.eclipse.equinox.p2.repository.tools/.settings/org.eclipse.jdt.ui.prefs
+++ b/bundles/org.eclipse.equinox.p2.repository.tools/.settings/org.eclipse.jdt.ui.prefs
@@ -7,36 +7,80 @@ org.eclipse.jdt.ui.importorder=;
org.eclipse.jdt.ui.ondemandthreshold=3
org.eclipse.jdt.ui.staticondemandthreshold=3
org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates/>
+sp_cleanup.add_all=false
sp_cleanup.add_default_serial_version_id=true
sp_cleanup.add_generated_serial_version_id=false
sp_cleanup.add_missing_annotations=true
sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
sp_cleanup.add_missing_nls_tags=false
sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
sp_cleanup.add_serial_version_id=false
sp_cleanup.always_use_blocks=true
sp_cleanup.always_use_parentheses_in_expressions=false
sp_cleanup.always_use_this_for_non_static_field_access=false
sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.arrays_fill=false
+sp_cleanup.bitwise_conditional_expression=false
+sp_cleanup.boolean_literal=false
+sp_cleanup.break_loop=false
+sp_cleanup.collection_cloning=false
+sp_cleanup.comparison_statement=false
+sp_cleanup.controlflow_merge=false
+sp_cleanup.convert_functional_interfaces=false
sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
+sp_cleanup.convert_to_switch_expressions=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.double_negation=false
+sp_cleanup.else_if=false
+sp_cleanup.embedded_if=false
+sp_cleanup.evaluate_nullable=false
+sp_cleanup.extract_increment=false
sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.hash=false
+sp_cleanup.if_condition=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.instanceof=false
+sp_cleanup.join=false
+sp_cleanup.lazy_logical_operator=false
sp_cleanup.make_local_variable_final=false
sp_cleanup.make_parameters_final=false
sp_cleanup.make_private_fields_final=true
-sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.map_cloning=false
+sp_cleanup.merge_conditional_blocks=false
+sp_cleanup.multi_catch=false
sp_cleanup.never_use_blocks=false
sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=false
+sp_cleanup.no_string_creation=false
+sp_cleanup.no_super=false
+sp_cleanup.number_suffix=false
+sp_cleanup.objects_equals=false
+sp_cleanup.on_save_use_additional_actions=true
sp_cleanup.organize_imports=true
+sp_cleanup.overridden_assignment=false
+sp_cleanup.precompile_regex=false
+sp_cleanup.primitive_serialization=false
+sp_cleanup.pull_up_assignment=false
+sp_cleanup.push_down_negation=false
sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.redundant_falling_through_block_end=false
sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=false
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=false
+sp_cleanup.remove_trailing_whitespaces=true
sp_cleanup.remove_trailing_whitespaces_all=true
sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_array_creation=true
sp_cleanup.remove_unnecessary_casts=true
sp_cleanup.remove_unnecessary_nls_tags=false
sp_cleanup.remove_unused_imports=false
@@ -45,12 +89,27 @@ sp_cleanup.remove_unused_private_fields=true
sp_cleanup.remove_unused_private_members=false
sp_cleanup.remove_unused_private_methods=true
sp_cleanup.remove_unused_private_types=true
+sp_cleanup.simplify_lambda_expression_and_method_ref=true
sp_cleanup.sort_members=false
sp_cleanup.sort_members_all=false
+sp_cleanup.static_inner_class=false
+sp_cleanup.strictly_equal_or_different=false
+sp_cleanup.stringbuilder=false
+sp_cleanup.switch=false
+sp_cleanup.ternary_operator=false
+sp_cleanup.try_with_resource=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_autoboxing=false
sp_cleanup.use_blocks=false
sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_directly_map_method=false
+sp_cleanup.use_lambda=false
sp_cleanup.use_parentheses_in_expressions=false
sp_cleanup.use_this_for_non_static_field_access=false
sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
sp_cleanup.use_this_for_non_static_method_access=false
sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+sp_cleanup.use_unboxing=false
+sp_cleanup.use_var=false
+sp_cleanup.useless_continue=false
+sp_cleanup.useless_return=false
diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.repository.tools/META-INF/MANIFEST.MF
index 4e5037ee3..3dba706cb 100644
--- a/bundles/org.eclipse.equinox.p2.repository.tools/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.repository.tools/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %bundleName
Bundle-SymbolicName: org.eclipse.equinox.p2.repository.tools;singleton:=true
-Bundle-Version: 2.2.500.qualifier
+Bundle-Version: 2.3.0.qualifier
Bundle-Activator: org.eclipse.equinox.p2.internal.repository.tools.Activator
Bundle-Vendor: %providerName
Bundle-Localization: plugin
@@ -15,7 +15,7 @@ Export-Package: org.eclipse.equinox.p2.internal.repository.comparator;x-internal
Require-Bundle: org.eclipse.equinox.common;bundle-version="3.3.0",
org.eclipse.equinox.registry,
org.tukaani.xz;bundle-version="1.3.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Import-Package: org.eclipse.equinox.app;version="1.0.0",
org.eclipse.equinox.frameworkadmin;version="2.0.0",
diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/pom.xml b/bundles/org.eclipse.equinox.p2.repository.tools/pom.xml
index 4c08f13c0..379a11b8a 100644
--- a/bundles/org.eclipse.equinox.p2.repository.tools/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.repository.tools/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.repository.tools</artifactId>
- <version>2.2.500-SNAPSHOT</version>
+ <version>2.3.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/comparator/java/ClassFileReader.java b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/comparator/java/ClassFileReader.java
index 6ad7ce7e7..1616ea649 100644
--- a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/comparator/java/ClassFileReader.java
+++ b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/comparator/java/ClassFileReader.java
@@ -77,7 +77,6 @@ public class ClassFileReader extends ClassFileStruct {
private InnerClassesAttribute innerClassesAttribute;
private int[] interfaceIndexes;
private char[][] interfaceNames;
- private int interfacesCount;
private int magicNumber;
private int majorVersion;
private MethodInfo[] methods;
@@ -199,21 +198,21 @@ public class ClassFileReader extends ClassFileStruct {
}
// Read the interfaces, use exception handlers to catch bad format
- this.interfacesCount = u2At(classFileBytes, readOffset, 0);
+ int interfacesCount = u2At(classFileBytes, readOffset, 0);
readOffset += 2;
this.interfaceNames = NO_INTERFACES_NAMES;
this.interfaceIndexes = Utility.EMPTY_INT_ARRAY;
- if (this.interfacesCount != 0) {
+ if (interfacesCount != 0) {
if ((decodingFlags & SUPER_INTERFACES) != CONSTANT_POOL) {
- this.interfaceNames = new char[this.interfacesCount][];
- this.interfaceIndexes = new int[this.interfacesCount];
- for (int i = 0; i < this.interfacesCount; i++) {
+ this.interfaceNames = new char[interfacesCount][];
+ this.interfaceIndexes = new int[interfacesCount];
+ for (int i = 0; i < interfacesCount; i++) {
this.interfaceIndexes[i] = u2At(classFileBytes, readOffset, 0);
this.interfaceNames[i] = getConstantClassNameAt(classFileBytes, constantPoolOffsets, this.interfaceIndexes[i]);
readOffset += 2;
}
} else {
- readOffset += (2 * this.interfacesCount);
+ readOffset += (2 * interfacesCount);
}
}
// Read the this.fields, use exception handlers to catch bad format
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 524c9faea..2a830635e 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
@@ -7,7 +7,7 @@
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
- *
+ *
* Contributors:
* IBM Corporation - initial API and implementation
* Compeople AG (Stefan Liebig) - various ongoing maintenance
@@ -90,9 +90,11 @@ public class Mirroring {
public MultiStatus run(boolean failOnError, boolean verbose) {
if (!destination.isModifiable())
- throw new IllegalStateException(NLS.bind(Messages.exception_destinationNotModifiable, destination.getLocation()));
+ throw new IllegalStateException(
+ NLS.bind(Messages.exception_destinationNotModifiable, destination.getLocation()));
if (compare)
- getComparator(); //initialize the comparator. Only needed if we're comparing. Used to force error if comparatorID is invalid.
+ getComparator(); // initialize the comparator. Only needed if we're comparing. Used to force
+ // error if comparatorID is invalid.
MultiStatus multiStatus = new MultiStatus(Activator.ID, IStatus.OK, Messages.message_mirroringStatus, null);
Iterator<IArtifactKey> keys = null;
if (keysToMirror != null)
@@ -103,7 +105,8 @@ public class Mirroring {
}
if (compareExclusionQuery != null) {
- IQueryResult<IArtifactDescriptor> exclusions = source.descriptorQueryable().query(compareExclusionQuery, null);
+ IQueryResult<IArtifactDescriptor> exclusions = source.descriptorQueryable().query(compareExclusionQuery,
+ null);
compareExclusions = exclusions.toUnmodifiableSet();
}
@@ -112,10 +115,10 @@ public class Mirroring {
IArtifactDescriptor[] descriptors = source.getArtifactDescriptors(key);
for (IArtifactDescriptor descriptor : descriptors) {
IStatus result = mirror(descriptor, verbose);
- //Only log INFO and WARNING if we want verbose logging. Always log ERRORs
+ // Only log INFO and WARNING if we want verbose logging. Always log ERRORs
if (!result.isOK() && (verbose || result.getSeverity() == IStatus.ERROR))
multiStatus.add(result);
- //stop mirroring as soon as we have an error
+ // stop mirroring as soon as we have an error
if (failOnError && multiStatus.getSeverity() == IStatus.ERROR)
return multiStatus;
}
@@ -146,23 +149,26 @@ public class Mirroring {
return multiStatus;
}
+ @SuppressWarnings("removal")
private IStatus mirror(IArtifactDescriptor sourceDescriptor, boolean verbose) {
- if (!includePacked && IArtifactDescriptor.FORMAT_PACKED.equals(sourceDescriptor.getProperty(IArtifactDescriptor.FORMAT)))
+ 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);
if (verbose)
- System.out.println("Mirroring: " + sourceDescriptor.getArtifactKey() + " (Descriptor: " + sourceDescriptor + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ System.out.println(
+ "Mirroring: " + sourceDescriptor.getArtifactKey() + " (Descriptor: " + sourceDescriptor + ")"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
MultiStatus compareStatus = new MultiStatus(Activator.ID, IStatus.OK, null, null);
boolean comparing = compare && !compareExclusions.contains(sourceDescriptor);
if (comparing) {
if (baselineDescriptor != null) {
- //compare source & baseline
+ // compare source & baseline
compareStatus.add(compare(baseline, baselineDescriptor, source, sourceDescriptor));
- //compare baseline & destination
+ // compare baseline & destination
if (destination.contains(baselineDescriptor)) {
compareStatus.add(compareToDestination(baselineDescriptor));
return compareStatus;
@@ -173,13 +179,13 @@ public class Mirroring {
}
}
- //from source or baseline
+ // from source or baseline
IArtifactRepository sourceRepository = baselineDescriptor != null ? baseline : source;
sourceDescriptor = baselineDescriptor != null ? baselineDescriptor : sourceDescriptor;
targetDescriptor = baselineDescriptor != null ? baselineDescriptor : targetDescriptor;
IStatus status = null;
if (!destination.contains(targetDescriptor))
- //actual download
+ // actual download
status = downloadArtifact(sourceRepository, targetDescriptor, sourceDescriptor);
else {
String message = NLS.bind(Messages.mirror_alreadyExists, sourceDescriptor, destination);
@@ -194,10 +200,13 @@ public class Mirroring {
}
/**
- * Takes an IArtifactDescriptor descriptor and the ProvisionException that was thrown when destination.getOutputStream(descriptor)
- * and compares descriptor to the duplicate descriptor in the destination.
- *
- * Callers should verify the ProvisionException was thrown due to the artifact existing in the destination before invoking this method.
+ * Takes an IArtifactDescriptor descriptor and the ProvisionException that was
+ * thrown when destination.getOutputStream(descriptor) and compares descriptor
+ * to the duplicate descriptor in the destination.
+ *
+ * Callers should verify the ProvisionException was thrown due to the artifact
+ * existing in the destination before invoking this method.
+ *
* @param descriptor
* @return the status of the compare
*/
@@ -209,12 +218,15 @@ public class Mirroring {
destDescriptor = destDescriptors[i];
}
if (destDescriptor == null)
- return new Status(IStatus.INFO, Activator.ID, ProvisionException.ARTIFACT_EXISTS, Messages.Mirroring_noMatchingDescriptor, null);
+ return new Status(IStatus.INFO, Activator.ID, ProvisionException.ARTIFACT_EXISTS,
+ Messages.Mirroring_noMatchingDescriptor, null);
return compare(source, descriptor, destination, destDescriptor);
}
- private IStatus compare(IArtifactRepository sourceRepository, IArtifactDescriptor sourceDescriptor, IArtifactRepository destRepository, IArtifactDescriptor destDescriptor) {
- IStatus comparison = getComparator().compare(sourceRepository, sourceDescriptor, destRepository, destDescriptor);
+ private IStatus compare(IArtifactRepository sourceRepository, IArtifactDescriptor sourceDescriptor,
+ IArtifactRepository destRepository, IArtifactDescriptor destDescriptor) {
+ IStatus comparison = getComparator().compare(sourceRepository, sourceDescriptor, destRepository,
+ destDescriptor);
if (comparatorLog != null && !comparison.isOK())
comparatorLog.log(sourceDescriptor, comparison);
return comparison;
@@ -223,7 +235,8 @@ public class Mirroring {
/*
* Create, and execute a MirrorRequest for a given descriptor.
*/
- private IStatus downloadArtifact(IArtifactRepository sourceRepo, IArtifactDescriptor destDescriptor, IArtifactDescriptor srcDescriptor) {
+ private IStatus downloadArtifact(IArtifactRepository sourceRepo, IArtifactDescriptor destDescriptor,
+ IArtifactDescriptor srcDescriptor) {
RawMirrorRequest request = new RawMirrorRequest(srcDescriptor, destDescriptor, destination, transport);
request.perform(sourceRepo, new NullProgressMonitor());
@@ -235,7 +248,7 @@ public class Mirroring {
}
/*
- * Get the equivalent descriptor from the baseline repository
+ * Get the equivalent descriptor from the baseline repository
*/
private IArtifactDescriptor getBaselineDescriptor(IArtifactDescriptor descriptor) {
if (baseline == null || !baseline.contains(descriptor))
@@ -250,8 +263,9 @@ public class Mirroring {
return null;
}
- /*
- * Simple validation of a mirror to see if all source descriptors are present in the destination
+ /*
+ * Simple validation of a mirror to see if all source descriptors are present in
+ * the destination
*/
private IStatus validateMirror(boolean verbose) {
MultiStatus status = new MultiStatus(Activator.ID, 0, Messages.Mirroring_ValidationError, null);
@@ -280,7 +294,8 @@ public class Mirroring {
// Missing an artifact
if (verbose)
System.out.println(NLS.bind(Messages.Mirroring_missingDescriptor, srcDescriptors[src]));
- status.add(new Status(IStatus.ERROR, Activator.ID, NLS.bind(Messages.Mirroring_missingDescriptor, srcDescriptors[src++])));
+ status.add(new Status(IStatus.ERROR, Activator.ID,
+ NLS.bind(Messages.Mirroring_missingDescriptor, srcDescriptors[src++])));
} else {
// Its okay if there are extra descriptors in the destination
dest++;
@@ -294,7 +309,8 @@ public class Mirroring {
if (baselineDescriptor != null)
srcProperties = baselineDescriptor.getProperties();
}
- // Baseline not set, or could not find descriptor so we'll use the source descriptor
+ // Baseline not set, or could not find descriptor so we'll use the source
+ // descriptor
if (srcProperties == null)
srcProperties = srcDescriptors[src].getProperties();
@@ -302,8 +318,12 @@ public class Mirroring {
for (String key : srcProperties.keySet()) {
if (!srcProperties.get(key).equals(destMap.get(key))) {
if (verbose)
- System.out.println(NLS.bind(Messages.Mirroring_differentDescriptorProperty, new Object[] {destDescriptors[dest], key, srcProperties.get(key), destMap.get(key)}));
- status.add(new Status(IStatus.WARNING, Activator.ID, NLS.bind(Messages.Mirroring_differentDescriptorProperty, new Object[] {destDescriptors[dest], key, srcProperties.get(key), destMap.get(key)})));
+ System.out.println(NLS.bind(Messages.Mirroring_differentDescriptorProperty,
+ new Object[] { destDescriptors[dest], key, srcProperties.get(key),
+ destMap.get(key) }));
+ status.add(new Status(IStatus.WARNING, Activator.ID,
+ NLS.bind(Messages.Mirroring_differentDescriptorProperty, new Object[] {
+ destDescriptors[dest], key, srcProperties.get(key), destMap.get(key) })));
}
}
src++;
@@ -311,11 +331,13 @@ public class Mirroring {
}
}
- // If there are still source descriptors they're missing from the destination repository
+ // If there are still source descriptors they're missing from the destination
+ // repository
while (src < srcDescriptors.length) {
if (verbose)
System.out.println(NLS.bind(Messages.Mirroring_missingDescriptor, srcDescriptors[src]));
- status.add(new Status(IStatus.ERROR, Activator.ID, NLS.bind(Messages.Mirroring_missingDescriptor, srcDescriptors[src++])));
+ status.add(new Status(IStatus.ERROR, Activator.ID,
+ NLS.bind(Messages.Mirroring_missingDescriptor, srcDescriptors[src++])));
}
}
diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/AbstractApplication.java b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/AbstractApplication.java
index 90d958ea0..e2848334e 100644
--- a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/AbstractApplication.java
+++ b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/AbstractApplication.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2017 IBM Corporation and others.
+ * Copyright (c) 2009, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -35,7 +35,7 @@ import org.osgi.framework.ServiceReference;
public abstract class AbstractApplication {
protected boolean removeAddedRepositories = true;
- protected List<RepositoryDescriptor> sourceRepositories = new ArrayList<>(); //List of repository descriptors
+ protected List<RepositoryDescriptor> sourceRepositories = new ArrayList<>(); // List of repository descriptors
protected List<URI> artifactReposToRemove = new ArrayList<>();
protected List<URI> metadataReposToRemove = new ArrayList<>();
protected List<IInstallableUnit> sourceIUs = new ArrayList<>();
@@ -59,22 +59,24 @@ public abstract class AbstractApplication {
}
private void setupAgent() throws ProvisionException {
- //note if we ever wanted these applications to act on a different agent than
- //the currently running system we would need to set it here
- ServiceReference<IProvisioningAgent> agentRef = Activator.getBundleContext().getServiceReference(IProvisioningAgent.class);
+ // note if we ever wanted these applications to act on a different agent than
+ // the currently running system we would need to set it here
+ ServiceReference<IProvisioningAgent> agentRef = Activator.getBundleContext()
+ .getServiceReference(IProvisioningAgent.class);
if (agentRef != null) {
agent = Activator.getBundleContext().getService(agentRef);
if (agent != null)
return;
}
- //there is no agent around so we need to create one
- ServiceReference<IProvisioningAgentProvider> providerRef = Activator.getBundleContext().getServiceReference(IProvisioningAgentProvider.class);
+ // there is no agent around so we need to create one
+ ServiceReference<IProvisioningAgentProvider> providerRef = Activator.getBundleContext()
+ .getServiceReference(IProvisioningAgentProvider.class);
if (providerRef == null)
throw new RuntimeException("No provisioning agent provider is available"); //$NON-NLS-1$
IProvisioningAgentProvider provider = Activator.getBundleContext().getService(providerRef);
if (provider == null)
throw new RuntimeException("No provisioning agent provider is available"); //$NON-NLS-1$
- //obtain agent for currently running system
+ // obtain agent for currently running system
agent = provider.createAgent(null);
Activator.getBundleContext().ungetService(providerRef);
}
@@ -101,11 +103,11 @@ public abstract class AbstractApplication {
}
protected IMetadataRepositoryManager getMetadataRepositoryManager() {
- return (IMetadataRepositoryManager) agent.getService(IMetadataRepositoryManager.SERVICE_NAME);
+ return agent.getService(IMetadataRepositoryManager.class);
}
protected IArtifactRepositoryManager getArtifactRepositoryManager() {
- return (IArtifactRepositoryManager) agent.getService(IArtifactRepositoryManager.SERVICE_NAME);
+ return agent.getService(IArtifactRepositoryManager.class);
}
public void initializeRepos(IProgressMonitor progress) throws ProvisionException {
@@ -136,21 +138,26 @@ public abstract class AbstractApplication {
processDestinationRepos(artifactRepositoryManager, metadataRepositoryManager);
}
- //Helper to add a repository. It takes care of adding the repos to the deletion list and loading it
- protected IMetadataRepository addRepository(IMetadataRepositoryManager manager, URI location, int flags, IProgressMonitor monitor) throws ProvisionException {
+ // Helper to add a repository. It takes care of adding the repos to the deletion
+ // list and loading it
+ protected IMetadataRepository addRepository(IMetadataRepositoryManager manager, URI location, int flags,
+ IProgressMonitor monitor) throws ProvisionException {
if (!manager.contains(location))
metadataReposToRemove.add(location);
return manager.loadRepository(location, flags, monitor);
}
- //Helper to add a repository. It takes care of adding the repos to the deletion list and loading it
- protected IArtifactRepository addRepository(IArtifactRepositoryManager manager, URI location, int flags, IProgressMonitor monitor) throws ProvisionException {
+ // Helper to add a repository. It takes care of adding the repos to the deletion
+ // list and loading it
+ protected IArtifactRepository addRepository(IArtifactRepositoryManager manager, URI location, int flags,
+ IProgressMonitor monitor) throws ProvisionException {
if (!manager.contains(location))
artifactReposToRemove.add(location);
return manager.loadRepository(location, flags, monitor);
}
- private void processDestinationRepos(IArtifactRepositoryManager artifactRepositoryManager, IMetadataRepositoryManager metadataRepositoryManager) throws ProvisionException {
+ private void processDestinationRepos(IArtifactRepositoryManager artifactRepositoryManager,
+ IMetadataRepositoryManager metadataRepositoryManager) throws ProvisionException {
RepositoryDescriptor artifactRepoDescriptor = null;
RepositoryDescriptor metadataRepoDescriptor = null;
@@ -180,13 +187,15 @@ public abstract class AbstractApplication {
return destinationArtifactRepository;
}
- protected IMetadataRepository initializeDestination(RepositoryDescriptor toInit, IMetadataRepositoryManager mgr) throws ProvisionException {
+ protected IMetadataRepository initializeDestination(RepositoryDescriptor toInit, IMetadataRepositoryManager mgr)
+ throws ProvisionException {
try {
- IMetadataRepository repository = addRepository(mgr, toInit.getRepoLocation(), IRepositoryManager.REPOSITORY_HINT_MODIFIABLE, null);
+ IMetadataRepository repository = addRepository(mgr, toInit.getRepoLocation(),
+ IRepositoryManager.REPOSITORY_HINT_MODIFIABLE, null);
if (initDestinationRepository(repository, toInit))
return repository;
} catch (ProvisionException e) {
- //fall through and create a new repository below
+ // fall through and create a new repository below
}
IMetadataRepository source = null;
@@ -194,45 +203,57 @@ public abstract class AbstractApplication {
if (toInit.getFormat() != null)
source = mgr.loadRepository(toInit.getFormat(), 0, null);
} catch (ProvisionException e) {
- //Ignore.
+ // Ignore.
}
- //This code assumes source has been successfully loaded before this point
- //No existing repository; create a new repository at destinationLocation but with source's attributes.
+ // This code assumes source has been successfully loaded before this point
+ // No existing repository; create a new repository at destinationLocation but
+ // with source's attributes.
try {
- IMetadataRepository result = mgr.createRepository(toInit.getRepoLocation(), toInit.getName() != null ? toInit.getName() : (source != null ? source.getName() : toInit.getRepoLocation().toString()), IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, source != null ? source.getProperties() : null);
+ IMetadataRepository result = mgr.createRepository(toInit.getRepoLocation(),
+ toInit.getName() != null ? toInit.getName()
+ : (source != null ? source.getName() : toInit.getRepoLocation().toString()),
+ IMetadataRepositoryManager.TYPE_SIMPLE_REPOSITORY, source != null ? source.getProperties() : null);
if (toInit.isCompressed() && !result.getProperties().containsKey(IRepository.PROP_COMPRESSED))
result.setProperty(IRepository.PROP_COMPRESSED, "true"); //$NON-NLS-1$
return (IMetadataRepository) RepositoryHelper.validDestinationRepository(result);
} catch (UnsupportedOperationException e) {
- throw new ProvisionException(NLS.bind(Messages.exception_invalidDestination, toInit.getRepoLocation()), e.getCause());
+ throw new ProvisionException(NLS.bind(Messages.exception_invalidDestination, toInit.getRepoLocation()),
+ e.getCause());
}
}
- protected IArtifactRepository initializeDestination(RepositoryDescriptor toInit, IArtifactRepositoryManager mgr) throws ProvisionException {
+ protected IArtifactRepository initializeDestination(RepositoryDescriptor toInit, IArtifactRepositoryManager mgr)
+ throws ProvisionException {
try {
- IArtifactRepository repository = addRepository(mgr, toInit.getRepoLocation(), IRepositoryManager.REPOSITORY_HINT_MODIFIABLE, null);
+ IArtifactRepository repository = addRepository(mgr, toInit.getRepoLocation(),
+ IRepositoryManager.REPOSITORY_HINT_MODIFIABLE, null);
if (initDestinationRepository(repository, toInit))
return repository;
} catch (ProvisionException e) {
- //fall through and create a new repository below
+ // fall through and create a new repository below
}
IArtifactRepository source = null;
try {
if (toInit.getFormat() != null)
source = mgr.loadRepository(toInit.getFormat(), 0, null);
} catch (ProvisionException e) {
- //Ignore.
+ // Ignore.
}
- //This code assumes source has been successfully loaded before this point
- //No existing repository; create a new repository at destinationLocation but with source's attributes.
+ // This code assumes source has been successfully loaded before this point
+ // No existing repository; create a new repository at destinationLocation but
+ // with source's attributes.
// TODO for now create a Simple repo by default.
try {
- IArtifactRepository result = mgr.createRepository(toInit.getRepoLocation(), toInit.getName() != null ? toInit.getName() : (source != null ? source.getName() : toInit.getRepoLocation().toString()), IArtifactRepositoryManager.TYPE_SIMPLE_REPOSITORY, source != null ? source.getProperties() : null);
+ IArtifactRepository result = mgr.createRepository(toInit.getRepoLocation(),
+ toInit.getName() != null ? toInit.getName()
+ : (source != null ? source.getName() : toInit.getRepoLocation().toString()),
+ IArtifactRepositoryManager.TYPE_SIMPLE_REPOSITORY, source != null ? source.getProperties() : null);
if (toInit.isCompressed() && !result.getProperties().containsKey(IRepository.PROP_COMPRESSED))
result.setProperty(IRepository.PROP_COMPRESSED, "true"); //$NON-NLS-1$
return (IArtifactRepository) RepositoryHelper.validDestinationRepository(result);
} catch (UnsupportedOperationException e) {
- throw new ProvisionException(NLS.bind(Messages.exception_invalidDestination, toInit.getRepoLocation()), e.getCause());
+ throw new ProvisionException(NLS.bind(Messages.exception_invalidDestination, toInit.getRepoLocation()),
+ e.getCause());
}
}
diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/Activator.java b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/Activator.java
index 0a449ecd7..567e2ccf7 100644
--- a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/Activator.java
+++ b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/Activator.java
@@ -1,13 +1,13 @@
/*******************************************************************************
- * Copyright (c) 2009, 2017 IBM Corporation and others.
+ * Copyright (c) 2009, 2021 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. - Bug 460967
@@ -51,8 +51,8 @@ public class Activator implements BundleActivator {
}
/*
- * Construct and return a URI from the given String. Log
- * and return null if there was a problem.
+ * Construct and return a URI from the given String. Log and return null if
+ * there was a problem.
*/
public static URI getURI(String spec) {
if (spec == null)
@@ -76,10 +76,11 @@ public class Activator implements BundleActivator {
}
/*
- * Return the artifact repository manager. Throw an exception if it cannot be obtained.
+ * Return the artifact repository manager. Throw an exception if it cannot be
+ * obtained.
*/
public static IArtifactRepositoryManager getArtifactRepositoryManager() throws ProvisionException {
- IArtifactRepositoryManager manager = (IArtifactRepositoryManager) getAgent().getService(IArtifactRepositoryManager.SERVICE_NAME);
+ IArtifactRepositoryManager manager = getAgent().getService(IArtifactRepositoryManager.class);
if (manager == null)
throw new ProvisionException(Messages.no_artifactRepo_manager);
return manager;
@@ -89,17 +90,18 @@ public class Activator implements BundleActivator {
* Return the profile registry. Throw an exception if it cannot be found.
*/
static IProfileRegistry getProfileRegistry() throws ProvisionException {
- IProfileRegistry registry = (IProfileRegistry) getAgent().getService(IProfileRegistry.SERVICE_NAME);
+ IProfileRegistry registry = getAgent().getService(IProfileRegistry.class);
if (registry == null)
throw new ProvisionException(Messages.no_profile_registry);
return registry;
}
/*
- * Return the metadata repository manager. Throw an exception if it cannot be obtained.
+ * Return the metadata repository manager. Throw an exception if it cannot be
+ * obtained.
*/
public static IMetadataRepositoryManager getMetadataRepositoryManager() throws ProvisionException {
- IMetadataRepositoryManager manager = (IMetadataRepositoryManager) getAgent().getService(IMetadataRepositoryManager.SERVICE_NAME);
+ IMetadataRepositoryManager manager = getAgent().getService(IMetadataRepositoryManager.class);
if (manager == null)
throw new ProvisionException(Messages.no_metadataRepo_manager);
return manager;
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 d09ea5084..21b99553d 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
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2017 IBM Corporation and others.
+ * Copyright (c) 2009, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -26,7 +26,7 @@ import org.eclipse.equinox.internal.p2.repository.Transport;
import org.eclipse.equinox.internal.p2.repository.helpers.RepositoryHelper;
import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.engine.*;
-import org.eclipse.equinox.p2.internal.repository.comparator.MD5ArtifactComparator;
+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.planner.IPlanner;
@@ -38,6 +38,7 @@ import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
import org.eclipse.osgi.util.NLS;
public class MirrorApplication extends AbstractApplication implements IApplication, IExecutableExtension {
+ private static final String MD5_COMPARATOR = ArtifactChecksumComparator.COMPARATOR_ID + ".md5"; //$NON-NLS-1$
private static final String LOG_ROOT = "p2.mirror"; //$NON-NLS-1$
private static final String MIRROR_MODE = "metadataOrArtifacts"; //$NON-NLS-1$
@@ -97,8 +98,10 @@ public class MirrorApplication extends AbstractApplication implements IApplicati
}
/*
- * The old "org.eclipse.equinox.p2.artifact.repository.mirrorApplication" application only does artifacts
- * Similary, "org.eclipse.equinox.p2.metadata.repository.mirrorApplication" only does metadata
+ * The old "org.eclipse.equinox.p2.artifact.repository.mirrorApplication"
+ * application only does artifacts Similary,
+ * "org.eclipse.equinox.p2.metadata.repository.mirrorApplication" only does
+ * metadata
*/
@Override
public void setInitializationData(IConfigurationElement config, String propertyName, Object data) {
@@ -141,8 +144,8 @@ public class MirrorApplication extends AbstractApplication implements IApplicati
else if (args[i].equalsIgnoreCase("-properties")) //$NON-NLS-1$
mirrorProperties = true;
- // check for args with parameters. If we are at the last argument or
- // if the next one has a '-' as the first character, then we can't have
+ // check for args with parameters. If we are at the last argument or
+ // if the next one has a '-' as the first character, then we can't have
// an arg with a param so continue.
if (i == args.length - 1 || args[i + 1].startsWith("-")) //$NON-NLS-1$
continue;
@@ -153,7 +156,7 @@ public class MirrorApplication extends AbstractApplication implements IApplicati
comparatorID = arg;
else if (args[i - 1].equalsIgnoreCase("-comparatorLog")) //$NON-NLS-1$
comparatorLogLocation = new File(arg);
- else if (args[i - 1].equalsIgnoreCase("-destinationName")) //$NON-NLS-1$
+ else if (args[i - 1].equalsIgnoreCase("-destinationName")) //$NON-NLS-1$
destination.setName(arg);
else if (args[i - 1].equalsIgnoreCase("-writeMode")) { //$NON-NLS-1$
if (args[i].equalsIgnoreCase("clean")) //$NON-NLS-1$
@@ -237,7 +240,7 @@ public class MirrorApplication extends AbstractApplication implements IApplicati
Mirroring mirror = new Mirroring(getCompositeArtifactRepository(), destinationArtifactRepository, raw);
mirror.setCompare(compare);
- mirror.setComparatorId(comparatorID == null ? MD5ArtifactComparator.MD5_COMPARATOR_ID : comparatorID);
+ mirror.setComparatorId(comparatorID == null ? MD5_COMPARATOR : comparatorID);
mirror.setBaseline(initializeBaseline());
mirror.setValidate(validate);
mirror.setCompareExclusions(compareExclusions);
@@ -245,7 +248,8 @@ public class MirrorApplication extends AbstractApplication implements IApplicati
mirror.setIncludePacked(includePacked);
mirror.setMirrorProperties(mirrorProperties);
- // If IUs have been specified then only they should be mirrored, otherwise mirror everything.
+ // If IUs have been specified then only they should be mirrored, otherwise
+ // mirror everything.
if (iusSpecified)
mirror.setArtifactKeys(keys.toArray(new IArtifactKey[keys.size()]));
@@ -275,9 +279,9 @@ public class MirrorApplication extends AbstractApplication implements IApplicati
/*
* Ensure all mandatory parameters have been set. Throw an exception if there
- * are any missing. We don't require the user to specify the artifact repository here,
- * we will default to the ones already registered in the manager. (callers are free
- * to add more if they wish)
+ * are any missing. We don't require the user to specify the artifact repository
+ * here, we will default to the ones already registered in the manager. (callers
+ * are free to add more if they wish)
*/
private void validate() throws ProvisionException {
if (sourceRepositories.isEmpty())
@@ -299,7 +303,8 @@ public class MirrorApplication extends AbstractApplication implements IApplicati
for (String rootIU : rootIUs) {
String[] segments = getArrayArgsFromString(rootIU, "/"); //$NON-NLS-1$
VersionRange range = segments.length > 1 ? VersionRange.create(segments[1]) : null;
- Iterator<IInstallableUnit> queryResult = metadataRepo.query(QueryUtil.createIUQuery(segments[0], range), null).iterator();
+ Iterator<IInstallableUnit> queryResult = metadataRepo
+ .query(QueryUtil.createIUQuery(segments[0], range), null).iterator();
while (queryResult.hasNext())
sourceIUs.add(queryResult.next());
}
@@ -348,7 +353,7 @@ public class MirrorApplication extends AbstractApplication implements IApplicati
IProfileRegistry registry = Activator.getProfileRegistry();
String profileId = "MirrorApplication-" + System.currentTimeMillis(); //$NON-NLS-1$
IProfile profile = registry.addProfile(profileId, slicingOptions.getFilter());
- IPlanner planner = (IPlanner) Activator.getAgent().getService(IPlanner.SERVICE_NAME);
+ IPlanner planner = Activator.getAgent().getService(IPlanner.class);
if (planner == null)
throw new IllegalStateException();
IProfileChangeRequest pcr = planner.createChangeRequest(profile);
@@ -369,8 +374,12 @@ public class MirrorApplication extends AbstractApplication implements IApplicati
if (slicingOptions.getInstallTimeLikeResolution())
return performResolution(monitor);
- PermissiveSlicer slicer = new PermissiveSlicer(getCompositeMetadataRepository(), slicingOptions.getFilter(), slicingOptions.includeOptionalDependencies(), slicingOptions.isEverythingGreedy(), slicingOptions.forceFilterTo(), slicingOptions.considerStrictDependencyOnly(), slicingOptions.followOnlyFilteredRequirements());
- IQueryable<IInstallableUnit> slice = slicer.slice(sourceIUs.toArray(new IInstallableUnit[sourceIUs.size()]), monitor);
+ PermissiveSlicer slicer = new PermissiveSlicer(getCompositeMetadataRepository(), slicingOptions.getFilter(),
+ slicingOptions.includeOptionalDependencies(), slicingOptions.isEverythingGreedy(),
+ slicingOptions.forceFilterTo(), slicingOptions.considerStrictDependencyOnly(),
+ slicingOptions.followOnlyFilteredRequirements());
+ IQueryable<IInstallableUnit> slice = slicer.slice(sourceIUs.toArray(new IInstallableUnit[sourceIUs.size()]),
+ monitor);
if (slice != null && slicingOptions.latestVersionOnly()) {
IQueryResult<IInstallableUnit> queryResult = slice.query(QueryUtil.createLatestIUQuery(), monitor);
@@ -406,14 +415,16 @@ public class MirrorApplication extends AbstractApplication implements IApplicati
}
/*
- * Set whether or not the application should be calling a comparator when mirroring.
+ * Set whether or not the application should be calling a comparator when
+ * mirroring.
*/
public void setCompare(boolean value) {
compare = value;
}
/*
- * Set whether or not we should ignore errors when running the mirror application.
+ * Set whether or not we should ignore errors when running the mirror
+ * application.
*/
public void setIgnoreErrors(boolean value) {
failOnError = !value;
@@ -441,7 +452,7 @@ public class MirrorApplication extends AbstractApplication implements IApplicati
}
/*
- * Set the location of the log for mirroring.
+ * Set the location of the log for mirroring.
*/
public void setLog(File mirrorLog) {
this.mirrorLogFile = mirrorLog;
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 59555f69f..0e1bb9335 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
@@ -65,10 +65,12 @@ public class RecreateRepositoryApplication extends AbstractApplication {
IArtifactRepositoryManager repositoryManager = getArtifactRepositoryManager();
removeArtifactRepo = !repositoryManager.contains(repoLocation);
- IArtifactRepository repository = repositoryManager.loadRepository(repoLocation, IRepositoryManager.REPOSITORY_HINT_MODIFIABLE, monitor);
+ IArtifactRepository repository = repositoryManager.loadRepository(repoLocation,
+ IRepositoryManager.REPOSITORY_HINT_MODIFIABLE, monitor);
if (repository == null || !repository.isModifiable())
- throw new ProvisionException(NLS.bind(Messages.exception_destinationNotModifiable, repository.getLocation()));
+ throw new ProvisionException(
+ NLS.bind(Messages.exception_destinationNotModifiable, repository.getLocation()));
if (!(repository instanceof IFileArtifactRepository))
throw new ProvisionException(NLS.bind(Messages.exception_notLocalFileRepo, repository.getLocation()));
@@ -99,10 +101,11 @@ public class RecreateRepositoryApplication extends AbstractApplication {
private void recreateRepository(IProgressMonitor monitor) throws ProvisionException {
IArtifactRepositoryManager manager = getArtifactRepositoryManager();
- //add pack200 mappings, the existing repoProperties is not modifiable
+ // add pack200 mappings, the existing repoProperties is not modifiable
Map<String, String> 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);
+ IArtifactRepository repository = manager.createRepository(repoLocation, repoName,
+ IArtifactRepositoryManager.TYPE_SIMPLE_REPOSITORY, newProperties);
if (!(repository instanceof IFileArtifactRepository))
throw new ProvisionException(NLS.bind(Messages.exception_notLocalFileRepo, repository.getLocation()));
@@ -130,7 +133,8 @@ public class RecreateRepositoryApplication extends AbstractApplication {
// TODO handle errors in some way
LogHelper.log(status);
- Map<String, String> checksumsToProperties = ChecksumUtilities.checksumsToProperties(IArtifactDescriptor.DOWNLOAD_CHECKSUM, checksums);
+ Map<String, String> checksumsToProperties = ChecksumUtilities
+ .checksumsToProperties(IArtifactDescriptor.DOWNLOAD_CHECKSUM, checksums);
newDescriptor.addProperties(checksumsToProperties);
File temp = new File(artifactFile.getParentFile(), artifactFile.getName() + ".pack.gz"); //$NON-NLS-1$
@@ -148,13 +152,15 @@ public class RecreateRepositoryApplication extends AbstractApplication {
}
}
+ @Deprecated(forRemoval = true, since = "2.3.0")
private ArtifactDescriptor createPack200ArtifactDescriptor(IArtifactKey key, File packFile, String installSize) {
if (packFile != null && packFile.exists()) {
ArtifactDescriptor result = new ArtifactDescriptor(key);
result.setProperty(IArtifactDescriptor.ARTIFACT_SIZE, installSize);
result.setProperty(IArtifactDescriptor.DOWNLOAD_SIZE, Long.toString(packFile.length()));
- IProcessingStepDescriptor[] steps = new IProcessingStepDescriptor[] {new ProcessingStepDescriptor("org.eclipse.equinox.p2.processing.Pack200Unpacker", null, true)}; //$NON-NLS-1$
+ IProcessingStepDescriptor[] steps = new IProcessingStepDescriptor[] {
+ new ProcessingStepDescriptor("org.eclipse.equinox.p2.processing.Pack200Unpacker", null, true) }; //$NON-NLS-1$
result.setProcessingSteps(steps);
result.setProperty(IArtifactDescriptor.FORMAT, IArtifactDescriptor.FORMAT_PACKED);
return result;
diff --git a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/messages.properties b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/messages.properties
index 3babdd987..4f512da83 100644
--- a/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/messages.properties
+++ b/bundles/org.eclipse.equinox.p2.repository.tools/src/org/eclipse/equinox/p2/internal/repository/tools/messages.properties
@@ -1,5 +1,5 @@
###############################################################################
-# Copyright (c) 2009, 2018 IBM Corporation and others.
+# Copyright (c) 2009, 2021 IBM Corporation and others.
#
# This program and the accompanying materials
# are made available under the terms of the Eclipse Public License 2.0
@@ -20,7 +20,7 @@ CompositeRepository_default_metadataRepo_name=Composite Artifact Repository
info_noMD5Infomation=No MD5 information available for the artifact [{0}].
info_noMD5InRepository=The repository {0} does not contain MD5 information for artifact [{1}].
-warning_differentMD5=The repositories {0} and {1} have different MD5 sums for the artifact [{2}].
+warning_differentMD5=The repositories {0} and {1} have different MessageDigest=MD5 sums for the artifact [{2}].
info_noChecksumInfomation=No {0} information available for the artifact [{1}].
info_noChecksumInRepository=The repository {0} does not contain {1} information for artifact [{2}].
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 243e468d2..6a41e1dcc 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
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2017 IBM Corporation and others.
+ * Copyright (c) 2009, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -17,8 +17,7 @@ package org.eclipse.equinox.p2.internal.repository.tools.tasks;
import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Task;
+import org.apache.tools.ant.*;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.URIUtil;
import org.eclipse.equinox.internal.p2.jarprocessor.ant.JarProcessorTask;
@@ -64,6 +63,7 @@ public class ProcessRepoTask extends Task {
private SigningOptions signing = null;
private JarProcessorTask jarProcessor = null;
+ @SuppressWarnings("removal")
@Override
public void execute() throws BuildException {
File file = URIUtil.toFile(repository);
@@ -112,11 +112,15 @@ public class ProcessRepoTask extends Task {
}
}
+ @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;
}
diff --git a/bundles/org.eclipse.equinox.p2.repository/.options b/bundles/org.eclipse.equinox.p2.repository/.options
new file mode 100644
index 000000000..c2d3dc538
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.repository/.options
@@ -0,0 +1,3 @@
+org.eclipse.equinox.p2.repository/credentials/debug = false
+org.eclipse.equinox.p2.repository/transport/debug = false
+org.eclipse.equinox.p2.repository/keyservice/debug = false
diff --git a/bundles/org.eclipse.equinox.p2.repository/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.repository/META-INF/MANIFEST.MF
index 444ede092..0f0800872 100644
--- a/bundles/org.eclipse.equinox.p2.repository/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.repository/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.repository;singleton:=true
-Bundle-Version: 2.5.0.qualifier
+Bundle-Version: 2.6.0.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.repository.Activator
Bundle-Vendor: %providerName
Bundle-Localization: plugin
@@ -42,6 +42,16 @@ Require-Bundle: org.eclipse.equinox.common,
Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Import-Package: javax.crypto,
+ org.bouncycastle;version="1.69.0",
+ org.bouncycastle.bcpg;version="1.69.0",
+ org.bouncycastle.gpg.keybox;version="1.69.0",
+ org.bouncycastle.gpg.keybox.jcajce;version="1.69.0",
+ org.bouncycastle.openpgp;version="1.69.0",
+ org.bouncycastle.openpgp.jcajce;version="1.69.0",
+ org.bouncycastle.openpgp.operator;version="1.69.0",
+ org.bouncycastle.openpgp.operator.bc;version="1.69.0",
+ org.bouncycastle.openpgp.operator.jcajce;version="1.69.0",
+ org.bouncycastle.util.encoders;version="1.69.0",
org.eclipse.core.runtime.jobs,
org.eclipse.core.runtime.preferences;version="3.2.0",
org.eclipse.equinox.internal.p2.core,
@@ -61,5 +71,5 @@ Import-Package: javax.crypto,
org.osgi.service.packageadmin;version="1.2.0",
org.osgi.service.prefs;version="1.0.0",
org.osgi.util.tracker;version="1.4.0"
-Service-Component: OSGI-INF/cacheManager.xml
+Service-Component: OSGI-INF/cacheManager.xml, OSGI-INF/pgpPublicKeyService.xml
Automatic-Module-Name: org.eclipse.equinox.p2.repository
diff --git a/bundles/org.eclipse.equinox.p2.repository/OSGI-INF/pgpPublicKeyService.xml b/bundles/org.eclipse.equinox.p2.repository/OSGI-INF/pgpPublicKeyService.xml
new file mode 100644
index 000000000..e303cd93e
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.repository/OSGI-INF/pgpPublicKeyService.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.equinox.p2.repository.spi.pgpPublicKeyService">
+ <implementation class="org.eclipse.equinox.internal.p2.repository.PGPKeyServiceComponent"/>
+ <service>
+ <provide interface="org.eclipse.equinox.p2.core.spi.IAgentServiceFactory"/>
+ </service>
+ <property name="p2.agent.servicename" type="String" value="org.eclipse.equinox.p2.repository.spi.PGPPublicKeyService"/>
+</scr:component>
diff --git a/bundles/org.eclipse.equinox.p2.repository/build.properties b/bundles/org.eclipse.equinox.p2.repository/build.properties
index f3b28f666..89e396d06 100644
--- a/bundles/org.eclipse.equinox.p2.repository/build.properties
+++ b/bundles/org.eclipse.equinox.p2.repository/build.properties
@@ -17,6 +17,7 @@ bin.includes = META-INF/,\
about.html,\
plugin.properties,\
OSGI-INF/cacheManager.xml,\
- OSGI-INF/
+ OSGI-INF/,\
+ .options
src.includes = about.html
source.. = src/
diff --git a/bundles/org.eclipse.equinox.p2.repository/pom.xml b/bundles/org.eclipse.equinox.p2.repository/pom.xml
index 0b6b8f363..7b16ab7c0 100644
--- a/bundles/org.eclipse.equinox.p2.repository/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.repository/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.repository</artifactId>
- <version>2.5.0-SNAPSHOT</version>
+ <version>2.6.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/persistence/XMLWriter.java b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/persistence/XMLWriter.java
index a31a7515d..cfcd0bbe7 100644
--- a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/persistence/XMLWriter.java
+++ b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/persistence/XMLWriter.java
@@ -122,7 +122,7 @@ public class XMLWriter implements XMLConstants {
}
public static String escape(String txt) {
- StringBuffer buffer = null;
+ StringBuilder buffer = null;
for (int i = 0; i < txt.length(); ++i) {
String replace;
char c = txt.charAt(i);
@@ -162,7 +162,7 @@ public class XMLWriter implements XMLConstants {
replace = Character.isWhitespace(c) ? " " : null; //$NON-NLS-1$
}
if (buffer == null) {
- buffer = new StringBuffer(txt.length() + 16);
+ buffer = new StringBuilder(txt.length() + 16);
buffer.append(txt.substring(0, i));
}
if (replace != null)
diff --git a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/CacheManager.java b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/CacheManager.java
index 99b3e9f41..aeda92105 100644
--- a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/CacheManager.java
+++ b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/CacheManager.java
@@ -27,12 +27,13 @@ import org.eclipse.equinox.internal.provisional.p2.repository.RepositoryEvent;
import org.eclipse.equinox.p2.core.IAgentLocation;
import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.repository.IRepository;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
import org.eclipse.osgi.util.NLS;
/**
* A class to manage metadata cache files. Creating the cache files will place
* the file in the AgentData location in a cache directory.
- *
+ *
* Using the bus listeners will allow the manager to listen for repository
* events. When a repository is removed, it will remove the cache file if one
* was created for the repository.
@@ -94,6 +95,7 @@ public class CacheManager {
if (!isURL(remoteFile)) {
throw new ProvisionException(new Status(IStatus.ERROR, Activator.ID, ProvisionException.REPOSITORY_NOT_FOUND, NLS.bind(Messages.CacheManager_CannotLoadNonUrlLocation, remoteFile), null));
}
+ checkLocationIsSecure(remoteFile);
SubMonitor submonitor = SubMonitor.convert(monitor, 1000);
try {
@@ -144,13 +146,13 @@ public class CacheManager {
/**
* Returns a local cache file with the contents of the given remote location,
* or <code>null</code> if a local cache could not be created.
- *
+ *
* @param repositoryLocation The remote location to be cached
* @param prefix The prefix to use when creating the cache file
* @param monitor a progress monitor
* @return A {@link File} object pointing to the cache file or <code>null</code>
* if the location is not a repository.
- * @throws FileNotFoundException if neither jar nor xml index file exists at given location
+ * @throws FileNotFoundException if neither jar nor xml index file exists at given location
* @throws AuthenticationFailedException if jar not available and xml causes authentication fail
* @throws IOException on general IO errors
* @throws ProvisionException on any error (e.g. user cancellation, unknown host, malformed address, connection refused, etc.)
@@ -160,7 +162,7 @@ public class CacheManager {
if (!isURL(repositoryLocation)) {
throw new ProvisionException(new Status(IStatus.ERROR, Activator.ID, ProvisionException.REPOSITORY_NOT_FOUND, NLS.bind(Messages.CacheManager_CannotLoadNonUrlLocation, repositoryLocation), null));
}
-
+ checkLocationIsSecure(repositoryLocation);
SubMonitor submonitor = SubMonitor.convert(monitor, 1000);
try {
knownPrefixes.add(prefix);
@@ -169,7 +171,7 @@ public class CacheManager {
URI xmlLocation = URIUtil.append(repositoryLocation, prefix + XML_EXTENSION);
int hashCode = computeHash(repositoryLocation);
- // Knowing if cache is stale is complicated by the fact that a jar could have been
+ // Knowing if cache is stale is complicated by the fact that a jar could have been
// produced after an xml index (and vice versa), and by the need to capture any
// errors, as these needs to be reported to the user as something meaningful - instead of
// just a general "can't read repository".
@@ -189,7 +191,7 @@ public class CacheManager {
// bug 269588 - server may return 0 when file exists, so extra flag is needed
boolean useJar = true;
try {
- lastModifiedRemote = transport.getLastModified(jarLocation, submonitor.newChild(1));
+ lastModifiedRemote = getLastModified(jarLocation, submonitor.newChild(1));
if (lastModifiedRemote <= 0)
LogHelper.log(new Status(IStatus.WARNING, Activator.ID, "Server returned lastModified <= 0 for " + jarLocation)); //$NON-NLS-1$
} catch (AuthenticationFailedException e) {
@@ -226,8 +228,8 @@ public class CacheManager {
// (Status is reported based on finding the XML file as giving up on certain errors
// when checking for the jar may not be correct).
try {
- lastModifiedRemote = transport.getLastModified(xmlLocation, submonitor.newChild(1));
- // if lastModifiedRemote is 0 - something is wrong in the communication stack, as
+ lastModifiedRemote = getLastModified(xmlLocation, submonitor.newChild(1));
+ // if lastModifiedRemote is 0 - something is wrong in the communication stack, as
// a FileNotFound exception should have been thrown.
// bug 269588 - server may return 0 when file exists - site is not correctly configured
if (lastModifiedRemote <= 0)
@@ -267,6 +269,30 @@ public class CacheManager {
}
}
+ private void checkLocationIsSecure(URI repositoryLocation) {
+ if ("http".equals(repositoryLocation.getScheme())) { //$NON-NLS-1$
+ LogHelper.log(new Status(IStatus.WARNING, Activator.ID, NLS.bind(Messages.unsafeHttp, repositoryLocation)));
+ }
+ }
+
+ private long getLastModified(URI location, IProgressMonitor monitor) throws AuthenticationFailedException, FileNotFoundException, CoreException {
+ CoreException exception = null;
+ long lastModifiedRemote = -1L;
+ do {
+ try {
+ lastModifiedRemote = transport.getLastModified(location, monitor);
+ } catch (CoreException e) {
+ if (e.getStatus() == null) {
+ throw e;
+ }
+ exception = e;
+ }
+ } while (exception != null && exception.getStatus() != null && exception.getStatus().getCode() == IArtifactRepository.CODE_RETRY);
+ if (exception != null)
+ throw exception;
+ return lastModifiedRemote;
+ }
+
/**
* Deletes the local cache file(s) for the given repository
* @param repositoryLocation
@@ -386,7 +412,7 @@ public class CacheManager {
if (!downloadDir.exists())
downloadDir.mkdir();
File tempFile = new File(downloadDir, cacheFile.getName());
- // Ensure that the file from a previous download attempt is removed
+ // Ensure that the file from a previous download attempt is removed
if (tempFile.exists())
safeDelete(tempFile);
@@ -402,6 +428,9 @@ public class CacheManager {
try {
submonitor.setWorkRemaining(1000);
result = transport.download(remoteFile, stream, submonitor.newChild(1000));
+ while (result.getCode() == IArtifactRepository.CODE_RETRY) {
+ result = transport.download(remoteFile, stream, submonitor.newChild(1000));
+ }
} catch (OperationCanceledException e) {
// need to pick up the status - a new operation canceled exception is thrown at the end
// as status will be CANCEL.
diff --git a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/Messages.java b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/Messages.java
index cd508f561..cd53a09b0 100644
--- a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/Messages.java
+++ b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/Messages.java
@@ -7,7 +7,7 @@
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
- *
+ *
* Contributors:
* IBM Corporation - initial API and implementation
* Cloudsmith Inc - additional messages
@@ -89,6 +89,7 @@ public class Messages extends NLS {
public static String UnableToRead_0_UserCanceled;
public static String RepositoryTransport_failedReadRepo;
+ public static String unsafeHttp;
static {
// initialize resource bundles
diff --git a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/PGPKeyServiceComponent.java b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/PGPKeyServiceComponent.java
new file mode 100644
index 000000000..dfb73bc90
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/PGPKeyServiceComponent.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2022 Eclipse contributors 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
+ *******************************************************************************/
+package org.eclipse.equinox.internal.p2.repository;
+
+import org.eclipse.equinox.internal.provisional.p2.repository.DefaultPGPPublicKeyService;
+import org.eclipse.equinox.p2.core.IProvisioningAgent;
+import org.eclipse.equinox.p2.core.spi.IAgentServiceFactory;
+
+public class PGPKeyServiceComponent implements IAgentServiceFactory {
+ @Override
+ public Object createService(IProvisioningAgent agent) {
+ return new DefaultPGPPublicKeyService(agent);
+ }
+}
diff --git a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/RepositoryPreferences.java b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/RepositoryPreferences.java
index a126e80b6..23ce204bf 100644
--- a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/RepositoryPreferences.java
+++ b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/RepositoryPreferences.java
@@ -15,25 +15,44 @@ package org.eclipse.equinox.internal.p2.repository;
*/
public class RepositoryPreferences {
+ /** See bug 574173: allow to retry download if specified */
+ private static boolean retryOnSocketTimeout = Boolean.getBoolean("p2.RepositoryPreferences.retryOnSocketTimeout"); //$NON-NLS-1$
+
+ /** See bug 574173 */
+ private static int connectionRetryCount = Integer.getInteger("p2.RepositoryPreferences.connectionRetryCount", 1); //$NON-NLS-1$
+
+ /** See bug 574173 */
+ private static int connectionMsRetryDelay = Integer.getInteger("p2.RepositoryPreferences.connectionMsRetryDelay", //$NON-NLS-1$
+ 200);
+
/**
- * Number of attempts to connect (with same credentials) before giving up.
- * Note that newer ECF using apache HTTPclient has retry by default.
- * TODO - make this configurable via a property.
- * TODO - consider removing this option
+ * Number of attempts to connect (with same credentials) before giving up. Note
+ * that newer ECF using apache HTTPclient has retry by default. TODO - consider
+ * removing this option
+ *
* @return the value 1
*/
public static int getConnectionRetryCount() {
- return 1;
+ return connectionRetryCount;
}
/**
* Reconnect delay after failure to connect (with same credentials)- in milliseconds.
* Current implementation returns 200ms.
- * TODO - make this configurable via a property
* @return the value 200
*/
public static long getConnectionMsRetryDelay() {
- return 200;
+ return connectionMsRetryDelay;
+ }
+
+ /**
+ * Whether an attempt should be made to retry download if the connection was
+ * terminated by SocketTimeoutException
+ *
+ * @return {@code false} by default
+ */
+ public static boolean getRetryOnSocketTimeout() {
+ return retryOnSocketTimeout;
}
/**
diff --git a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/helpers/AbstractRepositoryManager.java b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/helpers/AbstractRepositoryManager.java
index 06a338c2a..e85bdb2cb 100644
--- a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/helpers/AbstractRepositoryManager.java
+++ b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/helpers/AbstractRepositoryManager.java
@@ -32,8 +32,8 @@ import org.eclipse.equinox.internal.provisional.p2.repository.RepositoryEvent;
import org.eclipse.equinox.p2.core.*;
import org.eclipse.equinox.p2.core.spi.IAgentService;
import org.eclipse.equinox.p2.query.*;
-import org.eclipse.equinox.p2.repository.IRepository;
-import org.eclipse.equinox.p2.repository.IRepositoryManager;
+import org.eclipse.equinox.p2.repository.*;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
import org.eclipse.equinox.security.storage.EncodingUtils;
import org.eclipse.osgi.util.NLS;
import org.osgi.service.prefs.BackingStoreException;
@@ -196,6 +196,7 @@ public abstract class AbstractRepositoryManager<T> implements IRepositoryManager
clearNotFound(location);
boolean wasEnabled = isEnabled(location);
String nick = getRepositoryProperty(location, IRepository.PROP_NICKNAME);
+ String system = getRepositoryProperty(location, IRepository.PROP_SYSTEM);
//remove the repository so event is broadcast and repositories can clear their caches
if (!removeRepository(location))
fail(location, ProvisionException.REPOSITORY_NOT_FOUND);
@@ -204,6 +205,11 @@ public abstract class AbstractRepositoryManager<T> implements IRepositoryManager
IRepository<T> result = loadRepository(location, monitor, null, 0);
loaded = true;
setEnabled(location, wasEnabled);
+ if (result instanceof ICompositeRepository<?>) {
+ for (URI childLocation : ((ICompositeRepository<?>) result).getChildren()) {
+ basicRefreshRepository(childLocation, monitor);
+ }
+ }
return result;
} finally {
//if we failed to load, make sure the repository is not lost
@@ -211,6 +217,9 @@ public abstract class AbstractRepositoryManager<T> implements IRepositoryManager
addRepository(location, wasEnabled, true);
if (nick != null)
setRepositoryProperty(location, IRepository.PROP_NICKNAME, nick);
+ if (system != null) {
+ setRepositoryProperty(location, IRepository.PROP_SYSTEM, system);
+ }
}
}
@@ -727,6 +736,9 @@ public abstract class AbstractRepositoryManager<T> implements IRepositoryManager
ByteArrayOutputStream index = new ByteArrayOutputStream();
IStatus indexFileStatus = null;
indexFileStatus = getTransport().download(indexFileURI, index, monitor);
+ while (indexFileStatus.getCode() == IArtifactRepository.CODE_RETRY) {
+ indexFileStatus = getTransport().download(indexFileURI, index, monitor);
+ }
if (indexFileStatus != null && indexFileStatus.isOK())
return LocationProperties.create(new ByteArrayInputStream(index.toByteArray()));
return LocationProperties.createEmptyIndexFile();
diff --git a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/helpers/DebugHelper.java b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/helpers/DebugHelper.java
index bb422888a..e4955cefe 100644
--- a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/helpers/DebugHelper.java
+++ b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/helpers/DebugHelper.java
@@ -25,15 +25,18 @@ public class DebugHelper {
public static final boolean DEBUG_REPOSITORY_CREDENTIALS;
public static final boolean DEBUG_REPOSITORY_TRANSPORT;
+ public static final boolean DEBUG_KEY_SERVICE;
static {
DebugOptions options = ServiceHelper.getService(Activator.getContext(), DebugOptions.class);
if (options != null) {
DEBUG_REPOSITORY_CREDENTIALS = options.getBooleanOption(Activator.ID + "/credentials/debug", false); //$NON-NLS-1$
DEBUG_REPOSITORY_TRANSPORT = options.getBooleanOption(Activator.ID + "/transport/debug", false); //$NON-NLS-1$
+ DEBUG_KEY_SERVICE = options.getBooleanOption(Activator.ID + "/keyservice/debug", false); //$NON-NLS-1$
} else {
DEBUG_REPOSITORY_CREDENTIALS = false;
DEBUG_REPOSITORY_TRANSPORT = false;
+ DEBUG_KEY_SERVICE = false;
}
}
@@ -50,7 +53,7 @@ public class DebugHelper {
System.out.println(buffer.toString());
}
- public static void debug(String name, String message, Object[] keyValueArray) {
+ public static void debug(String name, String message, Object... keyValueArray) {
if (keyValueArray == null || keyValueArray.length == 0)
debug(name, message);
else {
diff --git a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/messages.properties b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/messages.properties
index 8c920be73..a2b8daa56 100644
--- a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/messages.properties
+++ b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/p2/repository/messages.properties
@@ -80,3 +80,4 @@ connection_to_0_failed_on_1_retry_attempt_2=Connection to {0} failed on {1}. Ret
UnableToRead_0_TooManyAttempts=Unable to read repository at: {0}. Too many failed login attempts.
UnableToRead_0_UserCanceled=Unable to read repository at: {0}. Login canceled by user.
RepositoryTransport_failedReadRepo=Error while reading from repository: {0}.
+unsafeHttp=Using unsafe http transport to retrieve {0}, see CVE-2021-41033. Consider using https instead. \ No newline at end of file
diff --git a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/provisional/p2/repository/DefaultPGPPublicKeyService.java b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/provisional/p2/repository/DefaultPGPPublicKeyService.java
new file mode 100644
index 000000000..3aa501986
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/internal/provisional/p2/repository/DefaultPGPPublicKeyService.java
@@ -0,0 +1,869 @@
+/*******************************************************************************
+ * Copyright (c) 2022 Eclipse contributors 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
+ *******************************************************************************/
+package org.eclipse.equinox.internal.provisional.p2.repository;
+
+import java.io.*;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.ByteBuffer;
+import java.nio.file.*;
+import java.nio.file.Path;
+import java.nio.file.attribute.FileTime;
+import java.util.*;
+import java.util.function.*;
+import org.bouncycastle.bcpg.ArmoredInputStream;
+import org.bouncycastle.bcpg.ArmoredOutputStream;
+import org.bouncycastle.gpg.keybox.*;
+import org.bouncycastle.gpg.keybox.jcajce.JcaKeyBoxBuilder;
+import org.bouncycastle.openpgp.*;
+import org.bouncycastle.openpgp.jcajce.JcaPGPObjectFactory;
+import org.bouncycastle.openpgp.operator.bc.BcPGPContentVerifierBuilderProvider;
+import org.bouncycastle.openpgp.operator.jcajce.JcaKeyFingerprintCalculator;
+import org.eclipse.core.runtime.*;
+import org.eclipse.equinox.internal.p2.core.helpers.LogHelper;
+import org.eclipse.equinox.internal.p2.repository.Transport;
+import org.eclipse.equinox.internal.p2.repository.helpers.DebugHelper;
+import org.eclipse.equinox.p2.core.IAgentLocation;
+import org.eclipse.equinox.p2.core.IProvisioningAgent;
+import org.eclipse.equinox.p2.repository.spi.PGPPublicKeyService;
+
+/**
+ * @since 2.6
+ */
+public class DefaultPGPPublicKeyService extends PGPPublicKeyService {
+
+ /**
+ * Enable debug tracing either via debug options or via a system property.
+ */
+ private static final boolean DEBUG_KEY_SERVICE = DebugHelper.DEBUG_KEY_SERVICE
+ || Boolean.TRUE.toString().equalsIgnoreCase(System.getProperty("p2.keyserver.debug")); //$NON-NLS-1$
+
+ /**
+ * The system property used to initialized the {@link #keyServer}.
+ */
+ private static final String KEY_SERVERS_PROPERTY = "p2.keyservers"; //$NON-NLS-1$
+
+ /**
+ * The system property used to determine where to look for the GPG pubring.
+ *
+ * @see #getGPPDirectory()
+ */
+ private static final String GPG_HOME_PROPERTY = "p2.gpg.home"; //$NON-NLS-1$
+
+ /**
+ * The system property used to determine whether to enable GPG pubring lookup.
+ *
+ * @see #gpg
+ * @see #setGPG(boolean)
+ */
+ private static final String GPG_PROPERTY = "p2.gpg"; //$NON-NLS-1$
+
+ /**
+ * The number of elapsed milliseconds after which keys cached from a key server
+ * are considered stale such that they will be re-fetched if possible.
+ */
+ private static final long STALE_AFTER_MILLIS = Long.getLong("p2.keyserver.cache.stale", 24) * 1000 * 60 * 60; //$NON-NLS-1$
+
+ /**
+ * Reuse p2's transport layer for fetching keys from the key server.
+ */
+ private final Transport transport;
+
+ /**
+ * Keys {@link #addKey(PGPPublicKey) added} to this key service are cached via
+ * this map.
+ */
+ private final Map<Long, LocalKeyCache> localKeys = new LinkedHashMap<>();
+
+ /**
+ * A folder with locally cached keys, indexed on {@link PGPPublicKey#getKeyID()
+ * key ID}.
+ */
+ private final Path keyCache;
+
+ /**
+ * The current key servers.
+ */
+ private final Map<String, PGPKeyServer> keyServers = new LinkedHashMap<>();
+
+ /**
+ * Whether to load from GPG's pubring.
+ */
+ private boolean gpg;
+
+ /**
+ * Creates an instance associated with the given agent.
+ *
+ * @param agent the agent for which a key service is provided.
+ */
+ public DefaultPGPPublicKeyService(IProvisioningAgent agent) {
+ IAgentLocation agentLocation = agent.getService(IAgentLocation.class);
+ URI dataArea = agentLocation.getDataArea(org.eclipse.equinox.internal.p2.repository.Activator.ID);
+ keyCache = Paths.get(dataArea).resolve("pgp"); //$NON-NLS-1$
+ try {
+ Files.createDirectories(keyCache);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ if (DEBUG_KEY_SERVICE) {
+ DebugHelper.debug("KeyServer", "Cache", "location", keyCache); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+
+ String keyServersProperty = System.getProperty(KEY_SERVERS_PROPERTY, ""); //$NON-NLS-1$
+ if (!keyServersProperty.isBlank()) {
+ Set<String> keyServersSet = new LinkedHashSet<>();
+ for (String keyServer : keyServersProperty.split("[,; \t]+")) { //$NON-NLS-1$
+ if (!keyServer.isEmpty()) {
+ keyServersSet.add(keyServer);
+ }
+ }
+
+ setKeyServers(keyServersSet);
+ }
+
+ setGPG(Boolean.TRUE.toString().equalsIgnoreCase(System.getProperty(GPG_PROPERTY, Boolean.TRUE.toString()))
+ || !System.getProperty(GPG_HOME_PROPERTY, "").isBlank()); //$NON-NLS-1$
+
+ transport = agent.getService(Transport.class);
+ }
+
+ public Set<String> getKeyServers() {
+ return Collections.unmodifiableSet(keyServers.keySet());
+ }
+
+ public void setKeyServers(Set<String> keyServers) {
+ Map<String, PGPKeyServer> newKeyServers = new LinkedHashMap<>();
+ for (String keyServer : keyServers) {
+ PGPKeyServer pgpKeyServer = this.keyServers.get(keyServer);
+ if (pgpKeyServer == null) {
+ pgpKeyServer = new PGPKeyServer(keyServer, this.keyCache) {
+ @Override
+ protected boolean isStale(Path path) {
+ return DefaultPGPPublicKeyService.this.isStale(path);
+ }
+
+ @Override
+ protected IStatus download(URI uri, OutputStream receiver, IProgressMonitor monitor) {
+ return DefaultPGPPublicKeyService.this.download(uri, receiver, monitor);
+ }
+
+ @Override
+ protected void log(Throwable throwable) {
+ DefaultPGPPublicKeyService.this.log(throwable);
+ }
+ };
+ }
+ newKeyServers.put(keyServer, pgpKeyServer);
+ }
+
+ this.keyServers.clear();
+ this.keyServers.putAll(newKeyServers);
+ }
+
+ @Override
+ public PGPPublicKey getKey(String fingerprint) {
+ int length = fingerprint.length();
+ if (length >= 16) {
+ long keyID = Long.parseUnsignedLong(fingerprint.substring(length - 16, length), 16);
+ Collection<PGPPublicKey> keys = getKeys(keyID);
+ for (PGPPublicKey key : keys) {
+ if (toHexFingerprint(key).equalsIgnoreCase(fingerprint)) {
+ return key;
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Collection<PGPPublicKey> getKeys(long keyID) {
+ List<PGPPublicKey> keys = new ArrayList<>();
+ for (PGPKeyServer keyServer : keyServers.values()) {
+ keys.addAll(keyServer.getKeys(keyID));
+ }
+
+ keys.addAll(getLocalKeyCache(keyID).get());
+
+ keys.addAll(getDefaultKeys(keyID));
+
+ return reconcileKeys(keys);
+ }
+
+ public boolean isGGP() {
+ return gpg;
+ }
+
+ public void setGPG(boolean gpg) {
+ this.gpg = gpg;
+ }
+
+ protected List<PGPPublicKey> getDefaultKeys(long keyID) {
+ return gpg ? getGPGPubringKeys(keyID) : Collections.emptyList();
+ }
+
+ protected List<PGPPublicKey> reconcileKeys(List<PGPPublicKey> keys) {
+ if (keys.size() <= 1) {
+ return new ArrayList<>(keys);
+ }
+
+ Map<ByteBuffer, PGPPublicKey> encodings = new LinkedHashMap<>();
+ Map<ByteBuffer, PGPPublicKey> fingerprints = new LinkedHashMap<>();
+ for (PGPPublicKey key : keys) {
+ try {
+ ByteBuffer encoding = ByteBuffer.wrap(key.getEncoded());
+ PGPPublicKey existingKey = encodings.put(encoding, key);
+ if (existingKey == null) {
+ ByteBuffer fingerprint = ByteBuffer.wrap(key.getFingerprint());
+ PGPPublicKey otherKey = fingerprints.put(fingerprint, key);
+ if (otherKey != null) {
+ fingerprints.put(fingerprint, choose(otherKey, key));
+ }
+ }
+ } catch (IOException e) {
+ log(e);
+ }
+ }
+
+ return new ArrayList<>(fingerprints.values());
+ }
+
+ /**
+ * While {@link #reconcileKeys(List) reconciling}, when two keys have the same
+ * fingerprint, this method must be chosen in favor of the other to be retained
+ * in the result.
+ *
+ * @param key1 the first key from which to choose.
+ * @param key2 the second key from which to choose.
+ * @return the key with the newest or most complete details.
+ */
+ protected PGPPublicKey choose(PGPPublicKey key1, PGPPublicKey key2) {
+ // Favor the one with the newest information.
+ long signatureTime1 = getNewestSignature(key1);
+ long signatureTime2 = getNewestSignature(key2);
+ if (signatureTime1 > signatureTime2) {
+ return key1;
+ } else if (signatureTime1 < signatureTime2) {
+ return key2;
+ }
+
+ // Favor the one with the most information.
+ int signatureCount1 = getSignatureCount(key1);
+ int signatureCount2 = getSignatureCount(key2);
+ if (signatureCount1 > signatureCount2) {
+ return key1;
+ } else if (signatureCount1 < signatureCount2) {
+ return key2;
+ }
+
+ return key1;
+ }
+
+ protected static int getSignatureCount(PGPPublicKey key) {
+ int result = 0;
+ for (Iterator<PGPSignature> signatures = key.getSignatures(); signatures.hasNext(); signatures.next()) {
+ ++result;
+ }
+ for (Iterator<PGPSignature> signatures = key.getKeySignatures(); signatures.hasNext(); signatures.next()) {
+ ++result;
+ }
+ return result;
+ }
+
+ protected static long getNewestSignature(PGPPublicKey key) {
+ long result = 0;
+ for (Iterator<PGPSignature> signatures = key.getSignatures(); signatures.hasNext();) {
+ PGPSignature signature = signatures.next();
+ long time = signature.getCreationTime().getTime();
+ result = Math.max(result, time);
+ }
+ for (Iterator<PGPSignature> signatures = key.getKeySignatures(); signatures.hasNext();) {
+ PGPSignature signature = signatures.next();
+ long time = signature.getCreationTime().getTime();
+ result = Math.max(result, time);
+ }
+
+ return result;
+ }
+
+ @Override
+ public PGPPublicKey addKey(PGPPublicKey key) {
+ long keyID = key.getKeyID();
+ LocalKeyCache localKeyCache = getLocalKeyCache(keyID);
+ localKeyCache.add(key);
+
+ Collection<PGPPublicKey> keys = getKeys(keyID);
+ byte[] fingerprint = key.getFingerprint();
+ for (PGPPublicKey otherKey : keys) {
+ if (Arrays.equals(otherKey.getFingerprint(), fingerprint)) {
+ return otherKey;
+ }
+ }
+
+ // We should never get this far.
+ return key;
+ }
+
+ protected boolean isStale(Path path) {
+ try {
+ FileTime lastModifiedTime = Files.getLastModifiedTime(path);
+ long lastModified = lastModifiedTime.toMillis();
+ long currentTime = System.currentTimeMillis();
+ return currentTime - lastModified > STALE_AFTER_MILLIS;
+ } catch (IOException e) {
+ return true;
+ }
+ }
+
+ @Override
+ public Set<PGPPublicKey> getVerifiedCertifications(PGPPublicKey key) {
+ Set<PGPPublicKey> certifications = new LinkedHashSet<>();
+ LOOP: for (Iterator<PGPSignature> signatures = key.getSignatures(); signatures.hasNext();) {
+ PGPSignature signature = signatures.next();
+ long signingKeyID = signature.getKeyID();
+ for (PGPPublicKey signingKey : getKeys(signingKeyID)) {
+ switch (signature.getSignatureType()) {
+ case PGPSignature.SUBKEY_BINDING:
+ case PGPSignature.PRIMARYKEY_BINDING: {
+ try {
+ signature.init(new BcPGPContentVerifierBuilderProvider(), signingKey);
+ if (signature.verifyCertification(signingKey, key)
+ && isCreatedBeforeRevocation(signature, signingKey)) {
+ certifications.add(signingKey);
+ continue LOOP;
+ }
+ } catch (PGPException e) {
+ //$FALL-THROUGH$
+ }
+ break;
+ }
+ case PGPSignature.DEFAULT_CERTIFICATION:
+ case PGPSignature.NO_CERTIFICATION:
+ case PGPSignature.CASUAL_CERTIFICATION:
+ case PGPSignature.POSITIVE_CERTIFICATION: {
+ for (Iterator<String> userIDs = key.getUserIDs(); userIDs.hasNext();) {
+ String userID = userIDs.next();
+ try {
+ signature.init(new BcPGPContentVerifierBuilderProvider(), signingKey);
+ if (signature.verifyCertification(userID, key)
+ && isCreatedBeforeRevocation(signature, signingKey)) {
+ certifications.add(signingKey);
+ continue LOOP;
+ }
+ } catch (PGPException e) {
+ //$FALL-THROUGH$
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+ return certifications;
+ }
+
+ @Override
+ public Date getVerifiedRevocationDate(PGPPublicKey key) {
+ for (Iterator<PGPSignature> signatures = key.getSignatures(); signatures.hasNext();) {
+ PGPSignature signature = signatures.next();
+ long signingKeyID = signature.getKeyID();
+ for (PGPPublicKey signingKey : getKeys(signingKeyID)) {
+ switch (signature.getSignatureType()) {
+ case PGPSignature.KEY_REVOCATION:
+ case PGPSignature.CERTIFICATION_REVOCATION: {
+ try {
+ signature.init(new BcPGPContentVerifierBuilderProvider(), signingKey);
+ if (signature.verifyCertification(key)) {
+ return signature.getCreationTime();
+ }
+ } catch (PGPException e) {
+ //$FALL-THROUGH$
+ }
+ break;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ private LocalKeyCache getLocalKeyCache(long keyID) {
+ LocalKeyCache localKeyCache = localKeys.get(keyID);
+ if (localKeyCache == null) {
+ String hexKeyID = toHex(keyID);
+ Path cache = keyCache.resolve(hexKeyID + ".asc"); //$NON-NLS-1$
+ localKeyCache = new LocalKeyCache(cache) {
+ @Override
+ protected List<PGPPublicKey> reconcileKeys(List<PGPPublicKey> keys) {
+ return DefaultPGPPublicKeyService.this.reconcileKeys(keys);
+ }
+
+ @Override
+ protected void log(Throwable throwable) {
+ DefaultPGPPublicKeyService.this.log(throwable);
+ }
+ };
+ localKeys.put(keyID, localKeyCache);
+ }
+ return localKeyCache;
+ }
+
+ protected Collection<PGPPublicKey> fetchKeys(URI uri, Path cache) throws IOException {
+ try {
+ ByteArrayOutputStream reciever = new ByteArrayOutputStream();
+ IStatus download = download(uri, reciever, new NullProgressMonitor());
+ if (!download.isOK()) {
+ Throwable exception = download.getException();
+ if (exception != null) {
+ throw new IOException(download.getMessage(), exception);
+ }
+ throw new IOException(download.getMessage());
+ }
+ List<PGPPublicKey> result = new ArrayList<>();
+ byte[] bytes = reciever.toByteArray();
+ try (InputStream input = new ArmoredInputStream(new ByteArrayInputStream(bytes))) {
+ result.addAll(loadKeys(input));
+ }
+
+ try (OutputStream out = newAtomicOutputStream(cache)) {
+ out.write(bytes);
+ }
+
+ return result;
+ } catch (IOException ex) {
+ if (Files.isRegularFile(cache)) {
+ try (InputStream input = new ArmoredInputStream(new BufferedInputStream(Files.newInputStream(cache)))) {
+ return loadKeys(input);
+ } catch (IOException ex1) {
+ try {
+ // Assume the cache is corrupt so delete it.
+ Files.delete(cache);
+ } catch (IOException ex2) {
+ log(ex2);
+ }
+ // Rethrow original network failure exception
+ throw new IOException("Error while processing " + uri + " as well while processing the cache " //$NON-NLS-1$ //$NON-NLS-2$
+ + cache + ": " + ex1.getMessage(), ex); //$NON-NLS-1$
+ }
+ }
+ throw new IOException("Error while processing " + uri, ex); //$NON-NLS-1$
+ }
+ }
+
+ protected IStatus download(URI uri, OutputStream receiver, IProgressMonitor monitor) {
+ return transport.download(uri, receiver, monitor);
+ }
+
+ protected void log(Throwable throwable) {
+ if (DEBUG_KEY_SERVICE) {
+ LogHelper.log(new Status(IStatus.ERROR, org.eclipse.equinox.internal.p2.repository.Activator.ID,
+ throwable.getMessage(), throwable));
+ }
+ }
+
+ protected static OutputStream newAtomicOutputStream(Path cache) throws IOException {
+ Path temp = Files.createTempFile(cache.getParent(), "out", ".tmp"); //$NON-NLS-1$ //$NON-NLS-2$
+ return new BufferedOutputStream(Files.newOutputStream(temp)) {
+ @Override
+ public void close() throws IOException {
+ super.close();
+ Files.move(temp, cache, StandardCopyOption.ATOMIC_MOVE, StandardCopyOption.REPLACE_EXISTING);
+ }
+ };
+ }
+
+ protected static List<PGPPublicKey> loadKeys(InputStream input) throws IOException {
+ try {
+ List<PGPPublicKey> result = new ArrayList<>();
+ for (Object o : new JcaPGPObjectFactory(input)) {
+ if (o instanceof PGPPublicKeyRingCollection) {
+ collectKeys((PGPPublicKeyRingCollection) o, result::add);
+ } else if (o instanceof PGPPublicKeyRing) {
+ collectKeys((PGPPublicKeyRing) o, result::add);
+ } else if (o instanceof PGPPublicKey) {
+ result.add((PGPPublicKey) o);
+ }
+ }
+ return result;
+ } catch (RuntimeException ex) {
+ throw new IOException(ex);
+ }
+ }
+
+ private static void collectKeys(PGPPublicKeyRingCollection pgpPublicKeyRingCollection,
+ Consumer<PGPPublicKey> collector) {
+ pgpPublicKeyRingCollection.forEach(keyring -> collectKeys(keyring, collector));
+ }
+
+ private static void collectKeys(PGPPublicKeyRing pgpPublicKeyRing, Consumer<PGPPublicKey> collector) {
+ pgpPublicKeyRing.getPublicKeys().forEachRemaining(collector::accept);
+ }
+
+ private static abstract class LocalKeyCache {
+ private Path cache;
+ private FileTime lastModifiedTime;
+ private List<PGPPublicKey> keys;
+
+ public LocalKeyCache(Path cache) {
+ this.cache = cache;
+ }
+
+ protected abstract void log(Throwable throwable);
+
+ protected abstract List<PGPPublicKey> reconcileKeys(List<PGPPublicKey> keysToReconcile);
+
+ public List<PGPPublicKey> get() {
+ if (keys != null) {
+ try {
+ FileTime newLastModifiedTime = Files.getLastModifiedTime(cache);
+ if (lastModifiedTime == null || lastModifiedTime.compareTo(newLastModifiedTime) < 0) {
+ lastModifiedTime = newLastModifiedTime;
+ } else {
+ return keys;
+ }
+ } catch (Exception e) {
+ //$FALL-THROUGH$
+ }
+ }
+
+ if (!Files.isRegularFile(cache)) {
+ return List.of();
+ }
+
+ try (InputStream input = new ArmoredInputStream(new BufferedInputStream(Files.newInputStream(cache)))) {
+ keys = loadKeys(input);
+ return keys;
+ } catch (IOException ex) {
+ log(ex);
+ try {
+ // Assume the cache is corrupt so delete it.
+ Files.delete(cache);
+ } catch (IOException ex2) {
+ log(ex2);
+ }
+ return List.of();
+ }
+ }
+
+ public void add(PGPPublicKey key) {
+ List<PGPPublicKey> oldKeys = get();
+ List<PGPPublicKey> newKeys = new ArrayList<>(oldKeys);
+ newKeys.add(key);
+ newKeys = reconcileKeys(newKeys);
+ if (!oldKeys.equals(newKeys)) {
+ try (OutputStream underlyingStream = newAtomicOutputStream(cache);
+ OutputStream output = new ArmoredOutputStream(underlyingStream)) {
+ for (PGPPublicKey newKey : newKeys) {
+ newKey.encode(output);
+ }
+ } catch (IOException e) {
+ log(e);
+ return;
+ }
+ keys = newKeys;
+ }
+ }
+ }
+
+ private static abstract class PGPKeyServer {
+ private final Map<Long, List<PGPPublicKey>> keyIDMap = new LinkedHashMap<>();
+
+ private final String keyServer;
+
+ private final Path keyCache;
+
+ public PGPKeyServer(String keyServer, Path baseCache) {
+ this.keyServer = keyServer;
+ keyCache = baseCache.resolve(keyServer.replace(':', '_'));
+ if (!Files.isDirectory(this.keyCache)) {
+ try {
+ Files.createDirectory(keyCache);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ protected abstract boolean isStale(Path path);
+
+ protected abstract IStatus download(URI uri, OutputStream receiver, IProgressMonitor monitor);
+
+ protected abstract void log(Throwable throwable);
+
+ public List<PGPPublicKey> getKeys(long keyID) {
+ List<PGPPublicKey> keys = keyIDMap.get(keyID);
+ String hexKeyID = toHex(keyID);
+ Path cache = keyCache.resolve(hexKeyID + ".asc"); //$NON-NLS-1$
+ boolean needsRemoteFetch = !Files.isRegularFile(cache) || isStale(cache);
+ if (keys == null || needsRemoteFetch) {
+ try {
+ Iterable<PGPPublicKey> fetchedKeys;
+ if (needsRemoteFetch) {
+ String link = "https://" + keyServer + "/pks/lookup?op=get&search=0x" + hexKeyID; //$NON-NLS-1$ //$NON-NLS-2$
+ if (DEBUG_KEY_SERVICE) {
+ DebugHelper.debug("KeyServer", "Searching", "uri", link); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
+ URI uri = new URI(link);
+ fetchedKeys = fetchKeys(uri, cache);
+ } else {
+ try (InputStream input = new ArmoredInputStream(
+ new BufferedInputStream(Files.newInputStream(cache)))) {
+ fetchedKeys = loadKeys(input);
+ }
+ }
+
+ List<PGPPublicKey> newKeys = new ArrayList<>();
+ for (PGPPublicKey fetchedKey : fetchedKeys) {
+ long fetchedKeyID = fetchedKey.getKeyID();
+ if (fetchedKeyID == keyID) {
+ newKeys.add(fetchedKey);
+ }
+ }
+
+ keyIDMap.put(keyID, newKeys);
+ keys = newKeys;
+ } catch (URISyntaxException | IOException e) {
+ log(e);
+ if (keys == null || keys.isEmpty()) {
+ List<PGPPublicKey> newKeys = List.of();
+ keyIDMap.put(keyID, newKeys);
+ keys = newKeys;
+ }
+ }
+ }
+
+ return Collections.unmodifiableList(keys);
+ }
+
+ protected Collection<PGPPublicKey> fetchKeys(URI uri, Path cache) throws IOException {
+ try {
+ ByteArrayOutputStream reciever = new ByteArrayOutputStream();
+ IStatus download = download(uri, reciever, new NullProgressMonitor());
+ if (!download.isOK()) {
+ // If the file is not found, save an empty file to prevent repeated attempts to
+ // download from this URI.
+ Throwable exception = download.getException();
+ if (exception instanceof FileNotFoundException) {
+ log(exception);
+ } else {
+ if (exception != null) {
+ throw new IOException(download.getMessage(), exception);
+ }
+ throw new IOException(download.getMessage());
+ }
+ }
+ List<PGPPublicKey> result;
+ byte[] bytes = reciever.toByteArray();
+ try {
+ try (InputStream input = new ArmoredInputStream(new ByteArrayInputStream(bytes))) {
+ result = loadKeys(input);
+ }
+ } catch (IOException ex) {
+ log(ex);
+ // If the bytes can't be processed cache an empty file to prevent repeated
+ // attempts.
+ bytes = new byte[0];
+ result = List.of();
+ }
+
+ try (OutputStream out = newAtomicOutputStream(cache)) {
+ out.write(bytes);
+ }
+
+ return result;
+ } catch (IOException ex) {
+ // If the key server fails, load the cache if it exists.
+ if (Files.isRegularFile(cache)) {
+ try (InputStream input = new ArmoredInputStream(
+ new BufferedInputStream(Files.newInputStream(cache)))) {
+ return loadKeys(input);
+ } catch (IOException ex1) {
+ try {
+ // Assume the cache is corrupt so delete it.
+ Files.delete(cache);
+ } catch (IOException ex2) {
+ log(ex2);
+ }
+ // Rethrow original network failure exception with additional details
+ throw new IOException("Error while processing " + uri + " as well while processing the cache " //$NON-NLS-1$ //$NON-NLS-2$
+ + cache + ": " + ex1.getMessage(), ex); //$NON-NLS-1$
+ }
+ }
+ throw new IOException("Error while processing " + uri, ex); //$NON-NLS-1$
+ }
+ }
+
+ }
+
+ private static List<PGPPublicKey> getGPGPubringKeys(long keyID) {
+ return GPGPubringCache.getKeys(keyID);
+ }
+
+ private static class GPGPubringCache {
+ private static final Supplier<PGPPublicKeyRingCollection> GPG_PUBRING = getGPGPubring();
+ private static volatile PGPPublicKeyRingCollection cachePubring;
+ private static volatile Map<Long, List<PGPPublicKey>> cache;
+
+ public static List<PGPPublicKey> getKeys(long keyID) {
+ PGPPublicKeyRingCollection pubring = GPG_PUBRING.get();
+ if (pubring != cachePubring) {
+ Map<Long, List<PGPPublicKey>> newCache = new LinkedHashMap<>();
+ for (Iterator<PGPPublicKeyRing> keyRings = pubring.getKeyRings(); keyRings.hasNext();) {
+ for (PGPPublicKey key : keyRings.next()) {
+ long keyID2 = key.getKeyID();
+ List<PGPPublicKey> keys = newCache.computeIfAbsent(keyID2, it -> new ArrayList<>());
+ keys.add(key);
+ }
+ }
+ cache = newCache;
+ cachePubring = pubring;
+ }
+
+ List<PGPPublicKey> result = cache.get(keyID);
+ return result == null ? List.of() : result;
+ }
+ }
+
+ private static abstract class GPGPubringSupplier implements Supplier<PGPPublicKeyRingCollection> {
+
+ private final Path pubring;
+
+ private PGPPublicKeyRingCollection keyRingCollection;
+
+ private FileTime lastModifiedTime;
+
+ public GPGPubringSupplier(Path pubring) {
+ this.pubring = pubring;
+ try {
+ keyRingCollection = new PGPPublicKeyRingCollection(Collections.emptyList());
+ } catch (IOException | PGPException e) {
+ // Cannot happen for an empty collection.
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public PGPPublicKeyRingCollection get() {
+ try {
+ FileTime newLastModifiedTime = Files.getLastModifiedTime(pubring);
+ if (lastModifiedTime == null || lastModifiedTime.compareTo(newLastModifiedTime) < 0) {
+ lastModifiedTime = newLastModifiedTime;
+ keyRingCollection = buildPubring();
+ }
+ } catch (Exception e) {
+ //$FALL-THROUGH$
+ }
+ return keyRingCollection;
+ }
+
+ protected abstract PGPPublicKeyRingCollection buildPubring() throws Exception;
+ }
+
+ private static Supplier<PGPPublicKeyRingCollection> getGPGPubring() {
+ Path gpgDirectory = getGPPDirectory();
+ Path pubringGpg = gpgDirectory.resolve("pubring.gpg"); //$NON-NLS-1$
+ Path pubringKbx = gpgDirectory.resolve("pubring.kbx"); //$NON-NLS-1$
+
+ if (Files.isRegularFile(pubringGpg)) {
+ return new GPGPubringSupplier(pubringGpg) {
+ @Override
+ protected PGPPublicKeyRingCollection buildPubring() throws Exception {
+ try (InputStream input = new BufferedInputStream(Files.newInputStream(pubringGpg))) {
+ PGPPublicKeyRingCollection keyRingCollection = new PGPPublicKeyRingCollection(input,
+ new JcaKeyFingerprintCalculator());
+ return keyRingCollection;
+ }
+ }
+ };
+ } else if (Files.isRegularFile(pubringKbx)) {
+ return new GPGPubringSupplier(pubringKbx) {
+ @Override
+ protected PGPPublicKeyRingCollection buildPubring() throws Exception {
+ try (InputStream input = new BufferedInputStream(Files.newInputStream(pubringKbx))) {
+ KeyBox keyBox = new JcaKeyBoxBuilder().build(input);
+ List<PGPPublicKeyRing> pgpPublicKeyRings = new ArrayList<>();
+ for (KeyBlob keyBlob : keyBox.getKeyBlobs()) {
+ switch (keyBlob.getType()) {
+ case OPEN_PGP_BLOB: {
+ PGPPublicKeyRing pgpPublicKeyRing = ((PublicKeyRingBlob) keyBlob).getPGPPublicKeyRing();
+ pgpPublicKeyRings.add(pgpPublicKeyRing);
+ }
+ default: {
+ //$FALL-THROUGH$
+ }
+ }
+ }
+ PGPPublicKeyRingCollection keyRingCollection = new PGPPublicKeyRingCollection(
+ pgpPublicKeyRings);
+ return keyRingCollection;
+ }
+ }
+ };
+ } else {
+ PGPPublicKeyRingCollection empty;
+ try {
+ empty = new PGPPublicKeyRingCollection(Collections.emptyList());
+ } catch (IOException | PGPException e) {
+ // Cannot happen for an empty collection.
+ throw new RuntimeException(e);
+ }
+ return () -> empty;
+ }
+ }
+
+ @SuppressWarnings("nls")
+ private static Path getGPPDirectory() {
+ // Handle ~ as might be used on macos and linux.
+ Function<String, Path> resolveTilde = s -> {
+ if (s.startsWith("~/") || s.startsWith("~" + File.separatorChar)) {
+ return new File(System.getProperty("user.home"), s.substring(2)).getAbsoluteFile().toPath();
+ }
+ return Paths.get(s);
+ };
+
+ // Allow the user to specify the GPG home used by p2 specifically.
+ Path path = checkDirectory(System.getProperty(GPG_HOME_PROPERTY), resolveTilde);
+ if (path != null) {
+ return path;
+ }
+
+ path = checkDirectory(System.getenv("GNUPGHOME"), resolveTilde);
+ if (path != null) {
+ return path;
+ }
+
+ if ("win32".equals(System.getProperty("osgi.os"))) {
+ // On Windows prefer %APPDATA%\gnupg if it exists, even if Cygwin is used.
+ path = checkDirectory(System.getenv("APPDATA"), //$NON-NLS-1$
+ s -> Paths.get(s).resolve("gnupg")); //$NON-NLS-1$
+ if (path != null) {
+ return path;
+ }
+ }
+ // All systems, including Cygwin and even Windows if %APPDATA%\gnupg doesn't
+ // exist.
+ return resolveTilde.apply("~/.gnupg"); //$NON-NLS-1$
+ }
+
+ private static Path checkDirectory(String dir, Function<String, Path> toPath) {
+ if (dir != null && !dir.isBlank()) {
+ try {
+ Path directory = toPath.apply(dir);
+ if (Files.isDirectory(directory)) {
+ return directory;
+ }
+ } catch (RuntimeException e) {
+ //$FALL-THROUGH$
+ }
+ }
+ return null;
+ }
+}
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 9b5cd4d9b..2403402ac 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
@@ -23,7 +23,7 @@ import org.eclipse.equinox.p2.repository.artifact.spi.ArtifactDescriptor;
* descriptor defines the artifact it contains, as well as any processing steps that
* must be performed when the artifact is transferred out of the repository (such
* as decompression, error checking, etc).
- *
+ *
* @noextend This interface is not intended to be extended by clients.
* @noimplement This interface is not intended to be implemented by clients. Instead subclass the {@link ArtifactDescriptor} class
* @since 2.0
@@ -34,37 +34,36 @@ public interface IArtifactDescriptor {
* An artifact descriptor property (value "download.size") indicating the number
* of bytes that will be transferred when this artifact is transferred out of the repository.
*/
- public static final String DOWNLOAD_SIZE = "download.size"; //$NON-NLS-1$
+ String DOWNLOAD_SIZE = "download.size"; //$NON-NLS-1$
/**
* An artifact descriptor property (value "artifact.size") indicating the size in
* bytes of the artifact in its native format (after processing steps have been applied).
*/
- public static final String ARTIFACT_SIZE = "artifact.size"; //$NON-NLS-1$
+ String ARTIFACT_SIZE = "artifact.size"; //$NON-NLS-1$
/**
* A prefix of an artifact descriptor properties storing checksum
* of the artifact bytes that are transferred.
* @since 2.4
*/
- public static final String DOWNLOAD_CHECKSUM = "download.checksum"; //$NON-NLS-1$
+ String DOWNLOAD_CHECKSUM = "download.checksum"; //$NON-NLS-1$
/**
* An artifact descriptor property (value "download.md5") indicating the MD5
* checksum of the artifact bytes that are transferred.
* @see #DOWNLOAD_CHECKSUM
*/
- @Deprecated
- public static final String DOWNLOAD_MD5 = "download.md5"; //$NON-NLS-1$
+ @Deprecated String DOWNLOAD_MD5 = "download.md5"; //$NON-NLS-1$
/**
- * An artifact descriptor property (value "download.contentType") indicating the
+ * An artifact descriptor property (value "download.contentType") indicating the
* content type of the artifact bytes that are transferred.
*/
- public static final String DOWNLOAD_CONTENTTYPE = "download.contentType"; //$NON-NLS-1$
+ String DOWNLOAD_CONTENTTYPE = "download.contentType"; //$NON-NLS-1$
/**
* An content type (value "application/zip") indicating the content is a zip file.
*/
- public static final String TYPE_ZIP = "application/zip"; //$NON-NLS-1$
+ String TYPE_ZIP = "application/zip"; //$NON-NLS-1$
/**
* A prefix of an artifact descriptor property storing list of
@@ -72,7 +71,7 @@ public interface IArtifactDescriptor {
* been applied).
* @since 2.4
*/
- public static final String ARTIFACT_CHECKSUM = "artifact.checksum"; //$NON-NLS-1$
+ String ARTIFACT_CHECKSUM = "artifact.checksum"; //$NON-NLS-1$
/**
* An artifact descriptor property (value "artifact.md5") indicating the MD5
@@ -80,59 +79,61 @@ public interface IArtifactDescriptor {
* been applied).
* @see #ARTIFACT_CHECKSUM
*/
- @Deprecated
- public static final String ARTIFACT_MD5 = "artifact.md5"; //$NON-NLS-1$
+ @Deprecated String ARTIFACT_MD5 = "artifact.md5"; //$NON-NLS-1$
/**
* An artifact descriptor property (value "format") indicating the storage format
* of the artifact in the repository.
* @see #FORMAT_PACKED
*/
- public static final String FORMAT = "format"; //$NON-NLS-1$
+ 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.
* @see #FORMAT
+ * @noreference This field is not intended to be referenced by clients.
+ *
+ * @deprecated See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a> for details.
*/
- public static final 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
*/
- public abstract IArtifactKey getArtifactKey();
+ IArtifactKey getArtifactKey();
/**
- * Return the value of the given property in this descriptor <code>null</code>
+ * Return the value of the given property in this descriptor <code>null</code>
* is returned if no such property exists
* @param key the property key to look for
* @return the value of the given property or <code>null</code>
*/
- public abstract String getProperty(String key);
+ String getProperty(String key);
/**
* Returns a read-only collection of the properties of the artifact descriptor.
* @return the properties of this artifact descriptor.
*/
- public Map<String, String> getProperties();
+ Map<String, String> getProperties();
- /**
+ /**
* Return the list of processing steps associated with this descriptor.
* An empty set of steps implies that this descriptor describes a complete
* copy of the artifact in its native form. If one or more steps are present,
* they may be performed when the artifact is transferred from the repository
* that contains it.
- *
+ *
* @return the list of processing steps for this descriptor
*/
- public abstract IProcessingStepDescriptor[] getProcessingSteps();
+ IProcessingStepDescriptor[] getProcessingSteps();
/**
* Return the artifact repository that holds the artifact described by this descriptor.
* <code>null</code> is returned if this descriptor is not held in a repository.
- *
+ *
* @return the repository holding this artifact or <code>null</code> if none.
*/
- public abstract IArtifactRepository getRepository();
+ IArtifactRepository getRepository();
}
diff --git a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/p2/repository/artifact/spi/IArtifactUIServices.java b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/p2/repository/artifact/spi/IArtifactUIServices.java
new file mode 100644
index 000000000..b5cc328f5
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/p2/repository/artifact/spi/IArtifactUIServices.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2022 Eclipse contributors 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
+ *******************************************************************************/
+package org.eclipse.equinox.p2.repository.artifact.spi;
+
+import java.io.File;
+import java.security.cert.Certificate;
+import java.util.*;
+import org.bouncycastle.openpgp.PGPPublicKey;
+import org.eclipse.equinox.p2.core.UIServices;
+import org.eclipse.equinox.p2.core.UIServices.TrustInfo;
+import org.eclipse.equinox.p2.metadata.IArtifactKey;
+
+/**
+ * An interface optionally implemented by {@link UIServices} to provide richer
+ * information for the users. In particular, the users often wish to know which
+ * artifacts are signed by which certificates or which keys when they are
+ * {@link UIServices#getTrustInfo(Certificate[][], Collection, String[])
+ * prompted} whether to trust such certificates or keys.
+ *
+ * @since 2.6
+ *
+ * @see UIServices#getTrustInfo(Certificate[][], Collection, String[])
+ */
+public interface IArtifactUIServices {
+
+ /**
+ * Opens a UI prompt to capture information about trusted content.
+ *
+ * @param untrustedCertificateChains a map from untrusted certificate chains to
+ * the set of keys of the artifacts signed by
+ * that chain.
+ * @param untrustedPGPKeys a map of untrusted PGP public keys to the
+ * set of keys of the artifacts signed by that
+ * key.
+ * @param unsignedArtifacts a set of keys of the artifacts that are not
+ * signed.
+ * @param artifactFiles a map from artifact keys to the file
+ * associated with that artifact key.
+ *
+ * @return the TrustInfo that describes the user's choices for trusting
+ * certificates, keys, and unsigned content.
+ *
+ * @see #getTrustInfo(UIServices, Map, Map, Set, Map)
+ * @see UIServices
+ */
+ TrustInfo getTrustInfo( //
+ Map<List<Certificate>, Set<IArtifactKey>> untrustedCertificateChains, //
+ Map<PGPPublicKey, Set<IArtifactKey>> untrustedPGPKeys, //
+ Set<IArtifactKey> unsignedArtifacts, //
+ Map<IArtifactKey, File> artifactFiles);
+
+ /**
+ * Opens a UI prompt to capture information about trusted content. This
+ * implementation is useful for delegating to an old-style
+ * {@link UIServices#getTrustInfo(Certificate[][], Collection, String[])
+ * UIServices implementation} that does not support the IArtifactUIServices
+ * interface.
+ *
+ * @param uiServices the delegate UI services.
+ * @param untrustedCertificateChains a map from untrusted certificate chains to
+ * the set of keys of the artifacts signed by
+ * that chain.
+ * @param untrustedPGPKeys a map of untrusted PGP public keys to the
+ * set of keys of the artifacts signed by that
+ * key.
+ * @param unsignedArtifacts a set of keys of the artifacts that are not
+ * signed.
+ * @param artifactFiles a map from artifact keys to the file
+ * associated with that artifact key.
+ *
+ * @return the TrustInfo that describes the user's choices for trusting
+ * certificates, keys, and unsigned content.
+ *
+ * @see #getTrustInfo(Map, Map, Set, Map)
+ * @see UIServices#getTrustInfo(Certificate[][], Collection, String[])
+ */
+ static TrustInfo getTrustInfo(UIServices uiServices, //
+ Map<List<Certificate>, Set<IArtifactKey>> untrustedCertificateChains, //
+ Map<PGPPublicKey, Set<IArtifactKey>> untrustedPGPKeys, //
+ Set<IArtifactKey> unsignedArtifacts, //
+ Map<IArtifactKey, File> artifactFiles) {
+ Certificate[][] unTrustedCertificateChainsArray = untrustedCertificateChains.keySet().stream()
+ .map(c -> c.toArray(Certificate[]::new)).toArray(Certificate[][]::new);
+ String[] details = unsignedArtifacts.isEmpty() ? null
+ : unsignedArtifacts.stream().map(artifactFiles::get).map(Objects::toString).toArray(String[]::new);
+ return uiServices.getTrustInfo(unTrustedCertificateChainsArray, untrustedPGPKeys.keySet(), details);
+ }
+}
diff --git a/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/p2/repository/spi/PGPPublicKeyService.java b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/p2/repository/spi/PGPPublicKeyService.java
new file mode 100644
index 000000000..6fbdff286
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.repository/src/org/eclipse/equinox/p2/repository/spi/PGPPublicKeyService.java
@@ -0,0 +1,243 @@
+/*******************************************************************************
+ * Copyright (c) 2022 Eclipse contributors 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
+ *******************************************************************************/
+package org.eclipse.equinox.p2.repository.spi;
+
+import java.util.*;
+import org.bouncycastle.openpgp.PGPPublicKey;
+import org.bouncycastle.openpgp.PGPSignature;
+import org.bouncycastle.util.encoders.Hex;
+import org.eclipse.equinox.p2.core.IProvisioningAgent;
+import org.eclipse.equinox.p2.core.spi.IAgentServiceFactory;
+
+/**
+ * A service for managing and searching {@link PGPPublicKey keys}.
+ * Implementations may make use of a
+ * <a href="https://datatracker.ietf.org/doc/html/draft-shaw-openpgp-hkp-00">key
+ * server</a> to fetch up-to-date information about keys. Implementations should
+ * generally provide support for caching and efficient lookup of keys,
+ * especially lookup based on {@link PGPPublicKey#getKeyID() key ID} because
+ * signatures generally use {@link PGPSignature#getKeyID() key IDs} and this is
+ * the primary use case.
+ *
+ * <p>
+ * Implementors of this service are responsible for registering the
+ * implementation with the {@link IProvisioningAgent provisioning agent} either
+ * {@link IProvisioningAgent#registerService(String, Object) explicitly} or via
+ * an {@link IAgentServiceFactory agent service factory}.
+ * </p>
+ *
+ * @see PGPPublicKey#getKeyID()
+ * @see PGPSignature#getKeyID()
+ * @see IAgentServiceFactory
+ * @see IProvisioningAgent#registerService(String, Object)
+ *
+ * @since 2.6
+ */
+public abstract class PGPPublicKeyService {
+ /**
+ * The name used for obtaining a reference to the key service.
+ *
+ * @see IProvisioningAgent#getService(Class)
+ * @see IProvisioningAgent#getService(String)
+ */
+ public static final String SERVICE_NAME = PGPPublicKeyService.class.getName();
+
+ /**
+ * Returns the key associated with the given
+ * {@link PGPPublicKey#getFingerprint() fingerprint}.
+ *
+ * @param fingerprint the fingerprint for which to search.
+ * @return the key with the matching fingerprint.
+ *
+ * @see PGPPublicKey#getFingerprint()
+ */
+ public PGPPublicKey getKey(byte[] fingerprint) {
+ return getKey(toHex(fingerprint));
+ }
+
+ /**
+ * Returns the key associated with the given
+ * {@link PGPPublicKey#getFingerprint() fingerprint} represented as a
+ * {@link #toHex(byte[]) hexadecimal} string value.
+ *
+ * @param fingerprint the fingerprint for which to search.
+ * @return the key with the matching fingerprint.
+ *
+ * @see PGPPublicKey#getFingerprint()
+ * @see #toHex(byte[])
+ */
+ public abstract PGPPublicKey getKey(String fingerprint);
+
+ /**
+ * Returns the keys associated with the given {@link PGPPublicKey#getKeyID() key
+ * ID}. In general, key ID collisions are possible so implementations must be
+ * tolerant of that.
+ *
+ * @param keyID the key ID for which to search.
+ * @return the keys with the matching key IDs.
+ *
+ * @see PGPPublicKey#getKeyID()
+ * @see PGPSignature#getKeyID()
+ */
+ public abstract Collection<PGPPublicKey> getKeys(long keyID);
+
+ /**
+ * Adds the given key to this key service. An implementations may fetch more
+ * up-to-date information about this key from a key server and may return a
+ * different key than the one passed in here. In general an implementation may
+ * also return an existing key, with the same fingerprint, already known to the
+ * key service.
+ *
+ * @param key the key to add.
+ * @return the normalized key available in this key service.
+ */
+ public abstract PGPPublicKey addKey(PGPPublicKey key);
+
+ /**
+ * Returns the set of keys that have been verified to have signed the given key.
+ * These are the links in the web of trust.
+ *
+ * @param key the key for which to find keys that have signed it.
+ * @return the set of keys that have been verified to have signed the given key.
+ *
+ * @see PGPSignature#verifyCertification(String, PGPPublicKey)
+ * @see PGPSignature#verifyCertification(PGPPublicKey, PGPPublicKey)
+ */
+ public abstract Set<PGPPublicKey> getVerifiedCertifications(PGPPublicKey key);
+
+ /**
+ * If this key has a revocation signature that is verified to have been signed
+ * by the public key of that revocation signature, this returns the
+ * {@link PGPSignature#getCreationTime() creation time} of that signature,
+ * otherwise it returns <code>null</code>.
+ *
+ * @param key the key to test for revocation.
+ * @return when this key was verifiably revoked, or <code>null</code> if it is
+ * not revoked.
+ *
+ * @see PGPSignature#getKeyID()
+ * @see PGPPublicKey#hasRevocation()
+ * @see PGPSignature#getCreationTime()
+ * @see PGPSignature#KEY_REVOCATION
+ * @see PGPSignature#SUBKEY_REVOCATION
+ */
+ public abstract Date getVerifiedRevocationDate(PGPPublicKey key);
+
+ /**
+ * Returns whether the signature's {@link PGPSignature creation time} is before
+ * the key's {@link #getVerifiedRevocationDate(PGPPublicKey) verified revocation
+ * date}, if that key has one.
+ *
+ * @param signature the signature to test.
+ * @param key the corresponding key of this signature against which to
+ * test.
+ * @return <code>true</code> if the signature was created before the key was
+ * revoked or if the key is not revoked, <code>false</code> otherwise.
+ *
+ * @throws IllegalArgumentException if the signature's
+ * {@link PGPSignature#getKeyID() key} is not
+ * the same as the key's
+ * {@link PGPPublicKey#getKeyID() key ID}
+ */
+ public boolean isCreatedBeforeRevocation(PGPSignature signature, PGPPublicKey key) {
+ if (signature.getKeyID() != key.getKeyID()) {
+ throw new IllegalArgumentException("The signature's key ID must be the same as the key's key ID"); //$NON-NLS-1$
+ }
+ Date verifiedRevocationDate = getVerifiedRevocationDate(key);
+ if (verifiedRevocationDate != null) {
+ long signatureCreationTime = signature.getCreationTime().getTime();
+ if (signatureCreationTime >= verifiedRevocationDate.getTime()) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Returns the hexadecimal representation of the key's
+ * {@link PGPPublicKey#getFingerprint() fingerprint}.
+ *
+ * @param key the key for which to get the hexadecimal fingerprint.
+ *
+ * @return the hexadecimal representation of the key's fingerprint.
+ */
+ public static String toHexFingerprint(PGPPublicKey key) {
+ return Hex.toHexString(key.getFingerprint());
+ }
+
+ /**
+ * Returns the hexadecimal representation of the given bytes.
+ *
+ * @param bytes the bytes to convert to a hexadecimal representation.
+ * @return the hexadecimal representation of the given bytes.
+ */
+ public static String toHex(byte[] bytes) {
+ return Hex.toHexString(bytes);
+ }
+
+ /**
+ * Returns the hexadecimal representation of the given long value, typically a
+ * key ID, padded with leading zeros to a length of 16.
+ *
+ * @param keyID the long value, typically a key ID, to convert to a hexadecimal
+ * representation.
+ * @return the hexadecimal representation of the given long value, padded with
+ * leading zeros.
+ */
+ public static String toHex(long keyID) {
+ return String.format("%1$016x", keyID); //$NON-NLS-1$
+ }
+
+ /**
+ * If the signature's {@link PGPSignature#getCreationTime() creation time} is
+ * before the key's {@link PGPPublicKey#getCreationTime() creation time}, this
+ * returns a negative value equal to the number of milliseconds that the
+ * signature was created before the key was created. If the key has a
+ * {@link PGPPublicKey#getValidSeconds() validity period}, i.e., if the key
+ * expires, and the signature's creation time is after the key's expiration,
+ * returns a positive value equal to the number of milliseconds that the
+ * signature was created after the key's expiration. Otherwise, the signature
+ * was created during the period of time that the key was valid and this returns
+ * <code>0</code>.
+ *
+ * @param signature the signature to test.
+ * @param key the corresponding key of this signature against which to
+ * test.
+ * @return a negative value representing the number of milliseconds the
+ * signature was created before the key was created, a positive value
+ * representing the number of milliseconds the signature as created
+ * after the key expired, or <code>0</code> if the signature was created
+ * during the valid period of the key.
+ * @throws IllegalArgumentException if the signature's
+ * {@link PGPSignature#getKeyID() key} is not
+ * the same as the key's
+ * {@link PGPPublicKey#getKeyID() key ID}
+ */
+ public static long compareSignatureTimeToKeyValidityTime(PGPSignature signature, PGPPublicKey key) {
+ if (signature.getKeyID() != key.getKeyID()) {
+ throw new IllegalArgumentException("The signature's key ID must be the same as the key's key ID"); //$NON-NLS-1$
+ }
+ long keyCreationTime = key.getCreationTime().getTime();
+ long signatureCreationTime = signature.getCreationTime().getTime();
+ long delta = signatureCreationTime - keyCreationTime;
+ if (delta < 0) {
+ return delta;
+ }
+ long validSeconds = key.getValidSeconds();
+ if (validSeconds != 0) {
+ delta = signatureCreationTime - (keyCreationTime + validSeconds * 1000);
+ if (delta > 0) {
+ return delta;
+ }
+ }
+ return 0;
+ }
+}
diff --git a/bundles/org.eclipse.equinox.p2.sar/.classpath b/bundles/org.eclipse.equinox.p2.sar/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.sar/.classpath
+++ b/bundles/org.eclipse.equinox.p2.sar/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.sar/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.sar/.settings/org.eclipse.jdt.core.prefs
index 2ac7183aa..53cfcf706 100644
--- a/bundles/org.eclipse.equinox.p2.sar/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.sar/.settings/org.eclipse.jdt.core.prefs
@@ -18,9 +18,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -37,6 +37,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -90,6 +91,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -126,10 +128,11 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
@@ -137,20 +140,23 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
@@ -242,11 +248,12 @@ org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
@@ -277,6 +284,8 @@ org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
@@ -301,13 +310,17 @@ org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
@@ -355,6 +368,8 @@ org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do no
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
@@ -391,9 +406,12 @@ org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not inser
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
@@ -429,10 +447,14 @@ org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
org.eclipse.jdt.core.incompatibleJDKLevel=ignore
org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.equinox.p2.sar/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.sar/META-INF/MANIFEST.MF
index 14256c8cb..00469f5fe 100644
--- a/bundles/org.eclipse.equinox.p2.sar/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.sar/META-INF/MANIFEST.MF
@@ -2,9 +2,9 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Sar Plug-in
Bundle-SymbolicName: org.eclipse.equinox.p2.sar;singleton:=true
-Bundle-Version: 0.2.0.qualifier
+Bundle-Version: 0.3.0.qualifier
Import-Package: org.osgi.framework;version="1.3.0"
Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Export-Package: org.eclipse.equinox.internal.p2.sar;x-friends:="org.eclipse.equinox.p2.artifact.optimizers,org.eclipse.equinox.p2.artifact.processors"
Automatic-Module-Name: org.eclipse.equinox.p2.sar
diff --git a/bundles/org.eclipse.equinox.p2.sar/pom.xml b/bundles/org.eclipse.equinox.p2.sar/pom.xml
index ca31f45c1..fb9f99428 100644
--- a/bundles/org.eclipse.equinox.p2.sar/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.sar/pom.xml
@@ -4,15 +4,12 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.sar</artifactId>
- <version>0.2.0-SNAPSHOT</version>
+ <version>0.3.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
- <properties>
- <skipAPIAnalysis>true</skipAPIAnalysis>
- </properties>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.tests.discovery/.classpath b/bundles/org.eclipse.equinox.p2.tests.discovery/.classpath
index c552bdbf4..0632a4d48 100644
--- a/bundles/org.eclipse.equinox.p2.tests.discovery/.classpath
+++ b/bundles/org.eclipse.equinox.p2.tests.discovery/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
<accessrules>
<accessrule kind="accessible" pattern="**/internal/**"/>
diff --git a/bundles/org.eclipse.equinox.p2.tests.discovery/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.tests.discovery/.settings/org.eclipse.jdt.core.prefs
index c28a10615..3d432ca34 100644
--- a/bundles/org.eclipse.equinox.p2.tests.discovery/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.tests.discovery/.settings/org.eclipse.jdt.core.prefs
@@ -18,9 +18,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -37,6 +37,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -90,6 +91,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -126,10 +128,11 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
@@ -137,20 +140,23 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
@@ -242,11 +248,12 @@ org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
@@ -277,6 +284,8 @@ org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
@@ -301,13 +310,17 @@ org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
@@ -355,6 +368,8 @@ org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do no
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
@@ -391,9 +406,12 @@ org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not inser
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
@@ -429,10 +447,14 @@ org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
org.eclipse.jdt.core.incompatibleJDKLevel=ignore
org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.equinox.p2.tests.discovery/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.tests.discovery/META-INF/MANIFEST.MF
index 154242c9a..361f71e5e 100644
--- a/bundles/org.eclipse.equinox.p2.tests.discovery/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.tests.discovery/META-INF/MANIFEST.MF
@@ -2,8 +2,8 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: org.eclipse.equinox.p2.tests.discovery;singleton:=true
-Bundle-Version: 1.2.0.qualifier
-Bundle-Vendor: %Bundle-Provider
+Bundle-Version: 1.3.200.qualifier
+Bundle-Vendor: %Bundle-Vendor
Bundle-Localization: plugin
Export-Package: org.eclipse.equinox.p2.discovery.tests;x-internal:=true,
org.eclipse.equinox.p2.discovery.tests.core;x-internal:=true,
@@ -15,6 +15,6 @@ Require-Bundle: org.eclipse.equinox.p2.discovery;bundle-version="1.0.0",
org.junit;bundle-version="3.8.0",
org.eclipse.core.runtime;bundle-version="3.1.0",
org.eclipse.ui;bundle-version="3.1.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Eclipse-BundleShape: dir
Automatic-Module-Name: org.eclipse.equinox.p2.tests.discovery
diff --git a/bundles/org.eclipse.equinox.p2.tests.discovery/plugin.xml b/bundles/org.eclipse.equinox.p2.tests.discovery/plugin.xml
index 968754bef..f6f6a95f0 100644
--- a/bundles/org.eclipse.equinox.p2.tests.discovery/plugin.xml
+++ b/bundles/org.eclipse.equinox.p2.tests.discovery/plugin.xml
@@ -86,7 +86,7 @@
style="push">
<parameter
name="org.eclipse.equinox.p2.ui.discovery.commands.DirectoryParameter"
- value="http://www.eclipse.org/mylyn/discovery/directory-3.3.xml">
+ value="https://www.eclipse.org/mylyn/discovery/directory-3.3.xml">
</parameter>
<parameter
name="org.eclipse.equinox.p2.ui.discovery.commands.TagsParameter"
@@ -99,7 +99,7 @@
style="push">
<parameter
name="org.eclipse.equinox.p2.ui.discovery.commands.RepositoryParameter"
- value="http://download.eclipse.org/tools/mylyn/update/e3.4">
+ value="https://download.eclipse.org/tools/mylyn/update/e3.4">
</parameter>
</command>
</menuContribution>
diff --git a/bundles/org.eclipse.equinox.p2.tests.discovery/pom.xml b/bundles/org.eclipse.equinox.p2.tests.discovery/pom.xml
index 83cc9de1c..ce3ff89b1 100644
--- a/bundles/org.eclipse.equinox.p2.tests.discovery/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.tests.discovery/pom.xml
@@ -4,12 +4,12 @@
<parent>
<artifactId>org.eclipse.equinox.p2.tests-parent</artifactId>
<groupId>org.eclipse</groupId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../../org.eclipse.equinox.p2.releng/org.eclipse.equinox.p2.tests-parent</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.tests.discovery</artifactId>
- <version>1.2.0-SNAPSHOT</version>
+ <version>1.3.200-SNAPSHOT</version>
<packaging>eclipse-test-plugin</packaging>
<properties>
diff --git a/bundles/org.eclipse.equinox.p2.tests.optimizers/pom.xml b/bundles/org.eclipse.equinox.p2.tests.optimizers/pom.xml
index 9d4e4fcd5..089a4d389 100644
--- a/bundles/org.eclipse.equinox.p2.tests.optimizers/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.tests.optimizers/pom.xml
@@ -4,7 +4,7 @@
<parent>
<artifactId>org.eclipse.equinox.p2.tests-parent</artifactId>
<groupId>org.eclipse</groupId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../../org.eclipse.equinox.p2.releng/org.eclipse.equinox.p2.tests-parent</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
@@ -15,6 +15,5 @@
<properties>
<testSuite>${project.artifactId}</testSuite>
<testClass>org.eclipse.equinox.p2.tests.optimizers.AutomatedTests</testClass>
- <skipAPIAnalysis>true</skipAPIAnalysis>
</properties>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.tests.reconciler.product/pom.xml b/bundles/org.eclipse.equinox.p2.tests.reconciler.product/pom.xml
index b0b2a7fa1..13eefc82a 100644
--- a/bundles/org.eclipse.equinox.p2.tests.reconciler.product/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.tests.reconciler.product/pom.xml
@@ -11,7 +11,7 @@
<parent>
<groupId>org.eclipse</groupId>
<artifactId>org.eclipse.equinox.p2.tests-parent</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../../org.eclipse.equinox.p2.releng/org.eclipse.equinox.p2.tests-parent</relativePath>
</parent>
diff --git a/bundles/org.eclipse.equinox.p2.tests.reconciler.product/reconciler.product b/bundles/org.eclipse.equinox.p2.tests.reconciler.product/reconciler.product
index 16b033ab4..0532b3ab5 100644
--- a/bundles/org.eclipse.equinox.p2.tests.reconciler.product/reconciler.product
+++ b/bundles/org.eclipse.equinox.p2.tests.reconciler.product/reconciler.product
@@ -24,6 +24,8 @@
<plugins>
<plugin id="com.ibm.icu"/>
+ <plugin id="com.sun.jna"/>
+ <plugin id="com.sun.jna.platform"/>
<plugin id="javax.annotation"/>
<plugin id="javax.inject"/>
<plugin id="javax.xml"/>
@@ -36,8 +38,8 @@
<plugin id="org.apache.commons.jxpath"/>
<plugin id="org.apache.commons.logging"/>
<plugin id="org.apache.felix.scr"/>
- <plugin id="org.apache.httpcomponents.httpclient"/>
- <plugin id="org.apache.httpcomponents.httpcore"/>
+ <plugin id="org.apache.httpcomponents.client5.httpclient5"/>
+ <plugin id="org.apache.httpcomponents.core5.httpcore5"/>
<plugin id="org.apache.xmlgraphics"/>
<plugin id="org.eclipse.core.commands"/>
<plugin id="org.eclipse.core.contenttype"/>
@@ -47,7 +49,7 @@
<plugin id="org.eclipse.core.expressions"/>
<plugin id="org.eclipse.core.jobs"/>
<plugin id="org.eclipse.core.net"/>
- <plugin id="org.eclipse.core.net.linux.x86_64" fragment="true"/>
+ <plugin id="org.eclipse.core.net.linux" fragment="true"/>
<plugin id="org.eclipse.core.runtime"/>
<plugin id="org.eclipse.e4.core.commands"/>
<plugin id="org.eclipse.e4.core.contexts"/>
@@ -62,6 +64,7 @@
<plugin id="org.eclipse.e4.ui.css.swt"/>
<plugin id="org.eclipse.e4.ui.css.swt.theme"/>
<plugin id="org.eclipse.e4.ui.di"/>
+ <plugin id="org.eclipse.e4.ui.dialogs"/>
<plugin id="org.eclipse.e4.ui.model.workbench"/>
<plugin id="org.eclipse.e4.ui.services"/>
<plugin id="org.eclipse.e4.ui.swt.gtk" fragment="true"/>
@@ -75,7 +78,7 @@
<plugin id="org.eclipse.ecf.filetransfer"/>
<plugin id="org.eclipse.ecf.identity"/>
<plugin id="org.eclipse.ecf.provider.filetransfer"/>
- <plugin id="org.eclipse.ecf.provider.filetransfer.httpclient45"/>
+ <plugin id="org.eclipse.ecf.provider.filetransfer.httpclient5"/>
<plugin id="org.eclipse.ecf.provider.filetransfer.source"/>
<plugin id="org.eclipse.ecf.provider.filetransfer.ssl" fragment="true"/>
<plugin id="org.eclipse.ecf.ssl" fragment="true"/>
@@ -85,7 +88,7 @@
<plugin id="org.eclipse.emf.ecore.xmi"/>
<plugin id="org.eclipse.equinox.app"/>
<plugin id="org.eclipse.equinox.common"/>
- <plugin id="org.eclipse.equinox.ds"/>
+ <plugin id="org.eclipse.equinox.concurrent"/>
<plugin id="org.eclipse.equinox.event"/>
<plugin id="org.eclipse.equinox.frameworkadmin"/>
<plugin id="org.eclipse.equinox.frameworkadmin.equinox"/>
@@ -117,13 +120,14 @@
<plugin id="org.eclipse.equinox.preferences"/>
<plugin id="org.eclipse.equinox.registry"/>
<plugin id="org.eclipse.equinox.security"/>
- <plugin id="org.eclipse.equinox.security.linux.x86_64" fragment="true"/>
+ <plugin id="org.eclipse.equinox.security.linux" fragment="true"/>
<plugin id="org.eclipse.equinox.security.ui"/>
<plugin id="org.eclipse.equinox.simpleconfigurator"/>
<plugin id="org.eclipse.equinox.simpleconfigurator.manipulator"/>
<plugin id="org.eclipse.help"/>
<plugin id="org.eclipse.jface"/>
<plugin id="org.eclipse.jface.databinding"/>
+ <plugin id="org.eclipse.jface.notifications"/>
<plugin id="org.eclipse.osgi"/>
<plugin id="org.eclipse.osgi.compatibility.state" fragment="true"/>
<plugin id="org.eclipse.osgi.services"/>
@@ -134,6 +138,7 @@
<plugin id="org.eclipse.swt.win32.win32.x86_64" fragment="true"/>
<plugin id="org.eclipse.ui"/>
<plugin id="org.eclipse.ui.workbench"/>
+ <plugin id="org.eclipse.urischeme"/>
<plugin id="org.sat4j.core"/>
<plugin id="org.sat4j.pb"/>
<plugin id="org.tukaani.xz"/>
@@ -144,9 +149,9 @@
</plugins>
<configurations>
+ <plugin id="org.apache.felix.scr" autoStart="true" startLevel="3" />
<plugin id="org.eclipse.core.runtime" autoStart="true" startLevel="2" />
<plugin id="org.eclipse.equinox.common" autoStart="true" startLevel="2" />
- <plugin id="org.eclipse.equinox.ds" autoStart="true" startLevel="3" />
<plugin id="org.eclipse.equinox.event" autoStart="true" startLevel="3" />
<plugin id="org.eclipse.equinox.p2.reconciler.dropins" autoStart="true" startLevel="4" />
<plugin id="org.eclipse.equinox.simpleconfigurator" autoStart="true" startLevel="1" />
diff --git a/bundles/org.eclipse.equinox.p2.tests.ui/All p2 UI tests.launch b/bundles/org.eclipse.equinox.p2.tests.ui/All p2 UI tests.launch
index 5c4250d11..d1009331c 100644
--- a/bundles/org.eclipse.equinox.p2.tests.ui/All p2 UI tests.launch
+++ b/bundles/org.eclipse.equinox.p2.tests.ui/All p2 UI tests.launch
@@ -1,72 +1,428 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
-<booleanAttribute key="append.args" value="true"/>
-<booleanAttribute key="askclear" value="false"/>
-<booleanAttribute key="automaticAdd" value="true"/>
-<booleanAttribute key="automaticValidate" value="false"/>
-<stringAttribute key="bootstrap" value=""/>
-<stringAttribute key="checked" value="[NONE]"/>
-<booleanAttribute key="clearConfig" value="true"/>
-<booleanAttribute key="clearws" value="true"/>
-<booleanAttribute key="clearwslog" value="false"/>
-<booleanAttribute key="com.mountainminds.eclemma.core.INPLACE_INSTRUMENTATION" value="true"/>
-<listAttribute key="com.mountainminds.eclemma.core.INSTRUMENTATION_PATHS">
-<listEntry value="/org.eclipse.equinox.p2.updatechecker/bin"/>
-<listEntry value="/org.eclipse.equinox.frameworkadmin.equinox/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.updatesite/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.core/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.extensionlocation/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.director.app/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.console/bin"/>
-<listEntry value="/org.eclipse.equinox.frameworkadmin/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.engine/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.exemplarysetup/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.metadata.repository/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.publisher/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.ui.sdk/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.directorywatcher/bin"/>
-<listEntry value="/org.eclipse.equinox.simpleconfigurator.manipulator/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.metadata/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.touchpoint.natives/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.artifact.repository/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.metadata.generator/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.jarprocessor/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.reconciler.dropins/bin"/>
-<listEntry value="/org.eclipse.equinox.simpleconfigurator/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.director/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.ui/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.garbagecollector/bin"/>
-<listEntry value="/org.eclipse.equinox.p2.touchpoint.eclipse/bin"/>
-</listAttribute>
-<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
-<booleanAttribute key="default" value="false"/>
-<booleanAttribute key="generateProfile" value="true"/>
-<booleanAttribute key="includeOptional" value="true"/>
-<stringAttribute key="location" value="${workspace_loc}/../junit-workspace"/>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
-<listEntry value="/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/AutomatedTests.java"/>
-</listAttribute>
-<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
-<listEntry value="1"/>
-</listAttribute>
-<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
-<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
-<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
-<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
-<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.equinox.p2.tests.ui.AutomatedTests"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -console -consoleLog"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.equinox.p2.tests.ui"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
-<stringAttribute key="pde.version" value="3.3"/>
-<stringAttribute key="product" value="org.eclipse.sdk.ide"/>
-<booleanAttribute key="run_in_ui_thread" value="true"/>
-<stringAttribute key="selected_target_plugins" value="ch.qos.logback.classic@default:default,ch.qos.logback.core@default:default,ch.qos.logback.slf4j@default:default,com.google.gson*2.8.2.v20180104-1110@default:default,com.google.guava@default:default,com.ibm.icu@default:default,com.jcraft.jsch@default:default,com.jcraft.jzlib@default:default,javaewah@default:default,javax.annotation@default:default,javax.el@default:default,javax.inject@default:default,javax.servlet.jsp@default:default,javax.servlet@default:default,javax.xml@default:default,org.apache.ant@default:default,org.apache.batik.constants@default:default,org.apache.batik.css@default:default,org.apache.batik.i18n@default:default,org.apache.batik.util@default:default,org.apache.commons.codec@default:default,org.apache.commons.httpclient@default:default,org.apache.commons.io@default:default,org.apache.commons.jxpath@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.scr@1:true,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.apache.jasper.glassfish@default:default,org.apache.log4j@default:default,org.apache.lucene.analyzers-common*7.1.0.v20180122-2126@default:default,org.apache.lucene.analyzers-smartcn@default:default,org.apache.lucene.core*7.1.0.v20171214-1510@default:default,org.apache.xerces@default:default,org.apache.xml.resolver@default:default,org.apache.xml.serializer@default:default,org.apache.xmlgraphics@default:default,org.apiguardian@default:default,org.easymock@default:default,org.eclipse.ant.core@default:default,org.eclipse.ant.launching@default:default,org.eclipse.ant.optional.junit@default:default,org.eclipse.ant.ui@default:default,org.eclipse.compare.core@default:default,org.eclipse.compare@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.databinding.beans@default:default,org.eclipse.core.databinding.observable@default:default,org.eclipse.core.databinding.property@default:default,org.eclipse.core.databinding@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.externaltools@default:default,org.eclipse.core.filebuffers@default:default,org.eclipse.core.filesystem.linux.x86_64@default:default,org.eclipse.core.filesystem@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.net.linux.x86_64@default:default,org.eclipse.core.net@default:default,org.eclipse.core.resources@default:default,org.eclipse.core.runtime@default:true,org.eclipse.core.tests.harness@default:default,org.eclipse.core.variables@default:default,org.eclipse.debug.core@default:default,org.eclipse.debug.ui@default:default,org.eclipse.e4.core.commands@default:default,org.eclipse.e4.core.contexts@default:default,org.eclipse.e4.core.di.annotations@default:default,org.eclipse.e4.core.di.extensions.supplier@default:default,org.eclipse.e4.core.di.extensions@default:default,org.eclipse.e4.core.di@default:default,org.eclipse.e4.core.services@default:default,org.eclipse.e4.emf.xpath@default:default,org.eclipse.e4.ui.bindings@default:default,org.eclipse.e4.ui.css.core@default:default,org.eclipse.e4.ui.css.swt.theme@default:default,org.eclipse.e4.ui.css.swt@default:default,org.eclipse.e4.ui.di@default:default,org.eclipse.e4.ui.model.workbench@default:default,org.eclipse.e4.ui.services@default:default,org.eclipse.e4.ui.swt.gtk@default:default,org.eclipse.e4.ui.widgets@default:default,org.eclipse.e4.ui.workbench.addons.swt@default:default,org.eclipse.e4.ui.workbench.renderers.swt@default:default,org.eclipse.e4.ui.workbench.swt@default:default,org.eclipse.e4.ui.workbench3@default:default,org.eclipse.e4.ui.workbench@default:default,org.eclipse.ecf.filetransfer@default:default,org.eclipse.ecf.identity@default:default,org.eclipse.ecf.provider.filetransfer.httpclient4.ssl@default:default,org.eclipse.ecf.provider.filetransfer.httpclient4@default:default,org.eclipse.ecf.provider.filetransfer.ssl@default:false,org.eclipse.ecf.provider.filetransfer@default:default,org.eclipse.ecf.ssl@default:false,org.eclipse.ecf@default:default,org.eclipse.egit.core@default:default,org.eclipse.egit.ui.smartimport@default:default,org.eclipse.egit.ui@default:default,org.eclipse.egit@default:default,org.eclipse.emf.common@default:default,org.eclipse.emf.ecore.change@default:default,org.eclipse.emf.ecore.edit@default:default,org.eclipse.emf.ecore.xmi@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.emf.edit@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.bidi@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.concurrent@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.event@default:default,org.eclipse.equinox.frameworkadmin.equinox@default:default,org.eclipse.equinox.frameworkadmin@default:default,org.eclipse.equinox.http.jetty@default:default,org.eclipse.equinox.http.registry@default:default,org.eclipse.equinox.http.servlet@default:default,org.eclipse.equinox.jsp.jasper.registry@default:default,org.eclipse.equinox.jsp.jasper@default:default,org.eclipse.equinox.launcher.gtk.linux.x86_64@default:default,org.eclipse.equinox.launcher@default:default,org.eclipse.equinox.p2.artifact.repository@default:default,org.eclipse.equinox.p2.console@default:default,org.eclipse.equinox.p2.core@default:default,org.eclipse.equinox.p2.director.app@default:default,org.eclipse.equinox.p2.director@default:default,org.eclipse.equinox.p2.directorywatcher@default:default,org.eclipse.equinox.p2.engine@default:default,org.eclipse.equinox.p2.extensionlocation@default:default,org.eclipse.equinox.p2.garbagecollector@default:default,org.eclipse.equinox.p2.jarprocessor@default:default,org.eclipse.equinox.p2.metadata.repository@default:default,org.eclipse.equinox.p2.metadata@default:default,org.eclipse.equinox.p2.operations@default:default,org.eclipse.equinox.p2.publisher@default:default,org.eclipse.equinox.p2.reconciler.dropins@default:default,org.eclipse.equinox.p2.repository.tools@default:default,org.eclipse.equinox.p2.repository@default:default,org.eclipse.equinox.p2.touchpoint.eclipse@default:default,org.eclipse.equinox.p2.touchpoint.natives@default:default,org.eclipse.equinox.p2.ui.sdk.scheduler@default:default,org.eclipse.equinox.p2.ui.sdk@default:default,org.eclipse.equinox.p2.ui@default:default,org.eclipse.equinox.p2.updatechecker@default:default,org.eclipse.equinox.p2.updatesite@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.equinox.security.linux.x86_64@default:default,org.eclipse.equinox.security.ui@default:default,org.eclipse.equinox.security@default:default,org.eclipse.equinox.simpleconfigurator.manipulator@default:default,org.eclipse.equinox.simpleconfigurator@1:true,org.eclipse.equinox.util@default:default,org.eclipse.help.base@default:default,org.eclipse.help.ui@default:default,org.eclipse.help.webapp@default:default,org.eclipse.help@default:default,org.eclipse.jdt.annotation*2.2.100.v20180626-0953@default:default,org.eclipse.jdt.apt.core@default:default,org.eclipse.jdt.apt.pluggable.core@default:default,org.eclipse.jdt.apt.ui@default:default,org.eclipse.jdt.compiler.apt@default:false,org.eclipse.jdt.compiler.tool@default:false,org.eclipse.jdt.core.manipulation@default:default,org.eclipse.jdt.core@default:default,org.eclipse.jdt.debug.ui@default:default,org.eclipse.jdt.debug@default:default,org.eclipse.jdt.doc.isv@default:default,org.eclipse.jdt.doc.user@default:default,org.eclipse.jdt.junit.core@default:default,org.eclipse.jdt.junit.runtime@default:default,org.eclipse.jdt.junit4.runtime@default:default,org.eclipse.jdt.junit@default:default,org.eclipse.jdt.launching@default:default,org.eclipse.jdt.ui@default:default,org.eclipse.jdt@default:default,org.eclipse.jem.util@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jface.databinding@default:default,org.eclipse.jface.text@default:default,org.eclipse.jface@default:default,org.eclipse.jgit.lfs@default:default,org.eclipse.jgit@default:default,org.eclipse.jsch.core@default:default,org.eclipse.jsch.ui@default:default,org.eclipse.ltk.core.refactoring@default:default,org.eclipse.ltk.ui.refactoring@default:default,org.eclipse.m2e.archetype.common@default:default,org.eclipse.m2e.core.ui@default:default,org.eclipse.m2e.core@default:default,org.eclipse.m2e.logback.appender@default:default,org.eclipse.m2e.maven.indexer@default:default,org.eclipse.m2e.maven.runtime.slf4j.simple@default:default,org.eclipse.m2e.maven.runtime@default:default,org.eclipse.m2e.model.edit@default:default,org.eclipse.m2e.workspace.cli@default:default,org.eclipse.mylyn.commons.core@default:default,org.eclipse.mylyn.commons.net@default:default,org.eclipse.mylyn.discovery.core@default:default,org.eclipse.osgi.compatibility.state@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi.util@default:default,org.eclipse.osgi@-1:true,org.eclipse.pde.api.tools.ui@default:default,org.eclipse.pde.api.tools@default:default,org.eclipse.pde.build@default:default,org.eclipse.pde.core@default:default,org.eclipse.pde.doc.user@default:default,org.eclipse.pde.ds.core@default:default,org.eclipse.pde.ds.ui@default:default,org.eclipse.pde.junit.runtime@default:default,org.eclipse.pde.launching@default:default,org.eclipse.pde.runtime@default:default,org.eclipse.pde.ua.core@default:default,org.eclipse.pde.ua.ui@default:default,org.eclipse.pde.ui.templates@default:default,org.eclipse.pde.ui@default:default,org.eclipse.pde@default:default,org.eclipse.platform.doc.isv@default:default,org.eclipse.platform.doc.user@default:default,org.eclipse.platform@default:default,org.eclipse.rcp@default:default,org.eclipse.releng.tools@default:default,org.eclipse.sdk@default:default,org.eclipse.search@default:default,org.eclipse.swt.gtk.linux.x86_64@default:default,org.eclipse.swt@default:default,org.eclipse.team.core@default:default,org.eclipse.team.ui@default:default,org.eclipse.test.performance.win32@default:default,org.eclipse.test.performance@default:default,org.eclipse.text@default:default,org.eclipse.ui.browser@default:default,org.eclipse.ui.cheatsheets@default:default,org.eclipse.ui.console@default:default,org.eclipse.ui.editors@default:default,org.eclipse.ui.externaltools@default:default,org.eclipse.ui.forms@default:default,org.eclipse.ui.genericeditor@default:default,org.eclipse.ui.ide.application@default:default,org.eclipse.ui.ide@default:default,org.eclipse.ui.intro.quicklinks@default:default,org.eclipse.ui.intro.universal@default:default,org.eclipse.ui.intro@default:default,org.eclipse.ui.navigator.resources@default:default,org.eclipse.ui.navigator@default:default,org.eclipse.ui.net@default:default,org.eclipse.ui.trace@default:default,org.eclipse.ui.views.log@default:default,org.eclipse.ui.views.properties.tabbed@default:default,org.eclipse.ui.views@default:default,org.eclipse.ui.workbench.texteditor@default:default,org.eclipse.ui.workbench@default:default,org.eclipse.ui@default:default,org.eclipse.urischeme@default:default,org.eclipse.wst.common.core@default:default,org.eclipse.wst.common.emf@default:default,org.eclipse.wst.common.environment@default:default,org.eclipse.wst.common.frameworks.ui@default:default,org.eclipse.wst.common.frameworks@default:default,org.eclipse.wst.common.project.facet.core@default:default,org.eclipse.wst.common.ui@default:default,org.eclipse.wst.common.uriresolver@default:default,org.eclipse.wst.sse.core@default:default,org.eclipse.wst.sse.ui@default:default,org.eclipse.wst.validation.ui@default:default,org.eclipse.wst.validation@default:default,org.eclipse.wst.xml.core@default:default,org.eclipse.wst.xml.ui@default:default,org.eclipse.wst.xsd.core@default:default,org.eclipse.xsd@default:default,org.hamcrest.core@default:default,org.junit.platform.commons@default:default,org.junit.platform.engine@default:default,org.junit.platform.launcher@default:default,org.junit@default:default,org.objectweb.asm*6.0.0.v20180116-1719@default:default,org.objectweb.asm*6.2.0.v20180807-1520@default:default,org.objectweb.asm.tree*6.2.0.v20180807-1520@default:default,org.opentest4j@default:default,org.sat4j.core@default:default,org.sat4j.pb@default:default,org.slf4j.api@default:default,org.slf4j.impl.log4j12@default:default,org.tukaani.xz@default:default,org.w3c.css.sac@default:default,org.w3c.dom.events@default:default,org.w3c.dom.smil@default:default,org.w3c.dom.svg@default:default"/>
-<stringAttribute key="selected_workspace_plugins" value="org.eclipse.equinox.frameworkadmin.equinox@default:default,org.eclipse.equinox.frameworkadmin.test@default:default,org.eclipse.equinox.frameworkadmin@default:default,org.eclipse.equinox.p2.artifact.optimizers@default:default,org.eclipse.equinox.p2.artifact.processors@default:default,org.eclipse.equinox.p2.artifact.repository@default:default,org.eclipse.equinox.p2.console@default:default,org.eclipse.equinox.p2.core@default:default,org.eclipse.equinox.p2.director.app@default:default,org.eclipse.equinox.p2.director@default:default,org.eclipse.equinox.p2.directorywatcher@default:default,org.eclipse.equinox.p2.discovery.compatibility@default:default,org.eclipse.equinox.p2.discovery@default:default,org.eclipse.equinox.p2.engine@default:default,org.eclipse.equinox.p2.extensionlocation@default:default,org.eclipse.equinox.p2.garbagecollector@default:default,org.eclipse.equinox.p2.installer@default:default,org.eclipse.equinox.p2.jarprocessor@default:default,org.eclipse.equinox.p2.metadata.repository@default:default,org.eclipse.equinox.p2.metadata@default:default,org.eclipse.equinox.p2.operations@default:default,org.eclipse.equinox.p2.publisher.eclipse@default:default,org.eclipse.equinox.p2.publisher@default:default,org.eclipse.equinox.p2.reconciler.dropins@default:default,org.eclipse.equinox.p2.repository.tools@default:default,org.eclipse.equinox.p2.repository@default:default,org.eclipse.equinox.p2.sar@default:default,org.eclipse.equinox.p2.tests.discovery@default:default,org.eclipse.equinox.p2.tests.optimizers@default:default,org.eclipse.equinox.p2.tests.ui@default:default,org.eclipse.equinox.p2.tests.verifier@default:default,org.eclipse.equinox.p2.tests@default:default,org.eclipse.equinox.p2.testserver@default:default,org.eclipse.equinox.p2.touchpoint.eclipse@default:default,org.eclipse.equinox.p2.touchpoint.natives@default:default,org.eclipse.equinox.p2.transport.ecf@default:default,org.eclipse.equinox.p2.ui.admin.rcp@default:default,org.eclipse.equinox.p2.ui.admin@default:default,org.eclipse.equinox.p2.ui.discovery@default:default,org.eclipse.equinox.p2.ui.importexport@default:default,org.eclipse.equinox.p2.ui.sdk.scheduler@default:default,org.eclipse.equinox.p2.ui.sdk@default:default,org.eclipse.equinox.p2.ui@default:default,org.eclipse.equinox.p2.updatechecker@default:default,org.eclipse.equinox.p2.updatesite@default:default,org.eclipse.equinox.simpleconfigurator.manipulator@default:default,org.eclipse.equinox.simpleconfigurator@1:true"/>
-<booleanAttribute key="show_selected_only" value="false"/>
-<booleanAttribute key="tracing" value="false"/>
-<booleanAttribute key="useCustomFeatures" value="false"/>
-<booleanAttribute key="useDefaultConfig" value="true"/>
-<booleanAttribute key="useDefaultConfigArea" value="false"/>
-<booleanAttribute key="useProduct" value="false"/>
+ <booleanAttribute key="append.args" value="true"/>
+ <booleanAttribute key="askclear" value="false"/>
+ <booleanAttribute key="automaticAdd" value="true"/>
+ <booleanAttribute key="automaticValidate" value="false"/>
+ <stringAttribute key="bootstrap" value=""/>
+ <stringAttribute key="checked" value="[NONE]"/>
+ <booleanAttribute key="clearConfig" value="true"/>
+ <booleanAttribute key="clearws" value="true"/>
+ <booleanAttribute key="clearwslog" value="false"/>
+ <booleanAttribute key="com.mountainminds.eclemma.core.INPLACE_INSTRUMENTATION" value="true"/>
+ <listAttribute key="com.mountainminds.eclemma.core.INSTRUMENTATION_PATHS">
+ <listEntry value="/org.eclipse.equinox.p2.updatechecker/bin"/>
+ <listEntry value="/org.eclipse.equinox.frameworkadmin.equinox/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.updatesite/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.core/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.extensionlocation/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.director.app/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.console/bin"/>
+ <listEntry value="/org.eclipse.equinox.frameworkadmin/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.engine/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.exemplarysetup/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.metadata.repository/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.publisher/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.ui.sdk/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.directorywatcher/bin"/>
+ <listEntry value="/org.eclipse.equinox.simpleconfigurator.manipulator/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.metadata/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.touchpoint.natives/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.artifact.repository/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.metadata.generator/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.jarprocessor/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.reconciler.dropins/bin"/>
+ <listEntry value="/org.eclipse.equinox.simpleconfigurator/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.director/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.ui/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.garbagecollector/bin"/>
+ <listEntry value="/org.eclipse.equinox.p2.touchpoint.eclipse/bin"/>
+ </listAttribute>
+ <stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
+ <booleanAttribute key="default" value="false"/>
+ <setAttribute key="deselected_workspace_bundles"/>
+ <booleanAttribute key="generateProfile" value="true"/>
+ <booleanAttribute key="includeOptional" value="true"/>
+ <stringAttribute key="location" value="${workspace_loc}/../junit-workspace"/>
+ <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+ <listEntry value="/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/AutomatedTests.java"/>
+ </listAttribute>
+ <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+ <listEntry value="1"/>
+ </listAttribute>
+ <stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
+ <booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+ <stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+ <stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
+ <booleanAttribute key="org.eclipse.jdt.launching.ATTR_ATTR_USE_ARGFILE" value="false"/>
+ <stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.equinox.p2.tests.ui.AutomatedTests"/>
+ <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -console -consoleLog"/>
+ <stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.equinox.p2.tests.ui"/>
+ <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+ <stringAttribute key="pde.version" value="3.3"/>
+ <stringAttribute key="product" value="org.eclipse.sdk.ide"/>
+ <booleanAttribute key="run_in_ui_thread" value="true"/>
+ <setAttribute key="selected_target_bundles">
+ <setEntry value="com.google.gson@default:default"/>
+ <setEntry value="com.google.guava*21.0.0.v20170206-1425@default:default"/>
+ <setEntry value="com.google.guava*27.1.0.v20190517-1946@default:default"/>
+ <setEntry value="com.ibm.icu@default:default"/>
+ <setEntry value="com.jcraft.jsch@default:default"/>
+ <setEntry value="com.sun.jna.platform@default:default"/>
+ <setEntry value="com.sun.jna@default:default"/>
+ <setEntry value="jakarta.activation@default:default"/>
+ <setEntry value="javaewah@default:default"/>
+ <setEntry value="javax.activation*2.0.0.v20201118-1818@default:default"/>
+ <setEntry value="javax.annotation@default:default"/>
+ <setEntry value="javax.el@default:default"/>
+ <setEntry value="javax.inject@default:default"/>
+ <setEntry value="javax.servlet.jsp@default:default"/>
+ <setEntry value="javax.xml@default:default"/>
+ <setEntry value="net.i2p.crypto.eddsa@default:default"/>
+ <setEntry value="org.apache.ant@default:default"/>
+ <setEntry value="org.apache.batik.constants@default:default"/>
+ <setEntry value="org.apache.batik.css@default:default"/>
+ <setEntry value="org.apache.batik.i18n@default:default"/>
+ <setEntry value="org.apache.batik.util@default:default"/>
+ <setEntry value="org.apache.commons.codec@default:default"/>
+ <setEntry value="org.apache.commons.fileupload@default:default"/>
+ <setEntry value="org.apache.commons.httpclient@default:default"/>
+ <setEntry value="org.apache.commons.io@default:default"/>
+ <setEntry value="org.apache.commons.jxpath@default:default"/>
+ <setEntry value="org.apache.commons.lang@default:default"/>
+ <setEntry value="org.apache.commons.logging@default:default"/>
+ <setEntry value="org.apache.felix.gogo.command@default:default"/>
+ <setEntry value="org.apache.felix.gogo.runtime@default:default"/>
+ <setEntry value="org.apache.felix.gogo.shell@default:default"/>
+ <setEntry value="org.apache.felix.scr@1:true"/>
+ <setEntry value="org.apache.httpcomponents.httpclient@default:default"/>
+ <setEntry value="org.apache.httpcomponents.httpcore@default:default"/>
+ <setEntry value="org.apache.jasper.glassfish@default:default"/>
+ <setEntry value="org.apache.lucene.analyzers-common*8.4.1.v20200122-1459@default:default"/>
+ <setEntry value="org.apache.lucene.analyzers-smartcn@default:default"/>
+ <setEntry value="org.apache.lucene.core*8.4.1.v20200122-1459@default:default"/>
+ <setEntry value="org.apache.sshd.osgi@default:default"/>
+ <setEntry value="org.apache.sshd.sftp@default:default"/>
+ <setEntry value="org.apache.xerces@default:default"/>
+ <setEntry value="org.apache.xml.resolver@default:default"/>
+ <setEntry value="org.apache.xmlgraphics@default:default"/>
+ <setEntry value="org.apiguardian@default:default"/>
+ <setEntry value="org.bouncycastle.bcpg@default:default"/>
+ <setEntry value="org.bouncycastle.bcprov@default:default"/>
+ <setEntry value="org.easymock@default:default"/>
+ <setEntry value="org.eclipse.ant.core@default:default"/>
+ <setEntry value="org.eclipse.ant.launching@default:default"/>
+ <setEntry value="org.eclipse.ant.optional.junit@default:false"/>
+ <setEntry value="org.eclipse.ant.ui@default:default"/>
+ <setEntry value="org.eclipse.compare.core@default:default"/>
+ <setEntry value="org.eclipse.compare@default:default"/>
+ <setEntry value="org.eclipse.core.commands@default:default"/>
+ <setEntry value="org.eclipse.core.contenttype@default:default"/>
+ <setEntry value="org.eclipse.core.databinding.beans@default:default"/>
+ <setEntry value="org.eclipse.core.databinding.observable@default:default"/>
+ <setEntry value="org.eclipse.core.databinding.property@default:default"/>
+ <setEntry value="org.eclipse.core.databinding@default:default"/>
+ <setEntry value="org.eclipse.core.expressions@default:default"/>
+ <setEntry value="org.eclipse.core.externaltools@default:default"/>
+ <setEntry value="org.eclipse.core.filebuffers@default:default"/>
+ <setEntry value="org.eclipse.core.filesystem.linux.x86_64@default:false"/>
+ <setEntry value="org.eclipse.core.filesystem@default:default"/>
+ <setEntry value="org.eclipse.core.jobs@default:default"/>
+ <setEntry value="org.eclipse.core.net.linux.x86_64@default:false"/>
+ <setEntry value="org.eclipse.core.net@default:default"/>
+ <setEntry value="org.eclipse.core.resources@default:default"/>
+ <setEntry value="org.eclipse.core.runtime@default:true"/>
+ <setEntry value="org.eclipse.core.tests.harness@default:default"/>
+ <setEntry value="org.eclipse.core.variables@default:default"/>
+ <setEntry value="org.eclipse.debug.core@default:default"/>
+ <setEntry value="org.eclipse.debug.ui@default:default"/>
+ <setEntry value="org.eclipse.e4.core.commands@default:default"/>
+ <setEntry value="org.eclipse.e4.core.contexts@default:default"/>
+ <setEntry value="org.eclipse.e4.core.di.annotations@default:default"/>
+ <setEntry value="org.eclipse.e4.core.di.extensions.supplier@default:default"/>
+ <setEntry value="org.eclipse.e4.core.di.extensions@default:default"/>
+ <setEntry value="org.eclipse.e4.core.di@default:default"/>
+ <setEntry value="org.eclipse.e4.core.services@default:default"/>
+ <setEntry value="org.eclipse.e4.emf.xpath@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.bindings@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.css.core@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.css.swt.theme@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.css.swt@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.di@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.dialogs@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.ide@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.model.workbench@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.services@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.swt.gtk@default:false"/>
+ <setEntry value="org.eclipse.e4.ui.widgets@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.workbench.addons.swt@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.workbench.renderers.swt@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.workbench.swt@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.workbench3@default:default"/>
+ <setEntry value="org.eclipse.e4.ui.workbench@default:default"/>
+ <setEntry value="org.eclipse.ecf.filetransfer@default:default"/>
+ <setEntry value="org.eclipse.ecf.identity@default:default"/>
+ <setEntry value="org.eclipse.ecf.provider.filetransfer.httpclient45@default:default"/>
+ <setEntry value="org.eclipse.ecf.provider.filetransfer.ssl@default:false"/>
+ <setEntry value="org.eclipse.ecf.provider.filetransfer@default:default"/>
+ <setEntry value="org.eclipse.ecf.ssl@default:false"/>
+ <setEntry value="org.eclipse.ecf@default:default"/>
+ <setEntry value="org.eclipse.egit.core@default:default"/>
+ <setEntry value="org.eclipse.egit.ui@default:default"/>
+ <setEntry value="org.eclipse.egit@default:default"/>
+ <setEntry value="org.eclipse.emf.common@default:default"/>
+ <setEntry value="org.eclipse.emf.ecore.change@default:default"/>
+ <setEntry value="org.eclipse.emf.ecore.edit@default:default"/>
+ <setEntry value="org.eclipse.emf.ecore.xmi@default:default"/>
+ <setEntry value="org.eclipse.emf.ecore@default:default"/>
+ <setEntry value="org.eclipse.emf.edit@default:default"/>
+ <setEntry value="org.eclipse.equinox.app@default:default"/>
+ <setEntry value="org.eclipse.equinox.bidi@default:default"/>
+ <setEntry value="org.eclipse.equinox.common@2:true"/>
+ <setEntry value="org.eclipse.equinox.concurrent@default:default"/>
+ <setEntry value="org.eclipse.equinox.console@default:default"/>
+ <setEntry value="org.eclipse.equinox.event@default:default"/>
+ <setEntry value="org.eclipse.equinox.frameworkadmin.equinox@default:default"/>
+ <setEntry value="org.eclipse.equinox.frameworkadmin@default:default"/>
+ <setEntry value="org.eclipse.equinox.http.jetty@default:default"/>
+ <setEntry value="org.eclipse.equinox.http.registry@default:default"/>
+ <setEntry value="org.eclipse.equinox.http.servlet@default:default"/>
+ <setEntry value="org.eclipse.equinox.jsp.jasper.registry@default:default"/>
+ <setEntry value="org.eclipse.equinox.jsp.jasper@default:default"/>
+ <setEntry value="org.eclipse.equinox.launcher.gtk.linux.x86_64@default:false"/>
+ <setEntry value="org.eclipse.equinox.launcher@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.artifact.repository@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.console@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.core@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.director.app@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.director@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.directorywatcher@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.engine@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.extensionlocation@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.garbagecollector@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.jarprocessor@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.metadata.repository@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.metadata@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.operations@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.publisher@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.reconciler.dropins@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.repository.tools@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.repository@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.touchpoint.eclipse@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.touchpoint.natives@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.ui.sdk.scheduler@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.ui.sdk@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.ui@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.updatechecker@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.updatesite@default:default"/>
+ <setEntry value="org.eclipse.equinox.preferences@default:default"/>
+ <setEntry value="org.eclipse.equinox.registry@default:default"/>
+ <setEntry value="org.eclipse.equinox.security.linux.x86_64@default:false"/>
+ <setEntry value="org.eclipse.equinox.security.ui@default:default"/>
+ <setEntry value="org.eclipse.equinox.security@default:default"/>
+ <setEntry value="org.eclipse.equinox.simpleconfigurator.manipulator@default:default"/>
+ <setEntry value="org.eclipse.equinox.simpleconfigurator@1:true"/>
+ <setEntry value="org.eclipse.help.base@default:default"/>
+ <setEntry value="org.eclipse.help.ui@default:default"/>
+ <setEntry value="org.eclipse.help.webapp@default:default"/>
+ <setEntry value="org.eclipse.help@default:default"/>
+ <setEntry value="org.eclipse.jdt.annotation*2.2.600.v20200408-1511@default:default"/>
+ <setEntry value="org.eclipse.jdt.apt.core@default:default"/>
+ <setEntry value="org.eclipse.jdt.apt.pluggable.core@default:default"/>
+ <setEntry value="org.eclipse.jdt.apt.ui@default:default"/>
+ <setEntry value="org.eclipse.jdt.compiler.apt@default:false"/>
+ <setEntry value="org.eclipse.jdt.compiler.tool@default:false"/>
+ <setEntry value="org.eclipse.jdt.core.manipulation@default:default"/>
+ <setEntry value="org.eclipse.jdt.core@default:default"/>
+ <setEntry value="org.eclipse.jdt.debug.ui@default:default"/>
+ <setEntry value="org.eclipse.jdt.debug@default:default"/>
+ <setEntry value="org.eclipse.jdt.doc.isv@default:default"/>
+ <setEntry value="org.eclipse.jdt.doc.user@default:default"/>
+ <setEntry value="org.eclipse.jdt.junit.core@default:default"/>
+ <setEntry value="org.eclipse.jdt.junit.runtime@default:default"/>
+ <setEntry value="org.eclipse.jdt.junit4.runtime@default:default"/>
+ <setEntry value="org.eclipse.jdt.junit@default:default"/>
+ <setEntry value="org.eclipse.jdt.launching@default:default"/>
+ <setEntry value="org.eclipse.jdt.ui@default:default"/>
+ <setEntry value="org.eclipse.jdt@default:default"/>
+ <setEntry value="org.eclipse.jetty.http@default:default"/>
+ <setEntry value="org.eclipse.jetty.io@default:default"/>
+ <setEntry value="org.eclipse.jetty.security@default:default"/>
+ <setEntry value="org.eclipse.jetty.server@default:default"/>
+ <setEntry value="org.eclipse.jetty.servlet@default:default"/>
+ <setEntry value="org.eclipse.jetty.util.ajax@default:default"/>
+ <setEntry value="org.eclipse.jetty.util@default:default"/>
+ <setEntry value="org.eclipse.jface.databinding@default:default"/>
+ <setEntry value="org.eclipse.jface.notifications@default:default"/>
+ <setEntry value="org.eclipse.jface.text@default:default"/>
+ <setEntry value="org.eclipse.jface@default:default"/>
+ <setEntry value="org.eclipse.jgit.gpg.bc@default:false"/>
+ <setEntry value="org.eclipse.jgit.http.apache@default:default"/>
+ <setEntry value="org.eclipse.jgit.ssh.apache@default:default"/>
+ <setEntry value="org.eclipse.jgit@default:default"/>
+ <setEntry value="org.eclipse.jsch.core@default:default"/>
+ <setEntry value="org.eclipse.jsch.ui@default:default"/>
+ <setEntry value="org.eclipse.ltk.core.refactoring@default:default"/>
+ <setEntry value="org.eclipse.ltk.ui.refactoring@default:default"/>
+ <setEntry value="org.eclipse.m2e.archetype.common@default:default"/>
+ <setEntry value="org.eclipse.m2e.core.ui@default:default"/>
+ <setEntry value="org.eclipse.m2e.core@default:default"/>
+ <setEntry value="org.eclipse.m2e.maven.indexer@default:default"/>
+ <setEntry value="org.eclipse.m2e.maven.runtime.slf4j.simple@default:default"/>
+ <setEntry value="org.eclipse.m2e.maven.runtime@default:default"/>
+ <setEntry value="org.eclipse.m2e.model.edit@default:default"/>
+ <setEntry value="org.eclipse.m2e.workspace.cli@default:default"/>
+ <setEntry value="org.eclipse.mylyn.commons.core@default:default"/>
+ <setEntry value="org.eclipse.mylyn.commons.net@default:default"/>
+ <setEntry value="org.eclipse.mylyn.discovery.core@default:default"/>
+ <setEntry value="org.eclipse.osgi.compatibility.state@default:false"/>
+ <setEntry value="org.eclipse.osgi.services@default:default"/>
+ <setEntry value="org.eclipse.osgi.util@default:default"/>
+ <setEntry value="org.eclipse.osgi@-1:true"/>
+ <setEntry value="org.eclipse.pde.api.tools.ui@default:default"/>
+ <setEntry value="org.eclipse.pde.api.tools@default:default"/>
+ <setEntry value="org.eclipse.pde.build@default:default"/>
+ <setEntry value="org.eclipse.pde.core@default:default"/>
+ <setEntry value="org.eclipse.pde.doc.user@default:default"/>
+ <setEntry value="org.eclipse.pde.ds.core@default:default"/>
+ <setEntry value="org.eclipse.pde.ds.ui@default:default"/>
+ <setEntry value="org.eclipse.pde.junit.runtime@default:default"/>
+ <setEntry value="org.eclipse.pde.launching@default:default"/>
+ <setEntry value="org.eclipse.pde.runtime@default:default"/>
+ <setEntry value="org.eclipse.pde.ua.core@default:default"/>
+ <setEntry value="org.eclipse.pde.ua.ui@default:default"/>
+ <setEntry value="org.eclipse.pde.ui.templates@default:default"/>
+ <setEntry value="org.eclipse.pde.ui@default:default"/>
+ <setEntry value="org.eclipse.pde@default:default"/>
+ <setEntry value="org.eclipse.platform.doc.isv@default:default"/>
+ <setEntry value="org.eclipse.platform.doc.user@default:default"/>
+ <setEntry value="org.eclipse.platform@default:default"/>
+ <setEntry value="org.eclipse.rcp@default:default"/>
+ <setEntry value="org.eclipse.sdk@default:default"/>
+ <setEntry value="org.eclipse.search@default:default"/>
+ <setEntry value="org.eclipse.swt.gtk.linux.x86_64@default:false"/>
+ <setEntry value="org.eclipse.swt@default:default"/>
+ <setEntry value="org.eclipse.team.core@default:default"/>
+ <setEntry value="org.eclipse.team.ui@default:default"/>
+ <setEntry value="org.eclipse.test.performance.win32@default:false"/>
+ <setEntry value="org.eclipse.test.performance@default:default"/>
+ <setEntry value="org.eclipse.text@default:default"/>
+ <setEntry value="org.eclipse.ui.browser@default:default"/>
+ <setEntry value="org.eclipse.ui.cheatsheets@default:default"/>
+ <setEntry value="org.eclipse.ui.console@default:default"/>
+ <setEntry value="org.eclipse.ui.editors@default:default"/>
+ <setEntry value="org.eclipse.ui.externaltools@default:default"/>
+ <setEntry value="org.eclipse.ui.forms@default:default"/>
+ <setEntry value="org.eclipse.ui.genericeditor@default:default"/>
+ <setEntry value="org.eclipse.ui.ide.application@default:default"/>
+ <setEntry value="org.eclipse.ui.ide@default:default"/>
+ <setEntry value="org.eclipse.ui.intro.quicklinks@default:default"/>
+ <setEntry value="org.eclipse.ui.intro.universal@default:default"/>
+ <setEntry value="org.eclipse.ui.intro@default:default"/>
+ <setEntry value="org.eclipse.ui.navigator.resources@default:default"/>
+ <setEntry value="org.eclipse.ui.navigator@default:default"/>
+ <setEntry value="org.eclipse.ui.net@default:default"/>
+ <setEntry value="org.eclipse.ui.trace@default:default"/>
+ <setEntry value="org.eclipse.ui.views.log@default:default"/>
+ <setEntry value="org.eclipse.ui.views.properties.tabbed@default:default"/>
+ <setEntry value="org.eclipse.ui.views@default:default"/>
+ <setEntry value="org.eclipse.ui.workbench.texteditor@default:default"/>
+ <setEntry value="org.eclipse.ui.workbench@default:default"/>
+ <setEntry value="org.eclipse.ui@default:default"/>
+ <setEntry value="org.eclipse.urischeme@default:default"/>
+ <setEntry value="org.eclipse.wst.common.core@default:default"/>
+ <setEntry value="org.eclipse.wst.common.emf@default:default"/>
+ <setEntry value="org.eclipse.wst.common.environment@default:default"/>
+ <setEntry value="org.eclipse.wst.common.frameworks.ui@default:default"/>
+ <setEntry value="org.eclipse.wst.common.frameworks@default:default"/>
+ <setEntry value="org.eclipse.wst.common.project.facet.core@default:default"/>
+ <setEntry value="org.eclipse.wst.common.ui@default:default"/>
+ <setEntry value="org.eclipse.wst.common.uriresolver@default:default"/>
+ <setEntry value="org.eclipse.wst.sse.core@default:default"/>
+ <setEntry value="org.eclipse.wst.sse.ui@default:default"/>
+ <setEntry value="org.eclipse.wst.validation.ui@default:default"/>
+ <setEntry value="org.eclipse.wst.validation@default:default"/>
+ <setEntry value="org.eclipse.wst.xml.core@default:default"/>
+ <setEntry value="org.eclipse.wst.xml.ui@default:default"/>
+ <setEntry value="org.eclipse.wst.xsd.core@default:default"/>
+ <setEntry value="org.eclipse.xsd@default:default"/>
+ <setEntry value="org.hamcrest.core@default:default"/>
+ <setEntry value="org.junit.jupiter.api@default:default"/>
+ <setEntry value="org.junit.platform.commons@default:default"/>
+ <setEntry value="org.junit.platform.engine@default:default"/>
+ <setEntry value="org.junit.platform.launcher@default:default"/>
+ <setEntry value="org.junit@default:default"/>
+ <setEntry value="org.opentest4j@default:default"/>
+ <setEntry value="org.sat4j.core@default:default"/>
+ <setEntry value="org.sat4j.pb@default:default"/>
+ <setEntry value="org.slf4j.api@default:default"/>
+ <setEntry value="org.tukaani.xz@default:default"/>
+ <setEntry value="org.w3c.css.sac@default:default"/>
+ <setEntry value="org.w3c.dom.events@default:default"/>
+ <setEntry value="org.w3c.dom.smil@default:default"/>
+ <setEntry value="org.w3c.dom.svg@default:default"/>
+ </setAttribute>
+ <setAttribute key="selected_workspace_bundles">
+ <setEntry value="org.eclipse.equinox.frameworkadmin.equinox@default:default"/>
+ <setEntry value="org.eclipse.equinox.frameworkadmin.test@default:default"/>
+ <setEntry value="org.eclipse.equinox.frameworkadmin@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.artifact.checksums.bouncycastle@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.artifact.optimizers@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.artifact.processors@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.artifact.repository@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.console@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.core@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.director.app@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.director@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.directorywatcher@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.discovery.compatibility@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.discovery@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.engine@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.examples.rcp.cloud@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.examples.rcp.discovery@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.examples.rcp.prestartupdate@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.examples.rcp.sdkbundlevisibility@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.examples.rcp.sdknoautoupdates@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.examples.rcp.sdkui@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.extensionlocation@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.garbagecollector@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.installer@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.jarprocessor@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.metadata.repository@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.metadata@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.operations@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.publisher.eclipse@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.publisher@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.reconciler.dropins@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.repository.tools@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.repository@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.sar@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.tests.discovery@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.tests.optimizers@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.tests.ui@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.tests.verifier@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.tests@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.testserver@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.touchpoint.eclipse@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.touchpoint.natives@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.transport.ecf@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.ui.admin.rcp@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.ui.admin@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.ui.discovery@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.ui.importexport@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.ui.sdk.scheduler@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.ui.sdk@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.ui@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.updatechecker@default:default"/>
+ <setEntry value="org.eclipse.equinox.p2.updatesite@default:default"/>
+ <setEntry value="org.eclipse.equinox.simpleconfigurator.manipulator@default:default"/>
+ <setEntry value="org.eclipse.equinox.simpleconfigurator@1:true"/>
+ </setAttribute>
+ <booleanAttribute key="show_selected_only" value="false"/>
+ <booleanAttribute key="tracing" value="false"/>
+ <booleanAttribute key="useCustomFeatures" value="false"/>
+ <booleanAttribute key="useDefaultConfig" value="true"/>
+ <booleanAttribute key="useDefaultConfigArea" value="false"/>
+ <booleanAttribute key="useProduct" value="false"/>
</launchConfiguration>
diff --git a/bundles/org.eclipse.equinox.p2.tests.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.tests.ui/META-INF/MANIFEST.MF
index 5330e2012..58c4adbf1 100644
--- a/bundles/org.eclipse.equinox.p2.tests.ui/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.tests.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.tests.ui
-Bundle-Version: 1.3.0.qualifier
+Bundle-Version: 1.3.400.qualifier
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Require-Bundle: org.eclipse.core.runtime;bundle-version="3.4.100",
diff --git a/bundles/org.eclipse.equinox.p2.tests.ui/build.properties b/bundles/org.eclipse.equinox.p2.tests.ui/build.properties
index e715d4bc7..0264e2b00 100644
--- a/bundles/org.eclipse.equinox.p2.tests.ui/build.properties
+++ b/bundles/org.eclipse.equinox.p2.tests.ui/build.properties
@@ -19,4 +19,3 @@ bin.includes = META-INF/,\
plugin.properties,\
test.xml
src.includes = about.html
-javacWarnings..=-raw,-unchecked,-varargsCast
diff --git a/bundles/org.eclipse.equinox.p2.tests.ui/pom.xml b/bundles/org.eclipse.equinox.p2.tests.ui/pom.xml
index e5f6fded1..f941878fb 100644
--- a/bundles/org.eclipse.equinox.p2.tests.ui/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.tests.ui/pom.xml
@@ -15,13 +15,13 @@
<parent>
<artifactId>org.eclipse.equinox.p2.tests-parent</artifactId>
<groupId>org.eclipse</groupId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../../org.eclipse.equinox.p2.releng/org.eclipse.equinox.p2.tests-parent</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.tests.ui</artifactId>
- <version>1.3.0-SNAPSHOT</version>
+ <version>1.3.400-SNAPSHOT</version>
<packaging>eclipse-test-plugin</packaging>
<properties>
diff --git a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/importexport/ImportExportRemoteTests.java b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/importexport/ImportExportRemoteTests.java
index 048f7e5af..fdb0c5299 100644
--- a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/importexport/ImportExportRemoteTests.java
+++ b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/importexport/ImportExportRemoteTests.java
@@ -78,7 +78,7 @@ public class ImportExportRemoteTests extends ServerBasedTestCase {
try (InputStream input = new FileInputStream(testFile)) {
List<IUDetail> ius = importexportService.importP2F(input);
assertEquals("Exported the number of features is not expected.", 1, ius.size());
- assertTrue("Exported feature is not expected.", iu.equals(ius.get(0).getIU()));
+ assertEquals("Exported feature is not expected.", iu, ius.get(0).getIU());
assertEquals("Exported the number of referred repositories is not expected.", 1,
ius.get(0).getReferencedRepositories().size());
assertEquals("Exported referred repository is not expected.", uri,
@@ -128,7 +128,7 @@ public class ImportExportRemoteTests extends ServerBasedTestCase {
try (InputStream input = new FileInputStream(testFile)) {
List<IUDetail> ius = importexportService.importP2F(input);
assertEquals("Exported the number of features is not expected.", 1, ius.size());
- assertTrue("Exported feature is not expected.", iu.equals(ius.get(0).getIU()));
+ assertEquals("Exported feature is not expected.", iu, ius.get(0).getIU());
assertEquals("Exported the number of referred repositories is not expected.", 1,
ius.get(0).getReferencedRepositories().size());
assertEquals("Exported referred repository is not expected.", uri,
diff --git a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/importexport/ImportExportTests.java b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/importexport/ImportExportTests.java
index 84353aeea..cbde87226 100644
--- a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/importexport/ImportExportTests.java
+++ b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/importexport/ImportExportTests.java
@@ -14,6 +14,8 @@
*******************************************************************************/
package org.eclipse.equinox.p2.tests.importexport;
+import static org.junit.Assert.assertThrows;
+
import java.io.*;
import java.util.ArrayList;
import java.util.List;
@@ -67,16 +69,16 @@ public class ImportExportTests extends AbstractProvisioningTest {
try (InputStream input = new FileInputStream(p2fFile)) {
List<IUDetail> iuDetails = importexportService.importP2F(input);
- assertTrue("Should load two features from the p2f file.", iuDetails.size() == 2);
+ assertEquals("Should load two features from the p2f file.", 2, iuDetails.size());
int counter = 0;
for (IUDetail iu : iuDetails) {
if ("org.polarion.eclipse.team.svn.connector.feature.group".equals(iu.getIU().getId())) {
counter++;
- assertTrue("Should have two referred repository.", iu.getReferencedRepositories().size() == 2);
+ assertEquals("Should have two referred repository.", 2, iu.getReferencedRepositories().size());
} else if ("org.polarion.eclipse.team.svn.connector.svnkit16.feature.group"
.equals(iu.getIU().getId())) {
counter++;
- assertTrue("Should have one referred repository", iu.getReferencedRepositories().size() == 1);
+ assertEquals("Should have one referred repository", 1, iu.getReferencedRepositories().size());
}
}
assertEquals("Load unexpected content.", 2, counter);
@@ -96,10 +98,8 @@ public class ImportExportTests extends AbstractProvisioningTest {
File p2fFile = getTestData("Error load test file.", "testData/importexport/incompatible.p2f");
try (InputStream input = new FileInputStream(p2fFile)) {
- importexportService.importP2F(input);
- assertTrue("Didn't complain the given file is not supported by current version.", false);
- } catch (VersionIncompatibleException e) {
- // expected
+ assertThrows("Didn't complain the given file is not supported by current version.",
+ VersionIncompatibleException.class, () -> importexportService.importP2F(input));
}
}
diff --git a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/actions/ElementUtilsTest.java b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/actions/ElementUtilsTest.java
index 319338c91..a4cfbd144 100644
--- a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/actions/ElementUtilsTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/actions/ElementUtilsTest.java
@@ -14,6 +14,8 @@
package org.eclipse.equinox.p2.tests.ui.actions;
+import static org.junit.Assert.assertNotEquals;
+
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
@@ -35,7 +37,7 @@ public class ElementUtilsTest extends ProfileModificationActionTest {
}
public void testInvalid() {
- assertTrue(ElementUtils.elementsToIUs(getInvalidSelection()).size() == 0);
+ assertTrue(ElementUtils.elementsToIUs(getInvalidSelection()).isEmpty());
}
public void testIUs() {
@@ -47,7 +49,7 @@ public class ElementUtilsTest extends ProfileModificationActionTest {
}
public void testMixedIUsAndNonIUs() {
- assertTrue(getMixedIUsAndNonIUs().length != ElementUtils.elementsToIUs(getMixedIUsAndNonIUs()).size());
+ assertNotEquals(getMixedIUsAndNonIUs().length, ElementUtils.elementsToIUs(getMixedIUsAndNonIUs()).size());
}
public void testMixedIUsAndElements() {
@@ -56,15 +58,15 @@ public class ElementUtilsTest extends ProfileModificationActionTest {
public void testUpdateUsingElements() throws URISyntaxException {
// Two visible repos, one is added, the other is not
- URI known1 = new URI("http://example.com/known1");
- URI known2 = new URI("http://example.com/known2");
+ URI known1 = new URI("https://example.com/known1");
+ URI known2 = new URI("https://example.com/known2");
IMetadataRepositoryManager manager = getMetadataRepositoryManager();
manager.addRepository(known1);
// Add system repos that should not be known or affected by ElementUtils
// One is an enabled system repo, one is disabled system repo
- URI uri = new URI("http://example.com/1");
- URI uri2 = new URI("http://example.com/2");
+ URI uri = new URI("https://example.com/1");
+ URI uri2 = new URI("https://example.com/2");
manager.addRepository(uri);
manager.setRepositoryProperty(uri, IRepository.PROP_SYSTEM, Boolean.toString(true));
manager.addRepository(uri2);
@@ -80,10 +82,10 @@ public class ElementUtilsTest extends ProfileModificationActionTest {
MetadataRepositoryElement[] elements = children.toArray(new MetadataRepositoryElement[children.size()]);
// Add a visible repo not known by the elements
- URI uri3 = new URI("http://example.com/3");
+ URI uri3 = new URI("https://example.com/3");
manager.addRepository(uri3);
- // Now update the repo using the elements.
+ // Now update the repo using the elements.
// We expect known2 to get added because it was in the elements
// We expect uri3 to get removed (as if it had been removed from a pref page)
// System repos shouldn't be touched
diff --git a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/InstallWithRemediationTest.java b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/InstallWithRemediationTest.java
index acf2fe1d4..bedcda8ae 100644
--- a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/InstallWithRemediationTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/InstallWithRemediationTest.java
@@ -35,9 +35,9 @@ import org.eclipse.swt.widgets.TreeItem;
*/
public class InstallWithRemediationTest extends WizardTest {
- // private static final String SELECTION_PAGE = "IUSelectionPage";
+ // private static final String SELECTION_PAGE = "IUSelectionPage";
private static final String AVAILABLE_SOFTWARE_PAGE = "AvailableSoftwarePage";
- // private static final String MAIN_IU = "MainIU";
+ // private static final String MAIN_IU = "MainIU";
IInstallableUnit toInstall;
@@ -54,154 +54,175 @@ public class InstallWithRemediationTest extends WizardTest {
iu.setProperty(InstallableUnitDescription.PROP_TYPE_GROUP, "true");
iu.setVersion(Version.createOSGi(2, 0, 0));
iu.setSingleton(true);
- iu.setLicenses(new ILicense[] {new License(null, "There is a license to accept!", null)});
- iu.setCapabilities(new IProvidedCapability[] {MetadataFactory.createProvidedCapability(IInstallableUnit.NAMESPACE_IU_ID, TOPLEVELIU, iu.getVersion())});
+ iu.setLicenses(new ILicense[] { new License(null, "There is a license to accept!", null) });
+ iu.setCapabilities(new IProvidedCapability[] { MetadataFactory
+ .createProvidedCapability(IInstallableUnit.NAMESPACE_IU_ID, TOPLEVELIU, iu.getVersion()) });
toInstall = MetadataFactory.createInstallableUnit(iu);
- createTestMetdataRepository(new IInstallableUnit[] {toInstall, anotherIUToInstall});
+ createTestMetdataRepository(new IInstallableUnit[] { toInstall, anotherIUToInstall });
}
//
- // public void testInstallWizardResolved() {
- // ArrayList<IInstallableUnit> iusInvolved = new ArrayList<IInstallableUnit>();
- // iusInvolved.add(toInstall);
- // InstallOperation op = new InstallOperation(getSession(), iusInvolved);
- // op.setProfileId(TESTPROFILE);
- // PreselectedIUInstallWizard wizard = new PreselectedIUInstallWizard(getProvisioningUI(), op, iusInvolved, null);
- // ProvisioningWizardDialog dialog = new ProvisioningWizardDialog(ProvUI.getDefaultParentShell(), wizard);
- // dialog.setBlockOnOpen(false);
- // dialog.open();
- // ProfileModificationJob longOp = null;
+ // public void testInstallWizardResolved() {
+ // ArrayList<IInstallableUnit> iusInvolved = new ArrayList<IInstallableUnit>();
+ // iusInvolved.add(toInstall);
+ // InstallOperation op = new InstallOperation(getSession(), iusInvolved);
+ // op.setProfileId(TESTPROFILE);
+ // PreselectedIUInstallWizard wizard = new
+ // PreselectedIUInstallWizard(getProvisioningUI(), op, iusInvolved, null);
+ // ProvisioningWizardDialog dialog = new
+ // ProvisioningWizardDialog(ProvUI.getDefaultParentShell(), wizard);
+ // dialog.setBlockOnOpen(false);
+ // dialog.open();
+ // ProfileModificationJob longOp = null;
//
- // try {
- // SelectableIUsPage page1 = (SelectableIUsPage) wizard.getPage(SELECTION_PAGE);
- // // should already have a plan
- // assertTrue("1.0", page1.isPageComplete());
- // // simulate the next button by getting next page and showing
- // IWizardPage page = page1.getNextPage();
- // dialog.showPage(page);
- // // we should be ok
- // assertTrue("1.1", page.isPageComplete());
+ // try {
+ // SelectableIUsPage page1 = (SelectableIUsPage) wizard.getPage(SELECTION_PAGE);
+ // // should already have a plan
+ // assertTrue("1.0", page1.isPageComplete());
+ // // simulate the next button by getting next page and showing
+ // IWizardPage page = page1.getNextPage();
+ // dialog.showPage(page);
+ // // we should be ok
+ // assertTrue("1.1", page.isPageComplete());
//
- // // if another operation is scheduled for this profile, we should not be allowed to proceed
- // longOp = getLongTestOperation();
- // getProvisioningUI().schedule(longOp, StatusManager.LOG);
- // // causes recalculation of plan and status
- // wizard.recomputePlan(dialog);
- // // can't move to next page while op is running
- // assertFalse("1.2", page.isPageComplete());
- // longOp.cancel();
+ // // if another operation is scheduled for this profile, we should not be
+ // allowed to proceed
+ // longOp = getLongTestOperation();
+ // getProvisioningUI().schedule(longOp, StatusManager.LOG);
+ // // causes recalculation of plan and status
+ // wizard.recomputePlan(dialog);
+ // // can't move to next page while op is running
+ // assertFalse("1.2", page.isPageComplete());
+ // longOp.cancel();
//
- // // op is no longer running, recompute plan
- // wizard.recomputePlan(dialog);
+ // // op is no longer running, recompute plan
+ // wizard.recomputePlan(dialog);
//
- // // license needs approval
- // assertFalse("1.4", wizard.canFinish());
- // // finish button should be disabled
- // dialog.updateButtons();
- // Button finishButton = dialog.testGetButton(IDialogConstants.FINISH_ID);
- // assertFalse("1.5", finishButton.isEnabled());
- // } finally {
- // dialog.getShell().close();
- // if (longOp != null)
- // longOp.cancel();
- // }
- // }
+ // // license needs approval
+ // assertFalse("1.4", wizard.canFinish());
+ // // finish button should be disabled
+ // dialog.updateButtons();
+ // Button finishButton = dialog.testGetButton(IDialogConstants.FINISH_ID);
+ // assertFalse("1.5", finishButton.isEnabled());
+ // } finally {
+ // dialog.getShell().close();
+ // if (longOp != null)
+ // longOp.cancel();
+ // }
+ // }
//
- // public void testInstallWizard() throws Exception {
- // ArrayList<IInstallableUnit> iusInvolved = new ArrayList<IInstallableUnit>();
- // iusInvolved.add(toInstall);
- // InstallOperation op = new MyNewInstallOperation(getSession(), iusInvolved);
- // op.setProfileId(TESTPROFILE);
- // PreselectedIUInstallWizard wizard = new PreselectedIUInstallWizard(getProvisioningUI(), op, iusInvolved, null);
- // ProvisioningWizardDialog dialog = new ProvisioningWizardDialog(ProvUI.getDefaultParentShell(), wizard);
- // dialog.setBlockOnOpen(false);
- // dialog.open();
- // ProfileModificationJob longOp = null;
+ // public void testInstallWizard() throws Exception {
+ // ArrayList<IInstallableUnit> iusInvolved = new ArrayList<IInstallableUnit>();
+ // iusInvolved.add(toInstall);
+ // InstallOperation op = new MyNewInstallOperation(getSession(), iusInvolved);
+ // op.setProfileId(TESTPROFILE);
+ // PreselectedIUInstallWizard wizard = new
+ // PreselectedIUInstallWizard(getProvisioningUI(), op, iusInvolved, null);
+ // ProvisioningWizardDialog dialog = new
+ // ProvisioningWizardDialog(ProvUI.getDefaultParentShell(), wizard);
+ // dialog.setBlockOnOpen(false);
+ // dialog.open();
+ // ProfileModificationJob longOp = null;
//
- // try {
- // SelectableIUsPage page1 = (SelectableIUsPage) wizard.getPage(SELECTION_PAGE);
- // // should already have a plan
- // assertTrue("1.0", page1.isPageComplete());
- // // simulate the next button by getting next page and showing
- // InstallWizardPage page = (InstallWizardPage) page1.getNextPage();
+ // try {
+ // SelectableIUsPage page1 = (SelectableIUsPage) wizard.getPage(SELECTION_PAGE);
+ // // should already have a plan
+ // assertTrue("1.0", page1.isPageComplete());
+ // // simulate the next button by getting next page and showing
+ // InstallWizardPage page = (InstallWizardPage) page1.getNextPage();
//
- // // get the operation
- // Field opField = ResolutionResultsWizardPage.class.getDeclaredField("resolvedOperation");
- // opField.setAccessible(true);
- // assertTrue("Expected instance of MyNewInstallOperation", opField.get(page) instanceof MyNewInstallOperation);
- // } finally {
- // dialog.getShell().close();
- // if (longOp != null)
- // longOp.cancel();
- // }
- // }
+ // // get the operation
+ // Field opField =
+ // ResolutionResultsWizardPage.class.getDeclaredField("resolvedOperation");
+ // opField.setAccessible(true);
+ // assertTrue("Expected instance of MyNewInstallOperation", opField.get(page)
+ // instanceof MyNewInstallOperation);
+ // } finally {
+ // dialog.getShell().close();
+ // if (longOp != null)
+ // longOp.cancel();
+ // }
+ // }
//
- // public void testInstallWizardWithoutLicenceBypass() throws Exception {
- // ArrayList<IInstallableUnit> iusInvolved = new ArrayList<IInstallableUnit>();
- // iusInvolved.add(toInstall);
- // InstallOperation op = new MyNewInstallOperation(getSession(), iusInvolved);
- // op.setProfileId(TESTPROFILE);
- // PreselectedIUInstallWizard wizard = new PreselectedIUInstallWizard(getProvisioningUI(), op, iusInvolved, null);
- // wizard.setBypassLicencePage(false);
- // ProvisioningWizardDialog dialog = new ProvisioningWizardDialog(ProvUI.getDefaultParentShell(), wizard);
- // dialog.setBlockOnOpen(false);
- // dialog.open();
- // ProfileModificationJob longOp = null;
+ // public void testInstallWizardWithoutLicenceBypass() throws Exception {
+ // ArrayList<IInstallableUnit> iusInvolved = new ArrayList<IInstallableUnit>();
+ // iusInvolved.add(toInstall);
+ // InstallOperation op = new MyNewInstallOperation(getSession(), iusInvolved);
+ // op.setProfileId(TESTPROFILE);
+ // PreselectedIUInstallWizard wizard = new
+ // PreselectedIUInstallWizard(getProvisioningUI(), op, iusInvolved, null);
+ // wizard.setBypassLicencePage(false);
+ // ProvisioningWizardDialog dialog = new
+ // ProvisioningWizardDialog(ProvUI.getDefaultParentShell(), wizard);
+ // dialog.setBlockOnOpen(false);
+ // dialog.open();
+ // ProfileModificationJob longOp = null;
//
- // try {
- // SelectableIUsPage selectableIUsPage = (SelectableIUsPage) wizard.getPage(SELECTION_PAGE);
- // // should already have a plan
- // assertTrue("1.0", selectableIUsPage.isPageComplete());
- // // simulate the next button by getting next page and showing
- // InstallWizardPage installWizardPage = (InstallWizardPage) selectableIUsPage.getNextPage();
+ // try {
+ // SelectableIUsPage selectableIUsPage = (SelectableIUsPage)
+ // wizard.getPage(SELECTION_PAGE);
+ // // should already have a plan
+ // assertTrue("1.0", selectableIUsPage.isPageComplete());
+ // // simulate the next button by getting next page and showing
+ // InstallWizardPage installWizardPage = (InstallWizardPage)
+ // selectableIUsPage.getNextPage();
//
- // assertFalse("Licence page bypass flag must be false", wizard.isBypassLicencePage());
- // IWizardPage licensePage = installWizardPage.getNextPage();
- // assertTrue("Expected instance of AcceptLicensesWizardPage", licensePage instanceof AcceptLicensesWizardPage);
+ // assertFalse("Licence page bypass flag must be false",
+ // wizard.isBypassLicencePage());
+ // IWizardPage licensePage = installWizardPage.getNextPage();
+ // assertTrue("Expected instance of AcceptLicensesWizardPage", licensePage
+ // instanceof AcceptLicensesWizardPage);
//
- // } finally {
- // dialog.getShell().close();
- // if (longOp != null)
- // longOp.cancel();
- // }
- // }
+ // } finally {
+ // dialog.getShell().close();
+ // if (longOp != null)
+ // longOp.cancel();
+ // }
+ // }
//
- // public void testInstallWizardWithLicenceBypass() throws Exception {
- // ArrayList<IInstallableUnit> iusInvolved = new ArrayList<IInstallableUnit>();
- // iusInvolved.add(toInstall);
- // InstallOperation op = new MyNewInstallOperation(getSession(), iusInvolved);
- // op.setProfileId(TESTPROFILE);
- // PreselectedIUInstallWizard wizard = new PreselectedIUInstallWizard(getProvisioningUI(), op, iusInvolved, null);
- // wizard.setBypassLicencePage(true);
- // ProvisioningWizardDialog dialog = new ProvisioningWizardDialog(ProvUI.getDefaultParentShell(), wizard);
- // dialog.setBlockOnOpen(false);
- // dialog.open();
- // ProfileModificationJob longOp = null;
+ // public void testInstallWizardWithLicenceBypass() throws Exception {
+ // ArrayList<IInstallableUnit> iusInvolved = new ArrayList<IInstallableUnit>();
+ // iusInvolved.add(toInstall);
+ // InstallOperation op = new MyNewInstallOperation(getSession(), iusInvolved);
+ // op.setProfileId(TESTPROFILE);
+ // PreselectedIUInstallWizard wizard = new
+ // PreselectedIUInstallWizard(getProvisioningUI(), op, iusInvolved, null);
+ // wizard.setBypassLicencePage(true);
+ // ProvisioningWizardDialog dialog = new
+ // ProvisioningWizardDialog(ProvUI.getDefaultParentShell(), wizard);
+ // dialog.setBlockOnOpen(false);
+ // dialog.open();
+ // ProfileModificationJob longOp = null;
//
- // try {
- // SelectableIUsPage selectableIUsPage = (SelectableIUsPage) wizard.getPage(SELECTION_PAGE);
- // // should already have a plan
- // assertTrue("1.0", selectableIUsPage.isPageComplete());
- // // simulate the next button by getting next page and showing
- // InstallWizardPage installWizardPage = (InstallWizardPage) selectableIUsPage.getNextPage();
+ // try {
+ // SelectableIUsPage selectableIUsPage = (SelectableIUsPage)
+ // wizard.getPage(SELECTION_PAGE);
+ // // should already have a plan
+ // assertTrue("1.0", selectableIUsPage.isPageComplete());
+ // // simulate the next button by getting next page and showing
+ // InstallWizardPage installWizardPage = (InstallWizardPage)
+ // selectableIUsPage.getNextPage();
//
- // assertTrue("Licence page bypass flag must be true", wizard.isBypassLicencePage());
- // IWizardPage licensePage = installWizardPage.getNextPage();
- // assertNull("Expected instance of AcceptLicensesWizardPage must be null", licensePage);
+ // assertTrue("Licence page bypass flag must be true",
+ // wizard.isBypassLicencePage());
+ // IWizardPage licensePage = installWizardPage.getNextPage();
+ // assertNull("Expected instance of AcceptLicensesWizardPage must be null",
+ // licensePage);
//
- // } finally {
- // dialog.getShell().close();
- // if (longOp != null)
- // longOp.cancel();
- // }
- // }
+ // } finally {
+ // dialog.getShell().close();
+ // if (longOp != null)
+ // longOp.cancel();
+ // }
+ // }
//
- // private static class MyNewInstallOperation extends InstallOperation {
- // public MyNewInstallOperation(ProvisioningSession session, Collection<IInstallableUnit> toInstall) {
- // super(session, toInstall);
- // }
- // }
+ // private static class MyNewInstallOperation extends InstallOperation {
+ // public MyNewInstallOperation(ProvisioningSession session,
+ // Collection<IInstallableUnit> toInstall) {
+ // super(session, toInstall);
+ // }
+ // }
/**
* Tests the wizard
@@ -223,15 +244,17 @@ public class InstallWithRemediationTest extends WizardTest {
AvailableIUsPage page1 = (AvailableIUsPage) wizard.getPage(AVAILABLE_SOFTWARE_PAGE);
// test initial wizard state
- assertTrue("1.0", page1.getSelectedIUs().size() == 0);
+ assertTrue("1.0", page1.getSelectedIUs().isEmpty());
assertFalse("1.1", page1.isPageComplete());
// Start reaching in...
AvailableIUGroup group = page1.testGetAvailableIUGroup();
group.setRepositoryFilter(AvailableIUGroup.AVAILABLE_ALL, null);
- // Now manipulate the tree itself. we are reaching way in.
- // We are trying to select everything in the repo apart from the IU we know is broken
- DeferredQueryContentProvider provider = (DeferredQueryContentProvider) group.getCheckboxTreeViewer().getContentProvider();
+ // Now manipulate the tree itself. we are reaching way in.
+ // We are trying to select everything in the repo apart from the IU we know is
+ // broken
+ DeferredQueryContentProvider provider = (DeferredQueryContentProvider) group.getCheckboxTreeViewer()
+ .getContentProvider();
provider.setSynchronous(true);
group.getCheckboxTreeViewer().refresh();
group.getCheckboxTreeViewer().expandAll();
@@ -268,11 +291,12 @@ public class InstallWithRemediationTest extends WizardTest {
remediationPage = wizard.getNextPage(page1);
dialog.showPage(remediationPage);
- // // this doesn't test much, it's just calling group API to flesh out NPE's, etc.
- // group.getCheckedLeafIUs();
- // group.getDefaultFocusControl();
- // group.getSelectedIUElements();
- // group.getSelectedIUs();
+ // // this doesn't test much, it's just calling group API to flesh out NPE's,
+ // etc.
+ // group.getCheckedLeafIUs();
+ // group.getDefaultFocusControl();
+ // group.getSelectedIUElements();
+ // group.getSelectedIUs();
} finally {
dialog.close();
diff --git a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/InstallWizardTest.java b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/InstallWizardTest.java
index f1ca13870..125fdd7b4 100644
--- a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/InstallWizardTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/dialogs/InstallWizardTest.java
@@ -52,10 +52,11 @@ public class InstallWizardTest extends WizardTest {
iu.setProperty(InstallableUnitDescription.PROP_TYPE_GROUP, "true");
iu.setVersion(Version.createOSGi(1, 0, 0));
iu.setSingleton(true);
- iu.setLicenses(new ILicense[] {new License(null, "There is a license to accept!", null)});
- iu.setCapabilities(new IProvidedCapability[] {MetadataFactory.createProvidedCapability(IInstallableUnit.NAMESPACE_IU_ID, MAIN_IU, iu.getVersion())});
+ iu.setLicenses(new ILicense[] { new License(null, "There is a license to accept!", null) });
+ iu.setCapabilities(new IProvidedCapability[] {
+ MetadataFactory.createProvidedCapability(IInstallableUnit.NAMESPACE_IU_ID, MAIN_IU, iu.getVersion()) });
toInstall = MetadataFactory.createInstallableUnit(iu);
- createTestMetdataRepository(new IInstallableUnit[] {toInstall});
+ createTestMetdataRepository(new IInstallableUnit[] { toInstall });
}
public void testInstallWizardResolved() {
@@ -79,7 +80,8 @@ public class InstallWizardTest extends WizardTest {
// we should be ok
assertTrue("1.1", page.isPageComplete());
- // if another operation is scheduled for this profile, we should not be allowed to proceed
+ // if another operation is scheduled for this profile, we should not be allowed
+ // to proceed
longOp = getLongTestOperation();
getProvisioningUI().schedule(longOp, StatusManager.LOG);
// causes recalculation of plan and status
@@ -125,7 +127,8 @@ public class InstallWizardTest extends WizardTest {
// get the operation
Field opField = ResolutionResultsWizardPage.class.getDeclaredField("resolvedOperation");
opField.setAccessible(true);
- assertTrue("Expected instance of MyNewInstallOperation", opField.get(page) instanceof MyNewInstallOperation);
+ assertTrue("Expected instance of MyNewInstallOperation",
+ opField.get(page) instanceof MyNewInstallOperation);
} finally {
dialog.getShell().close();
if (longOp != null)
@@ -154,7 +157,8 @@ public class InstallWizardTest extends WizardTest {
assertFalse("License page bypass flag must be false", wizard.isBypassLicensePage());
IWizardPage licensePage = installWizardPage.getNextPage();
- assertTrue("Expected instance of AcceptLicensesWizardPage", licensePage instanceof AcceptLicensesWizardPage);
+ assertTrue("Expected instance of AcceptLicensesWizardPage",
+ licensePage instanceof AcceptLicensesWizardPage);
} finally {
dialog.getShell().close();
@@ -219,15 +223,17 @@ public class InstallWizardTest extends WizardTest {
AvailableIUsPage page1 = (AvailableIUsPage) wizard.getPage(AVAILABLE_SOFTWARE_PAGE);
// test initial wizard state
- assertTrue("1.0", page1.getSelectedIUs().size() == 0);
+ assertTrue("1.0", page1.getSelectedIUs().isEmpty());
assertFalse("1.1", page1.isPageComplete());
// Start reaching in...
AvailableIUGroup group = page1.testGetAvailableIUGroup();
group.setRepositoryFilter(AvailableIUGroup.AVAILABLE_ALL, null);
- // Now manipulate the tree itself. we are reaching way in.
- // We are trying to select everything in the repo apart from the IU we know is broken
- DeferredQueryContentProvider provider = (DeferredQueryContentProvider) group.getCheckboxTreeViewer().getContentProvider();
+ // Now manipulate the tree itself. we are reaching way in.
+ // We are trying to select everything in the repo apart from the IU we know is
+ // broken
+ DeferredQueryContentProvider provider = (DeferredQueryContentProvider) group.getCheckboxTreeViewer()
+ .getContentProvider();
provider.setSynchronous(true);
group.getCheckboxTreeViewer().refresh();
group.getCheckboxTreeViewer().expandAll();
@@ -252,7 +258,8 @@ public class InstallWizardTest extends WizardTest {
dialog.showPage(page);
assertTrue("3.0", page.isPageComplete());
- // if another operation is scheduled for this profile, we should not be allowed to proceed
+ // if another operation is scheduled for this profile, we should not be allowed
+ // to proceed
longOp = getLongTestOperation();
getProvisioningUI().schedule(longOp, StatusManager.LOG);
// causes recalculation of plan and status
diff --git a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/operations/InstallOperationTests.java b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/operations/InstallOperationTests.java
index fc71e623c..47676b6ee 100644
--- a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/operations/InstallOperationTests.java
+++ b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/operations/InstallOperationTests.java
@@ -36,17 +36,19 @@ import org.eclipse.equinox.p2.tests.ui.AbstractProvisioningUITest;
public class InstallOperationTests extends AbstractProvisioningUITest {
public void testInstallerPlan() throws ProvisionException {
URI uri = getTestData("InstallHandler", "testData/installPlan").toURI();
- Set<IInstallableUnit> ius = getMetadataRepositoryManager().loadRepository(uri, getMonitor()).query(QueryUtil.createIUQuery("A"), getMonitor()).toSet();
- assertTrue("One IU", ius.size() == 1);
+ Set<IInstallableUnit> ius = getMetadataRepositoryManager().loadRepository(uri, getMonitor())
+ .query(QueryUtil.createIUQuery("A"), getMonitor()).toSet();
+ assertEquals("One IU", 1, ius.size());
InstallOperation op = new InstallOperation(getSession(), ius);
op.setProfileId(TESTPROFILE);
ProvisioningContext pc = new ProvisioningContext(getAgent());
- pc.setArtifactRepositories(new URI[] {uri});
- pc.setMetadataRepositories(new URI[] {uri});
+ pc.setArtifactRepositories(new URI[] { uri });
+ pc.setMetadataRepositories(new URI[] { uri });
op.setProvisioningContext(pc);
assertTrue("Should resolve", op.resolveModal(getMonitor()).isOK());
assertTrue("Should install", op.getProvisioningJob(null).runModal(getMonitor()).isOK());
- assertFalse("Action1 should have been installed", getProfile(TESTPROFILE).query(QueryUtil.createIUQuery("Action1"), getMonitor()).isEmpty());
+ assertFalse("Action1 should have been installed",
+ getProfile(TESTPROFILE).query(QueryUtil.createIUQuery("Action1"), getMonitor()).isEmpty());
}
public void testDetectMissingRequirement() throws ProvisionException, OperationCanceledException {
@@ -59,35 +61,43 @@ public class InstallOperationTests extends AbstractProvisioningUITest {
repoA = getMetadataRepositoryManager().loadRepository(uriA, getMonitor());
// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=305565
- repoA.addReferences(Collections.singletonList(new RepositoryReference(uriA, null, IRepository.TYPE_ARTIFACT, IRepository.ENABLED)));
+ repoA.addReferences(Collections
+ .singletonList(new RepositoryReference(uriA, null, IRepository.TYPE_ARTIFACT, IRepository.ENABLED)));
// now create a second set of repos and refer from the first
repoB = getMetadataRepositoryManager().loadRepository(uriB, getMonitor());
- repoB.addReferences(Collections.singletonList(new RepositoryReference(uriB, null, IRepository.TYPE_ARTIFACT, IRepository.ENABLED)));
- repoA.addReferences(Collections.singletonList(new RepositoryReference(repoB.getLocation(), null, IRepository.TYPE_METADATA, IRepository.ENABLED)));
+ repoB.addReferences(Collections
+ .singletonList(new RepositoryReference(uriB, null, IRepository.TYPE_ARTIFACT, IRepository.ENABLED)));
+ repoA.addReferences(Collections.singletonList(
+ new RepositoryReference(repoB.getLocation(), null, IRepository.TYPE_METADATA, IRepository.ENABLED)));
// this repo is referred by the previous one
repoC = getMetadataRepositoryManager().loadRepository(uriC, getMonitor());
- repoC.addReferences(Collections.singletonList(new RepositoryReference(uriC, null, IRepository.TYPE_ARTIFACT, IRepository.ENABLED)));
- repoB.addReferences(Collections.singletonList(new RepositoryReference(repoC.getLocation(), null, IRepository.TYPE_METADATA, IRepository.ENABLED)));
+ repoC.addReferences(Collections
+ .singletonList(new RepositoryReference(uriC, null, IRepository.TYPE_ARTIFACT, IRepository.ENABLED)));
+ repoB.addReferences(Collections.singletonList(
+ new RepositoryReference(repoC.getLocation(), null, IRepository.TYPE_METADATA, IRepository.ENABLED)));
String id = "TestProfileIDForMissingRequirement";
createProfile(id);
ProvisioningContext context = new ProvisioningContext(getAgent());
- context.setMetadataRepositories(new URI[] {repoA.getLocation()});
+ context.setMetadataRepositories(new URI[] { repoA.getLocation() });
context.setArtifactRepositories(new URI[0]);
- IInstallableUnit[] units = repoA.query(QueryUtil.createIUQuery("A"), getMonitor()).toArray(IInstallableUnit.class);
+ IInstallableUnit[] units = repoA.query(QueryUtil.createIUQuery("A"), getMonitor())
+ .toArray(IInstallableUnit.class);
assertTrue("should find A in main repo", units.length > 0);
// NOW WE CAN TEST!
- assertNull("ProvisioningContext does not follow by default", context.getProperty(ProvisioningContext.FOLLOW_REPOSITORY_REFERENCES));
+ assertNull("ProvisioningContext does not follow by default",
+ context.getProperty(ProvisioningContext.FOLLOW_REPOSITORY_REFERENCES));
InstallOperation op = new InstallOperation(getSession(), Collections.singleton(units[0]));
op.setProvisioningContext(context);
op.setProfileId(id);
assertTrue("Should resolve", op.resolveModal(getMonitor()).isOK());
- assertNotNull("Context was reset to follow", context.getProperty(ProvisioningContext.FOLLOW_REPOSITORY_REFERENCES));
+ assertNotNull("Context was reset to follow",
+ context.getProperty(ProvisioningContext.FOLLOW_REPOSITORY_REFERENCES));
getArtifactRepositoryManager().removeRepository(uriA);
getArtifactRepositoryManager().removeRepository(uriB);
@@ -99,7 +109,7 @@ public class InstallOperationTests extends AbstractProvisioningUITest {
}
public void testUpdateWithNamespaceChange() {
- //Create the IU that will be detected as an update
+ // Create the IU that will be detected as an update
InstallableUnitDescription iud = new MetadataFactory.InstallableUnitDescription();
iud.setId("NewB");
iud.setVersion(Version.create("1.0.0"));
@@ -110,14 +120,15 @@ public class InstallOperationTests extends AbstractProvisioningUITest {
Collection<IMatchExpression<IInstallableUnit>> updateExpression = new ArrayList<>();
updateExpression.add(matchExpression);
- iud.setUpdateDescriptor(MetadataFactory.createUpdateDescriptor(updateExpression, IUpdateDescriptor.HIGH, (String) null, (URI) null));
+ iud.setUpdateDescriptor(MetadataFactory.createUpdateDescriptor(updateExpression, IUpdateDescriptor.HIGH,
+ (String) null, (URI) null));
IInstallableUnit newIUB = MetadataFactory.createInstallableUnit(iud);
- //create the IU being updated
+ // create the IU being updated
IInstallableUnit installed = createIU("B");
- //Setup the profile
- installAsRoots(profile, new IInstallableUnit[] {installed}, true, createPlanner(), createEngine());
+ // Setup the profile
+ installAsRoots(profile, new IInstallableUnit[] { installed }, true, createPlanner(), createEngine());
List<IInstallableUnit> ius = new ArrayList<>();
ius.add(newIUB);
@@ -126,6 +137,7 @@ public class InstallOperationTests extends AbstractProvisioningUITest {
IStatus resolutionStatus = op.resolveModal(getMonitor());
assertEquals(IStatusCodes.PROFILE_CHANGE_ALTERED, ((MultiStatus) resolutionStatus).getChildren()[0].getCode());
- assertEquals(IStatusCodes.ALTERED_IMPLIED_UPDATE, ((MultiStatus) (((MultiStatus) resolutionStatus).getChildren()[0])).getChildren()[0].getCode());
+ assertEquals(IStatusCodes.ALTERED_IMPLIED_UPDATE,
+ ((MultiStatus) (((MultiStatus) resolutionStatus).getChildren()[0])).getChildren()[0].getCode());
}
}
diff --git a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/operations/UpdateOperationTests.java b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/operations/UpdateOperationTests.java
index cb0c9aa5c..0b84b4e63 100644
--- a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/operations/UpdateOperationTests.java
+++ b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/operations/UpdateOperationTests.java
@@ -33,43 +33,73 @@ public class UpdateOperationTests extends AbstractProvisioningUITest {
protected void setUp() throws Exception {
super.setUp();
a1 = createIU("A", Version.create("1.0.0"));
- IUpdateDescriptor update = MetadataFactory.createUpdateDescriptor("A", new VersionRange("[1.0.0, 1.0.0]"), 0, "update description");
- a120WithDifferentId = createIU("UpdateA", Version.createOSGi(1, 2, 0), null, NO_REQUIRES, NO_PROVIDES, NO_PROPERTIES, null, NO_TP_DATA, false, update, NO_REQUIRES);
- a130 = createIU("A", Version.createOSGi(1, 3, 0), null, NO_REQUIRES, NO_PROVIDES, NO_PROPERTIES, null, NO_TP_DATA, false, update, NO_REQUIRES);
- a140WithDifferentId = createIU("UpdateForA", Version.createOSGi(1, 4, 0), null, NO_REQUIRES, NO_PROVIDES, NO_PROPERTIES, null, NO_TP_DATA, false, update, NO_REQUIRES);
- IRequirementChange change = MetadataFactory.createRequirementChange(MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "B", VersionRange.emptyRange, null, false, false, false), MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "B", new VersionRange("[1.1.0, 1.3.0)"), null, false, false, true));
- IRequirement lifeCycle = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "A", new VersionRange("[1.0.0, 1.0.0]"), null, false, false);
- firstPatchForA1 = createIUPatch("P", Version.create("1.0.0"), true, new IRequirementChange[] {change}, new IRequirement[][] {{MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "A", VersionRange.emptyRange, null, false, false)}}, lifeCycle);
- secondPatchForA1 = createIUPatch("P", Version.create("2.0.0"), true, new IRequirementChange[] {change}, new IRequirement[][] {{MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "A", VersionRange.emptyRange, null, false, false)}}, lifeCycle);
- thirdPatchForA1 = createIUPatch("P2", Version.create("1.0.0"), true, new IRequirementChange[] {change}, new IRequirement[][] {{MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "A", VersionRange.emptyRange, null, false, false)}}, lifeCycle);
+ IUpdateDescriptor update = MetadataFactory.createUpdateDescriptor("A", new VersionRange("[1.0.0, 1.0.0]"), 0,
+ "update description");
+ a120WithDifferentId = createIU("UpdateA", Version.createOSGi(1, 2, 0), null, NO_REQUIRES, NO_PROVIDES,
+ NO_PROPERTIES, null, NO_TP_DATA, false, update, NO_REQUIRES);
+ a130 = createIU("A", Version.createOSGi(1, 3, 0), null, NO_REQUIRES, NO_PROVIDES, NO_PROPERTIES, null,
+ NO_TP_DATA, false, update, NO_REQUIRES);
+ a140WithDifferentId = createIU("UpdateForA", Version.createOSGi(1, 4, 0), null, NO_REQUIRES, NO_PROVIDES,
+ NO_PROPERTIES, null, NO_TP_DATA, false, update, NO_REQUIRES);
+ IRequirementChange change = MetadataFactory.createRequirementChange(
+ MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "B", VersionRange.emptyRange, null,
+ false, false, false),
+ MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "B",
+ new VersionRange("[1.1.0, 1.3.0)"), null, false, false, true));
+ IRequirement lifeCycle = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "A",
+ new VersionRange("[1.0.0, 1.0.0]"), null, false, false);
+ firstPatchForA1 = createIUPatch("P", Version.create("1.0.0"), true, new IRequirementChange[] { change },
+ new IRequirement[][] { { MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "A",
+ VersionRange.emptyRange, null, false, false) } },
+ lifeCycle);
+ secondPatchForA1 = createIUPatch("P", Version.create("2.0.0"), true, new IRequirementChange[] { change },
+ new IRequirement[][] { { MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "A",
+ VersionRange.emptyRange, null, false, false) } },
+ lifeCycle);
+ thirdPatchForA1 = createIUPatch("P2", Version.create("1.0.0"), true, new IRequirementChange[] { change },
+ new IRequirement[][] { { MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "A",
+ VersionRange.emptyRange, null, false, false) } },
+ lifeCycle);
- IRequirementChange change2 = MetadataFactory.createRequirementChange(MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "B", VersionRange.emptyRange, null, false, false, false), MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "B", new VersionRange("[1.1.0, 1.3.0)"), null, false, false, true));
- IRequirement lifeCycle2 = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "A", new VersionRange("[2.0.0, 3.2.0]"), null, false, false);
- patchFora2 = createIUPatch("P", Version.create("1.0.0"), true, new IRequirementChange[] {change2}, new IRequirement[][] {{MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "A", VersionRange.emptyRange, null, false, false)}}, lifeCycle2);
+ IRequirementChange change2 = MetadataFactory.createRequirementChange(
+ MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "B", VersionRange.emptyRange, null,
+ false, false, false),
+ MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "B",
+ new VersionRange("[1.1.0, 1.3.0)"), null, false, false, true));
+ IRequirement lifeCycle2 = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "A",
+ new VersionRange("[2.0.0, 3.2.0]"), null, false, false);
+ patchFora2 = createIUPatch("P", Version.create("1.0.0"), true, new IRequirementChange[] { change2 },
+ new IRequirement[][] { { MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "A",
+ VersionRange.emptyRange, null, false, false) } },
+ lifeCycle2);
b1 = createIU("B", Version.create("1.0.0"));
- update = MetadataFactory.createUpdateDescriptor("B", new VersionRange("[1.0.0, 1.0.0]"), 0, "update description");
- b12 = createIU("B", Version.createOSGi(1, 2, 0), null, NO_REQUIRES, NO_PROVIDES, NO_PROPERTIES, null, NO_TP_DATA, false, update, NO_REQUIRES);
+ update = MetadataFactory.createUpdateDescriptor("B", new VersionRange("[1.0.0, 1.0.0]"), 0,
+ "update description");
+ b12 = createIU("B", Version.createOSGi(1, 2, 0), null, NO_REQUIRES, NO_PROVIDES, NO_PROPERTIES, null,
+ NO_TP_DATA, false, update, NO_REQUIRES);
// Ensure that all versions, not just the latest, are considered by the UI
getPolicy().setShowLatestVersionsOnly(false);
}
public void testChooseUpdateOverPatch() {
- createTestMetdataRepository(new IInstallableUnit[] {a1, a120WithDifferentId, a130, firstPatchForA1, patchFora2});
+ createTestMetdataRepository(
+ new IInstallableUnit[] { a1, a120WithDifferentId, a130, firstPatchForA1, patchFora2 });
install(a1, true, false);
ArrayList<IInstallableUnit> iusInvolved = new ArrayList<>();
iusInvolved.add(a1);
UpdateOperation op = getProvisioningUI().getUpdateOperation(iusInvolved, null);
op.resolveModal(getMonitor());
IProfileChangeRequest request = op.getProfileChangeRequest();
- assertTrue("1.0", request.getAdditions().size() == 1);
- assertTrue("1.1", request.getAdditions().iterator().next().equals(a130));
- assertTrue("1.2", request.getRemovals().size() == 1);
- assertTrue("1.3", request.getRemovals().iterator().next().equals(a1));
+ assertEquals("1.0", 1, request.getAdditions().size());
+ assertEquals("1.1", a130, request.getAdditions().iterator().next());
+ assertEquals("1.2", 1, request.getRemovals().size());
+ assertEquals("1.3", a1, request.getRemovals().iterator().next());
}
public void testForcePatchOverUpdate() {
- createTestMetdataRepository(new IInstallableUnit[] {a1, a120WithDifferentId, a130, firstPatchForA1, patchFora2});
+ createTestMetdataRepository(
+ new IInstallableUnit[] { a1, a120WithDifferentId, a130, firstPatchForA1, patchFora2 });
install(a1, true, false);
ArrayList<IInstallableUnit> iusInvolved = new ArrayList<>();
iusInvolved.add(a1);
@@ -84,16 +114,17 @@ public class UpdateOperationTests extends AbstractProvisioningUITest {
}
}
assertNotNull(".99", firstPatch);
- op.setSelectedUpdates(new Update[] {firstPatch});
+ op.setSelectedUpdates(new Update[] { firstPatch });
op.resolveModal(getMonitor());
IProfileChangeRequest request = op.getProfileChangeRequest();
- assertTrue("1.0", request.getAdditions().size() == 1);
- assertTrue("1.1", request.getAdditions().iterator().next().equals(firstPatchForA1));
- assertTrue("1.2", request.getRemovals().size() == 0);
+ assertEquals("1.0", 1, request.getAdditions().size());
+ assertEquals("1.1", firstPatchForA1, request.getAdditions().iterator().next());
+ assertTrue("1.2", request.getRemovals().isEmpty());
}
public void testRecognizePatchIsInstalled() {
- createTestMetdataRepository(new IInstallableUnit[] {a1, a120WithDifferentId, a130, firstPatchForA1, patchFora2});
+ createTestMetdataRepository(
+ new IInstallableUnit[] { a1, a120WithDifferentId, a130, firstPatchForA1, patchFora2 });
install(a1, true, false);
install(firstPatchForA1, true, false);
ArrayList<IInstallableUnit> iusInvolved = new ArrayList<>();
@@ -102,15 +133,17 @@ public class UpdateOperationTests extends AbstractProvisioningUITest {
op.resolveModal(getMonitor());
IProfileChangeRequest request = op.getProfileChangeRequest();
// update was favored, that would happen even if patch was not installed
- assertTrue("1.0", request.getAdditions().size() == 1);
- assertTrue("1.1", request.getAdditions().iterator().next().equals(a130));
- // the patch is not being shown to the user because we figured out it was already installed
+ assertEquals("1.0", 1, request.getAdditions().size());
+ assertEquals("1.1", a130, request.getAdditions().iterator().next());
+ // the patch is not being shown to the user because we figured out it was
+ // already installed
// The elements showing are a130 and a120WithDifferentId
assertEquals("1.2", 2, op.getPossibleUpdates().length);
}
public void testChooseNotTheNewest() {
- createTestMetdataRepository(new IInstallableUnit[] {a1, a120WithDifferentId, a130, firstPatchForA1, patchFora2});
+ createTestMetdataRepository(
+ new IInstallableUnit[] { a1, a120WithDifferentId, a130, firstPatchForA1, patchFora2 });
install(a1, true, false);
ArrayList<IInstallableUnit> iusInvolved = new ArrayList<>();
iusInvolved.add(a1);
@@ -125,18 +158,18 @@ public class UpdateOperationTests extends AbstractProvisioningUITest {
}
}
assertNotNull(".99", notNewest);
- op.setSelectedUpdates(new Update[] {notNewest});
+ op.setSelectedUpdates(new Update[] { notNewest });
op.resolveModal(getMonitor());
IProfileChangeRequest request = op.getProfileChangeRequest();
// selected was favored
- assertTrue("1.0", request.getAdditions().size() == 1);
- assertTrue("1.1", request.getAdditions().iterator().next().equals(a120WithDifferentId));
+ assertEquals("1.0", 1, request.getAdditions().size());
+ assertEquals("1.1", a120WithDifferentId, request.getAdditions().iterator().next());
// The two updates and the patch were recognized
assertEquals("1.2", 3, op.getPossibleUpdates().length);
}
public void testChooseLatestPatches() {
- createTestMetdataRepository(new IInstallableUnit[] {a1, firstPatchForA1, secondPatchForA1, thirdPatchForA1});
+ createTestMetdataRepository(new IInstallableUnit[] { a1, firstPatchForA1, secondPatchForA1, thirdPatchForA1 });
install(a1, true, false);
ArrayList<IInstallableUnit> iusInvolved = new ArrayList<>();
iusInvolved.add(a1);
@@ -145,7 +178,7 @@ public class UpdateOperationTests extends AbstractProvisioningUITest {
IProfileChangeRequest request = op.getProfileChangeRequest();
// the latest two patches were selected
HashSet<IInstallableUnit> chosen = new HashSet<>();
- assertTrue("1.0", request.getAdditions().size() == 2);
+ assertEquals("1.0", 2, request.getAdditions().size());
chosen.addAll(request.getAdditions());
assertTrue("1.1", chosen.contains(secondPatchForA1));
assertTrue("1.2", chosen.contains(thirdPatchForA1));
@@ -154,7 +187,8 @@ public class UpdateOperationTests extends AbstractProvisioningUITest {
}
public void testLatestHasDifferentId() {
- createTestMetdataRepository(new IInstallableUnit[] {a1, firstPatchForA1, secondPatchForA1, thirdPatchForA1, a120WithDifferentId, a130, a140WithDifferentId});
+ createTestMetdataRepository(new IInstallableUnit[] { a1, firstPatchForA1, secondPatchForA1, thirdPatchForA1,
+ a120WithDifferentId, a130, a140WithDifferentId });
install(a1, true, false);
ArrayList<IInstallableUnit> iusInvolved = new ArrayList<>();
iusInvolved.add(a1);
@@ -162,15 +196,15 @@ public class UpdateOperationTests extends AbstractProvisioningUITest {
op.resolveModal(getMonitor());
IProfileChangeRequest request = op.getProfileChangeRequest();
// update 140 was recognized as the latest even though it had a different id
- assertTrue("1.0", request.getAdditions().size() == 1);
- assertTrue("1.1", request.getAdditions().iterator().next().equals(a140WithDifferentId));
+ assertEquals("1.0", 1, request.getAdditions().size());
+ assertEquals("1.1", a140WithDifferentId, request.getAdditions().iterator().next());
// All three patches and all three updates can be chosen
assertEquals("1.2", 6, op.getPossibleUpdates().length);
}
// bug 300445
public void testRemoveSelectionAfterResolve() {
- createTestMetdataRepository(new IInstallableUnit[] {a1, a130, b1, b12});
+ createTestMetdataRepository(new IInstallableUnit[] { a1, a130, b1, b12 });
install(a1, true, false);
ArrayList<IInstallableUnit> iusInvolved = new ArrayList<>();
iusInvolved.add(a1);
@@ -180,14 +214,14 @@ public class UpdateOperationTests extends AbstractProvisioningUITest {
Update[] updates = op.getSelectedUpdates();
assertEquals("1.0", 2, updates.length);
// choose just one
- op.setSelectedUpdates(new Update[] {updates[0]});
+ op.setSelectedUpdates(new Update[] { updates[0] });
op.resolveModal(getMonitor());
assertEquals("1.1", 1, op.getSelectedUpdates().length);
}
// bug 290858
public void testSearchForUpdatesInJob() {
- createTestMetdataRepository(new IInstallableUnit[] {a1, a130, b1, b12});
+ createTestMetdataRepository(new IInstallableUnit[] { a1, a130, b1, b12 });
install(a1, true, false);
ArrayList<IInstallableUnit> iusInvolved = new ArrayList<>();
iusInvolved.add(a1);
diff --git a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/query/QueryProviderTests.java b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/query/QueryProviderTests.java
index 6214b5448..9d279de2c 100644
--- a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/query/QueryProviderTests.java
+++ b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/query/QueryProviderTests.java
@@ -40,12 +40,16 @@ public class QueryProviderTests extends AbstractProvisioningUITest {
categoryProperties.put("org.eclipse.equinox.p2.type.category", "true");
HashMap<String, String> groupProperties = new HashMap<>();
groupProperties.put("org.eclipse.equinox.p2.type.group", "true");
- category = createIU(CAT, Version.create("1.0.0"), createRequiredCapabilities(IInstallableUnit.NAMESPACE_IU_ID, NESTED), categoryProperties, true);
- nestedCategory = createIU(NESTED, Version.create("1.0.0"), createRequiredCapabilities(IInstallableUnit.NAMESPACE_IU_ID, A), categoryProperties, true);
- a = createIU(A, Version.create("1.0.0"), createRequiredCapabilities(IInstallableUnit.NAMESPACE_IU_ID, B), groupProperties, true);
- b = createIU(B, Version.create("1.0.0"), createRequiredCapabilities(IInstallableUnit.NAMESPACE_IU_ID, C), groupProperties, true);
+ category = createIU(CAT, Version.create("1.0.0"),
+ createRequiredCapabilities(IInstallableUnit.NAMESPACE_IU_ID, NESTED), categoryProperties, true);
+ nestedCategory = createIU(NESTED, Version.create("1.0.0"),
+ createRequiredCapabilities(IInstallableUnit.NAMESPACE_IU_ID, A), categoryProperties, true);
+ a = createIU(A, Version.create("1.0.0"), createRequiredCapabilities(IInstallableUnit.NAMESPACE_IU_ID, B),
+ groupProperties, true);
+ b = createIU(B, Version.create("1.0.0"), createRequiredCapabilities(IInstallableUnit.NAMESPACE_IU_ID, C),
+ groupProperties, true);
c = createIU(C, Version.create("1.0.0"), NO_REQUIRES, NO_PROPERTIES, true);
- testRepo = createTestMetdataRepository(new IInstallableUnit[] {category, nestedCategory, a, b, c});
+ testRepo = createTestMetdataRepository(new IInstallableUnit[] { category, nestedCategory, a, b, c });
}
public void testNestedCategories() {
@@ -69,8 +73,9 @@ public class QueryProviderTests extends AbstractProvisioningUITest {
public void testInstallDrilldown() {
IUElementListRoot root = new IUElementListRoot();
- AvailableIUElement element = new AvailableIUElement(root, a, TESTPROFILE, getPolicy().getShowDrilldownRequirements());
- root.setChildren(new Object[] {element});
+ AvailableIUElement element = new AvailableIUElement(root, a, TESTPROFILE,
+ getPolicy().getShowDrilldownRequirements());
+ root.setChildren(new Object[] { element });
ArrayList<IInstallableUnit> iusInvolved = new ArrayList<>();
iusInvolved.add(a);
InstallOperation op = new InstallOperation(getSession(), iusInvolved);
@@ -79,7 +84,7 @@ public class QueryProviderTests extends AbstractProvisioningUITest {
IQueryable<IInstallableUnit> queryable = op.getProvisioningPlan().getAdditions();
element.setQueryable(queryable);
Object[] children = element.getChildren(element);
- assertTrue("1.1", children.length == 1);
+ assertEquals("1.1", 1, children.length);
}
}
diff --git a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/query/QueryableArtifactRepositoryManagerTest.java b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/query/QueryableArtifactRepositoryManagerTest.java
index 181b9bbab..6630186f2 100644
--- a/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/query/QueryableArtifactRepositoryManagerTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests.ui/src/org/eclipse/equinox/p2/tests/ui/query/QueryableArtifactRepositoryManagerTest.java
@@ -50,7 +50,7 @@ public class QueryableArtifactRepositoryManagerTest extends AbstractQueryTest {
QueryableArtifactRepositoryManager manager = getQueryableManager();
IQueryResult<URI> result = manager.locationsQueriable().query(new RepositoryLocationQuery(), getMonitor());
- assertTrue(queryResultSize(result) == repoCount);
+ assertEquals(repoCount, queryResultSize(result));
}
private QueryableArtifactRepositoryManager getQueryableManager() {
diff --git a/bundles/org.eclipse.equinox.p2.tests.verifier/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.tests.verifier/META-INF/MANIFEST.MF
index d3fc4adee..adaef97d8 100644
--- a/bundles/org.eclipse.equinox.p2.tests.verifier/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.tests.verifier/META-INF/MANIFEST.MF
@@ -1,8 +1,8 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
-Bundle-Name: Test Install Verifier
+Bundle-Name: %Bundle-Name
Bundle-SymbolicName: org.eclipse.equinox.p2.tests.verifier;singleton:=true
-Bundle-Version: 1.3.0.qualifier
+Bundle-Version: 1.3.100.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.tests.verifier.Activator
Export-Package: org.eclipse.equinox.internal.p2.tests.verifier;x-internal:=true
Require-Bundle: org.eclipse.core.runtime,
@@ -22,3 +22,4 @@ Bundle-ActivationPolicy: lazy
Bundle-ClassPath: bin/,
.
Automatic-Module-Name: org.eclipse.equinox.p2.tests.verifier
+Bundle-Vendor: %Bundle-Vendor
diff --git a/bundles/org.eclipse.equinox.p2.tests.verifier/OSGI-INF/l10n/bundle.properties b/bundles/org.eclipse.equinox.p2.tests.verifier/OSGI-INF/l10n/bundle.properties
new file mode 100644
index 000000000..0cebbef04
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests.verifier/OSGI-INF/l10n/bundle.properties
@@ -0,0 +1,3 @@
+#Properties file for org.eclipse.equinox.p2.tests.verifier
+Bundle-Vendor = Eclipse.org - Equinox
+Bundle-Name = Test Install Verifier \ No newline at end of file
diff --git a/bundles/org.eclipse.equinox.p2.tests.verifier/build.properties b/bundles/org.eclipse.equinox.p2.tests.verifier/build.properties
index d0960de35..d0ec30270 100644
--- a/bundles/org.eclipse.equinox.p2.tests.verifier/build.properties
+++ b/bundles/org.eclipse.equinox.p2.tests.verifier/build.properties
@@ -16,5 +16,6 @@ output.. = bin/
bin.includes = META-INF/,\
.,\
plugin.xml,\
- about.html
-javacWarnings..=-raw,-unchecked,-varargsCast
+ about.html,\
+ OSGI-INF/l10n/bundle.properties,\
+ OSGI-INF/
diff --git a/bundles/org.eclipse.equinox.p2.tests.verifier/pom.xml b/bundles/org.eclipse.equinox.p2.tests.verifier/pom.xml
index 8e15b1e96..08bb6782c 100644
--- a/bundles/org.eclipse.equinox.p2.tests.verifier/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.tests.verifier/pom.xml
@@ -4,11 +4,11 @@
<parent>
<artifactId>org.eclipse.equinox.p2.tests-parent</artifactId>
<groupId>org.eclipse</groupId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../../org.eclipse.equinox.p2.releng/org.eclipse.equinox.p2.tests-parent</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.tests.verifier</artifactId>
- <version>1.3.0-SNAPSHOT</version>
+ <version>1.3.100-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
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 23858dea1..73c3d22e7 100644
--- a/bundles/org.eclipse.equinox.p2.tests/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.tests/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.tests;singleton:=true
-Bundle-Version: 1.8.0.qualifier
+Bundle-Version: 1.8.700.qualifier
Bundle-ClassPath: .
Bundle-Activator: org.eclipse.equinox.p2.tests.TestActivator
Bundle-Vendor: %providerName
@@ -26,7 +26,6 @@ Require-Bundle: org.eclipse.equinox.frameworkadmin,
org.eclipse.core.tests.harness;bundle-version="3.4.0",
org.eclipse.core.runtime;bundle-version="3.4.0",
org.eclipse.equinox.p2.publisher;bundle-version="1.0.0",
- org.easymock;bundle-version="2.4.0",
org.eclipse.equinox.frameworkadmin.test;bundle-version="1.0.0",
org.junit;bundle-version="4.8.0",
org.hamcrest.core;bundle-version="1.3.0",
@@ -46,7 +45,7 @@ Require-Bundle: org.eclipse.equinox.frameworkadmin,
org.eclipse.ecf.filetransfer;bundle-version="4.0.0",
org.eclipse.ecf.identity;bundle-version="3.1.0",
org.eclipse.ecf.provider.filetransfer;bundle-version="3.1.0",
- org.eclipse.ecf.provider.filetransfer.httpclient45,
+ org.eclipse.ecf.provider.filetransfer.httpclient5,
org.eclipse.equinox.p2.reconciler.dropins;bundle-version="1.1.0",
org.eclipse.ant.core;bundle-version="3.2.200",
org.apache.ant;bundle-version="1.7.1",
@@ -54,7 +53,10 @@ Require-Bundle: org.eclipse.equinox.frameworkadmin,
org.eclipse.equinox.p2.publisher.eclipse;bundle-version="1.0.0",
org.eclipse.equinox.p2.operations;bundle-version="2.1.0",
org.eclipse.equinox.p2.ui.sdk.scheduler,
- org.eclipse.equinox.p2.artifact.repository;bundle-version="[1.3.0,2.0.0)"
+ org.eclipse.equinox.p2.artifact.repository;bundle-version="[1.3.0,2.0.0)",
+ org.hamcrest.library;bundle-version="1.3.0",
+ org.mockito.mockito-core,
+ net.bytebuddy.byte-buddy
Eclipse-RegisterBuddy: org.eclipse.equinox.p2.artifact.repository
Bundle-RequiredExecutionEnvironment: JavaSE-11
Eclipse-BundleShape: dir
diff --git a/bundles/org.eclipse.equinox.p2.tests/build.properties b/bundles/org.eclipse.equinox.p2.tests/build.properties
index 2eaa95987..0ed56864b 100644
--- a/bundles/org.eclipse.equinox.p2.tests/build.properties
+++ b/bundles/org.eclipse.equinox.p2.tests/build.properties
@@ -22,4 +22,3 @@ bin.includes = META-INF/,\
test.xml
customCallBack=foo.xml
src.includes = about.html
-javacWarnings..=-raw,-unchecked,-varargsCast
diff --git a/bundles/org.eclipse.equinox.p2.tests/plugin.xml b/bundles/org.eclipse.equinox.p2.tests/plugin.xml
index 841b529ea..857699598 100644
--- a/bundles/org.eclipse.equinox.p2.tests/plugin.xml
+++ b/bundles/org.eclipse.equinox.p2.tests/plugin.xml
@@ -153,4 +153,10 @@
suffix="@testArtifactRepositoryRegistry">
</filter>
</extension>
+ <extension
+ point="org.eclipse.equinox.p2.engine.pgp">
+ <trustedKeys
+ path="testData/pgp/signer2-publickey.asc">
+ </trustedKeys>
+ </extension>
</plugin>
diff --git a/bundles/org.eclipse.equinox.p2.tests/pom.xml b/bundles/org.eclipse.equinox.p2.tests/pom.xml
index 5f120716c..894085114 100644
--- a/bundles/org.eclipse.equinox.p2.tests/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.tests/pom.xml
@@ -10,13 +10,13 @@
<parent>
<groupId>org.eclipse</groupId>
<artifactId>org.eclipse.equinox.p2.tests-parent</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../../org.eclipse.equinox.p2.releng/org.eclipse.equinox.p2.tests-parent</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.tests</artifactId>
- <version>1.8.0-SNAPSHOT</version>
+ <version>1.8.700-SNAPSHOT</version>
<packaging>eclipse-test-plugin</packaging>
<properties>
@@ -44,6 +44,19 @@
</dependencies>
</configuration>
</plugin>
+ <plugin>
+ <groupId>org.eclipse.tycho.extras</groupId>
+ <artifactId>tycho-p2-extras-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>compare-attached-artifacts-with-release</id>
+ <configuration>
+ <!-- this bundle has intentionally corrupt zips inside that make content comparison fail, so let's skip it -->
+ <skip>true</skip>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
</plugins>
</build>
<profiles>
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/AbstractProvisioningTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/AbstractProvisioningTest.java
index dcc84bbfb..ab74b9572 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/AbstractProvisioningTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/AbstractProvisioningTest.java
@@ -739,7 +739,7 @@ public abstract class AbstractProvisioningTest extends TestCase {
}
}
- public static void writeBuffer(File outputFile, StringBuffer buffer) throws IOException {
+ public static void writeBuffer(File outputFile, StringBuilder buffer) throws IOException {
outputFile.getParentFile().mkdirs();
try (FileOutputStream stream = new FileOutputStream(outputFile)) {
stream.write(buffer.toString().getBytes());
@@ -1367,7 +1367,7 @@ public abstract class AbstractProvisioningTest extends TestCase {
IInstallableUnit sourceIU = it.next();
IQueryResult destinationCollector = destination.query(QueryUtil.createIUQuery(sourceIU), null);
assertEquals(message, 1, queryResultSize(destinationCollector));
- assertTrue(message, sourceIU.equals(destinationCollector.iterator().next()));
+ assertEquals(message, sourceIU, destinationCollector.iterator().next());
}
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/TestData.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/TestData.java
index c17384334..d2a8bc870 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/TestData.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/TestData.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2018 compeople AG and others.
+ * Copyright (c) 2007, 2021 compeople AG and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -22,7 +22,6 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
@@ -136,30 +135,31 @@ public class TestData {
* @throws IOException
*/
public static void assertEquals(ZipInputStream expected, ZipInputStream actual) throws IOException {
- Map<String, Object[]> jar1 = getEntries(expected);
- Map<String, Object[]> jar2 = getEntries(actual);
- for (String name : jar1.keySet()) {
- Object[] file1 = jar1.get(name);
- Object[] file2 = jar2.remove(name);
- Assert.assertNotNull(file2);
-
- ZipEntry entry1 = (ZipEntry) file1[0];
- ZipEntry entry2 = (ZipEntry) file2[0];
+ Map<String, Object[]> expectedEntries = getEntries(expected);
+ Map<String, Object[]> actualEntries = getEntries(actual);
+ for (String name : expectedEntries.keySet()) {
+ Object[] expectedFiles = expectedEntries.get(name);
+ Object[] actualFiles = actualEntries.remove(name);
+ Assert.assertNotNull(name + " entry is missing in actual zip stream (actual=" + actualEntries.keySet()
+ + ", expected=" + expectedEntries.keySet() + ")", actualFiles);
+
+ ZipEntry entry1 = (ZipEntry) expectedFiles[0];
+ ZipEntry entry2 = (ZipEntry) actualFiles[0];
// compare the entries
- Assert.assertTrue(entry1.getName().equals(entry2.getName()));
- Assert.assertTrue(entry1.getSize() == entry2.getSize());
+ Assert.assertEquals(entry1.getName(), entry2.getName());
+ Assert.assertEquals(entry1.getSize(), entry2.getSize());
// TODO for now skip over the timestamp as they seem to be different
// assertTrue(entry1.getTime() == entry2.getTime());
- Assert.assertTrue(entry1.isDirectory() == entry2.isDirectory());
- Assert.assertTrue(entry1.getCrc() == entry2.getCrc());
- Assert.assertTrue(entry1.getMethod() == entry2.getMethod());
+ Assert.assertEquals(entry1.isDirectory(), entry2.isDirectory());
+ Assert.assertEquals(entry1.getCrc(), entry2.getCrc());
+ Assert.assertEquals(entry1.getMethod(), entry2.getMethod());
// check the content of the entries
- Assert.assertTrue(Arrays.equals((byte[]) file1[1], (byte[]) file2[1]));
+ Assert.assertArrayEquals((byte[]) expectedFiles[1], (byte[]) actualFiles[1]);
}
// ensure that we have consumed all of the entries in the second JAR
- Assert.assertTrue(jar2.size() == 0);
+ Assert.assertEquals(0, actualEntries.size());
}
/**
@@ -181,11 +181,11 @@ public class TestData {
File entry1 = (File) file1[0];
ZipEntry entry2 = (ZipEntry) file2[0];
- Assert.assertTrue(entry1.isDirectory() == entry2.isDirectory());
+ Assert.assertEquals(entry1.isDirectory(), entry2.isDirectory());
// check the content of the entries
if (compareContent)
- Assert.assertTrue(Arrays.equals((byte[]) file1[1], (byte[]) file2[1]));
+ Assert.assertArrayEquals((byte[]) file1[1], (byte[]) file2[1]);
}
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/TestLicenseConsistency.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/TestLicenseConsistency.java
index e0c3f74e3..44cb6f077 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/TestLicenseConsistency.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/TestLicenseConsistency.java
@@ -27,13 +27,14 @@ import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
/**
- * Tests that licenses in the indigo repository are consistent with the platform feature license.
- * Note this test isn't intended to be included in automated tests. It produces a report
- * on stdout that can be used to identify features with inconsistent feature licenses.
+ * Tests that licenses in the latest release repository are consistent with the
+ * platform feature license. Note this test isn't intended to be included in
+ * automated tests. It produces a report on stdout that can be used to identify
+ * features with inconsistent feature licenses.
*/
public class TestLicenseConsistency extends AbstractProvisioningTest {
public void testLicenses() throws URISyntaxException, ProvisionException, OperationCanceledException {
- URI repoLocation = new URI("http://download.eclipse.org/releases/indigo/201103180900");
+ URI repoLocation = new URI("https://download.eclipse.org/releases/latest");
IMetadataRepository repo = getMetadataRepositoryManager().loadRepository(repoLocation, null);
IQueryResult<IInstallableUnit> allFeatures = repo.query(QueryUtil.createIUGroupQuery(), null);
IQueryResult<IInstallableUnit> platform = allFeatures.query(QueryUtil.createIUQuery("org.eclipse.platform.feature.group"), null);
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 a97ca935a..db75dbf27 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
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2009, 2018 IBM Corporation and others.
+ * Copyright (c) 2009, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -35,7 +35,7 @@ import org.eclipse.equinox.internal.p2.director.PermissiveSlicer;
import org.eclipse.equinox.internal.p2.metadata.ArtifactKey;
import org.eclipse.equinox.internal.p2.metadata.InstallableUnit;
import org.eclipse.equinox.p2.core.ProvisionException;
-import org.eclipse.equinox.p2.internal.repository.comparator.MD5ArtifactComparator;
+import org.eclipse.equinox.p2.internal.repository.comparator.ArtifactChecksumComparator;
import org.eclipse.equinox.p2.internal.repository.tools.Messages;
import org.eclipse.equinox.p2.metadata.IArtifactKey;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
@@ -777,7 +777,7 @@ public class MirrorTaskTest extends AbstractAntProvisioningTest {
// Create a comparator element
AntTaskElement comparator = new AntTaskElement("comparator");
- comparator.addAttribute("comparator", MD5ArtifactComparator.MD5_COMPARATOR_ID);
+ comparator.addAttribute("comparator", ArtifactChecksumComparator.COMPARATOR_ID + ".md5");
comparator.addElement(getRepositoryElement(baselineLocation.toURI(), null));
mirror.addElement(comparator);
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ant/Repo2RunnableTaskTests.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ant/Repo2RunnableTaskTests.java
index 75d7732c1..3ab304109 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ant/Repo2RunnableTaskTests.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ant/Repo2RunnableTaskTests.java
@@ -14,7 +14,10 @@
*******************************************************************************/
package org.eclipse.equinox.p2.tests.ant;
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
import java.net.URI;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.equinox.p2.core.ProvisionException;
@@ -22,7 +25,9 @@ import org.eclipse.equinox.p2.metadata.IArtifactKey;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
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.ArtifactKeyQuery;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
import org.eclipse.equinox.p2.tests.AbstractAntProvisioningTest;
@@ -130,6 +135,7 @@ public class Repo2RunnableTaskTests extends AbstractAntProvisioningTest {
/*
* Ensure that the output repository is of the expected type
*/
+ @SuppressWarnings("removal")
protected boolean expectedFormat(URI location) {
IArtifactRepository repo = null;
try {
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/AllTests.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/AllTests.java
index d797c0186..01422270a 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/AllTests.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/AllTests.java
@@ -19,9 +19,10 @@ import org.junit.runners.Suite;
/**
* Performs all automated director tests.
*/
+@SuppressWarnings("removal")
@RunWith(Suite.class)
@Suite.SuiteClasses({ Pack200ProcessorTest.class, ZipVerifierProcessorTest.class, ChecksumVerifierTest.class,
- ChecksumUtilitiesTest.class })
+ ChecksumUtilitiesTest.class, PGPSignatureVerifierTest.class })
public class AllTests {
// test suite
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/ChecksumUtilitiesTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/ChecksumUtilitiesTest.java
index c0cc0dce2..3f5b73987 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/ChecksumUtilitiesTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/ChecksumUtilitiesTest.java
@@ -26,7 +26,6 @@ import org.eclipse.equinox.internal.p2.artifact.processors.checksum.ChecksumUtil
import org.eclipse.equinox.internal.p2.artifact.processors.checksum.ChecksumVerifier;
import org.eclipse.equinox.internal.p2.metadata.ArtifactKey;
import org.eclipse.equinox.internal.p2.metadata.OSGiVersion;
-import org.eclipse.equinox.internal.provisional.p2.artifact.repository.processing.ProcessingStep;
import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor;
import org.eclipse.equinox.p2.repository.artifact.spi.ArtifactDescriptor;
import org.junit.Before;
@@ -70,10 +69,11 @@ public class ChecksumUtilitiesTest {
@Test
public void testChecksumProperty() {
- Collection<ProcessingStep> checksumVerifiers = ChecksumUtilities.getChecksumVerifiers(artifactDescriptor, propertyType, emptySet());
+ Collection<ChecksumVerifier> checksumVerifiers = ChecksumUtilities.getChecksumVerifiers(artifactDescriptor,
+ propertyType, emptySet());
assertEquals(format("Verifier for property=%s", property), 1, checksumVerifiers.size());
- ChecksumVerifier verifier = (ChecksumVerifier) checksumVerifiers.iterator().next();
+ ChecksumVerifier verifier = checksumVerifiers.iterator().next();
assertEquals(digestAlgorithm, verifier.getAlgorithmName());
assertEquals(algorithmId, verifier.getAlgorithmId());
assertEquals(value, verifier.getExpectedChecksum());
@@ -82,7 +82,8 @@ public class ChecksumUtilitiesTest {
@Test
public void testChecksumsToSkip() {
- Collection<ProcessingStep> checksumVerifiers = ChecksumUtilities.getChecksumVerifiers(artifactDescriptor, propertyType, singleton(algorithmId));
+ Collection<ChecksumVerifier> checksumVerifiers = ChecksumUtilities.getChecksumVerifiers(artifactDescriptor,
+ propertyType, singleton(algorithmId));
assertEquals(emptyList(), checksumVerifiers);
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/ChecksumVerifierTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/ChecksumVerifierTest.java
index f16eb28e4..1a66379d9 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/ChecksumVerifierTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/ChecksumVerifierTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2015, 2019 Mykola Nikishov.
+ * Copyright (c) 2015, 2021 Mykola Nikishov and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -13,12 +13,10 @@
*******************************************************************************/
package org.eclipse.equinox.p2.tests.artifact.processors;
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.eq;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.not;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.verify;
+import static org.mockito.AdditionalMatchers.not;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import java.io.IOException;
import java.util.Arrays;
@@ -66,63 +64,55 @@ public class ChecksumVerifierTest {
@Test
public void testInitialize() throws IOException, IllegalArgumentException, SecurityException {
- IProcessingStepDescriptor processingStepDescriptor = createMock(IProcessingStepDescriptor.class);
- expect(processingStepDescriptor.getData()).andReturn(checksum);
- replay(processingStepDescriptor);
+ IProcessingStepDescriptor processingStepDescriptor = mock(IProcessingStepDescriptor.class);
+ when(processingStepDescriptor.getData()).thenReturn(checksum);
- ChecksumVerifier verifier = new ChecksumVerifier(digestAlgorithm, providerName, algorithmId);
+ ChecksumVerifier verifier = new ChecksumVerifier(digestAlgorithm, providerName, algorithmId, false);
verifier.initialize(null, processingStepDescriptor, null);
Assert.assertEquals(Status.OK_STATUS, verifier.getStatus());
verifier.close();
- verify(processingStepDescriptor);
}
@Test
public void testInitialize_DownloadChecksum() throws IOException, IllegalArgumentException, SecurityException {
- IProcessingStepDescriptor processingStepDescriptor = createMock(IProcessingStepDescriptor.class);
- expect(processingStepDescriptor.getData()).andReturn(downloadProperty);
- IArtifactDescriptor artifactDescriptor = createMock(IArtifactDescriptor.class);
- replay(processingStepDescriptor);
- expect(artifactDescriptor.getProperty(eq(downloadProperty))).andReturn(checksum);
- expect(artifactDescriptor.getProperty(not(eq(downloadProperty)))).andReturn(null).times(1, 2);
+ IProcessingStepDescriptor processingStepDescriptor = mock(IProcessingStepDescriptor.class);
+ when(processingStepDescriptor.getData()).thenReturn(downloadProperty);
+ IArtifactDescriptor artifactDescriptor = mock(IArtifactDescriptor.class);
+ when(artifactDescriptor.getProperty(eq(downloadProperty))).thenReturn(checksum);
+ when(artifactDescriptor.getProperty(not(eq(downloadProperty)))).thenReturn(null);
HashMap<String, String> properties = new HashMap<>();
properties.put(downloadProperty, checksum);
- expect(artifactDescriptor.getProperties()).andReturn(properties);
- replay(artifactDescriptor);
+ when(artifactDescriptor.getProperties()).thenReturn(properties);
- ChecksumVerifier verifier = new ChecksumVerifier(digestAlgorithm, providerName, algorithmId);
+ ChecksumVerifier verifier = new ChecksumVerifier(digestAlgorithm, providerName, algorithmId, false);
verifier.initialize(null, processingStepDescriptor, artifactDescriptor);
Assert.assertEquals(Status.OK_STATUS, verifier.getStatus());
verifier.close();
- verify(processingStepDescriptor);
}
@Test
public void testInitialize_ArtifactChecksum() throws IOException, IllegalArgumentException, SecurityException {
- IProcessingStepDescriptor processingStepDescriptor = createMock(IProcessingStepDescriptor.class);
- expect(processingStepDescriptor.getData()).andReturn(artifactProperty);
- IArtifactDescriptor artifactDescriptor = createMock(IArtifactDescriptor.class);
- replay(processingStepDescriptor);
- expect(artifactDescriptor.getProperty(eq(artifactProperty))).andReturn(checksum);
+ IProcessingStepDescriptor processingStepDescriptor = mock(IProcessingStepDescriptor.class);
+ when(processingStepDescriptor.getData()).thenReturn(artifactProperty);
+ IArtifactDescriptor artifactDescriptor = mock(IArtifactDescriptor.class);
+ when(artifactDescriptor.getProperty(eq(artifactProperty))).thenReturn(checksum);
HashMap<String, String> properties = new HashMap<>();
properties.put(artifactProperty, checksum);
- expect(artifactDescriptor.getProperties()).andReturn(properties);
- expect(artifactDescriptor.getProperty(not(eq(artifactProperty)))).andReturn(null).times(1, 2);
- replay(artifactDescriptor);
+ when(artifactDescriptor.getProperties()).thenReturn(properties);
+ when(artifactDescriptor.getProperty(not(eq(artifactProperty)))).thenReturn(null);
- ChecksumVerifier verifier = new ChecksumVerifier(digestAlgorithm, providerName, algorithmId);
+ ChecksumVerifier verifier = new ChecksumVerifier(digestAlgorithm, providerName, algorithmId, false);
verifier.initialize(null, processingStepDescriptor, artifactDescriptor);
Assert.assertEquals(Status.OK_STATUS, verifier.getStatus());
verifier.close();
- verify(processingStepDescriptor);
}
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/PGPSignatureVerifierTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/PGPSignatureVerifierTest.java
new file mode 100644
index 000000000..dd3356767
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/PGPSignatureVerifierTest.java
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Red Hat Inc. 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
+ *******************************************************************************/
+package org.eclipse.equinox.p2.tests.artifact.processors;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URISyntaxException;
+import java.nio.file.Files;
+import java.util.Set;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.equinox.internal.p2.artifact.processors.pgp.PGPSignatureVerifier;
+import org.eclipse.equinox.internal.p2.metadata.ArtifactKey;
+import org.eclipse.equinox.internal.provisional.p2.repository.DefaultPGPPublicKeyService;
+import org.eclipse.equinox.p2.core.ProvisionException;
+import org.eclipse.equinox.p2.metadata.Version;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor;
+import org.eclipse.equinox.p2.repository.artifact.IProcessingStepDescriptor;
+import org.eclipse.equinox.p2.repository.artifact.spi.ArtifactDescriptor;
+import org.eclipse.equinox.p2.repository.artifact.spi.ProcessingStepDescriptor;
+import org.eclipse.equinox.p2.repository.spi.PGPPublicKeyService;
+import org.eclipse.equinox.p2.tests.TestAgentProvider;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+
+public class PGPSignatureVerifierTest {
+
+ @Rule
+ public TestAgentProvider agentProvider = new TestAgentProvider();
+
+ @Before
+ public void initialize() {
+ try {
+ PGPPublicKeyService keyService = agentProvider.getService(PGPPublicKeyService.class);
+ if (keyService instanceof DefaultPGPPublicKeyService) {
+ DefaultPGPPublicKeyService defaultPGPPublicKeyService = (DefaultPGPPublicKeyService) keyService;
+ defaultPGPPublicKeyService.setKeyServers(Set.of());
+ defaultPGPPublicKeyService.setGPG(false);
+ }
+ } catch (ProvisionException e) {
+ //$FALL-THROUGH$
+ }
+ }
+
+ // @formatter:off
+ /*
+ * About test keys: * Install the public&private keys locally * then generate
+ * signatures with eg `gpg -u signer2@fakeuser.eclipse.org -a --output
+ * signed_by_signer_2 --detach-sig testArtifact`
+ */
+ // @formatter:on
+
+ private IArtifactDescriptor createArtifact(String signaturesResourcePath, String publicKeyResourcePath)
+ throws IOException, URISyntaxException {
+ ArtifactDescriptor res = new ArtifactDescriptor(
+ new ArtifactKey("whatever", "whatever", Version.parseVersion("1.0.0")));
+ res.setProperty(PGPSignatureVerifier.PGP_SIGNATURES_PROPERTY_NAME, read(signaturesResourcePath));
+ res.setProperty(PGPSignatureVerifier.PGP_SIGNER_KEYS_PROPERTY_NAME, read(publicKeyResourcePath));
+ return res;
+ }
+
+ private static class ArtifactOutputStream extends ByteArrayOutputStream implements IAdaptable {
+ IArtifactDescriptor descriptor = new ArtifactDescriptor(
+ new ArtifactKey("whatever", "whatever", Version.parseVersion("1.0.0")));
+
+ public IArtifactDescriptor getDescriptor() {
+ return descriptor;
+ }
+
+ @Override
+ public <T> T getAdapter(Class<T> adapter) {
+ if (adapter.isInstance(descriptor)) {
+ return adapter.cast(descriptor);
+ }
+ return null;
+ }
+ }
+
+ private String read(String resource) throws IOException, URISyntaxException {
+ return Files.readString(new File(FileLocator.toFileURL(getClass().getResource(resource)).toURI()).toPath());
+ }
+
+ @Test
+ public void testOK() throws Exception {
+ IProcessingStepDescriptor processingStepDescriptor = new ProcessingStepDescriptor(null, null, false);
+ IArtifactDescriptor artifact = createArtifact("signed_by_signer_1", "public_signer1.pgp");
+ @SuppressWarnings("resource")
+ PGPSignatureVerifier verifier = new PGPSignatureVerifier();
+ verifier.initialize(agentProvider.getAgent(), processingStepDescriptor, artifact);
+ ArtifactOutputStream artifactOutputStream = new ArtifactOutputStream();
+ verifier.link(artifactOutputStream, new NullProgressMonitor());
+ Assert.assertTrue(verifier.getStatus().toString(), verifier.getStatus().isOK());
+ try (InputStream bytes = getClass().getResourceAsStream("testArtifact")) {
+ bytes.transferTo(verifier);
+ }
+ Assert.assertTrue(verifier.getStatus().isOK());
+ verifier.close();
+ Assert.assertTrue(verifier.getStatus().isOK());
+
+ IArtifactDescriptor descriptor = artifactOutputStream.getDescriptor();
+ Assert.assertNotNull("Signatures should be present",
+ descriptor.getProperty(PGPSignatureVerifier.PGP_SIGNATURES_PROPERTY_NAME));
+ Assert.assertNotNull("Keys should be present",
+ descriptor.getProperty(PGPSignatureVerifier.PGP_SIGNER_KEYS_PROPERTY_NAME));
+ }
+
+ @Test
+ public void testNoPublicKeyFound() throws Exception {
+ IProcessingStepDescriptor processingStepDescriptor = new ProcessingStepDescriptor(null, null, false);
+ IArtifactDescriptor artifact = createArtifact("signed_by_signer_1", "public_signer2.pgp");
+ try (PGPSignatureVerifier verifier = new PGPSignatureVerifier()) {
+ verifier.initialize(agentProvider.getAgent(), processingStepDescriptor, artifact);
+ ArtifactOutputStream artifactOutputStream = new ArtifactOutputStream();
+ verifier.link(artifactOutputStream, new NullProgressMonitor());
+ Assert.assertTrue(verifier.getStatus().toString(), verifier.getStatus().isOK());
+ try (InputStream bytes = getClass().getResourceAsStream("testArtifact")) {
+ bytes.transferTo(verifier);
+ }
+ Assert.assertTrue(verifier.getStatus().isOK());
+ verifier.close();
+ Assert.assertTrue(verifier.getStatus().isOK());
+
+ IArtifactDescriptor descriptor = artifactOutputStream.getDescriptor();
+ Assert.assertNull("No signatures should be present",
+ descriptor.getProperty(PGPSignatureVerifier.PGP_SIGNATURES_PROPERTY_NAME));
+ Assert.assertNull("No keys should be present",
+ descriptor.getProperty(PGPSignatureVerifier.PGP_SIGNER_KEYS_PROPERTY_NAME));
+ }
+ }
+
+ @Test
+ public void testTamperedSignature() throws Exception {
+ IProcessingStepDescriptor processingStepDescriptor = new ProcessingStepDescriptor(null, null, false);
+ IArtifactDescriptor artifact = createArtifact("signed_by_signer_1_tampered", "public_signer1.pgp");
+ try (PGPSignatureVerifier verifier = new PGPSignatureVerifier()) {
+ verifier.initialize(agentProvider.getAgent(), processingStepDescriptor, artifact);
+ // signature has random modification, making it invalid by itself
+ Assert.assertFalse(verifier.getStatus().isOK());
+ }
+ }
+
+ @Test
+ public void testSignatureForAnotherArtifact() throws Exception {
+ IProcessingStepDescriptor processingStepDescriptor = new ProcessingStepDescriptor(null, null, false);
+ IArtifactDescriptor artifact = createArtifact("signed_by_signer_1_otherArtifact", "public_signer1.pgp");
+ @SuppressWarnings("resource")
+ PGPSignatureVerifier verifier = new PGPSignatureVerifier();
+ verifier.initialize(agentProvider.getAgent(), processingStepDescriptor, artifact);
+ Assert.assertTrue(verifier.getStatus().isOK());
+ try (InputStream bytes = getClass().getResourceAsStream("testArtifact")) {
+ bytes.transferTo(verifier);
+ }
+ Assert.assertTrue(verifier.getStatus().isOK());
+ verifier.close();
+ IStatus status = verifier.getStatus();
+ assertEquals(IStatus.ERROR, status.getSeverity());
+ assertTrue(status.getMessage().matches(".*signature.*invalid.*"));
+ }
+}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/Pack200ProcessorTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/Pack200ProcessorTest.java
index d6a7a1010..a1447d16a 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/Pack200ProcessorTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/Pack200ProcessorTest.java
@@ -13,7 +13,14 @@
*******************************************************************************/
package org.eclipse.equinox.p2.tests.artifact.processors;
-import java.io.*;
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
import java.util.Arrays;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.equinox.internal.p2.artifact.processors.pack200.Pack200ProcessorStep;
@@ -24,6 +31,7 @@ import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
import org.eclipse.equinox.p2.tests.TestActivator;
import org.osgi.framework.Bundle;
+@Deprecated(forRemoval = true)
public class Pack200ProcessorTest extends AbstractProvisioningTest {
public Pack200ProcessorTest(String name) {
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/private_signer1.pgp b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/private_signer1.pgp
new file mode 100644
index 000000000..33d2c2f5f
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/private_signer1.pgp
@@ -0,0 +1,84 @@
+-----BEGIN PGP PRIVATE KEY BLOCK-----
+
+lQWFBGB1bugBDADQ5l7YnS9hNFRkBKSrvVNHt/TxeHaNNIHkdTC56I1QdThsOt4Y
+oQRI27AEOaY1GFEi6+QqwxALcMMMSTgkCRs2NFGqlWMVzNYE7bJMWChVa7uQ/9CG
+1HRbXwVwQx3hFgU4kmw1Kl/IH4LX76d9gAMyFANPjYZJSjbAv54wOlKruDRgpQFF
+pZeuXW7SnerL6sgd/+ZroikdkrjIs5t18C2ofzf6YnOokYkEEJSAEoQK5svVzT4G
+H3sw6FlE41RvnYKpuhvvyQhKjISDYfRaIL4JIpvR9Uko48eN9x654lJaucbMiLP4
+ROI9q7RQ6t1IMCiIN9QKgS+nVtHnN9MnXS0czGxfLdStv6bB+xgUoyBc7Uiqf4X0
+x8z9PE6O1L6Rgy2JMJHPgLWCF8h/u1FO88Br3I7TMzu2q/cg3k18L7eujnxVyYiD
+YIMxDBXBNnGCKRC4shgt8e+PzAPXIDFvbv7HOaERnx5c6eLl0tD12ocQeZHp1VlW
+nQteQ6CfvN07dNUAEQEAAf4HAwIrnfDjnCh1APMEp1xfdT91mv9aZw2xx3DU6gYT
+0lkgeZKe8HVLCuulx+MJ1Rl48ub2OnShpE7eMAI3M7N+7uaAFtNlTSR+ADW44eVF
+OzmH/CLjMsYD2pNSGdkvqdNzLHi52350TVnuKIciQs0QPAiMDMBrNEckUM3YDbmp
+wJlqywaUmjUUKdfvSjBrWTGfLtliRbsPh4BY7ule6R2DVwFDluCAWg9K2VkCL3QB
+6f+rdwvi5OzklxJuwd7cuerqNetlZnNHhdU/ZenGdjNuKMUCSEOXpbOWEABUV/dc
+9MyIhJdnvV8KovRMpo7RurBe8mv1cFjraA9oe+gM/7Iu+y6ZYlzQdLOJV/uc475k
+bHN/lF9jLsTC//gvW8oxdw1a4MIjG7w32L2J6ofeG1g3s8Hw4F84V/igS7WaQShF
+VxA3vu8Enggosdfx6lnOgFiR9qVNWcjLtIB2tgxrFDKJY2rFufRZ7VE1NED1AgCa
+weg8J8iYbqB14AMS2kiQhzYJ6AQukRidu7QnDhWeuOKcZ3klZvPna8e1ZAEar7os
+kjZVjbBpiwOgh2ZXhHvnl7po8XPfdbTZm48DFazDPxVUn+9PxS8/g6bDbrjAo2kk
+Wd1HKcOVTSbpO3l3cc0rC7wbZW+NxWrHTuZ8iMrIwtzI3+SZX5W9Fls8vmGpuA/W
+ZsGVMr3saXWKeVz8DpUzjPgsVscdQHgt6B6wpEhj8mWccL0BfviqmZnWCVcy2qTv
+9PXnCU4TNa7Y2cYtfXbmlOslT9ptBQ0fz+6/OuqB0NRWJl1AQNTBsM7GX8DF3mDb
+L+kv+IdIpmk0AN3iFcMo1K7nGoNyMDPuIXaPGYW9o7cfQsDuPO0rPUN8swAG8It3
+gLE1IFuQXyzJJ3pvTqf/NV9Wkh5YrCa8HvrzzR5WNnCBoUruNzWLfkFCZGOpiOGV
+//DnXvH2UPZA3hdSumz1yMnqXs1Zx/rMkblqufzxZR9EKwis4IrSULoaswir4IXc
+o4qi74OnaMWY+N7/CDAn07HAuB4HgK9UrnRTOYAM7pvOGRMzzbFMenE95hfotaEp
+mOjbqMiSGvXMHz1o2blZjHiq63pREP88XGBBfP3pSpVmjA+9Jrt+luVs9FkkTLqt
+N6snvrtc83Y92otxNpz8psU3CRu0avUKBF1eM5dPcg5RgGSV9ghCxXFsuOclrJ/q
+RI7O5uiEJF3VutvCM2Cz388IGuqejw15xSemXAmAAAPMmxL3t1gAPqLlyI6JW7UT
+WKYkiyKFRgLFt6Q+Xal92A/g+waJnxOrcM+va5i0xInTB+DnR3RD6egID42jP7V1
+e/6gZgmFKYWH1XDm9JsZSbW+5lDupuKutDdFY2xpcHNlIHAyIHRlc3QgU2lnbmVy
+IDEgPHNpZ25lcjFAZmFrZXVzZXIuZWNsaXBzZS5vcmc+iQHUBBMBCAA+FiEE6ZbG
+cKp/ZUCb9dtWE5442Q3tEfAFAmB1bugCGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYC
+AwECHgECF4AACgkQE5442Q3tEfC5dgv9GLaAehcQs3v11ae4LmGOHteAqq6qVmDe
+ouCQvID/nj8RHHscssweNTm1UhVpxn1RZvfQHPHqJXHaEy0v/QUUnVLSLDBMNd+3
+/0Sg++yaYTFVgSJLHkfGw9cz5eh8y+Lvmc3fiIxQhTdKAovMeqVZwLdPteMNYoLx
+ORNy60gBojMExGyyS0lHc5jNZtvDODPzexWmh9YZ/Ehb3UfX1mvyuMheI3LLW6VG
+d+xrP7Fd5d8rFlmzTQW0gg55YGEK2xvz/xS/cVEMrr6VffECp8wbrtrMlekVp9Yk
+aLKbKl9LCLokDzrpY7PD0N9upYiVj8QwiHJmuxacaIaGEBq/A6JJZhXrmigViigo
+c2Yh6Sm9FlLCUa7C+dmv7bjvW6uQKgbxjPYTLbxCNzQ2BeVcCSoVSQ7aA08WxeST
+UQL6/M7aWWmpE5L2m3bl0QFxRKB9yMU4Va/Znkh2YaMUR7joIk0RXM2CQ/73vAk/
+vClw4JIX+ed44GPhvtDSy4n4ywT8XHpJnQWFBGB1bugBDACy3hAYd33D5XdQeBEx
+hkhJ9gClwAraoFPVm9/TVATfwlS0M8olqsOWDFxpe5fqM5xsXrQ4x3n12E2alpli
+mhwlkyCcRKPT9Ofhxl9bC06jU+ibwtuDXMYohgBpHaZNvyaQLAnCxkJRkKaH7Oyl
+pzF1VF2ZaYJdwXEVz/qAErFw8Vl/3cllojfeqwunHIDnsAlXlyT9NjWIWYDocXF6
+FqawBV13nqC7I5F6QkmVkdcT2kgJUQapVR91tJBcSJLfzqRkN+1d7fqmF2PWC0Wx
+EsegEjz4vuja+t2ePVRmC2/EFskn5AB+EXz5/zhEUiL0JNjxyF5f5h8MwR2D0n0s
+bnhfk/c7Vld4S+50qT+GpYF/7aut2SF0XLIZErTJOs749D61keFwc+p+jgSJWS0L
+gFOkHpC0sFg0AZgxF12ZkyCniUTbEaJvxJjCidy3fLV+YH7HruWrrkgVUz8gDA3o
+G4xe2Bv5mSaJP54qBzWkri4KxkltACU/OQMZBXr0Y3KOWmEAEQEAAf4HAwLLvoWv
+eKC2/fMh+cA0nyp8Q5POdY1Y57YJSp7HcrUJVGFPMwY25rI9K/hg5LIKuXMlTiMw
+Jep9pAxERxhvohjPoKqb8zTT85PGFgSl6Mml+0h44CAGLT1bNuuB8/qqrOzWO3l+
+NvHYmaGTYtWKtETRvTZkepTyoKFZY7u0KO3xKusJS+MfuMKFvBlyibR8YLRQED2F
+KzNO8rPDLoFt8g6bfEnTgQbn/VqWBliFZ+W9oQAGXaoWC80LR7SBim4/XgsT5G/O
+PCZBsOIhHCEV0U6pO2kjDxjh+74CNOLnNTs54M2psYCKthMruQ7umGe1dMO+mQYU
+vu0xApMYoXAfCSWLq41b48IxLxGF53PhpjgAafM4TFYHDj56G7foZRmNDvLSFpzq
+/xyUxJGcDmx+J9GvAOuvObFn/25DrQJN2NXFm3cPcb6spDJspabBWR6rB+9mJelS
+b091fZN0cQM808dmbPyOgRwikB2078MOllFVKOoYbol0J9pZvxhjpAAUBYzSIQfe
++M6QYwHjqFVIaaM00ceo95QoXYbXmnrW2/TRpgZb0zKd26KSumhcS1saLgBb0TqM
+va+7xX+sdlOLNGAylulTmfOfsBryB6YogX4j6FpmZnzIwtfUS7KfuU9Ex6l50DY3
+kzRMFVpDTN2jRM90loztnTO3Mqa7yjTXgPv0lga2LIlJYYhzRTrt6alWsKxdAwWY
+JxuQiaa119ptdAqgRZkhuWpITFO8XnuQ1L/0vS9qw4SGjnDNm4zxH7AybWlSWzUG
+qsoETYAYMjPIcDuzggAu2YHVastfBI862vuUzPlLPHxQfT7uFWB5C+nyghSzocyZ
+3bL4FrRrf18LoPSODzoc0unMCXCnE8uS/fOqWTFTXCceNFB6em70p0f/BGpbFrxD
+kgE6Pb/VeX57KSuZLuHWbWxgUbVLf75WkkMUhJJ6ZscWpUtrBr6GpeiW0yp+Iw3b
+sRofxLSZ4KRBA3zB9WuhCOrqexVPvT+yRbFyzBtpwRfMpWqOdN+3L6wAqBiFzuuc
+zLqG9RrTLhRtVAGARRbA3K/0cd2Eu4yFj9JennA3/NGRzFrDx+CvnOoJh/cY9eYb
+GOU1KqMABWnpvc6D3UYtSA6pOwZ4k7/qwNuv+p+PwhEfsoBwoaGB5cPiZNKtvIBM
+oTV1J3J6MD0dZ2MbVisWr8L5DZOy41OpRv/nB3qxUjO9VWyx92f2oGeeOLrnwBt5
+TnmGP+KxtA9Q0EmRBxuASEHQ35Vc2J2qPBTGVEchHF+h8ojHpWuyc3vXQo4SaBoy
+arQN3DjExZfjjp0iaFYRGe8Tix3PrazL1XSDWRcfsdACjB0UJnYy2ngAR0CSZQ6m
+iQG8BBgBCAAmFiEE6ZbGcKp/ZUCb9dtWE5442Q3tEfAFAmB1bugCGwwFCQPCZwAA
+CgkQE5442Q3tEfDnvAwA0AkwV8a5kyU0mVHilaNAtZAx0GmlfkYkZqrmEd1sRSOr
+oCRRVqc4BvVfEO72BnmRTB2DP7Q7mP4HTMBwXEdd8mMqM7JWq+6mrOCy/22IDqqv
+kokhkwxAVvtNPuVpcJpa77my3OqMPatrE5jqa6t0O33ovrBADVZ8pgcZ1Vf2SFRj
+6Zv0ZIdSRRk//EhMipArrRttyTDP9OnCIWcHQ+mlkmSuBBcNJcH18q/Jd2ah9Fsn
+VRHn9Q1DSETOPDtGHcEvbo3eYiiiiZW+F8cBouiCks6Vxe6Ra5ur6kt9OrtxZ2pO
+YW9oLPHaZzaO1C9YFJuaa/Lyd8YYNeSgo2Cs/JOmQ7CFlC011Cdt4vGcKskGo9W2
+o8DdPvzHwtGZKELUNiP0x3Ci0jDkfk44up+xYznFZelaAyk43cY/ToAJW2e1vYxA
+K61Iw3QpP5uI6vYfaYaZYgR6Lpf52rsLZVJ0HrNVft/UZPZe4HXSloN3ZcIOgowe
+TJJnGnssYADXMioK7p6Y
+=P53y
+-----END PGP PRIVATE KEY BLOCK-----
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/private_signer2.pgp b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/private_signer2.pgp
new file mode 100644
index 000000000..c54415f0c
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/private_signer2.pgp
@@ -0,0 +1,84 @@
+-----BEGIN PGP PRIVATE KEY BLOCK-----
+
+lQWGBGB1hRUBDACuNDnJk8q+E8bZmIKkOCL9HTrj+ZAo2cfFfi/bLD9UsjRBOa21
+ly9oIjDSsmlFMBGX6J/xvwrnWs4lx1YI5yGw0sX9kzBC5ghAE+LVT28OEBkQZciQ
+i87C9ad8NjZYg+/ZUbW8Hrss9yQz18Lu0Abejs7redAxbhqpbtkqArvRGOKgC+P7
+qFuYuywvIoiAmh3OGzY+B39KLspFaavSorMNcxveoNXehCoDk9eI4WGhyng+XV1N
+ZSquRW4GB8zpEDY0a4Dq4bQsK50A3FeYQMC3Ud0mnMcHERLbghtMQC81Isd/0x44
+nOvjozelRxKzq0MowYXFxQ0jDJN26wVH+3FiovTTxfzk1ZyBOBbjT8yA7xHDgvff
+9HMEhCTWyHtxsJIAZrji+pjx4bgPsdvFb7/noQJsP1Ea/ihSl4SSiJk1wrKoQoA4
+3CVdKJ4FIF+v9Kf7ADftGqMdtTHu02AWdT60iu7eKeWY8by2TbsczOTPzb4opWxS
+QnCJwtdUngs+Hs0AEQEAAf4HAwLqAXbd6kJNxvMykoDbiN1hl3GLcD4gEiF76UHv
+zIdNk1QihIlcSRUHUERdMuHNgnrUQp9WPjNzptwEjAJcP4DYkWcR4+DxPrS07MUa
+3Rba+OPMMwgdqZOF3Ql5EvTqudkuIIFFflF4/ComqyDs9p0MvLIffAbcvV0u4plf
+gyjWFijh3vZvzRkHvTaIrPnzJFgcTztZ8bIIMsL48TX3Sz3JZiF7chcXUeutUrSJ
+740n5jiB0qEHPJ8hZRmAqaYFgInpx1+aRI1ueJCp8ML124Gnn9Tk5l6QSjSTEyPl
+E1YRBHszHRcLP2MJ1TfjyCuXoErpu8kXCKI1/aTTV95cguzEFX8gP32l6vnBC0xB
+NmQ3eNb9NFbb6QO0E9NEF3BG5ADjRplW4sHnrlQn0+TwDReR9X/RsRPEc2zIBnKe
+BZi3o9Judt/CQizyDXtObbg97sIdtnc/EaAIZMrA3uMAxrA5rin5DOIsz/H3zyh9
+w8LZ1cbaWCnp+POv74FjkgXBklniwxkpSSPrVmA2Zw2smXObZq+GcdmRhz0mG2l4
+oKYyPTe4WK74Ho96x1jlDPub7+4/HrCJnxXYsMR35tQvPplWfq1PLOY2mnsXzRho
+h7jWYxYNM949EFCwMF09abDBj34ZpRUfYpP6VC8NATG8//v6LwhhrD3AQwLYbpmA
+YK64LrnCyh8LfSFibp+8yBis+HHsxz2RgJ7gkrSORoKXAGJAHu+GYuhP9am1ObCH
+CUsO1McgCx4yUQZqMbSZuvhf8h61kmnW/+CZSQQ8pO25zvysdhwCPwY1ffsnFX8m
+gIVdMBM7QtC9PepJEGQctXMLH/yng6nCPwkb5dkWwoRywG+VhnokARua9n7fMyJJ
+C+MEVpmWpRNO2pUjtrW8IjftsjLyLah5FLfhfXR1ciQse5J9HkDsuoRr7owvZJ9U
+ZMZStlLZdrMNAIS6k/fRdgBG2mUhLRvdeBcqJ0zO3ZB6RT+Xi4T/C0BEr/tQ65lE
+iX3rgvjs7nqCCq45xmPoY34ClOKvAiXmE/5X9DtGVesJVpSkbDjzNeljH/UG/fSi
+1/pGlYS5FpYtjrPvS8dPvasobafl2nISTWVUpnChLdFSRvEnj71KtuqHmJf2K0F9
+9yz74UPiSv4Ff5Zyw0IcCeK8KIDsvEwfkTvo53ug3qrEA0mjajBNTK9jKDvCYeWD
+v4dbGZqDrMd9Q2UvXXOz9BBrgVN35nAsXXg0hTpKhcDgkKeYi3ssf0T/SR0aYu10
+LVGaN7AqvH11eaXW3Pxa4nO8qm2TBntJMnNO6IEozaba9uM4qrs/5BXWxcJRGBaz
+82PyG4AeTOccU6rJBK1zYhz0KMApuuA5rLQ3RWNsaXBzZSBwMiB0ZXN0IFNpZ25l
+ciAyIDxzaWduZXIyQGZha2V1c2VyLmVjbGlwc2Uub3JnPokB1AQTAQgAPhYhBFTo
+Ck5d9bkVHcBczvkSCo3ck5v0BQJgdYUVAhsDBQkDwmcABQsJCAcCBhUKCQgLAgQW
+AgMBAh4BAheAAAoJEPkSCo3ck5v0THMMAIx1c03u7PsAIXRdi0av9NhvPHjjmYAO
++aTxJB3UJFuCqvj61rKXZqBPYgZbQUJUTeDqENZ2+fZ/7kKZhFu5X3dmCePUGBfF
+tHnC6NfEj4Lp0+WMYTweoJ6jJQpW2ZqiWVMUgLlGGCbdTTnp9D10qSahaqYBcIgk
+v/38Qfqx+D3vyGrqPiUHUwCjwoXL5fsH7r3iNeJBsPdm+2fbjcuij5wzfXhK79B+
+xBQ0VEPcJi1Kbi+QCQC0HUdjc3OSDNSVXbEEgkCNrPPfHz6A14/E0Q+b04OaW2f7
+yq/p/wwVonh+AJomWTk/9bEi1WGahN8WjahHMbycR6Lqm3upyF+/CCiQjUGD0yG2
+XuGtfoieHvHcJF0g2eUAPrRlEtKQfp3Z/UTFAP+bWEhQMlUFLCBXCcPESxzomSkK
+P/ia0PjE7YvWxbV9qgO286EyToqAUqIBEfyxRRv/x3QhtKlTFa8/u/ysJLFx6bVr
+TdMXC6czbXnryZT9HqkdxqnCP2TNpZWo9p0FhgRgdYUVAQwAyp3Wtn6kUDuBPmYm
+9jrrvprMYkjBPapI7Qq/IsuLJfIRex5Pvj4ro1Hnm/FgEjgiAxDocp81HZ6M0PGG
+2PYfO444cqdpGGW1I4Ak7Wus78rSaBpbd98l5zpQYu1b6XILtXQQRY5rGIrbhlZu
+/Hpsdb5jf671GcFjCj+9UW2qJfQch1z9AU4uDBK/43iqWNjR+5hyVI1PQi4m/kYu
+uzEpuBwa0Y8UWWVbO2GQPYbmnSWnU/5MkBvLC5h3f85Q673byHdQCp5WWV99zSUC
+rMXb+xM1cCr6Q95xt1DstpbM1MgNJXiXs5cvb6LetTFeZGG5N0h7r5Qul20fTCyb
+IV89OPBKvkkMWNWwysy8L5mttNEfx78Z64cX/rpfKnS2dtW0G8RYi4JUPVTLekDA
+BQOyVsry8oPJ84NM4AoXO8Mln3bvSZgmSaNRJC+lNqX0xbb+42nZ2yR58rmh/mGc
+uuqdPVxzTeozvPXdDKl2veK/2fuo85mDt/c/QVAzf3uDvRmJABEBAAH+BwMC9jOj
+3vfR2C/zv0u3eFIq0QIXDgpmKvdClJasHTyyGAvNNJYjZmScm4JNnocGe3jmqCAq
+H9L8Y77q+ApljGiQXANFOYV/WMsfTjiqyL1FgNY9OgoNIMnkcMFva+vmlw+aBTYU
+HSL1BafF/nh7eJwDoTrSyH8ObnsuqeN8ZwL1iThix70fwbHmvQ7QEl6hgRFKE3oG
++EPmnlQOVbvYfDVYN6sQahRHVluHMZIrMfvMiEUklKAIH7Di/p1dgwoQCN+kHWrG
+GMQVJzuO8gWJqC5o61LtcnLau5nIgFFDhqqPi233KBGuqaFmA/7gEZO9d77+W9tU
+F2R6Xx4l9FNGws5o1YtwOTeHoLVNRTYoNMfz7B+Sj9RqJG4xQiwCFEKohlA8lIXp
+DJhI+TycFeVh3F/esGL4uRWoI46s3FmoliSFuBSqeE3Gz8OtXBOr3CT4RcSrjziF
+OuGCnbJAykVmx/2RpWNHN9RdzbmwGyZ8Gz4lxsmas6jRacBWMEn9DXMDq5AjeyYW
+lfpXEHAF/n06s+M5nAqJ6uhi1GDYcPQcY1CR6xT9rQoijP+xQUF3ssFGnBWQ1oC6
+nRl4ACJGODgcNuSu+f1/naNK2ZgfaA9hA4mA/YleaIQRvcwWG22ATqpkHnnacU6b
+CqesN+jan65BCR6qRRbSi/paK04AORikCwfz8eJXnZ9A0mlPIYi8ld5nNsdEV5MP
+BUdZdprrIk0KmSHq/0YovQ/ZqtOkXKZWF18Zk9QR/QFRkJ01eARK9AwKQixh6D89
+ZXv0PqWiquaFCsCE7YlkCC5f4XSwSY3KtqtK0BG5zmdus3Tl4gzOY6k1fCOczcpi
+d8ktPEPFBuDWUq8Lutme/a1yAwm82TvOVWPBikASIXpDXWM0JVjEN+4SwrxQ0Hrd
+HnCUkr/eHm4EOkmHGHCQnfs+Q50aJNquAorydhMPVez0AhaXu1DwCinAX0K3zAOa
+In5/JAhkZ7L5Fy4DG+uQ8YsZA0/2T/5Nr+k2nX1ERZuQ6zta67mAiZpw/M2J6ujZ
+AGEbImcGzN48NG8E4sykm/mUIjtxmwakWJ1Cb7+AtMG/8v2jCjwVDVThRWwkdrsY
+ug62N/HPQ+sXow6CMA7s1TaQvxn2p1s2zJk+cMOPPn/4VC4y6xPT6nr9Zsi+XxWy
+i87H8PyfwG2MqaJEgIr0vGoWPpnCJjUYvK3xqFXPsxz6ngDQW8mG704uWiZhGuua
+sXkWyxiobQ/1HtQyk0NA1MCQWSHfHlMf+Km9KrFSm3MlLFtvLvk9VHq8dqfttIZs
+l5WHh0o43X3iqMNBlWeJ8A4qmg6/k4n/Zek/y0znieFFXi8Tl3eCsLZWraaE1jP5
+wZyJAbwEGAEIACYWIQRU6ApOXfW5FR3AXM75EgqN3JOb9AUCYHWFFQIbDAUJA8Jn
+AAAKCRD5EgqN3JOb9JV1C/sEGGnSLRnVLurlTw6IFIRH0XXggzFaA6JN3cwTmJK5
+xCf4sSwyCt67LXQWZ+YTTFt+EXo/Yd25tPNyJDBAh1dg7TBkTAIGV3PrPJ6Ixmjo
+j5Tw2ykaw5fzI37+FjMhB91jzNMDpwcth+7+qu/ru6yIJ/AcHqfSKLD9ao38/jIf
+rfbmcZCb+5ZZCSUoyLRAUjSMFqqiRKfy5JiD/qz2ej5rXx4hv1zyq3XauVRC7H5c
+ZAAu4g9mP/ri9YhRelGrjm/VmkYMYJ9LS2kMHet7031ldpmcCZfex5ZUR0HLTrF7
+jBd1bN0VbGXZMIchXgJuVrJq7Kw36cjTvP+l46ufWYO+1VArGWk0CKhXIf/MR7C9
+W9RycZUlWTVGBXrncfvqY5Db3SABUJOTRwUyf43G5KCrScx8w7BM0hn+zJyAW9W/
+GplTfzZ8/SWpbNYSlJStpzvEzVUousCk5ERKTp93qYqI/m65zIrxxsaQUc70zUOQ
+dhlWIjDhIRD9JBC+M657iNc=
+=OHTb
+-----END PGP PRIVATE KEY BLOCK-----
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/public_signer1.pgp b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/public_signer1.pgp
new file mode 100644
index 000000000..485e0bb6f
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/public_signer1.pgp
@@ -0,0 +1,41 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQGNBGB1bugBDADQ5l7YnS9hNFRkBKSrvVNHt/TxeHaNNIHkdTC56I1QdThsOt4Y
+oQRI27AEOaY1GFEi6+QqwxALcMMMSTgkCRs2NFGqlWMVzNYE7bJMWChVa7uQ/9CG
+1HRbXwVwQx3hFgU4kmw1Kl/IH4LX76d9gAMyFANPjYZJSjbAv54wOlKruDRgpQFF
+pZeuXW7SnerL6sgd/+ZroikdkrjIs5t18C2ofzf6YnOokYkEEJSAEoQK5svVzT4G
+H3sw6FlE41RvnYKpuhvvyQhKjISDYfRaIL4JIpvR9Uko48eN9x654lJaucbMiLP4
+ROI9q7RQ6t1IMCiIN9QKgS+nVtHnN9MnXS0czGxfLdStv6bB+xgUoyBc7Uiqf4X0
+x8z9PE6O1L6Rgy2JMJHPgLWCF8h/u1FO88Br3I7TMzu2q/cg3k18L7eujnxVyYiD
+YIMxDBXBNnGCKRC4shgt8e+PzAPXIDFvbv7HOaERnx5c6eLl0tD12ocQeZHp1VlW
+nQteQ6CfvN07dNUAEQEAAbQ3RWNsaXBzZSBwMiB0ZXN0IFNpZ25lciAxIDxzaWdu
+ZXIxQGZha2V1c2VyLmVjbGlwc2Uub3JnPokB1AQTAQgAPhYhBOmWxnCqf2VAm/Xb
+VhOeONkN7RHwBQJgdW7oAhsDBQkDwmcABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheA
+AAoJEBOeONkN7RHwuXYL/Ri2gHoXELN79dWnuC5hjh7XgKquqlZg3qLgkLyA/54/
+ERx7HLLMHjU5tVIVacZ9UWb30Bzx6iVx2hMtL/0FFJ1S0iwwTDXft/9EoPvsmmEx
+VYEiSx5HxsPXM+XofMvi75nN34iMUIU3SgKLzHqlWcC3T7XjDWKC8TkTcutIAaIz
+BMRssktJR3OYzWbbwzgz83sVpofWGfxIW91H19Zr8rjIXiNyy1ulRnfsaz+xXeXf
+KxZZs00FtIIOeWBhCtsb8/8Uv3FRDK6+lX3xAqfMG67azJXpFafWJGiymypfSwi6
+JA866WOzw9DfbqWIlY/EMIhyZrsWnGiGhhAavwOiSWYV65ooFYooKHNmIekpvRZS
+wlGuwvnZr+2471urkCoG8Yz2Ey28Qjc0NgXlXAkqFUkO2gNPFsXkk1EC+vzO2llp
+qROS9pt25dEBcUSgfcjFOFWv2Z5IdmGjFEe46CJNEVzNgkP+97wJP7wpcOCSF/nn
+eOBj4b7Q0suJ+MsE/Fx6SbkBjQRgdW7oAQwAst4QGHd9w+V3UHgRMYZISfYApcAK
+2qBT1Zvf01QE38JUtDPKJarDlgxcaXuX6jOcbF60OMd59dhNmpaZYpocJZMgnESj
+0/Tn4cZfWwtOo1Pom8Lbg1zGKIYAaR2mTb8mkCwJwsZCUZCmh+zspacxdVRdmWmC
+XcFxFc/6gBKxcPFZf93JZaI33qsLpxyA57AJV5ck/TY1iFmA6HFxehamsAVdd56g
+uyORekJJlZHXE9pICVEGqVUfdbSQXEiS386kZDftXe36phdj1gtFsRLHoBI8+L7o
+2vrdnj1UZgtvxBbJJ+QAfhF8+f84RFIi9CTY8cheX+YfDMEdg9J9LG54X5P3O1ZX
+eEvudKk/hqWBf+2rrdkhdFyyGRK0yTrO+PQ+tZHhcHPqfo4EiVktC4BTpB6QtLBY
+NAGYMRddmZMgp4lE2xGib8SYwonct3y1fmB+x67lq65IFVM/IAwN6BuMXtgb+Zkm
+iT+eKgc1pK4uCsZJbQAlPzkDGQV69GNyjlphABEBAAGJAbwEGAEIACYWIQTplsZw
+qn9lQJv121YTnjjZDe0R8AUCYHVu6AIbDAUJA8JnAAAKCRATnjjZDe0R8Oe8DADQ
+CTBXxrmTJTSZUeKVo0C1kDHQaaV+RiRmquYR3WxFI6ugJFFWpzgG9V8Q7vYGeZFM
+HYM/tDuY/gdMwHBcR13yYyozslar7qas4LL/bYgOqq+SiSGTDEBW+00+5Wlwmlrv
+ubLc6ow9q2sTmOprq3Q7fei+sEANVnymBxnVV/ZIVGPpm/Rkh1JFGT/8SEyKkCut
+G23JMM/06cIhZwdD6aWSZK4EFw0lwfXyr8l3ZqH0WydVEef1DUNIRM48O0YdwS9u
+jd5iKKKJlb4XxwGi6IKSzpXF7pFrm6vqS306u3Fnak5hb2gs8dpnNo7UL1gUm5pr
+8vJ3xhg15KCjYKz8k6ZDsIWULTXUJ23i8ZwqyQaj1bajwN0+/MfC0ZkoQtQ2I/TH
+cKLSMOR+Tji6n7FjOcVl6VoDKTjdxj9OgAlbZ7W9jEArrUjDdCk/m4jq9h9phpli
+BHoul/nauwtlUnQes1V+39Rk9l7gddKWg3dlwg6CjB5MkmcaeyxgANcyKgrunpg=
+=JYpC
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/public_signer2.pgp b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/public_signer2.pgp
new file mode 100644
index 000000000..0beadf637
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/public_signer2.pgp
@@ -0,0 +1,41 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQGNBGB1hRUBDACuNDnJk8q+E8bZmIKkOCL9HTrj+ZAo2cfFfi/bLD9UsjRBOa21
+ly9oIjDSsmlFMBGX6J/xvwrnWs4lx1YI5yGw0sX9kzBC5ghAE+LVT28OEBkQZciQ
+i87C9ad8NjZYg+/ZUbW8Hrss9yQz18Lu0Abejs7redAxbhqpbtkqArvRGOKgC+P7
+qFuYuywvIoiAmh3OGzY+B39KLspFaavSorMNcxveoNXehCoDk9eI4WGhyng+XV1N
+ZSquRW4GB8zpEDY0a4Dq4bQsK50A3FeYQMC3Ud0mnMcHERLbghtMQC81Isd/0x44
+nOvjozelRxKzq0MowYXFxQ0jDJN26wVH+3FiovTTxfzk1ZyBOBbjT8yA7xHDgvff
+9HMEhCTWyHtxsJIAZrji+pjx4bgPsdvFb7/noQJsP1Ea/ihSl4SSiJk1wrKoQoA4
+3CVdKJ4FIF+v9Kf7ADftGqMdtTHu02AWdT60iu7eKeWY8by2TbsczOTPzb4opWxS
+QnCJwtdUngs+Hs0AEQEAAbQ3RWNsaXBzZSBwMiB0ZXN0IFNpZ25lciAyIDxzaWdu
+ZXIyQGZha2V1c2VyLmVjbGlwc2Uub3JnPokB1AQTAQgAPhYhBFToCk5d9bkVHcBc
+zvkSCo3ck5v0BQJgdYUVAhsDBQkDwmcABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheA
+AAoJEPkSCo3ck5v0THMMAIx1c03u7PsAIXRdi0av9NhvPHjjmYAO+aTxJB3UJFuC
+qvj61rKXZqBPYgZbQUJUTeDqENZ2+fZ/7kKZhFu5X3dmCePUGBfFtHnC6NfEj4Lp
+0+WMYTweoJ6jJQpW2ZqiWVMUgLlGGCbdTTnp9D10qSahaqYBcIgkv/38Qfqx+D3v
+yGrqPiUHUwCjwoXL5fsH7r3iNeJBsPdm+2fbjcuij5wzfXhK79B+xBQ0VEPcJi1K
+bi+QCQC0HUdjc3OSDNSVXbEEgkCNrPPfHz6A14/E0Q+b04OaW2f7yq/p/wwVonh+
+AJomWTk/9bEi1WGahN8WjahHMbycR6Lqm3upyF+/CCiQjUGD0yG2XuGtfoieHvHc
+JF0g2eUAPrRlEtKQfp3Z/UTFAP+bWEhQMlUFLCBXCcPESxzomSkKP/ia0PjE7YvW
+xbV9qgO286EyToqAUqIBEfyxRRv/x3QhtKlTFa8/u/ysJLFx6bVrTdMXC6czbXnr
+yZT9HqkdxqnCP2TNpZWo9rkBjQRgdYUVAQwAyp3Wtn6kUDuBPmYm9jrrvprMYkjB
+PapI7Qq/IsuLJfIRex5Pvj4ro1Hnm/FgEjgiAxDocp81HZ6M0PGG2PYfO444cqdp
+GGW1I4Ak7Wus78rSaBpbd98l5zpQYu1b6XILtXQQRY5rGIrbhlZu/Hpsdb5jf671
+GcFjCj+9UW2qJfQch1z9AU4uDBK/43iqWNjR+5hyVI1PQi4m/kYuuzEpuBwa0Y8U
+WWVbO2GQPYbmnSWnU/5MkBvLC5h3f85Q673byHdQCp5WWV99zSUCrMXb+xM1cCr6
+Q95xt1DstpbM1MgNJXiXs5cvb6LetTFeZGG5N0h7r5Qul20fTCybIV89OPBKvkkM
+WNWwysy8L5mttNEfx78Z64cX/rpfKnS2dtW0G8RYi4JUPVTLekDABQOyVsry8oPJ
+84NM4AoXO8Mln3bvSZgmSaNRJC+lNqX0xbb+42nZ2yR58rmh/mGcuuqdPVxzTeoz
+vPXdDKl2veK/2fuo85mDt/c/QVAzf3uDvRmJABEBAAGJAbwEGAEIACYWIQRU6ApO
+XfW5FR3AXM75EgqN3JOb9AUCYHWFFQIbDAUJA8JnAAAKCRD5EgqN3JOb9JV1C/sE
+GGnSLRnVLurlTw6IFIRH0XXggzFaA6JN3cwTmJK5xCf4sSwyCt67LXQWZ+YTTFt+
+EXo/Yd25tPNyJDBAh1dg7TBkTAIGV3PrPJ6Ixmjoj5Tw2ykaw5fzI37+FjMhB91j
+zNMDpwcth+7+qu/ru6yIJ/AcHqfSKLD9ao38/jIfrfbmcZCb+5ZZCSUoyLRAUjSM
+FqqiRKfy5JiD/qz2ej5rXx4hv1zyq3XauVRC7H5cZAAu4g9mP/ri9YhRelGrjm/V
+mkYMYJ9LS2kMHet7031ldpmcCZfex5ZUR0HLTrF7jBd1bN0VbGXZMIchXgJuVrJq
+7Kw36cjTvP+l46ufWYO+1VArGWk0CKhXIf/MR7C9W9RycZUlWTVGBXrncfvqY5Db
+3SABUJOTRwUyf43G5KCrScx8w7BM0hn+zJyAW9W/GplTfzZ8/SWpbNYSlJStpzvE
+zVUousCk5ERKTp93qYqI/m65zIrxxsaQUc70zUOQdhlWIjDhIRD9JBC+M657iNc=
+=Kto/
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/signed_by_signer_1 b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/signed_by_signer_1
new file mode 100644
index 000000000..a001778a4
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/signed_by_signer_1
@@ -0,0 +1,14 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQHRBAABCAA7FiEE6ZbGcKp/ZUCb9dtWE5442Q3tEfAFAmB1jSEdHHNpZ25lcjFA
+ZmFrZXVzZXIuZWNsaXBzZS5vcmcACgkQE5442Q3tEfDElAv/YEgAwby4DXD3J0ZX
+6iAU2nRjpaUqZ7SAVkOiueeuuxlDw9HnVpIEp/nAOM0OiJrY5h9jQwpLY+p7QmL/
+hWows1fX1PKzpJNATS3bHr+B7qxPkM2N2LKK/ipkknjBXeQIOZyn47nT1nI8/UbA
+UePb5PXDZdIraP6trf5WcsMPxncPntFA4hnPzoVSgvfIYw+Rnjnbsva67grJAe0s
+RJLQatTtPM35n7g3UiNwd09lADPz6u9Ka63GFIf1Prt/mZxsihYq+oJ3xwTudxin
+n2KFCVIw6pCfpXAdYp5CkpbLCBUxyM0TjwphpiVjpa3haqay6iOYcYTubpTcS60S
+Dmz0PE9RCyQq5ycXFPD1UGQKe4C3J/0PzUciT/WzDlxWhM0Wglgez+tYphwDyYHA
+4Q+aSv4FMtKJ/I+RVpgOeF+XApEFwPXB5gw9VtjP9e9uu2T3qEnllrzhfPnNzgY9
+km2tk2WYL2hFdRolQnSfzcimTBaa6GI7dWhMCYe0z1Q0xa1i
+=0YYr
+-----END PGP SIGNATURE-----
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/signed_by_signer_1_otherArtifact b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/signed_by_signer_1_otherArtifact
new file mode 100644
index 000000000..f8c604147
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/signed_by_signer_1_otherArtifact
@@ -0,0 +1,14 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQHRBAABCAA7FiEE6ZbGcKp/ZUCb9dtWE5442Q3tEfAFAmB1+EodHHNpZ25lcjFA
+ZmFrZXVzZXIuZWNsaXBzZS5vcmcACgkQE5442Q3tEfD5LAwAyPl8TBsC0bYZAsRX
+BSGXjlJ+oBKci5VH6bgM/ldnZD5SsYv6PVoxxdOJA2R6S88xxd0DuWivYuG+9aiZ
+w98hx6g0vNH8AWL+yd+l+2yIS8i/MJ57MCvVztexq935fIYU5KGdUNNEjDIrGHQQ
+AR5QWfTiy9EGracG4W6F9twmMOfDlCJ3eRCetp5OTvqBzS2gLom8ECaw7tezYvA/
+09Ok88j7vMI5kL3FO3WzzR+obeYUc19F6602h4cEJs/yOTOj/gz6GCXsAnuYQs1L
+yhjv4Cp4sBnMw+zPX0jFeNHu35mPt8oOFz1NLN85GHO7v3FFXmtwxj8bVBWBQR3R
+Vfi+n8SfR3WO5pYpsqPHZgP95K+W53ere1BZd67cT6uuJDtoDWC6TYPjndm5tnN1
++AzDQO12cC4w2cgIt3ElNYK0T8ADvrmCMPZPRPJ+GeZb0jb871SLDU1MPGZ9NHUl
+hiuiOU3vTN/X/SbZM/Zcz2eahRAOBOc8sXzqcbjQHN/Akzbg
+=acJE
+-----END PGP SIGNATURE-----
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/signed_by_signer_1_tampered b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/signed_by_signer_1_tampered
new file mode 100644
index 000000000..d165ca5a4
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/signed_by_signer_1_tampered
@@ -0,0 +1,14 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQHRBAABCAA7FiEE6ZbGcKp/ZUCb9dtWE5442Q3tEfAFAmB1jSEdHHNpZ25lcjFA
+ZmFrZXVzZXIuZWNsaXBzZS5vcmcACgkQE5442Q3tEfDElAv/YEgAwby4DXD3J0ZX
+6iAU2nRjpaUqZ7SAVkOiueeuuxlDw9HnVpIEp/nAOM0OiJrY5h9jQwpLY+p7QmL/
+hWows1fX1PKzpJNATS3bHr+B7qxPkM2N2LKK/ipkknjBXeQIOZyn47nT1nI8/UbA
+UePb5PXDZdIraP6trf5WcsMPxncPntFA4hnPzoVSgvfIYw+Rnjnbsva67grJAe0s
+RJLQatTtPM35n7g3UiNwd09lADPz6u9Ka63GFIf1Prt/mZxsihYq+oJ3xwTudxin
+n2KFCVIw6pCfpXAdYp5CkpbLCBUxyM0TjwphpiVjpa3haqay6iOYcYTubpTcS60S
+Dmz0PE9RCyQq5ycXFPD1UGQKe4C3J/0PzUciT/WzDlxWhM0Wglgez+tYphwDyYHA
+5Q+aSv4FMtKJ/I+RVpgOeF+XApEFwPXB5gw9VtjP9e9uu2T3qEnllrzhfPnNzgY9
+km2tk2WYL2hFdRolQnSfzcimTBaa6GI7dWhMCYe0z1Q0xa1i
+=0YYr
+-----END PGP SIGNATURE-----
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/signed_by_signer_2 b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/signed_by_signer_2
new file mode 100644
index 000000000..056858dbd
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/signed_by_signer_2
@@ -0,0 +1,14 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQHRBAABCAA7FiEEVOgKTl31uRUdwFzO+RIKjdyTm/QFAmB1jTEdHHNpZ25lcjJA
+ZmFrZXVzZXIuZWNsaXBzZS5vcmcACgkQ+RIKjdyTm/REpQv8DJeanIGgPjvV09sP
+BCBTSbHjoV6b5N6vjc15yZhBcWLJe0PAvApdCt0t7E4kTIKOqAz1sABB6YmJjGOZ
+SLL3AToVPk30b07Eq4qgOjEkb3pGlpVFshxEmtrLpbVy068774wacW+PLpvgP0FN
+7v0MlCbdcTBA18MVE3eraA14KL+yfLFkEgdtHSpZ6jzhRcQZexKJRpnS7/Bcah80
+RMZ69/N4HPWTo3ys7ELyeDC80P8B35fcayPLJVsFUgrUQ74UsIUwsaUQwoRNuZYR
+RSizHrJxkLhfYY5CMFTh9Bl1odY/kiXdBGw2Cqk02K3BlwFMsw5mK4CRtoagpGRO
+l1mX58sWjrE+J0tla6MG9aDZiUBdQzFoDGIppex5Bq9ePDcB6CCjR5HO4t7xIg5d
+1/pZly/T0kACgzrbfY3IkBVtL0Fv+PCOJRkmTqw2Lvo3Nhq18TTyZWQLqaZQt/Tc
+dmZVisxh4YbI8wpTRYh3jSlKJ1YYwlj6/QMG7t2UI9B2jg+7
+=8i0n
+-----END PGP SIGNATURE-----
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/testArtifact b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/testArtifact
new file mode 100644
index 000000000..fd80c131c
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/processors/testArtifact
@@ -0,0 +1 @@
+Hello! Please don't modify me because I'm signed for tests and modifying me in any way would make tests fail \ No newline at end of file
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/AllTests.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/AllTests.java
index fac04a26a..0abfcc708 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/AllTests.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/AllTests.java
@@ -26,7 +26,7 @@ import org.junit.runners.Suite;
BatchExecuteArtifactRepositoryTest.class, Bug252308.class, Bug265577.class, Bug351944.class,
CompositeArtifactRepositoryTest.class, CorruptedJar.class, FoldersRepositoryTest.class,
JarURLArtifactRepositoryTest.class, LocationTest.class, MD5Tests.class, MirrorSelectorTest.class,
- MirrorRequestTest.class, SimpleArtifactRepositoryTest.class, TransferTest.class
+ MirrorRequestTest.class, SimpleArtifactRepositoryTest.class, TransferTest.class, PGPVerifierTest.class
})
public class AllTests {
// test suite
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/CompositeArtifactRepositoryTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/CompositeArtifactRepositoryTest.java
index f41b886d1..36fb61c1e 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/CompositeArtifactRepositoryTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/CompositeArtifactRepositoryTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2017 IBM Corporation and others.
+ * Copyright (c) 2008, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -53,7 +53,7 @@ import org.eclipse.equinox.internal.p2.metadata.ArtifactKey;
import org.eclipse.equinox.internal.p2.persistence.CompositeRepositoryState;
import org.eclipse.equinox.internal.p2.repository.Transport;
import org.eclipse.equinox.p2.core.ProvisionException;
-import org.eclipse.equinox.p2.internal.repository.comparator.MD5ArtifactComparator;
+import org.eclipse.equinox.p2.internal.repository.comparator.ArtifactChecksumComparator;
import org.eclipse.equinox.p2.internal.repository.tools.ArtifactRepositoryValidator;
import org.eclipse.equinox.p2.metadata.IArtifactKey;
import org.eclipse.equinox.p2.metadata.Version;
@@ -71,6 +71,7 @@ import org.eclipse.equinox.p2.tests.TestArtifactRepository;
import org.eclipse.equinox.spi.p2.publisher.PublisherHelper;
public class CompositeArtifactRepositoryTest extends AbstractProvisioningTest {
+ private static final String COMPARATOR_ID = ArtifactChecksumComparator.COMPARATOR_ID + ".md5";
private static final String TEST_KEY = "TestKey";
private static final String TEST_VALUE = "TestValue";
//artifact repository to remove on tear down
@@ -756,7 +757,8 @@ public class CompositeArtifactRepositoryTest extends AbstractProvisioningTest {
compRepo.addChild(repo2Location.toURI());
//validate using the MD5 Comparator
- ArtifactRepositoryValidator validator = new ArtifactRepositoryValidator(MD5ArtifactComparator.MD5_COMPARATOR_ID);
+ ArtifactRepositoryValidator validator = new ArtifactRepositoryValidator(
+ COMPARATOR_ID);
assertFalse("Running verify on invalid repository", validator.validateComposite(compRepo).isOK());
}
@@ -791,7 +793,8 @@ public class CompositeArtifactRepositoryTest extends AbstractProvisioningTest {
}
//Add conflicting repositories
- ArtifactRepositoryValidator validator = new ArtifactRepositoryValidator(MD5ArtifactComparator.MD5_COMPARATOR_ID);
+ ArtifactRepositoryValidator validator = new ArtifactRepositoryValidator(
+ COMPARATOR_ID);
assertTrue(validator.validateComposite(compRepo, repo1).isOK());
compRepo.addChild(repo1Location.toURI());
assertFalse(validator.validateComposite(compRepo, repo2).isOK());
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/MirrorSelectorTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/MirrorSelectorTest.java
index 527fbc098..154400956 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/MirrorSelectorTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/MirrorSelectorTest.java
@@ -38,223 +38,223 @@ public class MirrorSelectorTest {
originals = new ArrayList<>();
MirrorInfo mi = null;
- mi = new MirrorInfo("http://ftp.wh2.tu-dresden.de/pub/mirrors/eclipse/", 3);
+ mi = new MirrorInfo("https://ftp.wh2.tu-dresden.de/pub/mirrors/eclipse/", 3);
mi.setBytesPerSecond(224906);
mi.incrementFailureCount();
//mi.totalFailureCount = 1;
originals.add(mi);
- mi = new MirrorInfo("http://ftp-stud.fht-esslingen.de/pub/Mirrors/eclipse/", 1);
+ mi = new MirrorInfo("https://ftp-stud.fht-esslingen.de/pub/Mirrors/eclipse/", 1);
mi.setBytesPerSecond(125868);
mi.incrementFailureCount();
//mi.totalFailureCount = 1;
originals.add(mi);
- mi = new MirrorInfo("http://mirror.netcologne.de/eclipse//", 0);
+ mi = new MirrorInfo("https://mirror.netcologne.de/eclipse//", 0);
mi.setBytesPerSecond(199719);
mi.incrementFailureCount();
mi.incrementFailureCount();
//mi.totalFailureCount = 2;
originals.add(mi);
- mi = new MirrorInfo("http://mirror.selfnet.de/eclipse/", 5);
+ mi = new MirrorInfo("https://mirror.selfnet.de/eclipse/", 5);
mi.setBytesPerSecond(132379);
mi.incrementFailureCount();
//mi.totalFailureCount = 1;
originals.add(mi);
- mi = new MirrorInfo("http://mirror.switch.ch/eclipse/", 7);
+ mi = new MirrorInfo("https://mirror.switch.ch/eclipse/", 7);
mi.setBytesPerSecond(137107);
mi.incrementFailureCount();
//mi.totalFailureCount = 1;
originals.add(mi);
- mi = new MirrorInfo("http://www.rcp-vision.com/eclipse/eclipseMirror/", 8);
+ mi = new MirrorInfo("https://www.rcp-vision.com/eclipse/eclipseMirror/", 8);
mi.setBytesPerSecond(128472);
mi.incrementFailureCount();
//mi.totalFailureCount = 1;
originals.add(mi);
- mi = new MirrorInfo("http://eclipse.mirror.garr.it/mirrors/eclipse//", 10);
+ mi = new MirrorInfo("https://eclipse.mirror.garr.it/mirrors/eclipse//", 10);
mi.setBytesPerSecond(129359);
mi.incrementFailureCount();
mi.incrementFailureCount();
//mi.totalFailureCount = 2;
originals.add(mi);
- mi = new MirrorInfo("http://ftp.roedu.net/pub/mirrors/eclipse.org/", 6);
+ mi = new MirrorInfo("https://ftp.roedu.net/pub/mirrors/eclipse.org/", 6);
mi.setBytesPerSecond(59587);
mi.incrementFailureCount();
//mi.totalFailureCount = 1;
originals.add(mi);
- mi = new MirrorInfo("http://giano.com.dist.unige.it/eclipse/", 9);
+ mi = new MirrorInfo("https://giano.com.dist.unige.it/eclipse/", 9);
mi.setBytesPerSecond(85624);
mi.incrementFailureCount();
//mi.totalFailureCount = 1;
originals.add(mi);
- mi = new MirrorInfo("http://ftp.roedu.net/mirrors/eclipse.org//", 19);
+ mi = new MirrorInfo("https://ftp.roedu.net/mirrors/eclipse.org//", 19);
mi.setBytesPerSecond(149572);
mi.incrementFailureCount();
mi.incrementFailureCount();
//mi.totalFailureCount = 2;
originals.add(mi);
- mi = new MirrorInfo("http://ftp.ing.umu.se/mirror/eclipse/", 18);
+ mi = new MirrorInfo("https://ftp.ing.umu.se/mirror/eclipse/", 18);
mi.setBytesPerSecond(105858);
mi.incrementFailureCount();
//mi.totalFailureCount = 1;
originals.add(mi);
- mi = new MirrorInfo("http://mirrors.fe.up.pt/pub/eclipse//", 15);
+ mi = new MirrorInfo("https://mirrors.fe.up.pt/pub/eclipse//", 15);
mi.setBytesPerSecond(67202);
mi.incrementFailureCount();
//mi.totalFailureCount = 1;
originals.add(mi);
- mi = new MirrorInfo("http://ftp.heanet.ie/pub/eclipse//", 17);
+ mi = new MirrorInfo("https://ftp.heanet.ie/pub/eclipse//", 17);
mi.setBytesPerSecond(68067);
mi.incrementFailureCount();
//mi.totalFailureCount = 1;
originals.add(mi);
- mi = new MirrorInfo("http://ftp.sh.cvut.cz/MIRRORS/eclipse/", 21);
+ mi = new MirrorInfo("https://ftp.sh.cvut.cz/MIRRORS/eclipse/", 21);
mi.setBytesPerSecond(73659);
mi.incrementFailureCount();
//mi.totalFailureCount = 1;
originals.add(mi);
- mi = new MirrorInfo("http://ftp.man.poznan.pl/eclipse/", 22);
+ mi = new MirrorInfo("https://ftp.man.poznan.pl/eclipse/", 22);
mi.setBytesPerSecond(73446);
mi.incrementFailureCount();
//mi.totalFailureCount = 1;
originals.add(mi);
- mi = new MirrorInfo("http://eclipse.dcc.fc.up.pt/", 16);
+ mi = new MirrorInfo("https://eclipse.dcc.fc.up.pt/", 16);
mi.setBytesPerSecond(45175);
mi.incrementFailureCount();
//mi.totalFailureCount = 1;
originals.add(mi);
- mi = new MirrorInfo("http://eclipse.nordnet.fi/eclipse/", 23);
+ mi = new MirrorInfo("https://eclipse.nordnet.fi/eclipse/", 23);
mi.setBytesPerSecond(61443);
mi.incrementFailureCount();
//mi.totalFailureCount = 1;
originals.add(mi);
- mi = new MirrorInfo("http://www.gtlib.gatech.edu/pub/eclipse/", 26);
+ mi = new MirrorInfo("https://www.gtlib.gatech.edu/pub/eclipse/", 26);
mi.setBytesPerSecond(57637);
mi.incrementFailureCount();
//mi.totalFailureCount = 1;
originals.add(mi);
- mi = new MirrorInfo("http://ftp.osuosl.org/pub/eclipse//", 28);
+ mi = new MirrorInfo("https://ftp.osuosl.org/pub/eclipse//", 28);
mi.setBytesPerSecond(35928);
mi.incrementFailureCount();
//mi.totalFailureCount = 1;
originals.add(mi);
- mi = new MirrorInfo("http://mirrors.med.harvard.edu/eclipse//", 32);
+ mi = new MirrorInfo("https://mirrors.med.harvard.edu/eclipse//", 32);
mi.setBytesPerSecond(40683);
//mi.totalFailureCount = 0;
originals.add(mi);
- mi = new MirrorInfo("http://mirrors.ibiblio.org/pub/mirrors/eclipse/", 31);
+ mi = new MirrorInfo("https://mirrors.ibiblio.org/pub/mirrors/eclipse/", 31);
mi.setBytesPerSecond(34207);
mi.incrementFailureCount();
mi.incrementFailureCount();
//mi.totalFailureCount = 2;
originals.add(mi);
- mi = new MirrorInfo("http://ftp.ussg.iu.edu/eclipse/", 33);
+ mi = new MirrorInfo("https://ftp.ussg.iu.edu/eclipse/", 33);
mi.setBytesPerSecond(31402);
mi.incrementFailureCount();
//mi.totalFailureCount = 1;
originals.add(mi);
- mi = new MirrorInfo("http://mirrors.xmission.com/eclipse/", 29);
+ mi = new MirrorInfo("https://mirrors.xmission.com/eclipse/", 29);
mi.setBytesPerSecond(24147);
mi.incrementFailureCount();
//mi.totalFailureCount = 1;
originals.add(mi);
- mi = new MirrorInfo("http://ftp.osuosl.org/pub/eclipse/", 34);
+ mi = new MirrorInfo("https://ftp.osuosl.org/pub/eclipse/", 34);
mi.setBytesPerSecond(-1);
//mi.totalFailureCount = 0;
originals.add(mi);
- mi = new MirrorInfo("http://www.ftp.saix.net/Eclipse//", 40);
+ mi = new MirrorInfo("https://www.ftp.saix.net/Eclipse//", 40);
mi.setBytesPerSecond(-1);
//mi.totalFailureCount = 0;
originals.add(mi);
- mi = new MirrorInfo("http://ftp.daum.net/eclipse/", 41);
+ mi = new MirrorInfo("https://ftp.daum.net/eclipse/", 41);
mi.setBytesPerSecond(-1);
//mi.totalFailureCount = 0;
originals.add(mi);
- mi = new MirrorInfo("http://eclipse.stu.edu.tw/", 43);
+ mi = new MirrorInfo("https://eclipse.stu.edu.tw/", 43);
mi.setBytesPerSecond(-1);
//mi.totalFailureCount = 0;
originals.add(mi);
- mi = new MirrorInfo("http://eclipse.stu.edu.tw/", 44);
+ mi = new MirrorInfo("https://eclipse.stu.edu.tw/", 44);
mi.setBytesPerSecond(-1);
//mi.totalFailureCount = 0;
originals.add(mi);
- mi = new MirrorInfo("http://ftp.kaist.ac.kr/eclipse/", 45);
+ mi = new MirrorInfo("https://ftp.kaist.ac.kr/eclipse/", 45);
mi.setBytesPerSecond(-1);
//mi.totalFailureCount = 0;
originals.add(mi);
- mi = new MirrorInfo("http://eclipse.stu.edu.tw//", 46);
+ mi = new MirrorInfo("https://eclipse.stu.edu.tw//", 46);
mi.setBytesPerSecond(-1);
//mi.totalFailureCount = 0;
originals.add(mi);
- mi = new MirrorInfo("http://ftp.tsukuba.wide.ad.jp/software/eclipse//", 47);
+ mi = new MirrorInfo("https://ftp.tsukuba.wide.ad.jp/software/eclipse//", 47);
mi.setBytesPerSecond(-1);
//mi.totalFailureCount = 0;
originals.add(mi);
- mi = new MirrorInfo("http://mirror.neu.edu.cn/eclipse/", 50);
+ mi = new MirrorInfo("https://mirror.neu.edu.cn/eclipse/", 50);
mi.setBytesPerSecond(-1);
//mi.totalFailureCount = 0;
originals.add(mi);
- mi = new MirrorInfo("http://mirror.bit.edu.cn/eclipse/", 51);
+ mi = new MirrorInfo("https://mirror.bit.edu.cn/eclipse/", 51);
mi.setBytesPerSecond(-1);
//mi.totalFailureCount = 0;
originals.add(mi);
- mi = new MirrorInfo("http://ftp.cs.pu.edu.tw/pub/eclipse/", 52);
+ mi = new MirrorInfo("https://ftp.cs.pu.edu.tw/pub/eclipse/", 52);
mi.setBytesPerSecond(-1);
//mi.totalFailureCount = 0;
originals.add(mi);
- mi = new MirrorInfo("http://ftp.neu.edu.cn/mirrors/eclipse/", 53);
+ mi = new MirrorInfo("https://ftp.neu.edu.cn/mirrors/eclipse/", 53);
mi.setBytesPerSecond(-1);
//mi.totalFailureCount = 0;
originals.add(mi);
- mi = new MirrorInfo("http://download.actuatechina.com/eclipse/", 54);
+ mi = new MirrorInfo("https://download.actuatechina.com/eclipse/", 54);
mi.setBytesPerSecond(-1);
//mi.totalFailureCount = 0;
originals.add(mi);
- mi = new MirrorInfo("http://linorg.usp.br/eclipse/", 57);
+ mi = new MirrorInfo("https://linorg.usp.br/eclipse/", 57);
mi.setBytesPerSecond(-1);
//mi.totalFailureCount = 0;
originals.add(mi);
- mi = new MirrorInfo("http://eclipse.c3sl.ufpr.br/", 59);
+ mi = new MirrorInfo("https://eclipse.c3sl.ufpr.br/", 59);
mi.setBytesPerSecond(-1);
//mi.totalFailureCount = 0;
originals.add(mi);
- mi = new MirrorInfo("http://download.eclipse.org/", 61);
+ mi = new MirrorInfo("https://download.eclipse.org/", 61);
mi.setBytesPerSecond(-1);
//mi.totalFailureCount = 0;
originals.add(mi);
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/PGPVerifierTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/PGPVerifierTest.java
new file mode 100644
index 000000000..0d4525b23
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/PGPVerifierTest.java
@@ -0,0 +1,132 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Red Hat Inc. 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
+ *******************************************************************************/
+package org.eclipse.equinox.p2.tests.artifact.repository;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Comparator;
+import java.util.Set;
+import java.util.stream.Stream;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.equinox.internal.p2.artifact.processors.pgp.PGPSignatureVerifier;
+import org.eclipse.equinox.internal.p2.artifact.repository.MirrorRequest;
+import org.eclipse.equinox.internal.p2.metadata.ArtifactKey;
+import org.eclipse.equinox.internal.provisional.p2.repository.DefaultPGPPublicKeyService;
+import org.eclipse.equinox.p2.core.IAgentLocation;
+import org.eclipse.equinox.p2.metadata.Version;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
+import org.eclipse.equinox.p2.repository.spi.PGPPublicKeyService;
+import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class PGPVerifierTest extends AbstractProvisioningTest {
+ IArtifactRepository targetRepo = null;
+ IArtifactRepository sourceRepo = null;
+
+ @Override
+ @Before
+ public void setUp() throws Exception {
+ super.setUp();
+ }
+
+ private void loadPGPTestRepo(String repoName) throws Exception {
+ sourceRepo = getArtifactRepositoryManager().loadRepository(
+ getTestData("Test repository for PGP", "testData/pgp/" + repoName).toURI(), new NullProgressMonitor());
+ targetRepo = createArtifactRepository(Files.createTempDirectory(PGPVerifierTest.class.getSimpleName()).toUri(),
+ NO_PROPERTIES);
+ }
+
+ @Test
+ public void testAllGood() throws Exception {
+ MirrorRequest mirrorRequest = performMirrorFrom("repoPGPOK");
+ IStatus mirrorStatus = mirrorRequest.getResult();
+ assertOK(mirrorStatus);
+
+ IArtifactDescriptor[] artifactDescriptors = targetRepo.getArtifactDescriptors(mirrorRequest.getArtifactKey());
+ Assert.assertEquals(1, artifactDescriptors.length);
+ IArtifactDescriptor descriptor = artifactDescriptors[0];
+ Assert.assertNotNull("Signatures should be present",
+ descriptor.getProperty(PGPSignatureVerifier.PGP_SIGNATURES_PROPERTY_NAME));
+ Assert.assertNotNull("Keys should be present",
+ descriptor.getProperty(PGPSignatureVerifier.PGP_SIGNER_KEYS_PROPERTY_NAME));
+ }
+
+ @Test
+ public void testAllGoodWithEncodedProperties() throws Exception {
+ MirrorRequest mirrorRequest = performMirrorFrom("repoPGPOK_encoded");
+ IStatus mirrorStatus = mirrorRequest.getResult();
+ assertOK(mirrorStatus);
+
+ IArtifactDescriptor[] artifactDescriptors = targetRepo.getArtifactDescriptors(mirrorRequest.getArtifactKey());
+ Assert.assertEquals(1, artifactDescriptors.length);
+ IArtifactDescriptor descriptor = artifactDescriptors[0];
+ Assert.assertNotNull("Signatures should be present",
+ descriptor.getProperty(PGPSignatureVerifier.PGP_SIGNATURES_PROPERTY_NAME));
+ Assert.assertNotNull("Keys should be present",
+ descriptor.getProperty(PGPSignatureVerifier.PGP_SIGNER_KEYS_PROPERTY_NAME));
+ }
+
+ private MirrorRequest performMirrorFrom(String repoName) throws Exception {
+ // Clear the remembered keys/cache of the agent.
+ IAgentLocation agentLocation = getAgent().getService(IAgentLocation.class);
+ Path repositoryCache = Paths
+ .get(agentLocation.getDataArea(org.eclipse.equinox.internal.p2.repository.Activator.ID));
+ if (Files.isDirectory(repositoryCache)) {
+ try (Stream<Path> walk = Files.walk(repositoryCache)) {
+ walk.sorted(Comparator.reverseOrder()).forEach(path -> {
+ try {
+ Files.delete(path);
+ } catch (IOException e) {
+ // Ignore
+ }
+ });
+ }
+ }
+ DefaultPGPPublicKeyService keyService = new DefaultPGPPublicKeyService(getAgent());
+ keyService.setGPG(false);
+ keyService.setKeyServers(Set.of());
+
+ getAgent().registerService(PGPPublicKeyService.SERVICE_NAME, keyService);
+ loadPGPTestRepo(repoName);
+ ArtifactKey key = new ArtifactKey("osgi.bundle", "blah", Version.create("1.0.0.123456"));
+ MirrorRequest mirrorRequest = new MirrorRequest(key, targetRepo, NO_PROPERTIES, NO_PROPERTIES, getTransport());
+ mirrorRequest.perform(sourceRepo, getMonitor());
+ return mirrorRequest;
+ }
+
+ @Test
+ public void testMissingPublicKey() throws Exception {
+ MirrorRequest mirrorRequest = performMirrorFrom("repoMissingPublicKey");
+ IStatus mirrorStatus = mirrorRequest.getResult();
+ assertOK(mirrorStatus);
+
+ IArtifactDescriptor[] artifactDescriptors = targetRepo.getArtifactDescriptors(mirrorRequest.getArtifactKey());
+ Assert.assertEquals(1, artifactDescriptors.length);
+ IArtifactDescriptor descriptor = artifactDescriptors[0];
+ Assert.assertNull("Signatures should not be present",
+ descriptor.getProperty(PGPSignatureVerifier.PGP_SIGNATURES_PROPERTY_NAME));
+ Assert.assertNull("Keys should not be present",
+ descriptor.getProperty(PGPSignatureVerifier.PGP_SIGNER_KEYS_PROPERTY_NAME));
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ getArtifactRepositoryManager().removeRepository(sourceRepo.getLocation());
+ getArtifactRepositoryManager().removeRepository(targetRepo.getLocation());
+ super.tearDown();
+ }
+}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/SimpleArtifactRepositoryTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/SimpleArtifactRepositoryTest.java
index 6c1d4f87a..c398b0025 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/SimpleArtifactRepositoryTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/SimpleArtifactRepositoryTest.java
@@ -256,6 +256,7 @@ public class SimpleArtifactRepositoryTest extends AbstractProvisioningTest {
/*
* Test that the appropriate location for a packed feature is returned.
*/
+ @Deprecated(forRemoval = true)
public void testProperPackedFeatureLocation() {
try {
repositoryFile = getTempFolder();
@@ -423,6 +424,7 @@ public class SimpleArtifactRepositoryTest extends AbstractProvisioningTest {
System.out.println("Total time: " + (end - start));
}
+ @SuppressWarnings("removal")
public void testQuery() throws Exception {
File folder = getTestFolder("ArtifactRepository_testQuery");
repositoryURI = folder.toURI();
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/TransferTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/TransferTest.java
index 6af6b822c..dd7b38315 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/TransferTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/TransferTest.java
@@ -41,7 +41,8 @@ public class TransferTest extends AbstractProvisioningTest {
} catch (BundleException e) {
fail("1.5", e);
}
- final URI toDownload = new URI("http://download.eclipse.org/eclipse/updates/4.11/R-4.11-201903070500/plugins/javax.servlet.jsp_2.2.0.v201112011158.jar.pack.gz");
+ final URI toDownload = new URI(
+ "https://download.eclipse.org/eclipse/updates/4.11/R-4.11-201903070500/plugins/javax.servlet.jsp_2.2.0.v201112011158.jar.pack.gz");
IStatus s = getTransport().download(toDownload, fos, new NullProgressMonitor());
assertOK("2.0", s);
int httpSize = -1;
@@ -56,7 +57,9 @@ public class TransferTest extends AbstractProvisioningTest {
try {
fos.close();
if (f != null) {
- String[] ecfPlugins = new String[] {"org.eclipse.ecf", "org.eclipse.ecf.identity", "org.eclipse.ecf.filetransfer", "org.eclipse.ecf.provider.filetransfer", "org.eclipse.ecf.provider.filetransfer.httpclient45"};
+ String[] ecfPlugins = new String[] { "org.eclipse.ecf", "org.eclipse.ecf.identity",
+ "org.eclipse.ecf.filetransfer", "org.eclipse.ecf.provider.filetransfer",
+ "org.eclipse.ecf.provider.filetransfer.httpclient5" };
StringBuilder buffer = new StringBuilder();
for (String ecfPlugin : ecfPlugins) {
Bundle bundle = Platform.getBundle(ecfPlugin);
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/processing/ProcessingStepHandlerTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/processing/ProcessingStepHandlerTest.java
index 749403ee0..c5706241b 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/processing/ProcessingStepHandlerTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/artifact/repository/processing/ProcessingStepHandlerTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
-* Copyright (c) 2007, 2020 compeople AG and others.
+* Copyright (c) 2007, 2021 compeople AG and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -44,6 +44,7 @@ import org.eclipse.equinox.p2.repository.artifact.spi.ProcessingStepDescriptor;
import org.eclipse.equinox.p2.tests.TestActivator;
import org.junit.Test;
+@SuppressWarnings("removal")
public class ProcessingStepHandlerTest {
// private static final int BUFFER_SIZE = 8 * 1024;
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/core/BackupTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/core/BackupTest.java
index daf3a5020..30faf7e96 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/core/BackupTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/core/BackupTest.java
@@ -13,297 +13,189 @@
*******************************************************************************/
package org.eclipse.equinox.p2.tests.core;
-import java.io.*;
-import org.eclipse.equinox.internal.p2.touchpoint.natives.BackupStore;
+import static java.nio.file.FileVisitResult.CONTINUE;
+import static java.nio.file.StandardOpenOption.CREATE_NEW;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import org.eclipse.equinox.internal.p2.touchpoint.natives.SimpleBackupStore;
import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
public class BackupTest extends AbstractProvisioningTest {
- private static final String BUPREFIX = "BackupTest";
- private File sourceDir;
- private File aDir;
- private File aaDir;
- private File bDir;
- private File aTxt;
- private File bTxt;
- private File abDir;
- private File cTxt;
- private File cTxtRelative;
+ private static final String BUPREFIX = "backup-test";
+
+ private Path sourceDir;
+
+ private Path aDir;
+ private Path aaDir;
+ private Path aTxt;
+
+ private Path bDir;
+ private Path bTxt;
+
+ private Path abDir;
+
+ private Path cTxt;
+
+ private SimpleBackupStore store;
/**
- * Sets up directories and files under user.home
- * <ul><li>P2BUTEST/</li>
- * <ul><li>A/</li>
- * <ul><li>AA/</li>
- * <ul><li>a.txt</li>
- * <li>b.txt</li>
- * </ul>
- * </ul>
- * <li>B/</li>
- * </ul>
- * </ul>
+ * <pre>
+ * /p2-backup-test
+ * /a
+ * /aa
+ * /a.txt
+ * /b.txt
+ * /ab
+ * /c.txt
+ * /b
+ * </pre>
*/
@Override
- public void setUp() {
- // create some test files under user.home
- // do not want them under /tmp as it may be on its own file system (and even
- // be an in-memory file system).
- //
+ public void setUp() throws IOException {
+ // Don't want to backup under /tmp since it may be it's own file system or an
+ // in-memory file system
String userHome = System.getProperty("user.home");
- sourceDir = new File(new File(userHome), "P2BUTEST");
- aDir = new File(sourceDir, "A");
- aDir.mkdirs();
- aaDir = new File(aDir, "AA");
- aaDir.mkdir();
- abDir = new File(aDir, "AB");
- abDir.mkdir();
-
- bDir = new File(sourceDir, "B");
- bDir.mkdirs();
- aTxt = new File(aaDir, "a.txt");
- bTxt = new File(aaDir, "b.txt");
- cTxt = new File(abDir, "c.txt");
- cTxtRelative = new File(aaDir, "../AB/c.txt");
- try {
- writeToFile(aTxt, "A\nA file with an A");
- writeToFile(bTxt, "B\nA file with a B");
- writeToFile(cTxt, "C\nA file with a C");
- } catch (IOException e) {
- fail();
- }
- }
+ sourceDir = Path.of(userHome, "p2-backup-test");
+ deleteAll(sourceDir);
- private void writeToFile(File file, String content) throws IOException {
- file.getParentFile().mkdirs();
- file.createNewFile();
+ aDir = sourceDir.resolve("a");
+ Files.createDirectories(aDir);
- try (Writer writer = new BufferedWriter(new FileWriter(file))) {
- writer.write(content);
- }
+ aaDir = aDir.resolve("aa");
+ Files.createDirectories(aaDir);
+
+ aTxt = aaDir.resolve("a.txt");
+ Files.write(aTxt, "A\nA file with an A".getBytes());
+
+ bTxt = aaDir.resolve("b.txt");
+ Files.write(bTxt, "B\nA file with a B".getBytes());
+
+ abDir = aDir.resolve("ab");
+ Files.createDirectories(abDir);
+
+ cTxt = abDir.resolve("c.txt");
+ Files.write(cTxt, "C\nA file with a C".getBytes());
+
+ bDir = sourceDir.resolve("b");
+ Files.createDirectories(bDir);
+
+ store = new SimpleBackupStore(null, BUPREFIX);
}
@Override
- public void tearDown() {
- fullyDelete(sourceDir);
+ public void tearDown() throws IOException {
+ deleteAll(sourceDir);
}
- /**
- * Deletes a file, or a directory with all of it's children.
- * @param file the file or directory to fully delete
- * @return true if, and only if the file is deleted
- */
- private boolean fullyDelete(File file) {
- if (!file.exists())
- return true;
- if (file.isDirectory()) {
- File[] children = file.listFiles();
- for (File child : children) {
- if (!fullyDelete(new File(file, child.getName()))) {
- return false;
+ private static void deleteAll(Path path) throws IOException {
+ if (!Files.exists(path)) {
+ return;
+ }
+
+ Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+ Files.delete(file);
+ return CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+ if (exc != null) {
+ throw exc;
}
+ Files.delete(dir);
+ return CONTINUE;
}
- }
- return file.delete();
+ });
}
/**
* Test that a path containing ".." can be backed up and restored.
*/
- public void testBackupRelative() {
- BackupStore store = new BackupStore(null, BUPREFIX);
- // backup and overwrite a.txt
- try {
- store.backup(cTxtRelative);
- } catch (IOException e) {
- e.printStackTrace();
- fail("IO Exception when backing up cTxtRelative");
- }
- if (cTxt.exists())
- fail("File not moved to backup - still exists");
- try {
- writeToFile(cTxt, "XXXX\n- This file should be restored with C");
- } catch (IOException e) {
- e.printStackTrace();
- fail("Could not write a file for testing purposes.");
- }
+ public void testBackupRelative() throws IOException {
+ Path cTxtRelative = aaDir.resolve(aaDir.relativize(cTxt));
- // restore
- try {
- store.restore();
- } catch (IOException e) {
- e.printStackTrace();
- fail("Restore operation failed with IOException");
- }
- // assert restore
- assertFileContent("Restore of C failed - not original content", cTxt, "C");
+ store.backup(cTxtRelative.toFile());
+ assertFalse(Files.exists(cTxt));
+
+ Files.write(cTxt, "XXXX\n- This file should be restored with C".getBytes());
+
+ store.restore();
+ assertFileContent("Restore of C failed - not original content", cTxt.toFile(), "C");
assertNoGarbage(store);
}
- public void testBackupRestore() {
- BackupStore store = new BackupStore(null, BUPREFIX);
- // backup and overwrite a.txt
- try {
- store.backup(aTxt);
- } catch (IOException e) {
- e.printStackTrace();
- fail("IO Exception when backing up aTxt");
- }
- if (aTxt.exists())
- fail("File not moved to backup - still exists");
- try {
- writeToFile(aTxt, "XXXX\n- This file should be restored with A");
- } catch (IOException e) {
- e.printStackTrace();
- fail("Could not write a file for testing purposes.");
- }
+ public void testBackupRestore() throws IOException {
+ store.backup(aTxt.toFile());
+ assertFalse("File not moved to backup - still exists", Files.exists(aTxt));
- // backup the empty B directory
- try {
- store.backup(bDir);
- } catch (IOException e) {
- e.printStackTrace();
- fail("IO Exception when backing up bDir");
- }
- if (bDir.exists())
- fail("Backed up directory was not moved");
-
- // backup b as a copy
- try {
- store.backupCopy(bTxt);
- assertFileContent("File should have been copied", bTxt, "B");
- } catch (IOException e) {
- fail("Could not backupCopy bTxt");
- }
+ Files.write(aTxt, "XXXX\n- This file should be restored with A".getBytes());
- // restore
- try {
- store.restore();
- } catch (IOException e) {
- e.printStackTrace();
- fail("Restore operation failed with IOException");
- }
+ store.backup(bDir.toFile());
+ assertFalse("Backed up directory was not moved", Files.isDirectory(bDir));
- // assert restore
- assertFileContent("Restore of A failed - not original content", aTxt, "A");
- if (!bDir.isDirectory() && bDir.listFiles().length != 0)
- fail("Empty directory not restored ok");
+ store.backupCopy(bTxt.toFile());
+ assertFileContent("File should have been copied", bTxt.toFile(), "B");
+ store.restore();
+ assertFileContent("Restore of A failed - not original content", aTxt.toFile(), "A");
+ assertTrue("Empty directory not restored ok", Files.isDirectory(bDir) && Files.list(bDir).count() == 0);
assertNoGarbage(store);
}
- public void testBackupDiscard() {
- BackupStore store = new BackupStore(null, BUPREFIX);
- // backup and overwrite a.txt
- try {
- store.backup(aTxt);
- } catch (IOException e) {
- e.printStackTrace();
- fail("IO Exception when backing up aTxt");
- }
- if (aTxt.exists())
- fail("File not moved to backup - still exists");
- try {
- writeToFile(aTxt, "XXXX\n- This file should be restored with A");
- } catch (IOException e) {
- e.printStackTrace();
- fail("Could not write a file for testing purposes.");
- }
-
- // backup the empty B directory
- try {
- store.backup(bDir);
- } catch (IOException e) {
- e.printStackTrace();
- fail("IO Exception when backing up bDir");
- }
- if (bDir.exists())
- fail("Backed up directory was not moved");
+ public void testBackupDiscard() throws IOException {
+ store.backup(aTxt.toFile());
+ assertFalse("File not moved to backup - still exists", Files.exists(aTxt));
- // restore
- store.discard();
+ Files.write(aTxt, "XXXX\n- This file should be restored with A".getBytes());
- // assert discard
- assertFileContent("Discard of A failed - not new content", aTxt, "XXXX");
- if (bDir.isDirectory())
- fail("Remove of empty directory not discarded ok");
+ store.backup(bDir.toFile());
+ assertFalse("Backed up directory was not moved", Files.exists(bDir));
+ store.discard();
+ assertFileContent("Discard of a.txt failed - not new content", aTxt.toFile(), "XXXX");
+ assertFalse("Empty directory not discarded - still exists", Files.isDirectory(bDir));
assertNoGarbage(store);
}
- public void testBackupAll() {
- BackupStore store = new BackupStore(null, BUPREFIX);
- // backup and overwrite a.txt
- try {
- store.backupAll(aDir);
- } catch (IOException e) {
- e.printStackTrace();
- fail("IO Exception when backing up aDir");
- }
- if (aTxt.exists())
- fail("File not moved to backup - still exists");
- if (bTxt.exists())
- fail("File bTxt not moved to backup - still exists");
-
- try {
- writeToFile(aTxt, "XXXX\n- This file should be restored with A");
- } catch (IOException e) {
- e.printStackTrace();
- fail("Could not write a file for testing purposes.");
- }
- try {
- store.restore();
- } catch (IOException e) {
- fail("Restore failed");
- }
- assertFileContent("A not restored", aTxt, "A");
- assertFileContent("B not restored", bTxt, "B");
+ public void testBackupAll() throws IOException {
+ store.backupAll(aDir.toFile());
+ assertFalse("File not moved to backup - still exists", Files.exists(aTxt));
+ assertFalse("File bTxt not moved to backup - still exists", Files.exists(bTxt));
+
+ Files.createDirectories(aTxt.getParent());
+ Files.write(aTxt, "XXXX\n- This file should be restored with A".getBytes(), CREATE_NEW);
+
+ store.restore();
+ assertFileContent("A not restored", aTxt.toFile(), "A");
+ assertFileContent("B not restored", bTxt.toFile(), "B");
assertNoGarbage(store);
}
- public void testBackupCopyAll() {
- BackupStore store = new BackupStore(null, BUPREFIX);
- // backup and overwrite a.txt
- try {
- store.backupCopyAll(aDir);
- } catch (IOException e) {
- e.printStackTrace();
- fail("IO Exception when backing up aDir");
- }
- if (!aTxt.exists())
- fail("File not copied to backup - does not exist");
- if (!bTxt.exists())
- fail("File bTxt not copied to backup - does not exists");
-
- try {
- writeToFile(aTxt, "XXXX\n- This file should be restored with A");
- writeToFile(bTxt, "XXXX\n- This file should be restored with B");
- } catch (IOException e) {
- e.printStackTrace();
- fail("Could not write a file for testing purposes.");
- }
- try {
- store.restore();
- } catch (IOException e) {
- fail("Restore failed");
- }
- assertFileContent("A not restored", aTxt, "A");
- assertFileContent("B not restored", bTxt, "B");
+ public void testBackupCopyAll() throws IOException {
+ store.backupCopyAll(aDir.toFile());
+ assertTrue("File not copied to backup - does not exist", Files.exists(aTxt));
+ assertTrue("File bTxt not copied to backup - does not exists", Files.exists(bTxt));
+
+ Files.write(aTxt, "XXXX\n- This file should be restored with A".getBytes());
+ Files.write(bTxt, "XXXX\n- This file should be restored with B".getBytes());
+
+ store.restore();
+ assertFileContent("A not restored", aTxt.toFile(), "A");
+ assertFileContent("B not restored", bTxt.toFile(), "B");
assertNoGarbage(store);
}
- private void assertNoGarbage(BackupStore store) {
- File buDir = new File(store.getBackupRoot(), BUPREFIX);
- if (buDir.exists())
- fail("Backup directory not cleaned up");
-
- // Set roots = store.getBackupRoots();
- // if (roots.size() == 0)
- // assertTrue("Root set is empty", true);
- // for (Iterator itor = roots.iterator(); itor.hasNext();) {
- // File root = (File) itor.next();
- // File buDir = new File(root, BUPREFIX);
- // if (buDir.exists())
- // fail("Backup directory not cleaned up");
- // }
+ private static void assertNoGarbage(SimpleBackupStore store) {
+ File buDir = store.getBackupRoot();
+ assertFalse("Backup directory not cleaned up", buDir.exists());
}
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/core/ProvisioningAgentTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/core/ProvisioningAgentTest.java
index fd4e953e9..268b42d5f 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/core/ProvisioningAgentTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/core/ProvisioningAgentTest.java
@@ -35,7 +35,7 @@ public class ProvisioningAgentTest extends AbstractProvisioningTest {
* @throws URISyntaxException
*/
public void testMultipleAgents() throws ProvisionException, URISyntaxException {
- URI repoLocation = new URI("http://download.eclipse.org/eclipse/updates/3.6");
+ URI repoLocation = new URI("https://download.eclipse.org/eclipse/updates/latest");
URI p2location = getTempFolder().toURI();
String PROFILE_ID = "testMultipleAgents";
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/DirectorApplicationTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/DirectorApplicationTest.java
index 973a234ff..9ac6d4b8a 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/DirectorApplicationTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/DirectorApplicationTest.java
@@ -838,4 +838,24 @@ public class DirectorApplicationTest extends AbstractProvisioningTest {
return avoidTrustPromptService.getTrustInfo(untrustedChain, null);
}
+ public void testPGPSignedArtifact() throws Exception {
+ File srcRepo = getTestData(null, "/testData/pgp/repoPGPOK");
+
+ IArtifactRepositoryManager artifactManager = getAgent().getService(IArtifactRepositoryManager.class);
+ IMetadataRepositoryManager metadataManager = getAgent().getService(IMetadataRepositoryManager.class);
+ assertNotNull(artifactManager);
+ assertNotNull(metadataManager);
+
+ File destinationRepo = new File(getTempFolder(), "DirectorApp Destination");
+ String[] args = getSingleRepoArgs(null, srcRepo, srcRepo, destinationRepo, "blah");
+
+ destinationRepo.mkdirs();
+
+ StringBuffer buffer = runDirectorApp(null, args);
+ assertFalse(buffer.toString(), buffer.toString().contains("failed"));
+
+ artifactManager.removeRepository(srcRepo.toURI());
+ metadataManager.removeRepository(srcRepo.toURI());
+ delete(destinationRepo);
+ }
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/IUListFormatterTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/IUListFormatterTest.java
index efa48f080..a2e1bf8ea 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/IUListFormatterTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/director/IUListFormatterTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2014, 2017 SAP AG and others.
+ * Copyright (c) 2014, 2021 SAP AG and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -14,22 +14,21 @@
package org.eclipse.equinox.p2.tests.director;
import static java.util.Arrays.asList;
-import static org.easymock.EasyMock.anyObject;
-import static org.easymock.EasyMock.createNiceMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.getCurrentArguments;
-import static org.easymock.EasyMock.replay;
import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import org.easymock.IAnswer;
import org.eclipse.equinox.internal.p2.director.app.IUListFormatter;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.metadata.Version;
import org.junit.Test;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
public class IUListFormatterTest {
@Test
@@ -75,37 +74,35 @@ public class IUListFormatterTest {
}
private static IInstallableUnit createIU(String id, String version, String name, String description) {
- IInstallableUnit iu = createNiceMock(id, IInstallableUnit.class);
- expect(iu.getId()).andStubReturn(id);
- expect(iu.getVersion()).andStubReturn(Version.create(version));
+ IInstallableUnit iu = mock(IInstallableUnit.class);
+ when(iu.getId()).thenReturn(id);
+ when(iu.getVersion()).thenReturn(Version.create(version));
final Map<String, String> properties = new HashMap<>(3, 1);
properties.put(IInstallableUnit.PROP_NAME, name);
properties.put(IInstallableUnit.PROP_DESCRIPTION, description);
- expect(iu.getProperties()).andStubReturn(properties);
- expect(iu.getProperty((String) anyObject())).andStubAnswer(new MapAnswer<>(properties));
- expect(iu.getProperty((String) anyObject(), (String) anyObject())).andStubAnswer(new MapAnswer<>(properties));
- replay(iu);
+ when(iu.getProperties()).thenReturn(properties);
+ when(iu.getProperty(anyString())).thenAnswer(new MapAnswer<>(properties));
+ when(iu.getProperty(anyString(), anyString())).thenAnswer(new MapAnswer<>(properties));
return iu;
}
private static IInstallableUnit createIU(String id, String version, int propCount) {
- IInstallableUnit iu = createNiceMock(id, IInstallableUnit.class);
- expect(iu.getId()).andStubReturn(id);
- expect(iu.getVersion()).andStubReturn(Version.create(version));
+ IInstallableUnit iu = mock(IInstallableUnit.class);
+ when(iu.getId()).thenReturn(id);
+ when(iu.getVersion()).thenReturn(Version.create(version));
final Map<String, String> properties = new HashMap<>(propCount, 1);
for (int i = 0; i < propCount; i++) {
properties.put("prop_" + i, "propValue_" + i);
}
- expect(iu.getProperties()).andStubReturn(properties);
- expect(iu.getProperty((String) anyObject())).andStubAnswer(new MapAnswer<>(properties));
- expect(iu.getProperty((String) anyObject(), (String) anyObject())).andStubAnswer(new MapAnswer<>(properties));
- replay(iu);
+ when(iu.getProperties()).thenReturn(properties);
+ when(iu.getProperty(anyString())).thenAnswer(new MapAnswer<>(properties));
+ when(iu.getProperty(anyString(), anyString())).thenAnswer(new MapAnswer<>(properties));
return iu;
}
- private static final class MapAnswer<T> implements IAnswer<T> {
+ private static final class MapAnswer<T> implements Answer<T> {
private final Map<?, T> map;
MapAnswer(Map<?, T> map) {
@@ -113,8 +110,8 @@ public class IUListFormatterTest {
}
@Override
- public T answer() throws Throwable {
- return map.get(getCurrentArguments()[0]);
+ public T answer(InvocationOnMock arg) throws Throwable {
+ return map.get(arg.getArguments()[0]);
}
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/CertificateCheckerTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/CertificateCheckerTest.java
index 79c58faf5..ba56cc6ea 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/CertificateCheckerTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/CertificateCheckerTest.java
@@ -15,12 +15,28 @@ package org.eclipse.equinox.p2.tests.engine;
import java.io.File;
import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
import java.security.cert.Certificate;
+import java.util.Comparator;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Stream;
import org.eclipse.core.runtime.IStatus;
+import org.eclipse.equinox.internal.p2.artifact.processors.pgp.PGPSignatureVerifier;
+import org.eclipse.equinox.internal.p2.core.AgentLocation;
import org.eclipse.equinox.internal.p2.core.ProvisioningAgent;
import org.eclipse.equinox.internal.p2.engine.EngineActivator;
import org.eclipse.equinox.internal.p2.engine.phases.CertificateChecker;
+import org.eclipse.equinox.internal.p2.metadata.ArtifactKey;
+import org.eclipse.equinox.internal.provisional.p2.repository.DefaultPGPPublicKeyService;
+import org.eclipse.equinox.p2.core.IAgentLocation;
+import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.core.UIServices;
+import org.eclipse.equinox.p2.engine.IProfileRegistry;
+import org.eclipse.equinox.p2.metadata.Version;
+import org.eclipse.equinox.p2.repository.artifact.spi.ArtifactDescriptor;
+import org.eclipse.equinox.p2.repository.spi.PGPPublicKeyService;
import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
import org.eclipse.equinox.p2.tests.TestActivator;
import org.eclipse.equinox.p2.tests.TestData;
@@ -29,6 +45,98 @@ import org.eclipse.equinox.p2.tests.TestData;
* Tests for {@link CertificateChecker}.
*/
public class CertificateCheckerTest extends AbstractProvisioningTest {
+ private static final String PGP_SIGNER1_PUBLIC_KEY = "-----BEGIN PGP PUBLIC KEY BLOCK-----\n" + "\n"
+ + "mQGNBGB1bugBDADQ5l7YnS9hNFRkBKSrvVNHt/TxeHaNNIHkdTC56I1QdThsOt4Y\n"
+ + "oQRI27AEOaY1GFEi6+QqwxALcMMMSTgkCRs2NFGqlWMVzNYE7bJMWChVa7uQ/9CG\n"
+ + "1HRbXwVwQx3hFgU4kmw1Kl/IH4LX76d9gAMyFANPjYZJSjbAv54wOlKruDRgpQFF\n"
+ + "pZeuXW7SnerL6sgd/+ZroikdkrjIs5t18C2ofzf6YnOokYkEEJSAEoQK5svVzT4G\n"
+ + "H3sw6FlE41RvnYKpuhvvyQhKjISDYfRaIL4JIpvR9Uko48eN9x654lJaucbMiLP4\n"
+ + "ROI9q7RQ6t1IMCiIN9QKgS+nVtHnN9MnXS0czGxfLdStv6bB+xgUoyBc7Uiqf4X0\n"
+ + "x8z9PE6O1L6Rgy2JMJHPgLWCF8h/u1FO88Br3I7TMzu2q/cg3k18L7eujnxVyYiD\n"
+ + "YIMxDBXBNnGCKRC4shgt8e+PzAPXIDFvbv7HOaERnx5c6eLl0tD12ocQeZHp1VlW\n"
+ + "nQteQ6CfvN07dNUAEQEAAbQ3RWNsaXBzZSBwMiB0ZXN0IFNpZ25lciAxIDxzaWdu\n"
+ + "ZXIxQGZha2V1c2VyLmVjbGlwc2Uub3JnPokB1AQTAQgAPhYhBOmWxnCqf2VAm/Xb\n"
+ + "VhOeONkN7RHwBQJgdW7oAhsDBQkDwmcABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheA\n"
+ + "AAoJEBOeONkN7RHwuXYL/Ri2gHoXELN79dWnuC5hjh7XgKquqlZg3qLgkLyA/54/\n"
+ + "ERx7HLLMHjU5tVIVacZ9UWb30Bzx6iVx2hMtL/0FFJ1S0iwwTDXft/9EoPvsmmEx\n"
+ + "VYEiSx5HxsPXM+XofMvi75nN34iMUIU3SgKLzHqlWcC3T7XjDWKC8TkTcutIAaIz\n"
+ + "BMRssktJR3OYzWbbwzgz83sVpofWGfxIW91H19Zr8rjIXiNyy1ulRnfsaz+xXeXf\n"
+ + "KxZZs00FtIIOeWBhCtsb8/8Uv3FRDK6+lX3xAqfMG67azJXpFafWJGiymypfSwi6\n"
+ + "JA866WOzw9DfbqWIlY/EMIhyZrsWnGiGhhAavwOiSWYV65ooFYooKHNmIekpvRZS\n"
+ + "wlGuwvnZr+2471urkCoG8Yz2Ey28Qjc0NgXlXAkqFUkO2gNPFsXkk1EC+vzO2llp\n"
+ + "qROS9pt25dEBcUSgfcjFOFWv2Z5IdmGjFEe46CJNEVzNgkP+97wJP7wpcOCSF/nn\n"
+ + "eOBj4b7Q0suJ+MsE/Fx6SbkBjQRgdW7oAQwAst4QGHd9w+V3UHgRMYZISfYApcAK\n"
+ + "2qBT1Zvf01QE38JUtDPKJarDlgxcaXuX6jOcbF60OMd59dhNmpaZYpocJZMgnESj\n"
+ + "0/Tn4cZfWwtOo1Pom8Lbg1zGKIYAaR2mTb8mkCwJwsZCUZCmh+zspacxdVRdmWmC\n"
+ + "XcFxFc/6gBKxcPFZf93JZaI33qsLpxyA57AJV5ck/TY1iFmA6HFxehamsAVdd56g\n"
+ + "uyORekJJlZHXE9pICVEGqVUfdbSQXEiS386kZDftXe36phdj1gtFsRLHoBI8+L7o\n"
+ + "2vrdnj1UZgtvxBbJJ+QAfhF8+f84RFIi9CTY8cheX+YfDMEdg9J9LG54X5P3O1ZX\n"
+ + "eEvudKk/hqWBf+2rrdkhdFyyGRK0yTrO+PQ+tZHhcHPqfo4EiVktC4BTpB6QtLBY\n"
+ + "NAGYMRddmZMgp4lE2xGib8SYwonct3y1fmB+x67lq65IFVM/IAwN6BuMXtgb+Zkm\n"
+ + "iT+eKgc1pK4uCsZJbQAlPzkDGQV69GNyjlphABEBAAGJAbwEGAEIACYWIQTplsZw\n"
+ + "qn9lQJv121YTnjjZDe0R8AUCYHVu6AIbDAUJA8JnAAAKCRATnjjZDe0R8Oe8DADQ\n"
+ + "CTBXxrmTJTSZUeKVo0C1kDHQaaV+RiRmquYR3WxFI6ugJFFWpzgG9V8Q7vYGeZFM\n"
+ + "HYM/tDuY/gdMwHBcR13yYyozslar7qas4LL/bYgOqq+SiSGTDEBW+00+5Wlwmlrv\n"
+ + "ubLc6ow9q2sTmOprq3Q7fei+sEANVnymBxnVV/ZIVGPpm/Rkh1JFGT/8SEyKkCut\n"
+ + "G23JMM/06cIhZwdD6aWSZK4EFw0lwfXyr8l3ZqH0WydVEef1DUNIRM48O0YdwS9u\n"
+ + "jd5iKKKJlb4XxwGi6IKSzpXF7pFrm6vqS306u3Fnak5hb2gs8dpnNo7UL1gUm5pr\n"
+ + "8vJ3xhg15KCjYKz8k6ZDsIWULTXUJ23i8ZwqyQaj1bajwN0+/MfC0ZkoQtQ2I/TH\n"
+ + "cKLSMOR+Tji6n7FjOcVl6VoDKTjdxj9OgAlbZ7W9jEArrUjDdCk/m4jq9h9phpli\n"
+ + "BHoul/nauwtlUnQes1V+39Rk9l7gddKWg3dlwg6CjB5MkmcaeyxgANcyKgrunpg=\n" + "=JYpC\n"
+ + "-----END PGP PUBLIC KEY BLOCK-----\n";
+ private static final String PGP_SIGNER1_SIGNATURE = "-----BEGIN PGP SIGNATURE-----\n" + "\n"
+ + "iQHRBAABCAA7FiEE6ZbGcKp/ZUCb9dtWE5442Q3tEfAFAmB4Bf8dHHNpZ25lcjFA\n"
+ + "ZmFrZXVzZXIuZWNsaXBzZS5vcmcACgkQE5442Q3tEfBPuAwAhE4zA7BswKFhEtzm\n"
+ + "DS3EbyRr/U13sV01YxqGtxYDCfrOt8TGVPXJSvo0AVP4vLFc5b+0jtVFoarFJNBu\n"
+ + "xhbVuyC72YdqudNbncSlW6KG5SgeWIM//ThKfl95pOWRWvJEoKJhmDwbDqhZYtL5\n"
+ + "SECegnWGtGx/klFtZihzHYJE/nfSnhySDaz5lCvXFFYRhIbNmNm2Yq7ztCOsN4Ys\n"
+ + "3uN+GEdoXGvv1DFg/xZPvwCOhZGsSQfkl1jmUwVltgKrw9OCFbdfYz7H6dbGWhRu\n"
+ + "2XpuKxPXGavKfpSvssVQIZ6aWi5W6wp5lZAQQddZvYAv3Gi5CZZcUT7ayFJYdD23\n"
+ + "p9jz76G7MXm0f0uNT9B57T72QryokUIEIJYsCb6lNjWUQB4cd0+JesM7sHwweOQ3\n"
+ + "7iTFc+WgVJkP0e695mm1tcvtQHUPbIItYJUsndyLgGInzglxN8+F4U4k8uapydI9\n"
+ + "RmV2NVAifYp8z95Am5AnlG8lqjwrWk5bMbJH82QsQESrNT/h\n" + "=8Vrn\n" + "-----END PGP SIGNATURE-----\n";
+
+ private static final String PGP_SIGNER2_PUBLIC_KEY = "-----BEGIN PGP PUBLIC KEY BLOCK-----\r\n" + "\r\n"
+ + "mQINBGHUyxYBEADATeNx4XA4H2fP9mD5xwlIyh7qvHLezgXpqCwNS9ATqBwnfrCV\r\n"
+ + "06a+pfSLsLoXrP/sdaB5WhijfuxTis18RMfoDVwGMRqyD2GiBCl2vwJDg3BUwHnc\r\n"
+ + "H7W6XkWKO7dkPmF+TUbD3cTWZ7cvrPmMjinmXaq8htuktGuE2VEGZRnuG1m+ChDM\r\n"
+ + "PnSb1ioFS2+MJv13P2fagVk2qC95DkPJGpMk3CY3ghLDEaY/KaJl+8axAlUUUk9N\r\n"
+ + "d3k/KVxxf5k3g26EVQkWWgH2mmolptGO101xW64iked97Cy4NK2yafOF/wmpsavx\r\n"
+ + "PGpOewnDgAJBBPkum6mPH0vcOZgxmLyh4uqfPfr3IaBQlbJLN2dXaDsV83j5t1wZ\r\n"
+ + "2qxOPcWBfORm6W7dC0TQgCXbEG0geMBpJtvnMX83Q2ORqDpjbHRJsV2k+8NxaXON\r\n"
+ + "pYXGr+Lj/9n0xfNEDXhCdGab0XP2tVZ5jfr2OQ5dAomEaPqK5Kq7akoWMddpDLNC\r\n"
+ + "G4IvH8G0cxwruJk00uwd6Nd2NVqVMRYCsBbA89VanUnutLUIpVnnOAetlX9blXHO\r\n"
+ + "JtmiCPGgHyp+iYGhKYVzfuZQyFhonbi0AhidJDvbHsoLT3p4Mcog1B9y6MODBE7R\r\n"
+ + "jwrU+qMqYsYeFhGYKbYyXv9TfEyUvtCQ/GnTtRJAQyicFdOdbK37WecS6QARAQAB\r\n"
+ + "tDdFY2xpcHNlIHAyIHRlc3QgU2lnbmVyIDIgPHNpZ25lcjJAZmFrZXVzZXIuZWNs\r\n"
+ + "aXBzZS5vcmc+iQJYBBMBCABCFiEEzZ1aK4a8T+GDlFHh4vaU9BsKs3AFAmHUyxYC\r\n"
+ + "GwMFCQPCZwAFCwkIBwIDIgIBBhUKCQgLAgQWAgMBAh4HAheAAAoJEOL2lPQbCrNw\r\n"
+ + "wH4QAIiCaw1mREgt4ldz7hQvmGxdMuQwVKZPzbOIAlYbZBo0q9SmeMf/CBCO90hg\r\n"
+ + "LFmJmsZV4KUU5NKI7UwkDVrpUCl00Ok6+gtiUTId2tRcwXI+25I478VX27j6OkQj\r\n"
+ + "7Xr6giv8cn8nstt5CF6xxeqrxvpmnZC0u30jE6CL6SdXSd0vViFDPQj3KgGJCRc9\r\n"
+ + "St+LHB3XJTsadihzQnscqI4E2i5Z3Uj1GogqxtR59M1NAXubl5dySM0qHhwn8O+6\r\n"
+ + "lcgCCeuyMLLde1M1v8w07jdRUM+IFqHrRnE89EPH3MQeZbQ3UfFXK2r7wx2BJCqL\r\n"
+ + "Irtn68kz834ByKchGR6DqaAw0q+iF2QkgzYxpwai41BgmtUCYnj+HxQNIF4KTzDe\r\n"
+ + "nd8mDAPWttGCoVuV2Tyu9peYOaqyAZ2PZwUEH5MqihPCbenU17RLXzRu/IT/SH47\r\n"
+ + "NGrN3yKGgLZr2EVWPWFibpoxP4G4NUCHsY75uiL2EWPVSjK/+OOeHIE5k3U3lYwB\r\n"
+ + "7clhBwMkIhQHJ+a0SHRkKixkwrQDw4veKY4LaD0NCBLHFoV5L9orH1ToGM729kr/\r\n"
+ + "+4I1VQFkL3KvfLjmRbTUgwHeqEquQ96JtqowbNwlpujfHXQKDNsuiKGP5OazXll5\r\n"
+ + "sH2CR7e4ePqhhzxjLvi9e/79Khq+08eqllS3rs06EXEAJYTo\r\n" + "=807V\r\n"
+ + "-----END PGP PUBLIC KEY BLOCK-----\r\n" + "";
+ private static final String PGP_SIGNER2_SIGNATURE = "-----BEGIN PGP SIGNATURE-----\n" + "\n"
+ + "iQIzBAABCAAdFiEEzZ1aK4a8T+GDlFHh4vaU9BsKs3AFAmHUy4UACgkQ4vaU9BsK\n"
+ + "s3DjuhAAvlCtqhK/7/aAG0/cXtlpu0fPC176OmEmBGTjCsrGdWwuRHsqXbLnMBVZ\n"
+ + "0D1m38MDvuYZfJuP7arw7USKp+Jy54Bv/YwvHLl74YTx1BN9hAN9QvyLxLZOjdm1\n"
+ + "/ipiWUuUgGa/brxEZNQqSR0w17TqXkIJHeFFS3T/rNH/Ckom5vQhAEm9HwJYeGdt\n"
+ + "tJ5BUl7BS1rrEOs+xmzqLu6AaERREc5gGRniJe7aP2Ke+/wL6oOLG3v/6vsJSM2e\n"
+ + "t+Olo4Ugc6JbdNrwvTO8kkTxsi0gp2CPhKl3RZVnbGoe4tXHawmk2V3eVTa0w6iP\n"
+ + "ARPJ/xH2dDsRi4Kz3OkcyQOI24jGmaqpUrx3+f2BnEbcVs4cHIJc+O2gh1WUz6uY\n"
+ + "Zw7qtK0W3H+E7RuJLCScgasPZZPBzyA6B3o2J3bfXnG5r41aJEuiq3otgllrBakG\n"
+ + "u7fX00h8lylgRrlCb4mquZxxRsrl+ac6U5eYdDMkK5VNkXgrus8FedIh3vmqI7RR\n"
+ + "ou9GEjho4kebt1Y1yTAQnxWBtTUG2hFt6VirKydI7+ZcCZmbD9lrZT6xVQOCkyUQ\n"
+ + "Cwy7vNPWkpMBBRVLoaThD2+7znDpb6wNYf9mDCcCK8tyuVCDSYEFX6jlqv1yfpNl\n"
+ + "QlYE1biLAHl09NH397Ta/9cWdfu68I7Mv4Ev2zu45OGa83h820M=\n" + "=9Ha/\n" + "-----END PGP SIGNATURE-----\n";
+
class CertificateTestService extends UIServices {
public boolean unsignedReturnValue = true;
public boolean wasPrompted = false;
@@ -55,14 +163,22 @@ public class CertificateCheckerTest extends AbstractProvisioningTest {
CertificateTestService serviceUI;
File unsigned;
private ProvisioningAgent testAgent;
+ private Path agentLocation;
@Override
protected void setUp() throws Exception {
serviceUI = new CertificateTestService();
testAgent = new ProvisioningAgent();
testAgent.registerService(UIServices.SERVICE_NAME, serviceUI);
+ agentLocation = Files.createTempDirectory("certificateTest");
+ testAgent.setLocation(agentLocation.toUri());
testAgent.setBundleContext(TestActivator.getContext());
checker = new CertificateChecker(testAgent);
+ PGPPublicKeyService keyService = testAgent.getService(PGPPublicKeyService.class);
+ if (keyService instanceof DefaultPGPPublicKeyService) {
+ ((DefaultPGPPublicKeyService) keyService).setKeyServers(Set.of());
+ }
+
try {
unsigned = TestData.getFile("CertificateChecker", "unsigned.jar");
} catch (IOException e) {
@@ -72,15 +188,29 @@ public class CertificateCheckerTest extends AbstractProvisioningTest {
assertTrue("1.0", unsigned.exists());
}
+ @Override
+ protected void tearDown() throws Exception {
+ try (Stream<Path> walk = Files.walk(agentLocation)) {
+ walk.sorted(Comparator.reverseOrder()).forEach(path -> {
+ try {
+ Files.delete(path);
+ } catch (IOException e) {
+ // Ignore
+ }
+ });
+ }
+ }
+
/**
- * Tests that installing unsigned content is not allowed when the policy says it must fail.
+ * Tests that installing unsigned content is not allowed when the policy says it
+ * must fail.
*/
public void testPolicyAllow() {
try {
- //if the service is consulted it will say no
+ // if the service is consulted it will say no
serviceUI.unsignedReturnValue = false;
System.getProperties().setProperty(EngineActivator.PROP_UNSIGNED_POLICY, EngineActivator.UNSIGNED_ALLOW);
- checker.add(unsigned);
+ checker.add(Map.of(new ArtifactDescriptor(new ArtifactKey("what", "ever", Version.create("1"))), unsigned));
IStatus result = checker.start();
assertEquals("1.0", IStatus.OK, result.getSeverity());
} finally {
@@ -89,12 +219,13 @@ public class CertificateCheckerTest extends AbstractProvisioningTest {
}
/**
- * Tests that installing unsigned content is not allowed when the policy says it must fail.
+ * Tests that installing unsigned content is not allowed when the policy says it
+ * must fail.
*/
public void testPolicyFail() {
try {
System.getProperties().setProperty(EngineActivator.PROP_UNSIGNED_POLICY, EngineActivator.UNSIGNED_FAIL);
- checker.add(unsigned);
+ checker.add(Map.of(new ArtifactDescriptor(new ArtifactKey("what", "ever", Version.create("1"))), unsigned));
IStatus result = checker.start();
assertEquals("1.0", IStatus.ERROR, result.getSeverity());
@@ -104,13 +235,14 @@ public class CertificateCheckerTest extends AbstractProvisioningTest {
}
/**
- * Tests that installing unsigned content with the "prompt" policy and the prompt succeeds.
+ * Tests that installing unsigned content with the "prompt" policy and the
+ * prompt succeeds.
*/
public void testPolicyPromptSuccess() {
try {
System.getProperties().setProperty(EngineActivator.PROP_UNSIGNED_POLICY, EngineActivator.UNSIGNED_PROMPT);
serviceUI.unsignedReturnValue = true;
- checker.add(unsigned);
+ checker.add(Map.of(new ArtifactDescriptor(new ArtifactKey("what", "ever", Version.create("1"))), unsigned));
IStatus result = checker.start();
assertEquals("1.0", IStatus.OK, result.getSeverity());
assertTrue("1.1", serviceUI.wasPrompted);
@@ -125,20 +257,21 @@ public class CertificateCheckerTest extends AbstractProvisioningTest {
public void testPolicyDefault() {
System.getProperties().remove(EngineActivator.PROP_UNSIGNED_POLICY);
serviceUI.unsignedReturnValue = true;
- checker.add(unsigned);
+ checker.add(Map.of(new ArtifactDescriptor(new ArtifactKey("what", "ever", Version.create("1"))), unsigned));
IStatus result = checker.start();
assertEquals("1.0", IStatus.OK, result.getSeverity());
assertTrue("1.1", serviceUI.wasPrompted);
}
/**
- * Tests that installing unsigned content with the "prompt" policy and the prompt says no.
+ * Tests that installing unsigned content with the "prompt" policy and the
+ * prompt says no.
*/
public void testPolicyPromptCancel() {
try {
System.getProperties().setProperty(EngineActivator.PROP_UNSIGNED_POLICY, EngineActivator.UNSIGNED_PROMPT);
serviceUI.unsignedReturnValue = false;
- checker.add(unsigned);
+ checker.add(Map.of(new ArtifactDescriptor(new ArtifactKey("what", "ever", Version.create("1"))), unsigned));
IStatus result = checker.start();
assertEquals("1.0", IStatus.CANCEL, result.getSeverity());
assertTrue("1.1", serviceUI.wasPrompted);
@@ -148,16 +281,17 @@ public class CertificateCheckerTest extends AbstractProvisioningTest {
}
/**
- * Tests that trust checks that occur in a headless environment are properly treated
- * as permissive, but not persistent, the same way as it would be if the service registration
- * were not there.
+ * Tests that trust checks that occur in a headless environment are properly
+ * treated as permissive, but not persistent, the same way as it would be if the
+ * service registration were not there.
*/
public void testBug291049() {
try {
// Intentionally replace our service with a null service
testAgent.registerService(UIServices.SERVICE_NAME, null);
- checker.add(unsigned);
- // TODO need to add some untrusted files here, too. To prove that we treated them as trusted temporarily
+ checker.add(Map.of(new ArtifactDescriptor(new ArtifactKey("what", "ever", Version.create("1"))), unsigned));
+ // TODO need to add some untrusted files here, too. To prove that we treated
+ // them as trusted temporarily
System.getProperties().setProperty(EngineActivator.PROP_UNSIGNED_POLICY, EngineActivator.UNSIGNED_PROMPT);
IStatus result = checker.start();
assertTrue("1.0", result.isOK());
@@ -165,4 +299,85 @@ public class CertificateCheckerTest extends AbstractProvisioningTest {
System.getProperties().remove(EngineActivator.PROP_UNSIGNED_POLICY);
}
}
+
+ public void testPGPSignedArtifactUntrustedKey() throws IOException, ProvisionException {
+ try {
+ // create a test profile
+ testAgent.registerService("FORCED_SELF", IProfileRegistry.SELF);
+ testAgent.registerService(IAgentLocation.SERVICE_NAME,
+ new AgentLocation(Files.createTempDirectory(
+ CertificateCheckerTest.class.getName() + "testPGPSignedArtifactUntrustedKey-profile")
+ .toUri()));
+ testAgent.getService(IProfileRegistry.class).addProfile(IProfileRegistry.SELF);
+
+ unsigned = TestData.getFile("pgp/repoPGPOK/plugins", "blah_1.0.0.123456.jar");
+ ArtifactDescriptor artifactDescriptor = new ArtifactDescriptor(
+ new ArtifactKey("what", "ever", Version.create("1")));
+ artifactDescriptor
+ .addProperties(Map.of(PGPSignatureVerifier.PGP_SIGNATURES_PROPERTY_NAME, PGP_SIGNER1_SIGNATURE, //
+ PGPSignatureVerifier.PGP_SIGNER_KEYS_PROPERTY_NAME, PGP_SIGNER1_PUBLIC_KEY));
+ checker.add(Map.of(artifactDescriptor, unsigned));
+ System.getProperties().setProperty(EngineActivator.PROP_UNSIGNED_POLICY, EngineActivator.UNSIGNED_PROMPT);
+ IStatus result = checker.start();
+ assertFalse(result.isOK());
+ assertTrue(serviceUI.wasPrompted);
+ } finally {
+ System.getProperties().remove(EngineActivator.PROP_UNSIGNED_POLICY);
+ }
+ }
+
+ public void testPGPSignedArtifactTrustedKeyInProvideCapability() throws IOException {
+ try {
+ unsigned = TestData.getFile("pgp/repoPGPOK/plugins", "blah_1.0.0.123456.jar");
+ ArtifactDescriptor artifactDescriptor = new ArtifactDescriptor(
+ new ArtifactKey("what", "ever", Version.create("1")));
+ artifactDescriptor
+ .addProperties(Map.of(PGPSignatureVerifier.PGP_SIGNATURES_PROPERTY_NAME, PGP_SIGNER2_SIGNATURE,
+ PGPSignatureVerifier.PGP_SIGNER_KEYS_PROPERTY_NAME, PGP_SIGNER2_PUBLIC_KEY));
+ checker.add(Map.of(artifactDescriptor, unsigned));
+ System.getProperties().setProperty(EngineActivator.PROP_UNSIGNED_POLICY, EngineActivator.UNSIGNED_PROMPT);
+ IStatus result = checker.start();
+ assertTrue(result.isOK());
+ assertFalse(serviceUI.wasPrompted);
+ } finally {
+ System.getProperties().remove(EngineActivator.PROP_UNSIGNED_POLICY);
+ }
+ }
+
+ //// SECURITY ISSUE: next lines become an attack vector as we have no guarantee
+ //// the metadata of those IUs is safe/were signed.
+ //// https://bugs.eclipse.org/bugs/show_bug.cgi?id=576705#c4
+// public void testPGPSignedArtifactTrustedKeyInInstalledIU() throws ProvisionException, IOException {
+// try {
+// // create a test profile
+// testAgent.registerService("FORCED_SELF", IProfileRegistry.SELF);
+// testAgent
+// .registerService(IAgentLocation.SERVICE_NAME,
+// new AgentLocation(Files.createTempDirectory(
+// CertificateCheckerTest.class.getName() + "testPGPSignedArtifactTrustedKey-profile")
+// .toUri()));
+// IProfile testProfile = testAgent.getService(IProfileRegistry.class).addProfile(IProfileRegistry.SELF);
+// // install an IU that declares trusted keys
+// InstallableUnitDescription desc = new InstallableUnitDescription();
+// desc.setProperty(CertificateChecker.TRUSTED_KEY_STORE_PROPERTY, PGP_PUBLIC_KEY);
+// desc.setId("unitWithTrustedKeys");
+// desc.setVersion(Version.create("1.0.0"));
+// IEngine engine = testAgent.getService(IEngine.class);
+// IProvisioningPlan plan = engine.createPlan(testProfile, new ProvisioningContext(testAgent));
+// plan.addInstallableUnit(MetadataFactory.createInstallableUnit(desc));
+// assertTrue(engine.perform(plan, getMonitor()).isOK());
+//
+// unsigned = TestData.getFile("pgp/repoPGPOK/plugins", "blah_1.0.0.123456.jar");
+// ArtifactDescriptor artifactDescriptor = new ArtifactDescriptor(
+// new ArtifactKey("what", "ever", Version.create("1")));
+// artifactDescriptor.addProperties(Map.of(PGPSignatureVerifier.PGP_SIGNATURES_PROPERTY_NAME, PGP_SIGNATURE));
+// checker.add(Map.of(artifactDescriptor, unsigned));
+// System.getProperties().setProperty(EngineActivator.PROP_UNSIGNED_POLICY, EngineActivator.UNSIGNED_PROMPT);
+// IStatus result = checker.start();
+// assertTrue(result.isOK());
+// assertFalse(serviceUI.wasPrompted);
+// } finally {
+// System.getProperties().remove(EngineActivator.PROP_UNSIGNED_POLICY);
+// }
+// }
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/DownloadManagerTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/DownloadManagerTest.java
index 908bb64e9..bd344be8b 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/DownloadManagerTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/DownloadManagerTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2017 IBM Corporation and others.
+ * Copyright (c) 2007, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -17,7 +17,10 @@ import java.net.URI;
import java.net.URISyntaxException;
import junit.framework.Test;
import junit.framework.TestSuite;
-import org.eclipse.core.runtime.*;
+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.engine.DownloadManager;
import org.eclipse.equinox.p2.engine.ProvisioningContext;
import org.eclipse.equinox.p2.metadata.IArtifactKey;
@@ -177,7 +180,7 @@ public class DownloadManagerTest extends AbstractProvisioningTest {
IArtifactRequest[] requests = new IArtifactRequest[] {createArtifactRequest()};
manager.add(requests);
IStatus result = manager.start(null);
- assertTrue("1.0", result.isOK());
+ assertTrue(result.getMessage(), result.isOK());
// Right now the provisioning context adds these to the manager so
// we have to remove them so as not to affect other tests.
@@ -197,7 +200,7 @@ public class DownloadManagerTest extends AbstractProvisioningTest {
IArtifactRequest[] requests = new IArtifactRequest[] {createArtifactRequest()};
manager.add(requests);
IStatus result = manager.start(null);
- assertTrue("1.0", result.isOK());
+ assertTrue(result.getMessage(), result.isOK());
// Right now the provisioning context adds these to the manager so
// we have to remove them so as not to affect other tests.
@@ -224,7 +227,7 @@ public class DownloadManagerTest extends AbstractProvisioningTest {
IArtifactRequest[] requests = new IArtifactRequest[] {createArtifactRequest()};
manager.add(requests);
IStatus result = manager.start(null);
- assertTrue("1.0", result.isOK());
+ assertTrue(result.getMessage(), result.isOK());
// Right now the provisioning context adds these to the manager so
// we have to remove them so as not to affect other tests.
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/PhaseSetTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/PhaseSetTest.java
index 310665dfe..0cc4d9152 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/PhaseSetTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/PhaseSetTest.java
@@ -243,7 +243,6 @@ public class PhaseSetTest extends AbstractProvisioningTest {
@Test
public void testPauseAndResumeMoreThanOnce() throws ProvisionException, InterruptedException {
- // URI repoLoc = URI.create("http://download.eclipse.org/releases/indigo");
URI repoLoc = getTestData("Load test data.", "/testData/pausefeature").toURI();
final PhaseSet phaseSet = (PhaseSet) PhaseSetFactory.createDefaultPhaseSet();
final int threhold = 3;
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/ProvisioningEventTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/ProvisioningEventTest.java
index 409e64309..f94358f9c 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/ProvisioningEventTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/engine/ProvisioningEventTest.java
@@ -16,14 +16,28 @@ package org.eclipse.equinox.p2.tests.engine;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.net.URI;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.EventObject;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.eclipse.core.internal.registry.ExtensionRegistry;
-import org.eclipse.core.runtime.*;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.spi.RegistryContributor;
import org.eclipse.equinox.internal.p2.artifact.repository.MirrorEvent;
-import org.eclipse.equinox.internal.p2.engine.*;
+import org.eclipse.equinox.internal.p2.engine.CollectEvent;
+import org.eclipse.equinox.internal.p2.engine.CommitOperationEvent;
+import org.eclipse.equinox.internal.p2.engine.InstallableUnitEvent;
+import org.eclipse.equinox.internal.p2.engine.PhaseEvent;
+import org.eclipse.equinox.internal.p2.engine.RollbackOperationEvent;
import org.eclipse.equinox.internal.p2.metadata.TouchpointData;
import org.eclipse.equinox.internal.p2.metadata.TouchpointInstruction;
import org.eclipse.equinox.internal.p2.touchpoint.eclipse.Util;
@@ -31,9 +45,18 @@ import org.eclipse.equinox.internal.p2.touchpoint.eclipse.actions.ActionConstant
import org.eclipse.equinox.internal.p2.touchpoint.eclipse.actions.RemoveRepositoryAction;
import org.eclipse.equinox.internal.provisional.p2.core.eventbus.ProvisioningListener;
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.IProvisioningPlan;
+import org.eclipse.equinox.p2.engine.PhaseSetFactory;
+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.IInstallableUnit;
+import org.eclipse.equinox.p2.metadata.IRequirement;
+import org.eclipse.equinox.p2.metadata.ITouchpointInstruction;
+import org.eclipse.equinox.p2.metadata.ITouchpointType;
+import org.eclipse.equinox.p2.metadata.MetadataFactory;
+import org.eclipse.equinox.p2.metadata.Version;
import org.eclipse.equinox.p2.query.IQueryResult;
import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.equinox.p2.repository.IRepository;
@@ -41,7 +64,9 @@ import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
import org.eclipse.equinox.p2.repository.artifact.IArtifactRequest;
import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
import org.eclipse.equinox.p2.tests.TestActivator;
-import org.junit.*;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
public class ProvisioningEventTest extends AbstractProvisioningTest {
private IEngine engine;
@@ -203,7 +228,7 @@ public class ProvisioningEventTest extends AbstractProvisioningTest {
IProfile profile = createProfile("testConfigureEvent");
IProvisioningPlan plan = engine.createPlan(profile, null);
- final String testLocation = "http://download.eclipse.org/releases/juno";
+ final String testLocation = "https://download.eclipse.org/releases/2021-09";
// remove the existing location in case it has
Map<String, Object> args = new HashMap<>();
args.put(ActionConstants.PARM_AGENT, getAgent());
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/End2EndTest35.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/End2EndTest35.java
index 76148ba98..4725ca6a9 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/End2EndTest35.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/End2EndTest35.java
@@ -59,7 +59,7 @@ public class End2EndTest35 extends AbstractEnd2EndTest {
@Override
protected URI getRepositoryLocation() {
- return URI.create("http://download.eclipse.org/eclipse/updates/3.5");
+ return URI.create("https://download.eclipse.org/eclipse/updates/3.5");
}
@Override
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/End2EndTest36.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/End2EndTest36.java
index ec819c5d9..fe33e7936 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/End2EndTest36.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/End2EndTest36.java
@@ -17,7 +17,10 @@ import java.io.File;
import java.io.IOException;
import java.net.URI;
import org.eclipse.core.runtime.Platform;
-import org.eclipse.equinox.internal.provisional.frameworkadmin.*;
+import org.eclipse.equinox.internal.provisional.frameworkadmin.FrameworkAdmin;
+import org.eclipse.equinox.internal.provisional.frameworkadmin.FrameworkAdminRuntimeException;
+import org.eclipse.equinox.internal.provisional.frameworkadmin.LauncherData;
+import org.eclipse.equinox.internal.provisional.frameworkadmin.Manipulator;
import org.eclipse.equinox.p2.metadata.VersionedId;
/**
@@ -59,7 +62,7 @@ public class End2EndTest36 extends AbstractEnd2EndTest {
@Override
protected URI getRepositoryLocation() {
- return URI.create("http://download.eclipse.org/eclipse/updates/3.6");
+ return URI.create("https://download.eclipse.org/eclipse/updates/3.6");
}
@Override
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/End2EndTest37.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/End2EndTest37.java
index b5f3cb394..6ea361ebf 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/End2EndTest37.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/full/End2EndTest37.java
@@ -59,7 +59,7 @@ public class End2EndTest37 extends AbstractEnd2EndTest {
@Override
protected URI getRepositoryLocation() {
- return URI.create("http://download.eclipse.org/eclipse/updates/3.7");
+ return URI.create("https://download.eclipse.org/eclipse/updates/3.7");
}
@Override
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 8b9592993..e77597a59 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
@@ -23,7 +23,10 @@ import org.eclipse.equinox.internal.p2.metadata.ArtifactKey;
import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.metadata.IArtifactKey;
import org.eclipse.equinox.p2.metadata.Version;
-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.spi.ArtifactDescriptor;
import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
@@ -31,6 +34,7 @@ import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
* Tests for the sweep (clean) phase of the garbage collection
*/
public class GCCleanTest extends AbstractProvisioningTest {
+ @SuppressWarnings("removal")
private IArtifactRepository createRepository(File location) throws ProvisionException {
URI repositoryURI = location.toURI();
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 4cd3e61c3..e09e8bc4d 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
@@ -27,7 +27,9 @@ import org.eclipse.equinox.p2.publisher.eclipse.FeaturesAndBundlesPublisherAppli
import org.eclipse.equinox.p2.publisher.eclipse.InstallPublisherApplication;
import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
-import org.eclipse.equinox.p2.tests.*;
+import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
+import org.eclipse.equinox.p2.tests.StringBufferStream;
+import org.eclipse.equinox.p2.tests.TestActivator;
import org.eclipse.osgi.util.NLS;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
@@ -90,7 +92,7 @@ public class GeneratorTests extends AbstractProvisioningTest {
for (int i = 0; i < limit; i++) {
BundleContext context = TestActivator.getContext();
Bundle bundle = context.getBundle(i);
- File bundleFile = FileLocator.getBundleFile(bundle);
+ File bundleFile = FileLocator.getBundleFileLocation(bundle).get();
if (!bundleFile.isFile()) {
//only jars please
++limit;
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/jarprocessor/JarProcessorTests.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/jarprocessor/JarProcessorTests.java
index afb71ab55..abc3a1592 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/jarprocessor/JarProcessorTests.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/jarprocessor/JarProcessorTests.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2005, 2017 IBM Corporation and others.
+ * Copyright (c) 2005, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -13,7 +13,11 @@
*******************************************************************************/
package org.eclipse.equinox.p2.tests.jarprocessor;
-import java.io.*;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.PrintStream;
import org.eclipse.core.runtime.Platform;
import org.eclipse.equinox.internal.p2.jarprocessor.PackStep;
import org.eclipse.equinox.internal.p2.jarprocessor.verifier.Verifier;
@@ -23,6 +27,7 @@ import org.eclipse.internal.provisional.equinox.p2.jarprocessor.JarProcessor;
import org.eclipse.internal.provisional.equinox.p2.jarprocessor.JarProcessorExecutor;
import org.eclipse.internal.provisional.equinox.p2.jarprocessor.JarProcessorExecutor.Options;
+@SuppressWarnings("removal")
public class JarProcessorTests extends AbstractProvisioningTest {
public void testVerifyStep() throws Exception {
@@ -78,6 +83,7 @@ public class JarProcessorTests extends AbstractProvisioningTest {
}
+ @Deprecated(forRemoval = true)
public void testPackUnpackVerify() throws Exception {
if (!PackStep.canPack() || !VerifyStep.canVerify())
return;
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/metadata/repository/MetadataRepositoryManagerTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/metadata/repository/MetadataRepositoryManagerTest.java
index 2b4ebef6a..6ac039147 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/metadata/repository/MetadataRepositoryManagerTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/metadata/repository/MetadataRepositoryManagerTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2018 IBM Corporation and others.
+ * Copyright (c) 2007, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -14,6 +14,8 @@
*******************************************************************************/
package org.eclipse.equinox.p2.tests.metadata.repository;
+import static org.junit.Assert.assertNotEquals;
+
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
@@ -379,23 +381,20 @@ public class MetadataRepositoryManagerTest extends AbstractProvisioningTest {
* cache is updated when it becomes stale.
*/
public void testMetadataCachingRemoteRepo() throws URISyntaxException, ProvisionException {
- URI repoLocation = new URI("http://download.eclipse.org/eclipse/updates/3.4milestones/");
+ URI repoLocation = new URI("https://download.eclipse.org/eclipse/updates/4.21/R-4.21-202109060500/");
if (!repoAvailable(repoLocation))
return;
IAgentLocation agentLocation = ServiceHelper.getService(TestActivator.getContext(), IAgentLocation.class);
- URI dataArea = agentLocation.getDataArea("org.eclipse.equinox.p2.metadata.repository/cache/");
+ URI dataArea = agentLocation.getDataArea("org.eclipse.equinox.p2.repository/cache/");
File dataAreaFile = URIUtil.toFile(dataArea);
- File cacheFileXML = new File(dataAreaFile, "content" + repoLocation.hashCode() + ".xml");
- File cacheFileJAR = new File(dataAreaFile, "content" + repoLocation.hashCode() + ".jar");
- File cacheFile;
+ File cacheFile = new File(dataAreaFile,
+ Integer.toString(URIUtil.append(repoLocation, "content.xml.xz").hashCode())); // as implemented in
+ // XZedSimpleMetadataRepository
+ // and CacheManager
// load a remote repository and check that a local cache was created
manager.loadRepository(repoLocation, null);
- assertTrue("Cache file was not created.", cacheFileXML.exists() || cacheFileJAR.exists());
- if (cacheFileXML.exists())
- cacheFile = cacheFileXML;
- else
- cacheFile = cacheFileJAR;
+ assertTrue("Cache file was not created.", cacheFile.exists());
// modify the last modified date to be older than the remote file
cacheFile.setLastModified(0);
@@ -403,7 +402,7 @@ public class MetadataRepositoryManagerTest extends AbstractProvisioningTest {
manager.removeRepository(repoLocation);
manager.loadRepository(repoLocation, null);
long lastModified = cacheFile.lastModified();
- assertTrue(0 != lastModified);
+ assertNotEquals(0, lastModified);
// reload the repository and check that the cache was not updated
manager.loadRepository(repoLocation, null);
@@ -505,9 +504,9 @@ public class MetadataRepositoryManagerTest extends AbstractProvisioningTest {
getEventBus().removeListener(referenceCollector);
}
assertEquals("1.0", 4, references.size());
- assertTrue("1.1", references.contains(new URI("http://download.eclipse.org/url/with/spaces/a%20b")));
+ assertTrue("1.1", references.contains(new URI("https://download.eclipse.org/url/with/spaces/a%20b")));
assertTrue("1.2", references.contains(new URI("file:/c:/tmp/url%20with%20spaces/")));
- assertTrue("1.3", references.contains(new URI("http://download.eclipse.org/uri/with/spaces/a%20b")));
+ assertTrue("1.3", references.contains(new URI("https://download.eclipse.org/uri/with/spaces/a%20b")));
assertTrue("1.4", references.contains(new URI("file:/c:/tmp/uri%20with%20spaces/")));
}
@@ -560,7 +559,7 @@ public class MetadataRepositoryManagerTest extends AbstractProvisioningTest {
try {
IMetadataRepository repoSlash = manager.loadRepository(locationSlash, null);
IMetadataRepository repoNoSlash = manager.loadRepository(locationNoSlash, null);
- assertTrue("1.0", repoNoSlash == repoSlash);
+ assertSame("1.0", repoNoSlash, repoSlash);
} catch (ProvisionException e) {
fail("1.99", e);
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/metadata/repository/ResumeDownloadTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/metadata/repository/ResumeDownloadTest.java
index 7c8dc873c..10ac9590f 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/metadata/repository/ResumeDownloadTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/metadata/repository/ResumeDownloadTest.java
@@ -19,7 +19,7 @@ import org.eclipse.equinox.p2.repository.metadata.IMetadataRepositoryManager;
import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
public class ResumeDownloadTest extends AbstractProvisioningTest {
- private static String UPDATE_SITE = "http://download.eclipse.org/eclipse/updates/3.4";
+ private static String UPDATE_SITE = "https://download.eclipse.org/eclipse/updates/4.21";
private IMetadataRepositoryManager mgr;
private URI repoLoc;
private String originalResumeProp;
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 fbf40e45f..416f4a8a3 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
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2017, 2020 IBM Corporation and others.
+ * Copyright (c) 2008, 2017, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -14,6 +14,7 @@
*******************************************************************************/
package org.eclipse.equinox.p2.tests.mirror;
+import static org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor.FORMAT_PACKED;
import static org.junit.Assert.assertNotEquals;
import java.io.File;
@@ -38,7 +39,7 @@ import org.eclipse.equinox.internal.p2.artifact.repository.simple.SimpleArtifact
import org.eclipse.equinox.internal.p2.core.helpers.OrderedProperties;
import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper;
import org.eclipse.equinox.p2.core.ProvisionException;
-import org.eclipse.equinox.p2.internal.repository.comparator.MD5ArtifactComparator;
+import org.eclipse.equinox.p2.internal.repository.comparator.ArtifactChecksumComparator;
import org.eclipse.equinox.p2.internal.repository.tools.Messages;
import org.eclipse.equinox.p2.internal.repository.tools.MirrorApplication;
import org.eclipse.equinox.p2.metadata.IArtifactKey;
@@ -63,6 +64,7 @@ import org.eclipse.osgi.util.NLS;
* Test API of the basic mirror application functionality's implementation.
*/
public class ArtifactMirrorApplicationTest extends AbstractProvisioningTest {
+ private static final String MD5_COMPARATOR = ArtifactChecksumComparator.COMPARATOR_ID + ".md5";
protected File destRepoLocation;
protected File sourceRepoLocation; //helloworldfeature
protected File sourceRepo2Location; //anotherfeature
@@ -881,6 +883,7 @@ public class ArtifactMirrorApplicationTest extends AbstractProvisioningTest {
/**
* Verifies that the mirror application executes processing steps correctly
*/
+ @SuppressWarnings("removal")
public void testArtifactProcessingSteps() {
if (System.getProperty("java.specification.version").compareTo("14") >= 0) {
// Test explicitly uses pack200 artifacts which are not supported on Java 14+
@@ -900,7 +903,8 @@ public class ArtifactMirrorApplicationTest extends AbstractProvisioningTest {
for (IArtifactKey key : packedRepo.query(ArtifactKeyQuery.ALL_KEYS, null)) {
for (IArtifactDescriptor srcDescriptor : packedRepo.getArtifactDescriptors(key)) {
- if (!(srcDescriptor.getProperty(IArtifactDescriptor.FORMAT) == null) && srcDescriptor.getProperty(IArtifactDescriptor.FORMAT).equals(IArtifactDescriptor.FORMAT_PACKED)) {
+ if (!(srcDescriptor.getProperty(IArtifactDescriptor.FORMAT) == null)
+ && srcDescriptor.getProperty(IArtifactDescriptor.FORMAT).equals(FORMAT_PACKED)) {
//if we have a packed artifact
IArtifactDescriptor newDescriptor = new ArtifactDescriptor(key);
Map<String, String> properties = new OrderedProperties();
@@ -1107,7 +1111,9 @@ public class ArtifactMirrorApplicationTest extends AbstractProvisioningTest {
try {
//Set compare flag.
- String[] args = new String[] {"-source", repo1Location.toURL().toExternalForm(), "-destination", repo2Location.toURL().toExternalForm(), "-verbose", "-compare", "-comparator", MD5ArtifactComparator.MD5_COMPARATOR_ID};
+ String[] args = new String[] { "-source", repo1Location.toURL().toExternalForm(), "-destination",
+ repo2Location.toURL().toExternalForm(), "-verbose", "-compare", "-comparator",
+ MD5_COMPARATOR };
//run the mirror application
runMirrorApplication("Running with duplicate descriptors with different md5 values", args);
} catch (Exception e) {
@@ -1159,7 +1165,10 @@ public class ArtifactMirrorApplicationTest extends AbstractProvisioningTest {
try {
//Set compareAgaist
- String[] args = new String[] {"-source", repoLocation.toURL().toExternalForm(), "-destination", destRepoLocation.toURL().toExternalForm(), "-compareAgainst", baselineLocation.toURL().toExternalForm(), "-verbose", "-compare", "-comparator", MD5ArtifactComparator.MD5_COMPARATOR_ID};
+ String[] args = new String[] { "-source", repoLocation.toURL().toExternalForm(), "-destination",
+ destRepoLocation.toURL().toExternalForm(), "-compareAgainst",
+ baselineLocation.toURL().toExternalForm(), "-verbose", "-compare", "-comparator",
+ MD5_COMPARATOR };
//run the mirror application
runMirrorApplication("Running with baseline compare", args);
} catch (Exception e) {
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/MetadataMirrorApplicationTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/MetadataMirrorApplicationTest.java
index 004b5db20..94bdec524 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/MetadataMirrorApplicationTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/MetadataMirrorApplicationTest.java
@@ -14,7 +14,9 @@
package org.eclipse.equinox.p2.tests.mirror;
import java.io.File;
-import java.net.*;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository;
@@ -516,7 +518,7 @@ public class MetadataMirrorApplicationTest extends AbstractProvisioningTest {
public void testMetadataMirrorToInvalid() {
URI invalidDestRepository;
try {
- invalidDestRepository = new URI("http://eclipse.org/equinox/foobar/abcdefg");
+ invalidDestRepository = new URI("https://eclipse.org/equinox/foobar/abcdefg");
basicRunMirrorApplication("14.1", sourceRepoLocation.toURL(), invalidDestRepository.toURL(), true);
//we expect an illegal state exception to be thrown and should never get here
fail("14.0 IllegalStateExpection not thrown");
@@ -535,7 +537,7 @@ public class MetadataMirrorApplicationTest extends AbstractProvisioningTest {
delete(invalidRepository);
try {
- URI invalidDestRepository = new URI("http://eclipse.org/equinox/foobar/abcdefg");
+ URI invalidDestRepository = new URI("https://eclipse.org/equinox/foobar/abcdefg");
basicRunMirrorApplication("15.1", invalidRepository.toURL(), invalidDestRepository.toURL(), true);
//we expect a provisioning exception to be thrown and should never get here
fail("15.0 ProvisionExpection not thrown");
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 2acff1940..7a8c97e60 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
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2020 IBM Corporation and others.
+ * Copyright (c) 2008, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -39,7 +39,7 @@ import org.eclipse.equinox.internal.p2.artifact.repository.simple.SimpleArtifact
import org.eclipse.equinox.internal.p2.core.helpers.OrderedProperties;
import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper;
import org.eclipse.equinox.p2.core.ProvisionException;
-import org.eclipse.equinox.p2.internal.repository.comparator.MD5ArtifactComparator;
+import org.eclipse.equinox.p2.internal.repository.comparator.ArtifactChecksumComparator;
import org.eclipse.equinox.p2.internal.repository.tools.Messages;
import org.eclipse.equinox.p2.internal.repository.tools.MirrorApplication;
import org.eclipse.equinox.p2.internal.repository.tools.RepositoryDescriptor;
@@ -940,6 +940,7 @@ public class NewMirrorApplicationArtifactTest extends AbstractProvisioningTest {
/**
* Verifies that the mirror application executes processing steps correctly
*/
+ @SuppressWarnings("removal")
@Test
public void testArtifactProcessingSteps() {
if (System.getProperty("java.specification.version").compareTo("14") >= 0) {
@@ -1162,7 +1163,7 @@ public class NewMirrorApplicationArtifactTest extends AbstractProvisioningTest {
}
@DataPoints
- public static String[] defaultComparator = {null, MD5ArtifactComparator.MD5_COMPARATOR_ID};
+ public static String[] defaultComparator = { null, ArtifactChecksumComparator.COMPARATOR_ID + ".md5" };
@Theory
public void testCompareUsingMD5Comparator(String comparator) {
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/NewMirrorApplicationMetadataTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/NewMirrorApplicationMetadataTest.java
index 173bb4ca0..4d8c2ac71 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/NewMirrorApplicationMetadataTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/mirror/NewMirrorApplicationMetadataTest.java
@@ -14,8 +14,12 @@
package org.eclipse.equinox.p2.tests.mirror;
import java.io.File;
-import java.net.*;
-import java.util.*;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
import org.eclipse.equinox.internal.p2.metadata.repository.CompositeMetadataRepository;
import org.eclipse.equinox.internal.simpleconfigurator.utils.URIUtil;
import org.eclipse.equinox.p2.core.ProvisionException;
@@ -551,7 +555,7 @@ public class NewMirrorApplicationMetadataTest extends AbstractProvisioningTest {
public void testMetadataMirrorToInvalid() {
URI invalidDestRepository = null;
try {
- invalidDestRepository = new URI("http://eclipse.org/equinox/foobar/abcdefg");
+ invalidDestRepository = new URI("https://eclipse.org/equinox/foobar/abcdefg");
basicRunMirrorApplication("14.1", sourceRepoLocation.toURL(), invalidDestRepository.toURL(), true);
//we expect an illegal state exception to be thrown and should never get here
fail("14.0 IllegalStateExpection not thrown");
@@ -574,7 +578,7 @@ public class NewMirrorApplicationMetadataTest extends AbstractProvisioningTest {
delete(invalidRepository);
try {
- URI invalidDestRepository = new URI("http://eclipse.org/equinox/foobar/abcdefg");
+ URI invalidDestRepository = new URI("https://eclipse.org/equinox/foobar/abcdefg");
basicRunMirrorApplication("15.1", invalidRepository.toURL(), invalidDestRepository.toURL(), true);
//we expect a provisioning exception to be thrown and should never get here
fail("15.0 ProvisionExpection not thrown");
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/AbsolutePlanTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/AbsolutePlanTest.java
index d14302449..9e5d9b322 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/AbsolutePlanTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/AbsolutePlanTest.java
@@ -52,6 +52,7 @@ public class AbsolutePlanTest extends AbstractProvisioningTest {
for (Operand op : ops) {
if (op instanceof InstallableUnitPropertyOperand) {
found = true;
+ break;
}
}
assertTrue(found);
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/Bug309717.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/Bug309717.java
index 5e3dad312..faedba0c8 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/Bug309717.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/Bug309717.java
@@ -32,7 +32,8 @@ public class Bug309717 extends AbstractProvisioningTest {
public void testUpdate() throws ProvisionException, OperationCanceledException, URISyntaxException {
IProvisioningAgent agent = getAgentProvider().createAgent(getTestData("test data bug309717", "testData/bug309717/p2").toURI());
- IMetadataRepository repo1 = agent.getService(IMetadataRepositoryManager.class).loadRepository(new URI("http://download.eclipse.org/releases/helios"), null);
+ IMetadataRepository repo1 = agent.getService(IMetadataRepositoryManager.class)
+ .loadRepository(new URI("https://download.eclipse.org/releases/2021-09"), null);
// assertFalse(repo1.query(QueryUtil.createIUQuery("org.eclipse.rap.jface.databinding"), new NullProgressMonitor()).isEmpty());
assertNotNull(repo1);
@@ -42,21 +43,13 @@ public class Bug309717 extends AbstractProvisioningTest {
URI jdojo = getTestData("repo for bug309717", "testData/bug309717/repo/jdojo").toURI();
IMetadataRepository repo3 = agent.getService(IMetadataRepositoryManager.class).loadRepository(jdojo, null);
assertNotNull(repo3);
- IMetadataRepository repo4 = agent.getService(IMetadataRepositoryManager.class).loadRepository(new URI("http://download.eclipse.org/eclipse/updates/3.6"), null);
+ IMetadataRepository repo4 = agent.getService(IMetadataRepositoryManager.class)
+ .loadRepository(new URI("https://download.eclipse.org/eclipse/updates/4.21"), null);
// assertFalse(repo1.query(QueryUtil.createIUQuery("org.eclipse.rap.jface.databinding"), new NullProgressMonitor()).isEmpty());
assertNotNull(repo4);
IPlanner planner = getPlanner(agent);
IProfile profile = agent.getService(IProfileRegistry.class).getProfile("PlatformProfile");
IProfileChangeRequest request = planner.createChangeRequest(profile);
assertNotNull(request);
- // Set<IInstallableUnit> ius = repo2.query(QueryUtil.createIUQuery("org.eclipse.riena.toolbox.feature.feature.group", Version.create("2.0.0.201003181312")), new NullProgressMonitor()).toUnmodifiableSet();
- // request.addAll(ius);
- // ProvisioningContext ctx = new ProvisioningContext(getAgent());
- // ctx.setMetadataRepositories(new URI[] {new URI("http://download.eclipse.org/releases/helios"), rienaRepo});
- // IProvisioningPlan plan = planner.getProvisioningPlan(request, ctx, new NullProgressMonitor());
- //
- // assertOK("resolution failed", plan.getStatus());
- // assertEquals(0, plan.getAdditions().query(QueryUtil.createIUQuery("org.eclipse.rap.jface.databinding"), new NullProgressMonitor()).toUnmodifiableSet().size());
- // System.out.println(plan);
}
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/TychoUsage.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/TychoUsage.java
index 0e3a5fe7b..08701b299 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/TychoUsage.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/planner/TychoUsage.java
@@ -1,15 +1,28 @@
package org.eclipse.equinox.p2.tests.planner;
import java.net.URISyntaxException;
-import java.util.*;
-import org.eclipse.core.runtime.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.URIUtil;
import org.eclipse.equinox.internal.p2.director.Projector;
import org.eclipse.equinox.internal.p2.director.Slicer;
import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.engine.IProfile;
-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.MetadataFactory;
+import org.eclipse.equinox.p2.metadata.Version;
+import org.eclipse.equinox.p2.metadata.VersionRange;
import org.eclipse.equinox.p2.planner.IProfileChangeRequest;
-import org.eclipse.equinox.p2.query.*;
+import org.eclipse.equinox.p2.query.Collector;
+import org.eclipse.equinox.p2.query.IQueryable;
+import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.equinox.p2.repository.metadata.IMetadataRepository;
import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
@@ -20,7 +33,9 @@ public class TychoUsage extends AbstractProvisioningTest {
private void setupTopLevelIU() {
IRequirement[] reqPlatform1 = new IRequirement[1];
- reqPlatform1[0] = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "org.eclipse.emf.sdk.feature.group", new VersionRange("[2.7.2.v20120130-0943, 2.7.2.v20120130-0943]"), null, false, false, true);
+ reqPlatform1[0] = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID,
+ "org.eclipse.emf.sdk.feature.group", new VersionRange("[2.27.0.v20210816-1137, 2.27.0.v20210816-1137]"),
+ null, false, false, true);
Map<String, String> p = new HashMap<>();
topLevelIU = createIU("topLevelIU", Version.create("1.0.0"), null, reqPlatform1, new IProvidedCapability[0], p, null, null, true);
}
@@ -32,7 +47,7 @@ public class TychoUsage extends AbstractProvisioningTest {
}
public void testEquivalentP2Call() throws ProvisionException, URISyntaxException {
- loadMetadataRepository(URIUtil.fromString("http://download.eclipse.org/releases/indigo"));
+ loadMetadataRepository(URIUtil.fromString("https://download.eclipse.org/releases/2021-09"));
profile = createProfile("TestProfile." + getName());
IProfileChangeRequest pcr = getPlanner(getAgent()).createChangeRequest(profile);
pcr.add(topLevelIU);
@@ -42,8 +57,11 @@ public class TychoUsage extends AbstractProvisioningTest {
}
public void testTychoUsage() throws ProvisionException, URISyntaxException {
- IMetadataRepository repo = loadMetadataRepository(URIUtil.fromString("http://download.eclipse.org/releases/indigo"));
- IInstallableUnit newRoot1 = repo.query(QueryUtil.createIUQuery("org.eclipse.emf.sdk.feature.group", Version.create("2.7.2.v20120130-0943")), new NullProgressMonitor()).iterator().next();
+ IMetadataRepository repo = loadMetadataRepository(
+ URIUtil.fromString("https://download.eclipse.org/releases/2021-09"));
+ IInstallableUnit newRoot1 = repo.query(
+ QueryUtil.createIUQuery("org.eclipse.emf.sdk.feature.group", Version.create("2.27.0.v20210816-1137")),
+ new NullProgressMonitor()).iterator().next();
Collection<IInstallableUnit> newRoots = new ArrayList<>();
newRoots.add(newRoot1);
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ANYConfigCUsActionTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ANYConfigCUsActionTest.java
index bb92cf4ef..d6085fd8a 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ANYConfigCUsActionTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ANYConfigCUsActionTest.java
@@ -14,13 +14,17 @@
******************************************************************************/
package org.eclipse.equinox.p2.tests.publisher.actions;
-import static org.easymock.EasyMock.expect;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.matches;
+import static org.mockito.Mockito.when;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
-import org.easymock.EasyMock;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.equinox.internal.p2.metadata.InstallableUnit;
import org.eclipse.equinox.internal.p2.publisher.eclipse.DataLoader;
@@ -212,7 +216,8 @@ public class ANYConfigCUsActionTest extends ActionTest {
fail("Unable to create product file advice", e); //$NON-NLS-1$
}
- expect(publisherInfo.getAdvice(EasyMock.matches(configSpec), EasyMock.eq(false), (String) EasyMock.anyObject(), (Version) EasyMock.anyObject(), EasyMock.eq(IExecutableAdvice.class))).andReturn(launchingList).anyTimes();
+ when(publisherInfo.getAdvice(matches(configSpec), eq(false), anyString(), any(Version.class),
+ eq(IExecutableAdvice.class))).thenReturn(launchingList);
//configure IConfigAdvice
ConfigData configData = loader.getConfigData();
@@ -220,14 +225,15 @@ public class ANYConfigCUsActionTest extends ActionTest {
ArrayList<IConfigAdvice> configList = new ArrayList<>();
configList.add(configAdvice);
configList.add(productAdvice);
- expect(publisherInfo.getAdvice(EasyMock.matches(configSpec), EasyMock.eq(false), (String) EasyMock.anyObject(), (Version) EasyMock.anyObject(), EasyMock.eq(IConfigAdvice.class))).andReturn(configList).anyTimes();
+ when(publisherInfo.getAdvice(matches(configSpec), eq(false), anyString(), any(Version.class),
+ eq(IConfigAdvice.class))).thenReturn(configList);
//setup metadata repository
IInstallableUnit[] ius = {mockIU("foo", null), mockIU("bar", null)}; //$NON-NLS-1$ //$NON-NLS-2$
metadataRepo = new TestMetadataRepository(getAgent(), ius);
- expect(publisherInfo.getMetadataRepository()).andReturn(metadataRepo).anyTimes();
- expect(publisherInfo.getContextMetadataRepository()).andReturn(null).anyTimes();
+ when(publisherInfo.getMetadataRepository()).thenReturn(metadataRepo);
+ when(publisherInfo.getContextMetadataRepository()).thenReturn(null);
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/AccumulateConfigDataActionTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/AccumulateConfigDataActionTest.java
index 66707af19..ffe6009d5 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/AccumulateConfigDataActionTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/AccumulateConfigDataActionTest.java
@@ -15,19 +15,25 @@
******************************************************************************/
package org.eclipse.equinox.p2.tests.publisher.actions;
+import static org.mockito.Mockito.verify;
+
import java.io.File;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Map;
-import org.easymock.Capture;
-import org.easymock.EasyMock;
+import java.util.stream.Collectors;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.equinox.frameworkadmin.BundleInfo;
import org.eclipse.equinox.internal.provisional.frameworkadmin.ConfigData;
-import org.eclipse.equinox.p2.publisher.eclipse.*;
+import org.eclipse.equinox.p2.publisher.IPublisherAdvice;
+import org.eclipse.equinox.p2.publisher.eclipse.AccumulateConfigDataAction;
+import org.eclipse.equinox.p2.publisher.eclipse.ConfigAdvice;
+import org.eclipse.equinox.p2.publisher.eclipse.LaunchingAdvice;
import org.eclipse.equinox.p2.tests.TestActivator;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
public class AccumulateConfigDataActionTest extends ActionTest {
@@ -41,13 +47,11 @@ public class AccumulateConfigDataActionTest extends ActionTest {
private static String launcherName = "launcherName"; //$NON-NLS-1$
private static String launcherVersion = "0.0.0"; //$NON-NLS-1$
- Capture<ConfigAdvice> configAdviceCapture;
- Capture<LaunchingAdvice> launchingAdviceCapture;
+ ArgumentCaptor<IPublisherAdvice> capture;
@Override
public void setUp() throws Exception {
- configAdviceCapture = new Capture<>();
- launchingAdviceCapture = new Capture<>();
+ capture = ArgumentCaptor.forClass(IPublisherAdvice.class);
setupPublisherInfo();
setupPublisherResult();
testAction = new AccumulateConfigDataAction(publisherInfo, configSpec, configLocation, executableLocation);
@@ -55,13 +59,15 @@ public class AccumulateConfigDataActionTest extends ActionTest {
public void testAccumulateConfigDataAction() throws Exception {
testAction.perform(publisherInfo, publisherResult, new NullProgressMonitor());
+ verify(publisherInfo, Mockito.atLeastOnce()).addAdvice(capture.capture());
verifyConfigAdvice();
verifyLaunchAdvice();
debug("Completed AccumulateConfigDataActionTest."); //$NON-NLS-1$
}
private void verifyLaunchAdvice() throws URISyntaxException {
- LaunchingAdvice captured = launchingAdviceCapture.getValue();
+ LaunchingAdvice captured = (LaunchingAdvice) capture.getAllValues().stream()
+ .filter(LaunchingAdvice.class::isInstance).collect(Collectors.toList()).get(0);
String[] programArgs = captured.getProgramArguments();
assertTrue(programArgs.length == 4);
assertTrue(programArgs[0].equalsIgnoreCase("-startup")); //$NON-NLS-1$
@@ -79,7 +85,8 @@ public class AccumulateConfigDataActionTest extends ActionTest {
}
private void verifyConfigAdvice() throws Exception {
- ConfigAdvice captured = configAdviceCapture.getValue();
+ ConfigAdvice captured = (ConfigAdvice) capture.getAllValues().stream().filter(ConfigAdvice.class::isInstance)
+ .collect(Collectors.toList()).get(0);
Map<String, String> prop = captured.getProperties();
assertTrue(prop.get("eclipse.buildId").equalsIgnoreCase("TEST-ID")); //$NON-NLS-1$ //$NON-NLS-2$
assertTrue(prop.get("eclipse.p2.profile").equalsIgnoreCase("PlatformProfile")); //$NON-NLS-1$//$NON-NLS-2$
@@ -107,8 +114,5 @@ public class AccumulateConfigDataActionTest extends ActionTest {
ConfigAdvice configAdvice = new ConfigAdvice(configData, configSpec);
ArrayList<ConfigAdvice> configList = new ArrayList<>();
configList.add(configAdvice);
-
- publisherInfo.addAdvice(EasyMock.and(EasyMock.isA(ConfigAdvice.class), EasyMock.capture(configAdviceCapture)));
- publisherInfo.addAdvice(EasyMock.and(EasyMock.isA(LaunchingAdvice.class), EasyMock.capture(launchingAdviceCapture)));
}
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ActionTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ActionTest.java
index 1741c7878..25290d337 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ActionTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ActionTest.java
@@ -14,10 +14,9 @@
******************************************************************************/
package org.eclipse.equinox.p2.tests.publisher.actions;
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import java.io.ByteArrayOutputStream;
import java.io.File;
@@ -118,9 +117,9 @@ public abstract class ActionTest extends AbstractProvisioningTest {
for (IRequirement act : actual) {
if (expected.getMatches().equals(act.getMatches())) {
String descr = "IRequirement " + expected.getMatches();
- Assert.assertEquals("Min of " + descr, expected.getMin(), act.getMin());
- Assert.assertEquals("Max of " + descr, expected.getMax(), act.getMax());
- Assert.assertEquals("Greedy of " + descr, expected.isGreedy(), act.isGreedy());
+ assertEquals("Min of " + descr, expected.getMin(), act.getMin());
+ assertEquals("Max of " + descr, expected.getMax(), act.getMax());
+ assertEquals("Greedy of " + descr, expected.isGreedy(), act.isGreedy());
return;
}
}
@@ -128,13 +127,12 @@ public abstract class ActionTest extends AbstractProvisioningTest {
}
protected IInstallableUnit mockIU(String id, Version version) {
- IInstallableUnit result = createMock(IInstallableUnit.class);
- expect(result.getId()).andReturn(id).anyTimes();
+ IInstallableUnit result = mock(IInstallableUnit.class);
+ when(result.getId()).thenReturn(id);
if (version == null)
version = Version.emptyVersion;
- expect(result.getVersion()).andReturn(version).anyTimes();
- expect(result.getFilter()).andReturn(null).anyTimes();
- replay(result);
+ when(result.getVersion()).thenReturn(version);
+ when(result.getFilter()).thenReturn(null);
return result;
}
@@ -170,31 +168,20 @@ public abstract class ActionTest extends AbstractProvisioningTest {
* Call this method to setup Publisher Info, not <code>insertPublisherInfoBehavior</code>
*/
public void setupPublisherInfo() {
- publisherInfo = createPublisherInfoMock();
+ publisherInfo = mock(IPublisherInfo.class);
String[] config = getArrayFromString(configSpec, COMMA_SEPARATOR);
- expect(publisherInfo.getConfigurations()).andReturn(config).anyTimes();
+ when(publisherInfo.getConfigurations()).thenReturn(config);
insertPublisherInfoBehavior();
- replay(publisherInfo);
- }
-
- /**
- * Creates the mock object for the IPublisherInfo. Subclasses
- * can override to create a nice or strict mock instead.
- * @return The publisher info mock
- * @see org.easymock.EasyMock#createNiceMock(Class)
- * @see org.easymock.EasyMock#createStrictMock(Class)
- */
- protected IPublisherInfo createPublisherInfoMock() {
- return createMock(IPublisherInfo.class);
}
/**
* Do not call this method, it is called by <code>setupPublisherInfo</code>.
*/
protected void insertPublisherInfoBehavior() {
- expect(publisherInfo.getMetadataRepository()).andReturn(createTestMetdataRepository(new IInstallableUnit[0])).anyTimes();
- expect(publisherInfo.getContextMetadataRepository()).andReturn(createTestMetdataRepository(new IInstallableUnit[0])).anyTimes();
+ when(publisherInfo.getMetadataRepository()).thenReturn(createTestMetdataRepository(new IInstallableUnit[0]));
+ when(publisherInfo.getContextMetadataRepository())
+ .thenReturn(createTestMetdataRepository(new IInstallableUnit[0]));
}
public void cleanup() {
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/AdviceMatcher.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/AdviceMatcher.java
deleted file mode 100644
index f23e1f53b..000000000
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/AdviceMatcher.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008, 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 Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.equinox.p2.tests.publisher.actions;
-
-import org.easymock.EasyMock;
-import org.easymock.IArgumentMatcher;
-import org.eclipse.equinox.p2.metadata.Version;
-import org.eclipse.equinox.p2.publisher.IPublisherAdvice;
-
-/**
- * A matcher that matches advice applicable to a given id and version.
- */
-public class AdviceMatcher implements IArgumentMatcher {
- private final Version version;
- private final String id;
- private static Class<?> clazz;
-
- public static IPublisherAdvice adviceMatches(String id, Version version, Class<?> clazz) {
- AdviceMatcher.clazz = clazz;
- EasyMock.reportMatcher(new AdviceMatcher(id, version));
- return null;
- }
-
- public AdviceMatcher(String id, Version version) {
- this.id = id;
- this.version = version;
- }
-
- @Override
- public void appendTo(StringBuffer buf) {
- buf.append("AdviceMatcher[" + id + ',' + version + ']');
- }
-
- @Override
- public boolean matches(Object arg) {
- if (!(arg instanceof IPublisherAdvice))
- return false;
- if (!(clazz.isAssignableFrom(arg.getClass())))
- return false;
- IPublisherAdvice advice = (IPublisherAdvice) arg;
- return advice.isApplicable("", false, id, version);
- }
-}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/BundlesActionTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/BundlesActionTest.java
index f56b010af..fd95c834b 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/BundlesActionTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/BundlesActionTest.java
@@ -16,15 +16,16 @@
******************************************************************************/
package org.eclipse.equinox.p2.tests.publisher.actions;
-import static org.easymock.EasyMock.and;
-import static org.easymock.EasyMock.capture;
-import static org.easymock.EasyMock.expect;
import static org.eclipse.equinox.p2.tests.publisher.actions.StatusMatchers.errorStatus;
import static org.eclipse.equinox.p2.tests.publisher.actions.StatusMatchers.statusWithMessageWhich;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.hasItem;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import java.io.BufferedInputStream;
import java.io.File;
@@ -39,7 +40,6 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.zip.ZipInputStream;
-import org.easymock.EasyMock;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
@@ -58,6 +58,7 @@ import org.eclipse.equinox.p2.metadata.IUpdateDescriptor;
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.AbstractPublisherApplication;
import org.eclipse.equinox.p2.publisher.AdviceFileAdvice;
import org.eclipse.equinox.p2.publisher.IPublisherInfo;
@@ -78,6 +79,8 @@ import org.eclipse.equinox.p2.tests.TestActivator;
import org.eclipse.equinox.p2.tests.TestData;
import org.eclipse.equinox.p2.tests.publisher.TestArtifactRepository;
import org.eclipse.equinox.spi.p2.publisher.PublisherHelper;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
public class BundlesActionTest extends ActionTest {
private static final String OSGI = PublisherHelper.OSGI_BUNDLE_CLASSIFIER;
@@ -141,39 +144,27 @@ public class BundlesActionTest extends ActionTest {
private static final VersionRange TEST1_IU_D_VERSION_RANGE = VersionRange.create("1.3.0");//$NON-NLS-1$
protected TestArtifactRepository artifactRepository = new TestArtifactRepository(getAgent());
-
- private MultiCapture<ITouchpointAdvice> tpAdvice1, tpAdvice2;
- private MultiCapture<IUpdateDescriptorAdvice> udAdvice3;
- private MultiCapture<ICapabilityAdvice> capAdvice5;
-
- @Override
- public void setupPublisherInfo() {
- tpAdvice1 = new MultiCapture<>();
- tpAdvice2 = new MultiCapture<>();
-
- udAdvice3 = new MultiCapture<>();
- capAdvice5 = new MultiCapture<>();
-
- super.setupPublisherInfo();
- }
+ private ArgumentCaptor<AdviceFileAdvice> updateDescriptorCapture;
public void testAll() throws Exception {
File[] files = TEST_BASE.listFiles();
- testAction = new BundlesAction(files);
+ testAction = Mockito.spy(new BundlesAction(files));
setupPublisherResult();
setupPublisherInfo();
artifactRepository.setProperty(AbstractPublisherApplication.PUBLISH_PACK_FILES_AS_SIBLINGS, "true");//$NON-NLS-1$
+ updateDescriptorCapture = ArgumentCaptor.forClass(AdviceFileAdvice.class);
+ IStatus status = testAction.perform(publisherInfo, publisherResult, new NullProgressMonitor());
+ verify(publisherInfo, Mockito.atLeastOnce()).addAdvice(updateDescriptorCapture.capture());
+ assertEquals(Status.OK_STATUS, status);
- assertEquals(Status.OK_STATUS, testAction.perform(publisherInfo, publisherResult, new NullProgressMonitor()));
verifyBundlesAction();
cleanup();
- debug("Completed BundlesActionTest.");//$NON-NLS-1$
}
public void testTranslationFragment() {
File foo_fragment = new File(TestActivator.getTestDataFolder(), "FragmentPublisherTest/foo.fragment");//$NON-NLS-1$
File foo = new File(TestActivator.getTestDataFolder(), "FragmentPublisherTest/foo");//$NON-NLS-1$
- BundlesAction bundlesAction = new BundlesAction(new File[] {foo_fragment});
+ BundlesAction bundlesAction = new BundlesAction(new File[] { foo_fragment });
PublisherInfo info = new PublisherInfo();
PublisherResult results = new PublisherResult();
@@ -183,7 +174,7 @@ public class BundlesActionTest extends ActionTest {
info = new PublisherInfo();
results = new PublisherResult();
- bundlesAction = new BundlesAction(new File[] {foo});
+ bundlesAction = new BundlesAction(new File[] { foo });
bundlesAction.perform(info, results, new NullProgressMonitor());
ius = results.getIUs(null, null);
assertEquals(1, ius.size());
@@ -195,7 +186,7 @@ public class BundlesActionTest extends ActionTest {
utils.setTranslationSource(queryableArray);
assertEquals("English Foo", utils.getIUProperty(iu, IInstallableUnit.PROP_NAME));
- bundlesAction = new BundlesAction(new File[] {foo_fragment});
+ bundlesAction = new BundlesAction(new File[] { foo_fragment });
bundlesAction.perform(info, results, new NullProgressMonitor());
ius = results.getIUs(null, null);
assertEquals(3, ius.size());
@@ -218,6 +209,7 @@ public class BundlesActionTest extends ActionTest {
verifyArtifactRepository();
}
+ @SuppressWarnings("removal")
private void verifyArtifactRepository() throws Exception {
IArtifactKey key2 = ArtifactKey.parse("osgi.bundle,test2,1.0.0.qualifier");//$NON-NLS-1$
IArtifactDescriptor[] descriptors = artifactRepository.getArtifactDescriptors(key2);
@@ -235,7 +227,8 @@ public class BundlesActionTest extends ActionTest {
canonicalIdx = 0;
}
- try (ZipInputStream actual = artifactRepository.getZipInputStream(descriptors[canonicalIdx]); ZipInputStream expected = new ZipInputStream(new FileInputStream(TEST_FILE2))) {
+ try (ZipInputStream actual = artifactRepository.getZipInputStream(descriptors[canonicalIdx]);
+ ZipInputStream expected = new ZipInputStream(new FileInputStream(TEST_FILE2))) {
TestData.assertEquals(expected, actual);
}
@@ -245,12 +238,14 @@ public class BundlesActionTest extends ActionTest {
IArtifactKey key1 = ArtifactKey.parse("osgi.bundle,test1,0.1.0");//$NON-NLS-1$
ZipInputStream zis = artifactRepository.getZipInputStream(key1);
- Map<String, Object[]> fileMap = getFileMap(new HashMap<>(), new File[] {TEST_FILE1}, new Path(TEST_FILE1.getAbsolutePath()));
+ Map<String, Object[]> fileMap = getFileMap(new HashMap<>(), new File[] { TEST_FILE1 },
+ new Path(TEST_FILE1.getAbsolutePath()));
TestData.assertContains(fileMap, zis, true);
}
private void verifyBundle1() {
- List<IInstallableUnit> ius = new ArrayList<>(publisherResult.getIUs(TEST1_PROVBUNDLE_NAME, IPublisherResult.ROOT));
+ List<IInstallableUnit> ius = new ArrayList<>(
+ publisherResult.getIUs(TEST1_PROVBUNDLE_NAME, IPublisherResult.ROOT));
assertEquals(1, ius.size());
IInstallableUnit bundle1IU = ius.get(0);
@@ -269,25 +264,28 @@ public class BundlesActionTest extends ActionTest {
verifyProvidedCapability(providedCapabilities, OSGI_IDENTITY, TEST1_PROVBUNDLE_NAME, BUNDLE1_VERSION);
verifyProvidedCapability(providedCapabilities, OSGI, TEST1_PROVBUNDLE_NAME, BUNDLE1_VERSION);
verifyProvidedCapability(providedCapabilities, TEST1_PROV_Z_NAMESPACE, TEST1_PROVZ_NAME, TEST2_PROVZ_VERSION);
- verifyProvidedCapability(providedCapabilities, PublisherHelper.NAMESPACE_ECLIPSE_TYPE, "source", Version.create("1.0.0"));//$NON-NLS-1$//$NON-NLS-2$
+ verifyProvidedCapability(providedCapabilities, PublisherHelper.NAMESPACE_ECLIPSE_TYPE, "source", //$NON-NLS-1$
+ Version.create("1.0.0"));//$NON-NLS-1$
assertEquals(5, providedCapabilities.size());
- Collection<ITouchpointData> data = bundle1IU.getTouchpointData();
+ List<AdviceFileAdvice> tData = updateDescriptorCapture.getAllValues();
boolean found = false;
- for (ITouchpointData td : data) {
- ITouchpointInstruction configure = td.getInstruction("configure");
- if (configure == null)
- continue;
- String body = configure.getBody();
- if (body != null && body.indexOf("download.eclipse.org/releases/ganymede") > 0) {
- found = true;
+ for (AdviceFileAdvice iTouchpointAdvice : tData) {
+ ITouchpointInstruction configure = iTouchpointAdvice.getTouchpointData(NO_TP_DATA)
+ .getInstruction("configure");
+ if (configure != null) {
+ String body = configure.getBody();
+ if (body != null && body.indexOf("download.eclipse.org/releases/ganymede") > 0) {
+ found = true;
+ }
}
}
assertTrue(found);
}
private void verifyBundle2() {
- List<IInstallableUnit> ius = new ArrayList<>(publisherResult.getIUs(TEST2_PROV_BUNDLE_NAME, IPublisherResult.ROOT));
+ List<IInstallableUnit> ius = new ArrayList<>(
+ publisherResult.getIUs(TEST2_PROV_BUNDLE_NAME, IPublisherResult.ROOT));
assertEquals(1, ius.size());
IInstallableUnit bundleIu = ius.get(0);
@@ -304,14 +302,16 @@ public class BundlesActionTest extends ActionTest {
// check provided capabilities
Collection<IProvidedCapability> providedCapabilities = bundleIu.getProvidedCapabilities();
- verifyProvidedCapability(providedCapabilities, PROVBUNDLE_NAMESPACE, TEST2_PROV_BUNDLE_NAME, PROVBUNDLE2_VERSION);
+ verifyProvidedCapability(providedCapabilities, PROVBUNDLE_NAMESPACE, TEST2_PROV_BUNDLE_NAME,
+ PROVBUNDLE2_VERSION);
verifyProvidedCapability(providedCapabilities, OSGI, TEST2_PROV_BUNDLE_NAME, BUNDLE2_VERSION);
verifyProvidedCapability(providedCapabilities, OSGI_IDENTITY, TEST2_PROV_BUNDLE_NAME, BUNDLE2_VERSION);
verifyProvidedCapability(providedCapabilities, TEST2_PROV_Z_NAMESPACE, TEST2_PROV_Z_NAME, TEST2_PROVZ_VERSION);
verifyProvidedCapability(providedCapabilities, TEST2_PROV_Y_NAMESPACE, TEST2_PROV_Y_NAME, TEST2_PROVY_VERSION);
verifyProvidedCapability(providedCapabilities, TEST2_PROV_X_NAMESPACE, TEST2_PROV_X_NAME, TEST2_PROVX_VERSION);
- verifyProvidedCapability(providedCapabilities, PublisherHelper.NAMESPACE_ECLIPSE_TYPE, "bundle", Version.create("1.0.0"));//$NON-NLS-1$//$NON-NLS-2$
- assertEquals(7, providedCapabilities.size()); /*number of tested elements*/
+ verifyProvidedCapability(providedCapabilities, PublisherHelper.NAMESPACE_ECLIPSE_TYPE, "bundle", //$NON-NLS-1$
+ Version.create("1.0.0"));//$NON-NLS-1$
+ assertEquals(7, providedCapabilities.size()); /* number of tested elements */
// check %bundle name is correct
Map<String, String> prop = bundleIu.getProperties();
@@ -333,27 +333,41 @@ public class BundlesActionTest extends ActionTest {
}
private void verifyBundle3() {
- // also a regression test for bug 393051: manifest headers use uncommon (but valid) capitalization
- ArrayList<IInstallableUnit> ius = new ArrayList<>(publisherResult.getIUs(TEST3_PROV_BUNDLE_NAME, IPublisherResult.ROOT));
+ // also a regression test for bug 393051: manifest headers use uncommon (but
+ // valid) capitalization
+ ArrayList<IInstallableUnit> ius = new ArrayList<>(
+ publisherResult.getIUs(TEST3_PROV_BUNDLE_NAME, IPublisherResult.ROOT));
assertEquals(1, ius.size());
-
- IInstallableUnit bundleIu = ius.get(0);
-
- IUpdateDescriptor updateDescriptor = bundleIu.getUpdateDescriptor();
- String name = RequiredCapability.extractName(updateDescriptor.getIUsBeingUpdated().iterator().next());
+ IUpdateDescriptor updateDescriptor = null;
+ boolean found = false;
+ for (AdviceFileAdvice advice : updateDescriptorCapture.getAllValues()) {
+ IUpdateDescriptor descriptor = advice.getUpdateDescriptor(new InstallableUnitDescription());
+ if (descriptor != null) {
+ Collection<IMatchExpression<IInstallableUnit>> iUsBeingUpdated = descriptor.getIUsBeingUpdated();
+ if (iUsBeingUpdated != null) {
+ String name = RequiredCapability.extractName(descriptor.getIUsBeingUpdated().iterator().next());
+ if (TEST3_PROV_BUNDLE_NAME.equals(name)) {
+ updateDescriptor = descriptor;
+ found = true;
+ break;
+ }
+ }
+ }
+ }
+ assertTrue(found);
VersionRange range = RequiredCapability.extractRange(updateDescriptor.getIUsBeingUpdated().iterator().next());
String description = updateDescriptor.getDescription();
int severity = updateDescriptor.getSeverity();
VersionRange expectedRange = new VersionRange("(0.0.1," + BUNDLE3_VERSION + "]");
- assertEquals(TEST3_PROV_BUNDLE_NAME, name);
assertEquals(expectedRange, range);
assertEquals("Some description about this update", description.trim());
assertEquals(8, severity);
}
private void verifyBundle4() {
- ArrayList<IInstallableUnit> ius = new ArrayList<>(publisherResult.getIUs(TEST4_PROV_BUNDLE_NAME, IPublisherResult.ROOT));
+ ArrayList<IInstallableUnit> ius = new ArrayList<>(
+ publisherResult.getIUs(TEST4_PROV_BUNDLE_NAME, IPublisherResult.ROOT));
assertEquals(1, ius.size());
IInstallableUnit bundleIu = ius.get(0);
@@ -362,23 +376,29 @@ public class BundlesActionTest extends ActionTest {
// check required capabilities
Collection<IRequirement> requirements = bundleIu.getRequirements();
- verifyRequirement(requirements, JAVA_PACKAGE, TEST4_REQ_PACKAGE_OPTIONAL_NAME, DEFAULT_VERSION_RANGE, null, 0, 1, false);
- verifyRequirement(requirements, JAVA_PACKAGE, TEST4_REQ_PACKAGE_OPTGREEDY_NAME, DEFAULT_VERSION_RANGE, null, 0, 1, true);
+ verifyRequirement(requirements, JAVA_PACKAGE, TEST4_REQ_PACKAGE_OPTIONAL_NAME, DEFAULT_VERSION_RANGE, null, 0,
+ 1, false);
+ verifyRequirement(requirements, JAVA_PACKAGE, TEST4_REQ_PACKAGE_OPTGREEDY_NAME, DEFAULT_VERSION_RANGE, null, 0,
+ 1, true);
verifyRequirement(requirements, OSGI, TEST4_REQ_BUNDLE_OPTIONAL_NAME, DEFAULT_VERSION_RANGE, null, 0, 1, false);
verifyRequirement(requirements, OSGI, TEST4_REQ_BUNDLE_OPTGREEDY_NAME, DEFAULT_VERSION_RANGE, null, 0, 1, true);
assertEquals(4, requirements.size());
}
private void verifyBundle5() {
- ArrayList<IInstallableUnit> ius = new ArrayList<>(publisherResult.getIUs(TEST5_PROV_BUNDLE_NAME, IPublisherResult.ROOT));
+ ArrayList<IInstallableUnit> ius = new ArrayList<>(
+ publisherResult.getIUs(TEST5_PROV_BUNDLE_NAME, IPublisherResult.ROOT));
assertEquals(1, ius.size());
IInstallableUnit bundle5IU = ius.get(0);
-
+ for (AdviceFileAdvice adv : updateDescriptorCapture.getAllValues()) {
+ IRequirement[] reqs = adv.getRequiredCapabilities(new InstallableUnitDescription());
+ if (reqs != null) {
+ verifyRequirement(List.of(reqs), "bar", "foo", VersionRange.emptyRange, null, 6, 7, true);
+ }
+ }
Collection<IRequirement> requirements = bundle5IU.getRequirements();
verifyRequirement(requirements, OSGI_EE, TEST5_REQ_EE, null, 1, 1, true);
- verifyRequirement(requirements, "bar", "foo", VersionRange.emptyRange, null, 6, 7, true);
- assertEquals(2, requirements.size());
}
@Override
@@ -392,7 +412,8 @@ public class BundlesActionTest extends ActionTest {
@Override
protected void insertPublisherInfoBehavior() {
- //super sets publisherInfo.getMetadataRepository and publisherInfo.getContextMetadataRepository
+ // super sets publisherInfo.getMetadataRepository and
+ // publisherInfo.getContextMetadataRepository
super.insertPublisherInfoBehavior();
Map<String, String> sarProperties = new HashMap<>();
sarProperties.put("key1", "value1");//$NON-NLS-1$//$NON-NLS-2$
@@ -402,23 +423,21 @@ public class BundlesActionTest extends ActionTest {
sdkProperties.put("key1", "value1");//$NON-NLS-1$//$NON-NLS-2$
sdkProperties.put("key2", "value2");//$NON-NLS-1$//$NON-NLS-2$
- expect(publisherInfo.getArtifactRepository()).andReturn(artifactRepository).anyTimes();
- expect(publisherInfo.getArtifactOptions()).andReturn(IPublisherInfo.A_INDEX | IPublisherInfo.A_OVERWRITE | IPublisherInfo.A_PUBLISH).anyTimes();
- expect(publisherInfo.getAdvice(null, false, null, null, ICapabilityAdvice.class)).andReturn(new ArrayList<>()).anyTimes();
+ when(publisherInfo.getArtifactRepository()).thenReturn(artifactRepository);
+ when(publisherInfo.getArtifactOptions())
+ .thenReturn(IPublisherInfo.A_INDEX | IPublisherInfo.A_OVERWRITE | IPublisherInfo.A_PUBLISH);
+ when(publisherInfo.getAdvice(null, false, null, null, ICapabilityAdvice.class)).thenReturn(new ArrayList<>());
expectOtherAdviceQueries(TEST1_PROVBUNDLE_NAME, BUNDLE1_VERSION);
expectPropertyAdviceQuery(TEST1_PROVBUNDLE_NAME, BUNDLE1_VERSION, sarProperties);
expectUpdateDescriptorAdviceQuery(TEST1_PROVBUNDLE_NAME, BUNDLE1_VERSION, null);
- expectTouchpointAdviceQuery(TEST1_PROVBUNDLE_NAME, BUNDLE1_VERSION, tpAdvice1);
expectOtherAdviceQueries(TEST2_PROV_BUNDLE_NAME, BUNDLE2_VERSION);
expectPropertyAdviceQuery(TEST2_PROV_BUNDLE_NAME, BUNDLE2_VERSION, sdkProperties);
expectUpdateDescriptorAdviceQuery(TEST2_PROV_BUNDLE_NAME, BUNDLE2_VERSION, null);
- expectTouchpointAdviceQuery(TEST2_PROV_BUNDLE_NAME, BUNDLE2_VERSION, tpAdvice2);
expectOtherAdviceQueries(TEST3_PROV_BUNDLE_NAME, BUNDLE3_VERSION);
expectPropertyAdviceQuery(TEST3_PROV_BUNDLE_NAME, BUNDLE3_VERSION, sarProperties);
- expectUpdateDescriptorAdviceQuery(TEST3_PROV_BUNDLE_NAME, BUNDLE3_VERSION, udAdvice3);
expectTouchpointAdviceQuery(TEST3_PROV_BUNDLE_NAME, BUNDLE3_VERSION, null);
expectOtherAdviceQueries(TEST4_PROV_BUNDLE_NAME, BUNDLE4_VERSION);
@@ -426,49 +445,43 @@ public class BundlesActionTest extends ActionTest {
expectUpdateDescriptorAdviceQuery(TEST4_PROV_BUNDLE_NAME, BUNDLE4_VERSION, null);
expectTouchpointAdviceQuery(TEST4_PROV_BUNDLE_NAME, BUNDLE4_VERSION, null);
- expectCapabilityAdviceQuery(TEST5_PROV_BUNDLE_NAME, BUNDLE5_VERSION, capAdvice5);
+// expectCapabilityAdviceQuery(TEST5_PROV_BUNDLE_NAME, BUNDLE5_VERSION, capAdvice5.getValues());
expectOtherAdviceQueries(TEST5_PROV_BUNDLE_NAME, BUNDLE5_VERSION);
expectPropertyAdviceQuery(TEST5_PROV_BUNDLE_NAME, BUNDLE5_VERSION, sarProperties);
expectUpdateDescriptorAdviceQuery(TEST5_PROV_BUNDLE_NAME, BUNDLE5_VERSION, null);
expectTouchpointAdviceQuery(TEST5_PROV_BUNDLE_NAME, BUNDLE5_VERSION, null);
- //capture any touchpoint advice, and return the captured advice when the action asks for it
- publisherInfo.addAdvice(and(AdviceMatcher.adviceMatches(TEST1_PROVBUNDLE_NAME, BUNDLE1_VERSION, ITouchpointAdvice.class), capture(tpAdvice1)));
- EasyMock.expectLastCall().anyTimes();
-
- publisherInfo.addAdvice(and(AdviceMatcher.adviceMatches(TEST2_PROV_BUNDLE_NAME, BUNDLE2_VERSION, ITouchpointAdvice.class), capture(tpAdvice2)));
- EasyMock.expectLastCall().anyTimes();
-
- publisherInfo.addAdvice(and(AdviceMatcher.adviceMatches(TEST3_PROV_BUNDLE_NAME, BUNDLE3_VERSION, AdviceFileAdvice.class), capture(udAdvice3)));
-
- publisherInfo.addAdvice(and(AdviceMatcher.adviceMatches(TEST5_PROV_BUNDLE_NAME, BUNDLE5_VERSION, AdviceFileAdvice.class), capture(capAdvice5)));
- EasyMock.expectLastCall().anyTimes();
}
private void expectOtherAdviceQueries(String bundleName, Version bundleVersion) {
- expect(publisherInfo.getAdvice(null, false, bundleName, bundleVersion, ICapabilityAdvice.class))
- .andReturn(Collections.emptyList());
- expect(publisherInfo.getAdvice(null, false, bundleName, bundleVersion, IAdditionalInstallableUnitAdvice.class))
- .andReturn(Collections.emptyList());
- expect(publisherInfo.getAdvice(null, true, bundleName, bundleVersion, IBundleShapeAdvice.class)).andReturn(null);
+ when(publisherInfo.getAdvice(null, false, bundleName, bundleVersion, ICapabilityAdvice.class))
+ .thenReturn(Collections.emptyList());
+ when(publisherInfo.getAdvice(null, false, bundleName, bundleVersion, IAdditionalInstallableUnitAdvice.class))
+ .thenReturn(Collections.emptyList());
+ when(publisherInfo.getAdvice(null, true, bundleName, bundleVersion, IBundleShapeAdvice.class)).thenReturn(null);
}
- private void expectCapabilityAdviceQuery(String bundleName, Version bundleVersion, Collection<ICapabilityAdvice> answer) {
- if (answer == null)
- answer = Collections.emptyList();
- expect(publisherInfo.getAdvice(null, false, bundleName, bundleVersion, ICapabilityAdvice.class)).andReturn(answer);
- }
+// private void expectCapabilityAdviceQuery(String bundleName, Version bundleVersion,
+// Collection<ICapabilityAdvice> answer) {
+// if (answer == null)
+// answer = Collections.emptyList();
+// when(publisherInfo.getAdvice(null, false, bundleName, bundleVersion, ICapabilityAdvice.class))
+// .thenReturn(answer);
+// }
- private void expectUpdateDescriptorAdviceQuery(String bundleName, Version bundleVersion, Collection<IUpdateDescriptorAdvice> answer) {
+ private void expectUpdateDescriptorAdviceQuery(String bundleName, Version bundleVersion,
+ Collection<IUpdateDescriptorAdvice> answer) {
if (answer == null)
answer = Collections.emptyList();
- expect(publisherInfo.getAdvice(null, false, bundleName, bundleVersion, IUpdateDescriptorAdvice.class)).andReturn(answer);
+ when(publisherInfo.getAdvice(null, false, bundleName, bundleVersion, IUpdateDescriptorAdvice.class))
+ .thenReturn(answer);
}
- private void expectTouchpointAdviceQuery(String bundleName, Version bundleVersion, Collection<ITouchpointAdvice> answer) {
+ private void expectTouchpointAdviceQuery(String bundleName, Version bundleVersion, List<ITouchpointAdvice> answer) {
if (answer == null)
answer = Collections.emptyList();
- expect(publisherInfo.getAdvice(null, false, bundleName, bundleVersion, ITouchpointAdvice.class)).andReturn(answer).anyTimes();
+ when(publisherInfo.getAdvice(null, false, bundleName, bundleVersion, ITouchpointAdvice.class))
+ .thenReturn(answer);
}
private void expectPropertyAdviceQuery(String bundleName, Version bundleVersion, Map<String, String> answer) {
@@ -477,20 +490,22 @@ public class BundlesActionTest extends ActionTest {
propertyAdvices = Collections.singletonList(createPropertyAdvice(answer));
else
propertyAdvices = Collections.emptyList();
- expect(publisherInfo.getAdvice(null, false, bundleName, bundleVersion, IPropertyAdvice.class)).andReturn(propertyAdvices).times(2);
+ when(publisherInfo.getAdvice(null, false, bundleName, bundleVersion, IPropertyAdvice.class))
+ .thenReturn(propertyAdvices);
}
private IPropertyAdvice createPropertyAdvice(Map<String, String> properties) {
- IPropertyAdvice mockAdvice = EasyMock.createMock(IPropertyAdvice.class);
- expect(mockAdvice.getInstallableUnitProperties((InstallableUnitDescription) EasyMock.anyObject())).andReturn(null).anyTimes();
- expect(mockAdvice.getArtifactProperties((IInstallableUnit) EasyMock.anyObject(), (IArtifactDescriptor) EasyMock.anyObject())).andReturn(properties).anyTimes();
- EasyMock.replay(mockAdvice);
+ IPropertyAdvice mockAdvice = mock(IPropertyAdvice.class);
+ when(mockAdvice.getInstallableUnitProperties(any(InstallableUnitDescription.class))).thenReturn(null);
+ when(mockAdvice.getArtifactProperties(any(IInstallableUnit.class), any(IArtifactDescriptor.class)))
+ .thenReturn(properties);
return mockAdvice;
}
public void testDynamicImport() throws Exception {
File testData = getTestData("dymamicImport", "testData/dynamicImport");
- IInstallableUnit iu = BundlesAction.createBundleIU(BundlesAction.createBundleDescription(testData), null, new PublisherInfo());
+ IInstallableUnit iu = BundlesAction.createBundleIU(BundlesAction.createBundleDescription(testData), null,
+ new PublisherInfo());
Collection<IRequirement> requirements = iu.getRequirements();
verifyRequirement(requirements, OSGI_EE, TESTDYN_REQ_EE, null, 1, 1, true);
@@ -507,11 +522,13 @@ public class BundlesActionTest extends ActionTest {
// overall status shall be error...
assertThat(status, errorStatus());
List<IStatus> childStatuses = Arrays.asList(status.getChildren());
- assertThat(childStatuses, hasItem(statusWithMessageWhich(containsString("The manifest line \"foo\" is invalid; it has no colon ':' character after the header key."))));
+ assertThat(childStatuses, hasItem(statusWithMessageWhich(containsString(
+ "The manifest line \"foo\" is invalid; it has no colon ':' character after the header key."))));
assertThat(childStatuses.size(), is(1));
// ... but the valid bundle must still be published
- Collection<IInstallableUnit> ius = publisherResult.getIUs("org.eclipse.p2.test.validManifest", IPublisherResult.ROOT);
+ Collection<IInstallableUnit> ius = publisherResult.getIUs("org.eclipse.p2.test.validManifest",
+ IPublisherResult.ROOT);
assertThat(ius.size(), is(1));
}
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/CaptureList.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/CaptureList.java
deleted file mode 100644
index e317d621c..000000000
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/CaptureList.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008, 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 Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.equinox.p2.tests.publisher.actions;
-
-import java.util.AbstractList;
-import org.easymock.Capture;
-
-/**
- * An object that adapts an EasyMock Capture to a List.
- */
-public class CaptureList<E> extends AbstractList<E> {
- private Capture<E> capture;
-
- public CaptureList(Capture<E> capture) {
- this.capture = capture;
- }
-
- @Override
- public E get(int arg0) {
- return capture.getValue();
- }
-
- @Override
- public int size() {
- return capture.hasCaptured() ? 1 : 0;
- }
-
-}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ConfigCUsActionTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ConfigCUsActionTest.java
index 24b6997bb..99afa871c 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ConfigCUsActionTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ConfigCUsActionTest.java
@@ -15,13 +15,17 @@
******************************************************************************/
package org.eclipse.equinox.p2.tests.publisher.actions;
-import static org.easymock.EasyMock.expect;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.matches;
+import static org.mockito.Mockito.when;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
-import org.easymock.EasyMock;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.equinox.internal.p2.metadata.InstallableUnit;
import org.eclipse.equinox.internal.p2.publisher.eclipse.DataLoader;
@@ -147,7 +151,8 @@ public class ConfigCUsActionTest extends ActionTest {
ConfigAdvice configAdvice = new ConfigAdvice(configData, configSpec);
ArrayList<IConfigAdvice> configList = new ArrayList<>();
configList.add(configAdvice);
- expect(publisherInfo.getAdvice(EasyMock.matches(configSpec), EasyMock.eq(false), (String) EasyMock.anyObject(), (Version) EasyMock.anyObject(), EasyMock.eq(IConfigAdvice.class))).andReturn(configList).anyTimes();
+ when(publisherInfo.getAdvice(matches(configSpec), eq(false), anyString(), any(Version.class),
+ eq(IConfigAdvice.class))).thenReturn(configList);
//configure IExecutableAdvice
LauncherData launcherData = loader.getLauncherData();
@@ -164,14 +169,15 @@ public class ConfigCUsActionTest extends ActionTest {
// TODO Auto-generated catch block
}
- expect(publisherInfo.getAdvice(EasyMock.matches(configSpec), EasyMock.eq(false), (String) EasyMock.anyObject(), (Version) EasyMock.anyObject(), EasyMock.eq(IExecutableAdvice.class))).andReturn(launchingList).anyTimes();
+ when(publisherInfo.getAdvice(matches(configSpec), eq(false), anyString(), any(Version.class),
+ eq(IExecutableAdvice.class))).thenReturn(launchingList);
//setup metadata repository
IInstallableUnit[] ius = {mockIU("foo", null), mockIU("bar", null)}; //$NON-NLS-1$ //$NON-NLS-2$
metadataRepo = new TestMetadataRepository(getAgent(), ius);
- expect(publisherInfo.getMetadataRepository()).andReturn(metadataRepo).anyTimes();
- expect(publisherInfo.getContextMetadataRepository()).andReturn(null).anyTimes();
+ when(publisherInfo.getMetadataRepository()).thenReturn(metadataRepo);
+ when(publisherInfo.getContextMetadataRepository()).thenReturn(null);
}
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/EquinoxExecutableActionTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/EquinoxExecutableActionTest.java
index 41bf705a0..532bab05e 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/EquinoxExecutableActionTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/EquinoxExecutableActionTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2017 Code 9 and others.
+ * Copyright (c) 2008, 2021 Code 9 and others.
*
* This
* program and the accompanying materials are made available under the terms of
@@ -15,9 +15,11 @@
******************************************************************************/
package org.eclipse.equinox.p2.tests.publisher.actions;
-import static org.easymock.EasyMock.anyBoolean;
-import static org.easymock.EasyMock.anyObject;
-import static org.easymock.EasyMock.expect;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.nullable;
+import static org.mockito.Mockito.when;
import java.io.File;
import java.io.FileInputStream;
@@ -30,6 +32,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Enumeration;
import java.util.LinkedList;
+import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
@@ -62,10 +65,9 @@ public class EquinoxExecutableActionTest extends ActionTest {
private static final File LINUX_EXEC = new File(TestActivator.getTestDataFolder(), "EquinoxExecutableActionTest/linux/"); //$NON-NLS-1$
private static final File WIN_EXEC = new File(TestActivator.getTestDataFolder(), "EquinoxExecutableActionTest/win/"); //$NON-NLS-1$
private final String EXECUTABLE_NAME = "LauncherName"; //$NON-NLS-1$
- private Collection<IBrandingAdvice> brandingAdvice = new LinkedList<>();
private String macConfigCocoa = "cocoa.macosx.x86"; //$NON-NLS-1$
- private String winConfig = "win32.win32.x86"; //$NON-NLS-1$
- private String linuxConfig = "linux.gtk.x86"; //$NON-NLS-1$
+ private String winConfig = "win32.win32.x86_64"; //$NON-NLS-1$
+ private String linuxConfig = "linux.gtk.x86_64"; //$NON-NLS-1$
private ExecutablesDescriptor executablesDescriptor;
private IArtifactRepository artifactRepository;
private Version version = Version.create("1.2.3"); //$NON-NLS-1$
@@ -76,9 +78,6 @@ public class EquinoxExecutableActionTest extends ActionTest {
public void setUp() throws Exception {
setupPublisherInfo();
setupPublisherResult();
- }
-
- private void setupArtifactRepository() {
artifactRepository = new TestArtifactRepository(getAgent());
}
@@ -118,7 +117,10 @@ public class EquinoxExecutableActionTest extends ActionTest {
private void testExecutableAction(String idBase, final String osArg, String config, File exec, File icon) {
id = idBase;
- setupBrandingAdvice(osArg, configSpec, exec, icon);
+ when(publisherInfo.getArtifactRepository()).thenReturn(artifactRepository);
+ when(publisherInfo.getArtifactOptions()).thenReturn(IPublisherInfo.A_PUBLISH);
+ when(publisherInfo.getAdvice(anyString(), anyBoolean(), nullable(String.class), nullable(Version.class),
+ eq(IBrandingAdvice.class))).then(invocation -> setupBrandingAdvice(osArg, icon));
executablesDescriptor = ExecutablesDescriptor.createDescriptor(osArg, "eclipse", exec);
testAction = new EquinoxExecutableAction(executablesDescriptor, config, idBase, version, flavorArg);
testAction.perform(publisherInfo, publisherResult, new NullProgressMonitor());
@@ -128,10 +130,10 @@ public class EquinoxExecutableActionTest extends ActionTest {
private void verifyResults(String idBase, String confSpec) {
ArrayList<IInstallableUnit> iuList = new ArrayList<>(publisherResult.getIUs(null, IPublisherResult.ROOT));
+ assertEquals(3, iuList.size());
verifyEclipseIU(iuList, idBase, confSpec);
verifyCU(iuList, idBase, confSpec);
verifyExecIU(iuList, idBase, confSpec);
- assertTrue(iuList.size() == 3);
}
private void verifyCU(ArrayList<IInstallableUnit> iuList, String idBase, String confSpec) {
@@ -162,16 +164,16 @@ public class EquinoxExecutableActionTest extends ActionTest {
private void verifyEclipseIU(ArrayList<IInstallableUnit> iuList, String idBase, String confSpec) {
for (IInstallableUnit possibleEclipse : iuList) {
if (possibleEclipse.getId().equals((idBase + ".executable." + confSpec + "." + EXECUTABLE_NAME))) { //$NON-NLS-1$//$NON-NLS-2$
- assertTrue(possibleEclipse.getVersion().equals(version));
+ assertEquals(version, possibleEclipse.getVersion());
Collection<IProvidedCapability> providedCapability = possibleEclipse.getProvidedCapabilities();
verifyProvidedCapability(providedCapability, IInstallableUnit.NAMESPACE_IU_ID, idBase + ".executable." + confSpec + "." + EXECUTABLE_NAME, version); //$NON-NLS-1$ //$NON-NLS-2$
- assertTrue(providedCapability.size() == 1);
+ assertEquals(1, providedCapability.size());
Collection<IRequirement> req = possibleEclipse.getRequirements();
- assertTrue(req.size() == 0);
+ assertEquals(0, req.size());
return;//pass
}
}
- fail();
+ fail("No executable installable unit.");
}
private void verifyExecIU(ArrayList<IInstallableUnit> iuList, String idBase, String confSpec) {
@@ -274,15 +276,8 @@ public class EquinoxExecutableActionTest extends ActionTest {
}
}
- @Override
- protected void insertPublisherInfoBehavior() {
- setupArtifactRepository();
- expect(publisherInfo.getArtifactRepository()).andReturn(artifactRepository).anyTimes();
- expect(publisherInfo.getArtifactOptions()).andReturn(IPublisherInfo.A_PUBLISH).anyTimes();
- expect(publisherInfo.getAdvice((String) anyObject(), anyBoolean(), (String) anyObject(), (Version) anyObject(), (Class<IBrandingAdvice>) anyObject())).andReturn(brandingAdvice);
- }
-
- private void setupBrandingAdvice(final String osArg, final String config, final File exec, final File icon) {
+ private List<IBrandingAdvice> setupBrandingAdvice(final String osArg, final File icon) {
+ List<IBrandingAdvice> brandingAdvice = new LinkedList<>();
brandingAdvice.add(new IBrandingAdvice() {
@Override
public boolean isApplicable(String configSpec, boolean includeDefault, String id, Version version) {
@@ -304,5 +299,6 @@ public class EquinoxExecutableActionTest extends ActionTest {
return EXECUTABLE_NAME;
}
});
+ return brandingAdvice;
}
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/EquinoxLauncherCUActionTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/EquinoxLauncherCUActionTest.java
index 95442d175..ff0b846fb 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/EquinoxLauncherCUActionTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/EquinoxLauncherCUActionTest.java
@@ -15,9 +15,8 @@
******************************************************************************/
package org.eclipse.equinox.p2.tests.publisher.actions;
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Collection;
@@ -56,13 +55,12 @@ public class EquinoxLauncherCUActionTest extends ActionTest {
}
protected IInstallableUnit mockIU(String id, Version version, boolean fragment) {
- IInstallableUnit result = createMock(IInstallableUnit.class);
- expect(result.getId()).andReturn(id).anyTimes();
+ IInstallableUnit result = mock(IInstallableUnit.class);
+ when(result.getId()).thenReturn(id);
if (version == null)
version = Version.emptyVersion;
- expect(result.getVersion()).andReturn(version).anyTimes();
- expect(result.getFilter()).andReturn(null).anyTimes();
- replay(result);
+ when(result.getVersion()).thenReturn(version);
+ when(result.getFilter()).thenReturn(null);
return result;
}
@@ -108,7 +106,10 @@ public class EquinoxLauncherCUActionTest extends ActionTest {
ArrayList<IVersionAdvice> versionList = new ArrayList<>();
versionList.add(versionAdvice);
- expect(publisherInfo.getAdvice(null, true, EquinoxLauncherCUAction.ORG_ECLIPSE_EQUINOX_LAUNCHER, null, IVersionAdvice.class)).andReturn(versionList);
- expect(publisherInfo.getAdvice(configSpec, true, EquinoxLauncherCUAction.ORG_ECLIPSE_EQUINOX_LAUNCHER + "." + configSpec, null, IVersionAdvice.class)).andReturn(versionList); //$NON-NLS-1$
+ when(publisherInfo.getAdvice(null, true, EquinoxLauncherCUAction.ORG_ECLIPSE_EQUINOX_LAUNCHER, null,
+ IVersionAdvice.class)).thenReturn(versionList);
+ when(publisherInfo.getAdvice(configSpec, true,
+ EquinoxLauncherCUAction.ORG_ECLIPSE_EQUINOX_LAUNCHER + "." + configSpec, null, IVersionAdvice.class)) //$NON-NLS-1$
+ .thenReturn(versionList);
}
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/FeaturesActionTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/FeaturesActionTest.java
index a83f52b14..279660892 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/FeaturesActionTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/FeaturesActionTest.java
@@ -15,10 +15,10 @@
******************************************************************************/
package org.eclipse.equinox.p2.tests.publisher.actions;
-import static org.easymock.EasyMock.and;
-import static org.easymock.EasyMock.capture;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.isA;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import java.io.File;
import java.io.IOException;
@@ -26,10 +26,9 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;
-import org.easymock.Capture;
-import org.easymock.EasyMock;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.equinox.internal.p2.metadata.ArtifactKey;
@@ -62,6 +61,8 @@ import org.eclipse.equinox.p2.tests.TestData;
import org.eclipse.equinox.p2.tests.TestMetadataRepository;
import org.eclipse.equinox.p2.tests.publisher.TestArtifactRepository;
import org.eclipse.equinox.spi.p2.publisher.PublisherHelper;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
public class FeaturesActionTest extends ActionTest {
@@ -75,12 +76,12 @@ public class FeaturesActionTest extends ActionTest {
private Version barVersion = Version.create("1.1.1"); //$NON-NLS-1$
private String BAR = "bar"; //$NON-NLS-1$
private String FOO = "foo"; //$NON-NLS-1$
- private Capture<ITouchpointAdvice> tpAdvice;
+ private ArgumentCaptor<ITouchpointAdvice> capture = ArgumentCaptor.forClass(ITouchpointAdvice.class);
@Override
public void setUp() throws Exception {
- testAction = new FeaturesAction(new File[] {root});
- tpAdvice = new Capture<>();
+ super.setUp();
+ testAction = Mockito.spy(new FeaturesAction(new File[] { root }));
setupPublisherInfo();
setupPublisherResult();
}
@@ -90,37 +91,41 @@ public class FeaturesActionTest extends ActionTest {
*/
public void testSimple() throws Exception {
testAction.perform(publisherInfo, publisherResult, new NullProgressMonitor());
+ verify(publisherInfo, Mockito.atLeastOnce()).addAdvice(capture.capture());
verifyRepositoryContents();
debug("Completed FeaturesAction."); //$NON-NLS-1$
}
public void testFeaturePatch() throws Exception {
File testFolder = getTestFolder("FeaturesAction.testFilters");
- StringBuffer buffer = new StringBuffer();
+ StringBuilder buffer = new StringBuilder();
buffer.append("<feature id=\"test.feature\" version=\"1.0.0\" > \n");
buffer.append(" <requires> \n");
- buffer.append(" <import feature=\"org.foo\" version=\"[1.0.0,2.0.0)\" match=\"versionRange\" patch=\"true\"/> \n");
+ buffer.append(
+ " <import feature=\"org.foo\" version=\"[1.0.0,2.0.0)\" match=\"versionRange\" patch=\"true\"/> \n");
buffer.append(" </requires> \n");
buffer.append("</feature> \n");
File featureXML = new File(testFolder, "feature.xml");
writeBuffer(featureXML, buffer);
publisherInfo = new PublisherInfo();
- FeaturesAction action = new FeaturesAction(new File[] {testFolder});
+ FeaturesAction action = new FeaturesAction(new File[] { testFolder });
action.perform(publisherInfo, publisherResult, new NullProgressMonitor());
- IInstallableUnitPatch iu = (IInstallableUnitPatch) publisherResult.getIU("test.feature.feature.group", Version.parseVersion("1.0.0"), null);
+ IInstallableUnitPatch iu = (IInstallableUnitPatch) publisherResult.getIU("test.feature.feature.group",
+ Version.parseVersion("1.0.0"), null);
IRequirement[][] applicabilityScope = iu.getApplicabilityScope();
assertEquals(1, applicabilityScope.length);
IRequiredCapability require = (IRequiredCapability) applicabilityScope[0][0];
- IRequirement expected = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "org.foo.feature.group", VersionRange.create("[1.0.0, 2.0.0)"), null, false, false, true);
+ IRequirement expected = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID,
+ "org.foo.feature.group", VersionRange.create("[1.0.0, 2.0.0)"), null, false, false, true);
verifyRequirement(Collections.singleton(expected), require);
}
public void testMatchRange() throws Exception {
File testFolder = getTestFolder("FeaturesAction.testFilters");
- StringBuffer buffer = new StringBuffer();
+ StringBuilder buffer = new StringBuilder();
buffer.append("<feature id=\"test.feature\" version=\"1.0.0\" > \n");
buffer.append(" <requires> \n");
buffer.append(" <import plugin=\"org.plug\" version=\"[1.0.0,2.0.0)\" match=\"versionRange\" /> \n");
@@ -131,7 +136,7 @@ public class FeaturesActionTest extends ActionTest {
writeBuffer(featureXML, buffer);
publisherInfo = new PublisherInfo();
- FeaturesAction action = new FeaturesAction(new File[] {testFolder});
+ FeaturesAction action = new FeaturesAction(new File[] { testFolder });
action.perform(publisherInfo, publisherResult, new NullProgressMonitor());
IInstallableUnit iu = publisherResult.getIU("test.feature.feature.group", Version.parseVersion("1.0.0"), null);
@@ -141,10 +146,12 @@ public class FeaturesActionTest extends ActionTest {
String requireName = ((IRequiredCapability) require).getName();
if (requireName.equals("org.foo.feature.group")) {
- IRequirement expected = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "org.foo.feature.group", VersionRange.create("[1.0.0, 2.0.0)"), null, false, false, true);
+ IRequirement expected = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID,
+ "org.foo.feature.group", VersionRange.create("[1.0.0, 2.0.0)"), null, false, false, true);
verifyRequirement(Collections.singleton(expected), require);
} else if (requireName.equals("org.plug")) {
- IRequirement expected = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "org.plug", VersionRange.create("[1.0.0, 2.0.0)"), null, false, false, true);
+ IRequirement expected = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "org.plug",
+ VersionRange.create("[1.0.0, 2.0.0)"), null, false, false, true);
verifyRequirement(Collections.singleton(expected), require);
}
}
@@ -152,7 +159,7 @@ public class FeaturesActionTest extends ActionTest {
public void testMatchGreaterOrEqual() throws Exception {
File testFolder = getTestFolder("FeaturesAction.testFilters");
- StringBuffer buffer = new StringBuffer();
+ StringBuilder buffer = new StringBuilder();
buffer.append("<feature id=\"test.feature\" version=\"1.0.0\" > \n");
buffer.append(" <requires> \n");
buffer.append(" <import plugin=\"org.plug\" version=\"1.0.0\" match=\"greaterOrEqual\" /> \n");
@@ -163,7 +170,7 @@ public class FeaturesActionTest extends ActionTest {
writeBuffer(featureXML, buffer);
publisherInfo = new PublisherInfo();
- FeaturesAction action = new FeaturesAction(new File[] {testFolder});
+ FeaturesAction action = new FeaturesAction(new File[] { testFolder });
action.perform(publisherInfo, publisherResult, new NullProgressMonitor());
IInstallableUnit iu = publisherResult.getIU("test.feature.feature.group", Version.parseVersion("1.0.0"), null);
@@ -173,10 +180,12 @@ public class FeaturesActionTest extends ActionTest {
String requireName = ((IRequiredCapability) require).getName();
if (requireName.equals("org.foo.feature.group")) {
- IRequirement expected = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "org.foo.feature.group", VersionRange.create("1.0.0"), null, false, false, true);
+ IRequirement expected = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID,
+ "org.foo.feature.group", VersionRange.create("1.0.0"), null, false, false, true);
verifyRequirement(Collections.singleton(expected), require);
} else if (requireName.equals("org.plug")) {
- IRequirement expected = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "org.plug", VersionRange.create("1.0.0"), null, false, false, true);
+ IRequirement expected = MetadataFactory.createRequirement(IInstallableUnit.NAMESPACE_IU_ID, "org.plug",
+ VersionRange.create("1.0.0"), null, false, false, true);
verifyRequirement(Collections.singleton(expected), require);
}
}
@@ -184,7 +193,7 @@ public class FeaturesActionTest extends ActionTest {
public void testFilters() throws Exception {
File testFolder = getTestFolder("FeaturesAction.testFilters");
- StringBuffer buffer = new StringBuffer();
+ StringBuilder buffer = new StringBuilder();
buffer.append("<feature id=\"test.feature\" version=\"1.0.0\" > \n");
buffer.append(" <includes id=\"org.foo\" version=\"1.0.0\" filter=\"(osgi.os=win32)\"/> \n");
buffer.append(" <plugin id=\"org.plug\" version=\"1.0.0\" filter=\"(my.prop=foo)\" os=\"win32\" /> \n");
@@ -197,7 +206,7 @@ public class FeaturesActionTest extends ActionTest {
writeBuffer(featureXML, buffer);
publisherInfo = new PublisherInfo();
- FeaturesAction action = new FeaturesAction(new File[] {testFolder});
+ FeaturesAction action = new FeaturesAction(new File[] { testFolder });
action.perform(publisherInfo, publisherResult, new NullProgressMonitor());
IInstallableUnit iu = publisherResult.getIU("test.feature.feature.group", Version.parseVersion("1.0.0"), null);
@@ -207,7 +216,8 @@ public class FeaturesActionTest extends ActionTest {
if (((IRequiredCapability) require).getName().equals("org.foo.feature.group")) {
assertEquals(ExpressionUtil.parseLDAP("(osgi.os=win32)"), require.getFilter().getParameters()[0]);
} else if (((IRequiredCapability) require).getName().equals("org.plug")) {
- assertEquals(ExpressionUtil.parseLDAP("(&(my.prop=foo)(osgi.os=win32))"), require.getFilter().getParameters()[0]);
+ assertEquals(ExpressionUtil.parseLDAP("(&(my.prop=foo)(osgi.os=win32))"),
+ require.getFilter().getParameters()[0]);
} else if (((IRequiredCapability) require).getName().equals("org.plug2")) {
assertEquals(ExpressionUtil.parseLDAP("(my.prop=foo)"), require.getFilter().getParameters()[0]);
} else if (((IRequiredCapability) require).getName().equals("org.foo2.feature.group")) {
@@ -222,151 +232,173 @@ public class FeaturesActionTest extends ActionTest {
}
private void verifyMetadata() {
- //{foo.feature.jar=[foo.feature.jar 1.0.0], bar.feature.jar=[bar.feature.jar 1.1.1], foo.feature.group=[foo.feature.group 1.0.0], bar.feature.group=[bar.feature.group 1.1.1]}
- ArrayList<IInstallableUnit> fooIUs = new ArrayList<>(publisherResult.getIUs("foo.feature.jar", IPublisherResult.NON_ROOT)); //$NON-NLS-1$
- assertTrue(fooIUs.size() == 1);
+ // {foo.feature.jar=[foo.feature.jar 1.0.0], bar.feature.jar=[bar.feature.jar
+ // 1.1.1], foo.feature.group=[foo.feature.group 1.0.0],
+ // bar.feature.group=[bar.feature.group 1.1.1]}
+ ArrayList<IInstallableUnit> fooIUs = new ArrayList<>(
+ publisherResult.getIUs("foo.feature.jar", IPublisherResult.NON_ROOT)); //$NON-NLS-1$
+ assertEquals(1, fooIUs.size());
IInstallableUnit foo = fooIUs.get(0);
assertTrue(foo.getId().equalsIgnoreCase("foo.feature.jar")); //$NON-NLS-1$
- assertTrue(foo.getVersion().equals(fooVersion));
+ assertEquals(fooVersion, foo.getVersion());
assertEquals("Foo Feature", foo.getProperty(IInstallableUnit.PROP_NAME));
assertEquals("Foo Description", foo.getProperty(IInstallableUnit.PROP_DESCRIPTION));
assertEquals("Foo License", foo.getLicenses().iterator().next().getBody());
assertEquals("Foo Copyright", foo.getCopyright().getBody());
- assertTrue(foo.getProperty("key1").equals("value1")); //$NON-NLS-1$ //$NON-NLS-2$
- assertTrue(foo.getProperty("key2").equals("value2")); //$NON-NLS-1$//$NON-NLS-2$
- assertTrue(foo.getArtifacts().iterator().next().equals(FOO_KEY));
- assertEquals(foo.getFilter().getParameters()[0], ExpressionUtil.parseLDAP("(org.eclipse.update.install.features=true)")); //$NON-NLS-1$
+ assertEquals("value1", foo.getProperty("key1")); //$NON-NLS-1$ //$NON-NLS-2$
+ assertEquals("value2", foo.getProperty("key2")); //$NON-NLS-1$//$NON-NLS-2$
+ assertEquals(FOO_KEY, foo.getArtifacts().iterator().next());
+ assertEquals(foo.getFilter().getParameters()[0],
+ ExpressionUtil.parseLDAP("(org.eclipse.update.install.features=true)")); //$NON-NLS-1$
- //check touchpointType
+ // check touchpointType
assertTrue(foo.getTouchpointType().getId().equalsIgnoreCase("org.eclipse.equinox.p2.osgi")); //$NON-NLS-1$
- assertTrue(foo.getTouchpointType().getVersion().equals(fooVersion));
+ assertEquals(fooVersion, foo.getTouchpointType().getVersion());
- //zipped=true
+ // zipped=true
Collection<ITouchpointData> tpData = foo.getTouchpointData();
String fooValue = tpData.iterator().next().getInstructions().get("zipped").getBody(); //$NON-NLS-1$
assertTrue(fooValue.equalsIgnoreCase("true")); //$NON-NLS-1$
Collection<IRequirement> fooRequiredCapabilities = foo.getRequirements();
- assertTrue(fooRequiredCapabilities.size() == 0);
+ assertTrue(fooRequiredCapabilities.isEmpty());
Collection<IProvidedCapability> fooProvidedCapabilities = foo.getProvidedCapabilities();
- verifyProvidedCapability(fooProvidedCapabilities, IInstallableUnit.NAMESPACE_IU_ID, "foo.feature.jar", fooVersion); //$NON-NLS-1$
- verifyProvidedCapability(fooProvidedCapabilities, PublisherHelper.NAMESPACE_ECLIPSE_TYPE, "feature", fooVersion); //$NON-NLS-1$
+ verifyProvidedCapability(fooProvidedCapabilities, IInstallableUnit.NAMESPACE_IU_ID, "foo.feature.jar", //$NON-NLS-1$
+ fooVersion);
+ verifyProvidedCapability(fooProvidedCapabilities, PublisherHelper.NAMESPACE_ECLIPSE_TYPE, "feature", //$NON-NLS-1$
+ fooVersion);
verifyProvidedCapability(fooProvidedCapabilities, "org.eclipse.update.feature", FOO, fooVersion); //$NON-NLS-1$
- assertTrue(fooProvidedCapabilities.size() == 3);
+ assertEquals(3, fooProvidedCapabilities.size());
- //feature group IU for foo
+ // feature group IU for foo
fooIUs = new ArrayList<>(publisherResult.getIUs("foo.feature.group", IPublisherResult.ROOT)); //$NON-NLS-1$
- assertTrue(fooIUs.size() == 1);
+ assertEquals(1, fooIUs.size());
IInstallableUnit fooGroup = fooIUs.get(0);
- tpData = fooGroup.getTouchpointData();
- assertEquals(1, tpData.size());
- ITouchpointInstruction instruction = tpData.iterator().next().getInstruction("install");
+ ITouchpointAdvice tData = capture.getValue();
+ ITouchpointInstruction instruction = tData.getTouchpointData(NO_TP_DATA).getInstruction("install");
assertNotNull(instruction);
- assertEquals("ln(targetDir:@artifact,linkTarget:foo/lib.1.so,linkName:lib.so);chmod(targetDir:@artifact,targetFile:lib/lib.so,permissions:755);", instruction.getBody());
+ assertEquals(
+ "ln(targetDir:@artifact,linkTarget:foo/lib.1.so,linkName:lib.so);chmod(targetDir:@artifact,targetFile:lib/lib.so,permissions:755);",
+ instruction.getBody());
assertNull(fooGroup.getFilter());
- /*verify bar*/
- ArrayList<IInstallableUnit> barIUs = new ArrayList<>(publisherResult.getIUs("bar.feature.jar", IPublisherResult.NON_ROOT)); //$NON-NLS-1$
- assertTrue(barIUs.size() == 1);
+ /* verify bar */
+ ArrayList<IInstallableUnit> barIUs = new ArrayList<>(
+ publisherResult.getIUs("bar.feature.jar", IPublisherResult.NON_ROOT)); //$NON-NLS-1$
+ assertEquals(1, barIUs.size());
IInstallableUnit bar = barIUs.get(0);
- assertTrue(bar.getId().equals("bar.feature.jar")); //$NON-NLS-1$
- assertTrue(bar.getVersion().equals(barVersion));
- assertTrue(bar.getProperty("key1").equals("value1")); //$NON-NLS-1$//$NON-NLS-2$
- assertTrue(bar.getProperty("key2").equals("value2")); //$NON-NLS-1$//$NON-NLS-2$
+ assertEquals("bar.feature.jar", bar.getId()); //$NON-NLS-1$
+ assertEquals(barVersion, bar.getVersion());
+ assertEquals("value1", bar.getProperty("key1")); //$NON-NLS-1$//$NON-NLS-2$
+ assertEquals("value2", bar.getProperty("key2")); //$NON-NLS-1$//$NON-NLS-2$
assertTrue(bar.getProperties().containsKey("org.eclipse.update.installHandler")); //$NON-NLS-1$
assertTrue(bar.getProperties().containsValue("handler=bar handler")); //$NON-NLS-1$
- assertTrue(bar.getArtifacts().iterator().next().equals(BAR_KEY));
- assertEquals(bar.getFilter().getParameters()[0], ExpressionUtil.parseLDAP("(org.eclipse.update.install.features=true)")); //$NON-NLS-1$
+ assertEquals(BAR_KEY, bar.getArtifacts().iterator().next());
+ assertEquals(bar.getFilter().getParameters()[0],
+ ExpressionUtil.parseLDAP("(org.eclipse.update.install.features=true)")); //$NON-NLS-1$
assertTrue(bar.isSingleton());
barIUs = new ArrayList<>(publisherResult.getIUs("bar.feature.group", IPublisherResult.ROOT)); //$NON-NLS-1$
- assertTrue(fooIUs.size() == 1);
+ assertEquals(1, fooIUs.size());
IInstallableUnit barGroup = barIUs.get(0);
Collection<IRequirement> barRequiredCapabilities = barGroup.getRequirements();
- //contains(barRequiredCapabilities, IInstallableUnit.NAMESPACE_IU_ID, "bar_root", new VersionRange(barVersion, true, barVersion, true), null, false /*multiple*/, false /*optional*/); //$NON-NLS-1$//$NON-NLS-2$
- verifyRequirement(barRequiredCapabilities, IInstallableUnit.NAMESPACE_IU_ID, "bar.feature.jar", new VersionRange(barVersion, true, barVersion, true), "(org.eclipse.update.install.features=true)", 1, 1, true); //$NON-NLS-1$//$NON-NLS-2$
- verifyRequirement(barRequiredCapabilities, IInstallableUnit.NAMESPACE_IU_ID, "org.bar.feature.feature.group", VersionRange.emptyRange, "(&(|(osgi.nl=de)(osgi.nl=en)(osgi.nl=fr)))", 1, 1, true); //$NON-NLS-1$//$NON-NLS-2$
- assertEquals(barGroup.getFilter().getParameters()[0], ExpressionUtil.parseLDAP("(&(|(osgi.os=macosx)(osgi.os=win32))(|(osgi.ws=carbon)(osgi.ws=win32))(|(osgi.arch=ppc)(osgi.arch=x86))(osgi.nl=en))"));
-
- //check zipped=true in touchpointData
+ // contains(barRequiredCapabilities, IInstallableUnit.NAMESPACE_IU_ID,
+ // "bar_root", new VersionRange(barVersion, true, barVersion, true), null, false
+ // /*multiple*/, false /*optional*/); //$NON-NLS-1$//$NON-NLS-2$
+ verifyRequirement(barRequiredCapabilities, IInstallableUnit.NAMESPACE_IU_ID, "bar.feature.jar", //$NON-NLS-1$
+ new VersionRange(barVersion, true, barVersion, true), "(org.eclipse.update.install.features=true)", 1, //$NON-NLS-1$
+ 1, true);
+ verifyRequirement(barRequiredCapabilities, IInstallableUnit.NAMESPACE_IU_ID, "org.bar.feature.feature.group", //$NON-NLS-1$
+ VersionRange.emptyRange, "(&(|(osgi.nl=de)(osgi.nl=en)(osgi.nl=fr)))", 1, 1, true); //$NON-NLS-1$
+ assertEquals(barGroup.getFilter().getParameters()[0], ExpressionUtil.parseLDAP(
+ "(&(|(osgi.os=macosx)(osgi.os=win32))(|(osgi.ws=carbon)(osgi.ws=win32))(|(osgi.arch=ppc)(osgi.arch=x86))(osgi.nl=en))"));
+
+ // check zipped=true in touchpointData
String barValue = bar.getTouchpointData().iterator().next().getInstructions().get("zipped").getBody(); //$NON-NLS-1$
assertTrue(barValue.equalsIgnoreCase("true")); //$NON-NLS-1$
- //check touchpointType
+ // check touchpointType
assertTrue(bar.getTouchpointType().getId().equalsIgnoreCase("org.eclipse.equinox.p2.osgi")); //$NON-NLS-1$
- assertTrue(bar.getTouchpointType().getVersion().equals(fooVersion));
- //String namespace, String name, VersionRange range, String filter, boolean optional, boolean multiple, boolean greedy)
+ assertEquals(fooVersion, bar.getTouchpointType().getVersion());
+ // String namespace, String name, VersionRange range, String filter, boolean
+ // optional, boolean multiple, boolean greedy)
barRequiredCapabilities = bar.getRequirements();
- assertTrue(barRequiredCapabilities.size() == 0);
+ assertTrue(barRequiredCapabilities.isEmpty());
Collection<IProvidedCapability> barProvidedCapabilities = bar.getProvidedCapabilities();
- verifyProvidedCapability(barProvidedCapabilities, IInstallableUnit.NAMESPACE_IU_ID, "bar.feature.jar", barVersion); //$NON-NLS-1$
- verifyProvidedCapability(barProvidedCapabilities, PublisherHelper.NAMESPACE_ECLIPSE_TYPE, "feature", fooVersion); //$NON-NLS-1$
+ verifyProvidedCapability(barProvidedCapabilities, IInstallableUnit.NAMESPACE_IU_ID, "bar.feature.jar", //$NON-NLS-1$
+ barVersion);
+ verifyProvidedCapability(barProvidedCapabilities, PublisherHelper.NAMESPACE_ECLIPSE_TYPE, "feature", //$NON-NLS-1$
+ fooVersion);
verifyProvidedCapability(barProvidedCapabilities, "org.eclipse.update.feature", BAR, barVersion); //$NON-NLS-1$
- assertTrue(barProvidedCapabilities.size() == 3);
+ assertEquals(3, barProvidedCapabilities.size());
}
private void verifyArtifacts() throws IOException {
ZipInputStream actualStream = artifactRepository.getZipInputStream(FOO_KEY);
- Map<String, Object[]> expected = getFileMap(new HashMap<>(), new File[] {new File(root, FOO)}, new Path(new File(root, FOO).getAbsolutePath()));
+ Map<String, Object[]> expected = getFileMap(new HashMap<>(), new File[] { new File(root, FOO) },
+ new Path(new File(root, FOO).getAbsolutePath()));
TestData.assertContains(expected, actualStream, true);
- expected = getFileMap(new HashMap<>(), new File[] {new File(root, BAR)}, new Path(new File(root, BAR).getAbsolutePath()));
+ expected = getFileMap(new HashMap<>(), new File[] { new File(root, BAR) },
+ new Path(new File(root, BAR).getAbsolutePath()));
actualStream = artifactRepository.getZipInputStream(BAR_KEY);
TestData.assertContains(expected, actualStream, true);
}
@Override
protected void insertPublisherInfoBehavior() {
- //setup metadataRepository with barIU
- metadataRepository = new TestMetadataRepository(getAgent(), new IInstallableUnit[] {mockIU(BAR, null)});
-
- ArrayList<IPropertyAdvice> adviceCollection = fillAdvice(new ArrayList<>());
- expect(publisherInfo.getAdvice(null, false, "bar.feature.jar", barVersion, IPropertyAdvice.class)).andReturn(adviceCollection).anyTimes();
- expect(publisherInfo.getAdvice(null, false, "bar", barVersion, IPropertyAdvice.class)).andReturn(adviceCollection).anyTimes();
- expect(publisherInfo.getAdvice(null, false, "bar", barVersion, IFeatureRootAdvice.class))
- .andReturn(Collections.emptyList()).anyTimes();
- expect(publisherInfo.getAdvice(null, false, "bar.feature.group", barVersion, IPropertyAdvice.class)).andReturn(adviceCollection).anyTimes();
- expect(publisherInfo.getAdvice(null, false, "bar.feature.group", barVersion, ITouchpointAdvice.class))
- .andReturn(Collections.emptyList()).anyTimes();
- expect(publisherInfo.getAdvice(null, false, "bar.feature.group", barVersion, ICapabilityAdvice.class))
- .andReturn(Collections.emptyList()).anyTimes();
- expect(publisherInfo.getAdvice(null, false, "bar.feature.group", barVersion,
- IAdditionalInstallableUnitAdvice.class)).andReturn(Collections.emptyList()).anyTimes();
- expect(publisherInfo.getAdvice(null, false, "foo.feature.jar", fooVersion, IPropertyAdvice.class)).andReturn(adviceCollection).anyTimes();
- expect(publisherInfo.getAdvice(null, false, "bar.feature.group", barVersion, IUpdateDescriptorAdvice.class))
- .andReturn(Collections.emptyList()).anyTimes();
- expect(publisherInfo.getAdvice(null, false, "foo", fooVersion, IPropertyAdvice.class)).andReturn(adviceCollection).anyTimes();
- expect(publisherInfo.getAdvice(null, false, "foo", fooVersion, IFeatureRootAdvice.class))
- .andReturn(Collections.emptyList()).anyTimes();
- expect(publisherInfo.getAdvice(null, false, "foo.feature.group", fooVersion, IPropertyAdvice.class)).andReturn(adviceCollection).anyTimes();
- expect(publisherInfo.getAdvice(null, false, "foo.feature.group", fooVersion, ICapabilityAdvice.class))
- .andReturn(Collections.emptyList()).anyTimes();
- expect(publisherInfo.getAdvice(null, false, "foo.feature.group", fooVersion,
- IAdditionalInstallableUnitAdvice.class)).andReturn(Collections.emptyList()).anyTimes();
- expect(publisherInfo.getAdvice(null, false, "foo.feature.group", fooVersion, IUpdateDescriptorAdvice.class))
- .andReturn(Collections.emptyList()).anyTimes();
- expect(publisherInfo.getArtifactOptions()).andReturn(IPublisherInfo.A_INDEX | IPublisherInfo.A_OVERWRITE | IPublisherInfo.A_PUBLISH).anyTimes();
- expect(publisherInfo.getArtifactRepository()).andReturn(artifactRepository).anyTimes();
- expect(publisherInfo.getMetadataRepository()).andReturn(metadataRepository).anyTimes();
- expect(publisherInfo.getContextMetadataRepository()).andReturn(null).anyTimes();
-
- //capture any touchpoint advice, and return the captured advice when the action asks for it
- publisherInfo.addAdvice(and(isA(ITouchpointAdvice.class), capture(tpAdvice)));
- EasyMock.expectLastCall().anyTimes();
- expect(publisherInfo.getAdvice(null, false, "foo.feature.group", fooVersion, ITouchpointAdvice.class)).andReturn(new CaptureList<>(tpAdvice)).anyTimes();
+ // setup metadataRepository with barIU
+ metadataRepository = new TestMetadataRepository(getAgent(), new IInstallableUnit[] { mockIU(BAR, null) });
+
+ List<IPropertyAdvice> adviceCollection = fillAdvice(new ArrayList<>());
+ when(publisherInfo.getAdvice(null, false, "bar.feature.jar", barVersion, IPropertyAdvice.class))
+ .thenReturn(adviceCollection);
+ when(publisherInfo.getAdvice(null, false, "bar", barVersion, IPropertyAdvice.class))
+ .thenReturn(adviceCollection);
+ when(publisherInfo.getAdvice(null, false, "bar", barVersion, IFeatureRootAdvice.class))
+ .thenReturn(Collections.emptyList());
+ when(publisherInfo.getAdvice(null, false, "bar.feature.group", barVersion, IPropertyAdvice.class))
+ .thenReturn(adviceCollection);
+ when(publisherInfo.getAdvice(null, false, "bar.feature.group", barVersion, ITouchpointAdvice.class))
+ .thenReturn(Collections.emptyList());
+ when(publisherInfo.getAdvice(null, false, "bar.feature.group", barVersion, ICapabilityAdvice.class))
+ .thenReturn(Collections.emptyList());
+ when(publisherInfo.getAdvice(null, false, "bar.feature.group", barVersion,
+ IAdditionalInstallableUnitAdvice.class)).thenReturn(Collections.emptyList());
+ when(publisherInfo.getAdvice(null, false, "foo.feature.jar", fooVersion, IPropertyAdvice.class))
+ .thenReturn(adviceCollection);
+ when(publisherInfo.getAdvice(null, false, "bar.feature.group", barVersion, IUpdateDescriptorAdvice.class))
+ .thenReturn(Collections.emptyList());
+ when(publisherInfo.getAdvice(null, false, "foo", fooVersion, IPropertyAdvice.class))
+ .thenReturn(adviceCollection);
+ when(publisherInfo.getAdvice(null, false, "foo", fooVersion, IFeatureRootAdvice.class))
+ .thenReturn(Collections.emptyList());
+ when(publisherInfo.getAdvice(null, false, "foo.feature.group", fooVersion, IPropertyAdvice.class))
+ .thenReturn(adviceCollection);
+ when(publisherInfo.getAdvice(null, false, "foo.feature.group", fooVersion, ICapabilityAdvice.class))
+ .thenReturn(Collections.emptyList());
+ when(publisherInfo.getAdvice(null, false, "foo.feature.group", fooVersion,
+ IAdditionalInstallableUnitAdvice.class)).thenReturn(Collections.emptyList());
+ when(publisherInfo.getAdvice(null, false, "foo.feature.group", fooVersion, IUpdateDescriptorAdvice.class))
+ .thenReturn(Collections.emptyList());
+ when(publisherInfo.getArtifactOptions())
+ .thenReturn(IPublisherInfo.A_INDEX | IPublisherInfo.A_OVERWRITE | IPublisherInfo.A_PUBLISH);
+ when(publisherInfo.getArtifactRepository()).thenReturn(artifactRepository);
+ when(publisherInfo.getMetadataRepository()).thenReturn(metadataRepository);
+ when(publisherInfo.getContextMetadataRepository()).thenReturn(null);
}
- private ArrayList<IPropertyAdvice> fillAdvice(ArrayList<IPropertyAdvice> adviceCollection) {
+ private List<IPropertyAdvice> fillAdvice(ArrayList<IPropertyAdvice> adviceCollection) {
Map<String, String> prop = new HashMap<>();
prop.put("key1", "value1"); //$NON-NLS-1$//$NON-NLS-2$
prop.put("key2", "value2"); //$NON-NLS-1$//$NON-NLS-2$
- IPropertyAdvice propertyAdvice = EasyMock.createMock(IPropertyAdvice.class);
- expect(propertyAdvice.getInstallableUnitProperties((InstallableUnitDescription) EasyMock.anyObject())).andReturn(prop).anyTimes();
- expect(propertyAdvice.getArtifactProperties((IInstallableUnit) EasyMock.anyObject(), (IArtifactDescriptor) EasyMock.anyObject())).andReturn(null).anyTimes();
- EasyMock.replay(propertyAdvice);
+ IPropertyAdvice propertyAdvice = mock(IPropertyAdvice.class);
+ when(propertyAdvice.getInstallableUnitProperties(any(InstallableUnitDescription.class))).thenReturn(prop);
+ when(propertyAdvice.getArtifactProperties(any(IInstallableUnit.class), any(IArtifactDescriptor.class)))
+ .thenReturn(null);
adviceCollection.add(propertyAdvice);
return adviceCollection;
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/JREActionTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/JREActionTest.java
index 088b3bd9c..dc5719e14 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/JREActionTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/JREActionTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2018 Code 9 and others.
+ * Copyright (c) 2008, 2021 Code 9 and others.
*
* This
* program and the accompanying materials are made available under the terms of
@@ -16,15 +16,17 @@
******************************************************************************/
package org.eclipse.equinox.p2.tests.publisher.actions;
-import static org.easymock.EasyMock.expect;
import static org.eclipse.equinox.p2.tests.publisher.actions.StatusMatchers.errorStatus;
import static org.eclipse.equinox.p2.tests.publisher.actions.StatusMatchers.okStatus;
import static org.eclipse.equinox.p2.tests.publisher.actions.StatusMatchers.statusWithMessageWhich;
+import static org.hamcrest.CoreMatchers.anyOf;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.hasItem;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.greaterThan;
+import static org.mockito.Mockito.when;
import java.io.ByteArrayOutputStream;
import java.io.File;
@@ -57,7 +59,12 @@ import org.eclipse.equinox.p2.tests.TestData;
import org.eclipse.equinox.p2.tests.TestMetadataRepository;
import org.eclipse.equinox.p2.tests.publisher.TestArtifactRepository;
import org.eclipse.equinox.spi.p2.publisher.PublisherHelper;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+@RunWith(JUnit4.class)
public class JREActionTest extends ActionTest {
private File J14 = new File(TestActivator.getTestDataFolder(), "JREActionTest/1.4/"); //$NON-NLS-1$
@@ -70,12 +77,14 @@ public class JREActionTest extends ActionTest {
protected TestMetadataRepository metadataRepository;
@Override
+ @Before
public void setUp() throws Exception {
setupPublisherInfo();
setupPublisherResult();
}
// TODO this name is misleading: the test doesn't test the real Java 1.4 JRE IU but a broken local copy of the 1.4 profile
+ @Test
public void test14() throws Exception {
performAction(new JREAction(J14));
@@ -85,6 +94,7 @@ public class JREActionTest extends ActionTest {
verifyArtifactRepository(ArtifactKey.parse("binary,a.jre.j2se,1.4.0"), J14, "J2SE-1.4.profile"); //$NON-NLS-1$ //$NON-NLS-2$
}
+ @Test
public void test15() throws Exception {
performAction(new JREAction(J15));
@@ -94,6 +104,7 @@ public class JREActionTest extends ActionTest {
verifyArtifactRepository(ArtifactKey.parse("binary,a.jre.j2se,1.5.0"), J15, "J2SE-1.5.profile"); //$NON-NLS-1$ //$NON-NLS-2$
}
+ @Test
public void test16() throws Exception {
performAction(new JREAction(J16));
@@ -103,6 +114,7 @@ public class JREActionTest extends ActionTest {
verifyArtifactRepository(ArtifactKey.parse("binary,a.jre.javase,1.6.0"), J16, "JavaSE-1.6.profile"); //$NON-NLS-1$//$NON-NLS-2$
}
+ @Test
public void testOSGiMin() throws Exception {
performAction(new JREAction("OSGi/Minimum-1.2"));
@@ -111,6 +123,7 @@ public class JREActionTest extends ActionTest {
// verifyConfigIU("a.jre.osgi.minimum", jreVersion); // TODO config IU is not needed!?
}
+ @Test
public void testPackageVersionsFromJreFolder() throws Exception {
performAction(new JREAction(jreWithPackageVersionsFolder));
@@ -121,6 +134,7 @@ public class JREActionTest extends ActionTest {
verifyArtifactRepository(ArtifactKey.parse("binary,a.jre.test,1.0.0"), jreWithPackageVersionsFolder, "test-1.0.0.profile"); //$NON-NLS-1$//$NON-NLS-2$
}
+ @Test
public void testPackageVersionsFromJavaProfile() throws Exception {
// introduced for bug 334519: directly point to a profile file
performAction(new JREAction(jreWithPackageVersionsProfile));
@@ -130,27 +144,22 @@ public class JREActionTest extends ActionTest {
assertThat(providedCapabilities, hasItem(MetadataFactory.createProvidedCapability(PublisherHelper.CAPABILITY_NS_JAVA_PACKAGE, "my.package", Version.create("1.0.0"))));
}
+ @Test
public void testDefaultJavaProfile() throws Exception {
performAction(new JREAction((String) null));
// these assertions need to be changed each time the default java profile, hardcoded in o.e.e.p2.publisher.actions.JREAction, is changed;
- verifyMetadataIU("a.jre.javase", 226, 21, Version.parseVersion("9.0.0"));
+ verifyMetadataIU("a.jre.javase", 226, 23, Version.parseVersion("11.0.0"));
// verifyConfigIU(DEFAULT_JRE_NAME, DEFAULT_JRE_VERSION); // TODO config IU is not needed!?
}
+ @Test(expected = IllegalArgumentException.class)
public void testNonExistingJreLocation() {
File nonExistingProfile = new File(jreWithPackageVersionsFolder, "no.profile");
- try {
- performAction(new JREAction(nonExistingProfile));
- fail("Expected failure when the JRE location does not exists.");
- // TODO shouldn't this be an error status?
- } catch (IllegalArgumentException e) {
- // test is successful
- } catch (Exception e) {
- fail("Expected IllegalArgumentException when the JRE location does not exists, caught " + e.getClass().getName());
- }
+ performAction(new JREAction(nonExistingProfile));
}
+ @Test
public void testOsgiEECapabilities() {
// added for bug 388566
performAction(new JREAction("J2SE-1.5"));
@@ -163,6 +172,7 @@ public class JREActionTest extends ActionTest {
assertThat(capabilities, not(hasItem(createEECapability("J2SE", "1.5"))));
}
+ @Test
public void testSingleOsgiEECapability() {
// contains a single version:Version attribute instead of the common version:List<Version>
performAction(new JREAction("OSGi/Minimum-1.0"));
@@ -172,6 +182,7 @@ public class JREActionTest extends ActionTest {
assertThat(capabilities, hasItem(createEECapability("OSGi/Minimum", "1.0")));
}
+ @Test
public void testInvalidOsgiEECapabilitySpec() {
testAction = new JREAction(new File(TestActivator.getTestDataFolder(), "JREActionTest/invalidOsgiEE/ee-capability-syntax-test.profile"));
IStatus status = testAction.perform(publisherInfo, publisherResult, new NullProgressMonitor());
@@ -184,7 +195,7 @@ public class JREActionTest extends ActionTest {
assertThat(Arrays.asList(eeStatus.getChildren()), hasItem(statusWithMessageWhich(containsString("Syntax error in version '1.a.invalidversion'"))));
assertThat(Arrays.asList(eeStatus.getChildren()), hasItem(statusWithMessageWhich(containsString("Ignoring unknown capability namespace 'other.namespace'"))));
assertThat(Arrays.asList(eeStatus.getChildren()), hasItem(statusWithMessageWhich(containsString("Cannot specify both 'version:Version' and 'version:List<Version>'"))));
- assertThat(eeStatus.getChildren().length, is(5));
+ assertEquals(5, eeStatus.getChildren().length);
}
private void performAction(JREAction jreAction) {
@@ -196,34 +207,37 @@ public class JREActionTest extends ActionTest {
IInstallableUnit foo = getPublishedUnit(id);
// check version
- assertTrue(foo.getVersion().equals(jreVersion));
+ assertEquals(jreVersion, foo.getVersion());
// check touchpointType
assertTrue(foo.getTouchpointType().getId().equalsIgnoreCase("org.eclipse.equinox.p2.native")); //$NON-NLS-1$
- assertTrue(foo.getTouchpointType().getVersion().equals(Version.create("1.0.0"))); //$NON-NLS-1$
+ assertEquals(Version.create("1.0.0"), foo.getTouchpointType().getVersion()); //$NON-NLS-1$
// check provided capabilities
Collection<IProvidedCapability> fooProvidedCapabilities = foo.getProvidedCapabilities();
- assertThat(fooProvidedCapabilities.size(), is(1 + expectedProvidedPackages + expectedProvidedEEs));
+ int expected = expectedProvidedPackages + expectedProvidedEEs;
+ assertThat(fooProvidedCapabilities.size(), anyOf(is(expected), greaterThan(expected)));
}
private void verifyConfigIU(String id, Version jreVersion) {
IInstallableUnit bar = getPublishedUnit("config." + id);
Map<?, ?> instructions = bar.getTouchpointData().iterator().next().getInstructions();
- assertTrue(((ITouchpointInstruction) instructions.get("install")).getBody().equals("unzip(source:@artifact, target:${installFolder});")); //$NON-NLS-1$//$NON-NLS-2$
- assertTrue(((ITouchpointInstruction) instructions.get("uninstall")).getBody().equals("cleanupzip(source:@artifact, target:${installFolder});")); //$NON-NLS-1$ //$NON-NLS-2$
+ assertEquals("unzip(source:@artifact, target:${installFolder});", //$NON-NLS-1$
+ ((ITouchpointInstruction) instructions.get("install")).getBody()); //$NON-NLS-1$
+ assertEquals("cleanupzip(source:@artifact, target:${installFolder});", //$NON-NLS-1$
+ ((ITouchpointInstruction) instructions.get("uninstall")).getBody()); //$NON-NLS-1$
assertTrue(bar instanceof IInstallableUnitFragment);
Collection<IRequirement> requiredCapability = ((IInstallableUnitFragment) bar).getHost();
verifyRequirement(requiredCapability, IInstallableUnit.NAMESPACE_IU_ID, id, new VersionRange(jreVersion, true, Version.MAX_VERSION, true));
- assertTrue(requiredCapability.size() == 1);
+ assertEquals(1, requiredCapability.size());
Collection<IProvidedCapability> providedCapability = bar.getProvidedCapabilities();
verifyProvidedCapability(providedCapability, IInstallableUnit.NAMESPACE_IU_ID, "config." + id, jreVersion); //$NON-NLS-1$
- assertTrue(providedCapability.size() == 1);
+ assertEquals(1, providedCapability.size());
- assertTrue(bar.getProperty("org.eclipse.equinox.p2.type.fragment").equals("true")); //$NON-NLS-1$//$NON-NLS-2$
- assertTrue(bar.getVersion().equals(jreVersion));
+ assertEquals("true", bar.getProperty("org.eclipse.equinox.p2.type.fragment")); //$NON-NLS-1$//$NON-NLS-2$
+ assertEquals(jreVersion, bar.getVersion());
}
private void verifyArtifactRepository(IArtifactKey key, File JRELocation, final String fileName) throws IOException {
@@ -241,13 +255,13 @@ public class JREActionTest extends ActionTest {
private IInstallableUnit getPublishedUnit(String id) {
Collection<IInstallableUnit> units = publisherResult.getIUs(id, IPublisherResult.ROOT);
- assertThat(units.size(), is(1));
+ assertEquals(1, units.size());
return units.iterator().next();
}
private Collection<IProvidedCapability> getPublishedCapabilitiesOf(String id) {
Collection<IInstallableUnit> ius = publisherResult.getIUs(id, IPublisherResult.ROOT);
- assertThat(ius.size(), is(1));
+ assertEquals(1, ius.size());
IInstallableUnit iu = ius.iterator().next();
return iu.getProvidedCapabilities();
}
@@ -262,7 +276,7 @@ public class JREActionTest extends ActionTest {
@Override
protected void insertPublisherInfoBehavior() {
- expect(publisherInfo.getArtifactRepository()).andReturn(artifactRepository).anyTimes();
- expect(publisherInfo.getArtifactOptions()).andReturn(IPublisherInfo.A_PUBLISH).anyTimes();
+ when(publisherInfo.getArtifactRepository()).thenReturn(artifactRepository);
+ when(publisherInfo.getArtifactOptions()).thenReturn(IPublisherInfo.A_PUBLISH);
}
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/LocalUpdateSiteActionTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/LocalUpdateSiteActionTest.java
index 706760c4e..53d5f03b8 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/LocalUpdateSiteActionTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/LocalUpdateSiteActionTest.java
@@ -14,9 +14,11 @@
******************************************************************************/
package org.eclipse.equinox.p2.tests.publisher.actions;
-import static org.easymock.EasyMock.anyBoolean;
-import static org.easymock.EasyMock.anyObject;
-import static org.easymock.EasyMock.expect;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
import java.io.File;
import java.util.Collection;
@@ -29,7 +31,6 @@ import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.metadata.ITouchpointData;
import org.eclipse.equinox.p2.metadata.ITouchpointInstruction;
import org.eclipse.equinox.p2.metadata.Version;
-import org.eclipse.equinox.p2.publisher.IPublisherAdvice;
import org.eclipse.equinox.p2.publisher.IPublisherInfo;
import org.eclipse.equinox.p2.tests.TestData;
import org.eclipse.equinox.p2.tests.publisher.TestArtifactRepository;
@@ -48,10 +49,11 @@ public class LocalUpdateSiteActionTest extends ActionTest {
@Override
protected void insertPublisherInfoBehavior() {
super.insertPublisherInfoBehavior();
- expect(publisherInfo.getArtifactRepository()).andReturn(artifactRepository).anyTimes();
- expect(publisherInfo.getArtifactOptions()).andReturn(IPublisherInfo.A_INDEX | IPublisherInfo.A_OVERWRITE | IPublisherInfo.A_PUBLISH).anyTimes();
- expect(publisherInfo.getAdvice((String) anyObject(), anyBoolean(), (String) anyObject(), (Version) anyObject(),
- (Class<IPublisherAdvice>) anyObject())).andReturn(Collections.emptyList()).anyTimes();
+ when(publisherInfo.getArtifactRepository()).thenReturn(artifactRepository);
+ when(publisherInfo.getArtifactOptions())
+ .thenReturn(IPublisherInfo.A_INDEX | IPublisherInfo.A_OVERWRITE | IPublisherInfo.A_PUBLISH);
+ when(publisherInfo.getAdvice(anyString(), anyBoolean(), anyString(), any(Version.class), any(Class.class)))
+ .thenReturn(Collections.emptyList());
}
/**
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/MultiCapture.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/MultiCapture.java
deleted file mode 100644
index 3f9d8133d..000000000
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/MultiCapture.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008, 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 Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.equinox.p2.tests.publisher.actions;
-
-import java.util.*;
-import org.easymock.Capture;
-
-/**
- * A capture that captures multiple values
- */
-public class MultiCapture<T> extends Capture<T> implements Collection<T> {
- private static final long serialVersionUID = 1L;
- private final List<T> captured = new ArrayList<>();
-
- @Override
- public boolean add(T arg0) {
- return captured.add(arg0);
- }
-
- @Override
- public boolean addAll(Collection<? extends T> arg0) {
- return captured.addAll(arg0);
- }
-
- @Override
- public void clear() {
- captured.clear();
- }
-
- @Override
- public boolean contains(Object arg0) {
- return captured.contains(arg0);
- }
-
- @Override
- public boolean containsAll(Collection<?> arg0) {
- return captured.containsAll(arg0);
- }
-
- @Override
- public boolean isEmpty() {
- return captured.isEmpty();
- }
-
- @Override
- public Iterator<T> iterator() {
- return captured.iterator();
- }
-
- @Override
- public boolean remove(Object arg0) {
- return captured.remove(arg0);
- }
-
- @Override
- public boolean removeAll(Collection<?> arg0) {
- return captured.removeAll(arg0);
- }
-
- @Override
- public boolean retainAll(Collection<?> arg0) {
- return captured.retainAll(arg0);
- }
-
- @Override
- public void setValue(T value) {
- captured.add(value);
- super.setValue(value);
- }
-
- @Override
- public int size() {
- return captured.size();
- }
-
- @Override
- public Object[] toArray() {
- return captured.toArray();
- }
-
- @Override
- public <X> X[] toArray(X[] arg0) {
- return captured.toArray(arg0);
- }
-}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductActionCapturingTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductActionCapturingTest.java
index ffddce266..898c5f0fb 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductActionCapturingTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductActionCapturingTest.java
@@ -16,65 +16,35 @@
******************************************************************************/
package org.eclipse.equinox.p2.tests.publisher.actions;
-import static org.easymock.EasyMock.anyBoolean;
-import static org.easymock.EasyMock.anyObject;
-import static org.easymock.EasyMock.createNiceMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.expectLastCall;
import static org.eclipse.equinox.p2.tests.publisher.actions.StatusMatchers.okStatus;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.verify;
import java.io.File;
-import java.util.Collections;
-import org.easymock.Capture;
-import org.easymock.EasyMock;
+import java.util.stream.Collectors;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.equinox.frameworkadmin.BundleInfo;
import org.eclipse.equinox.internal.p2.publisher.eclipse.ProductFile;
-import org.eclipse.equinox.p2.metadata.Version;
import org.eclipse.equinox.p2.publisher.IPublisherAdvice;
-import org.eclipse.equinox.p2.publisher.IPublisherInfo;
-import org.eclipse.equinox.p2.publisher.actions.RootIUAdvice;
import org.eclipse.equinox.p2.publisher.eclipse.IConfigAdvice;
import org.eclipse.equinox.p2.publisher.eclipse.IExecutableAdvice;
import org.eclipse.equinox.p2.publisher.eclipse.ProductAction;
import org.eclipse.equinox.p2.publisher.eclipse.ProductFileAdvice;
import org.eclipse.equinox.p2.tests.TestData;
import org.eclipse.equinox.p2.tests.publisher.TestArtifactRepository;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
public class ProductActionCapturingTest extends ActionTest {
File executablesFeatureLocation = null;
String source = "";
- private Capture<RootIUAdvice> rootIUAdviceCapture;
- private Capture<ProductFileAdvice> productFileAdviceCapture;
protected TestArtifactRepository artifactRepository = new TestArtifactRepository(getAgent());
@Override
- protected IPublisherInfo createPublisherInfoMock() {
- //override to create a nice mock, because we don't care about other method calls.
- return createNiceMock(IPublisherInfo.class);
- }
-
- @Override
- protected void insertPublisherInfoBehavior() {
- // capture these calls for assertions
- publisherInfo.addAdvice(EasyMock.and(EasyMock.isA(RootIUAdvice.class), EasyMock.capture(rootIUAdviceCapture)));
- publisherInfo.addAdvice(EasyMock.and(EasyMock.isA(ProductFileAdvice.class), EasyMock.capture(productFileAdviceCapture)));
-
- expect(publisherInfo.getArtifactRepository()).andReturn(artifactRepository).anyTimes();
- expect(publisherInfo.getArtifactOptions()).andReturn(IPublisherInfo.A_PUBLISH).anyTimes();
- //Return an empty list every time getAdvice is called
- expect(publisherInfo.getAdvice((String) anyObject(), anyBoolean(), (String) anyObject(), (Version) anyObject(), (Class<IPublisherAdvice>) anyObject())).andReturn(Collections.emptyList());
- expectLastCall().anyTimes();
- }
-
- @Override
public void setUp() throws Exception {
- rootIUAdviceCapture = new Capture<>();
- productFileAdviceCapture = new Capture<>();
setupPublisherInfo();
setupPublisherResult();
}
@@ -84,15 +54,18 @@ public class ProductActionCapturingTest extends ActionTest {
* IConfigAdvice (start levels, auto-start).
*/
public void testSetBundleConfigData() throws Exception {
+ ArgumentCaptor<IPublisherAdvice> productFileAdviceCapture = ArgumentCaptor.forClass(IPublisherAdvice.class);
addContextIU("org.eclipse.rcp.feature.group", "3.5.0.v20081110-9C9tEvNEla71LZ2jFz-RFB-t");
ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "startLevel.product").toString());
- testAction = new ProductAction(source, productFile, flavorArg, executablesFeatureLocation);
+ testAction = Mockito.spy(new ProductAction(source, productFile, flavorArg, executablesFeatureLocation));
IStatus status = testAction.perform(publisherInfo, publisherResult, null);
+ verify(publisherInfo, Mockito.atLeastOnce()).addAdvice(productFileAdviceCapture.capture());
assertThat(status, is(okStatus()));
- IConfigAdvice configAdvice = productFileAdviceCapture.getValue();
+ IConfigAdvice configAdvice = (IConfigAdvice) productFileAdviceCapture.getAllValues().stream()
+ .filter(IConfigAdvice.class::isInstance).collect(Collectors.toList()).get(0);
BundleInfo[] bundles = configAdvice.getBundles();
assertEquals("1.0", 2, bundles.length);
assertEquals("1.1", "org.eclipse.equinox.common", bundles[0].getSymbolicName());
@@ -110,14 +83,17 @@ public class ProductActionCapturingTest extends ActionTest {
* Tests that correct advice is created for the org.eclipse.platform product.
*/
public void testPlatformProduct() throws Exception {
+ ArgumentCaptor<IPublisherAdvice> productFileAdviceCapture = ArgumentCaptor.forClass(IPublisherAdvice.class);
ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "platform.product").toString());
addContextIU("org.eclipse.platform.feature.group", "1.2.3");
- testAction = new ProductAction(source, productFile, flavorArg, executablesFeatureLocation);
+ testAction = Mockito.spy(new ProductAction(source, productFile, flavorArg, executablesFeatureLocation));
IStatus status = testAction.perform(publisherInfo, publisherResult, null);
+ verify(publisherInfo, Mockito.atLeastOnce()).addAdvice(productFileAdviceCapture.capture());
assertThat(status, is(okStatus()));
- IExecutableAdvice launchAdvice = productFileAdviceCapture.getValue();
+ IExecutableAdvice launchAdvice = (IExecutableAdvice) productFileAdviceCapture.getAllValues().stream()
+ .filter(ProductFileAdvice.class::isInstance).collect(Collectors.toList()).get(0);
assertEquals("1.0", "eclipse", launchAdvice.getExecutableName());
String[] programArgs = launchAdvice.getProgramArguments();
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductActionTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductActionTest.java
index 3405c53e5..994cfafcd 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductActionTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductActionTest.java
@@ -16,7 +16,6 @@
******************************************************************************/
package org.eclipse.equinox.p2.tests.publisher.actions;
-import static org.easymock.EasyMock.createNiceMock;
import static org.eclipse.equinox.p2.tests.publisher.actions.StatusMatchers.errorStatus;
import static org.eclipse.equinox.p2.tests.publisher.actions.StatusMatchers.okStatus;
import static org.eclipse.equinox.p2.tests.publisher.actions.StatusMatchers.statusWithMessageWhich;
@@ -71,21 +70,18 @@ public class ProductActionTest extends ActionTest {
String source = "";
protected TestArtifactRepository artifactRepository = new TestArtifactRepository(getAgent());
- @Override protected IPublisherInfo createPublisherInfoMock() {
- //override to create a nice mock, because we don't care about other method calls.
- return createNiceMock(IPublisherInfo.class);
- }
-
- @Override public void setUp() throws Exception {
+ @Override
+ public void setUp() throws Exception {
setupPublisherInfo();
setupPublisherResult();
}
- @Override public void setupPublisherInfo() {
+ @Override
+ public void setupPublisherInfo() {
PublisherInfo publisherInfoImpl = new PublisherInfo();
publisherInfoImpl.setArtifactRepository(artifactRepository);
publisherInfoImpl.setArtifactOptions(IPublisherInfo.A_PUBLISH);
- publisherInfoImpl.setConfigurations(new String[] {configSpec});
+ publisherInfoImpl.setConfigurations(new String[] { configSpec });
publisherInfo = publisherInfoImpl;
}
@@ -95,18 +91,20 @@ public class ProductActionTest extends ActionTest {
* splash screen, icon, etc.
*/
public void testBrandedApplication() throws Exception {
- ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "brandedProduct/branded.product").toString());
+ ProductFile productFile = new ProductFile(
+ TestData.getFile("ProductActionTest", "brandedProduct/branded.product").toString());
addContextIU("org.eclipse.platform.feature.group", "1.2.3");
performProductAction(productFile);
Collection<IInstallableUnit> ius = publisherResult.getIUs("branded.product", IPublisherResult.NON_ROOT);
assertEquals("1.0", 1, ius.size());
- //TODO assert branding was done correctly
+ // TODO assert branding was done correctly
}
public void testLicense() throws Exception {
- ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "productWithLicense.product").toString());
+ ProductFile productFile = new ProductFile(
+ TestData.getFile("ProductActionTest", "productWithLicense.product").toString());
performProductAction(productFile);
Collection<IInstallableUnit> ius = publisherResult.getIUs("licenseIU.product", IPublisherResult.NON_ROOT);
assertEquals("1.0", 1, ius.size());
@@ -116,7 +114,8 @@ public class ProductActionTest extends ActionTest {
}
public void testLicenseNoURL() throws Exception {
- ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "licenseNoURL.product").toString());
+ ProductFile productFile = new ProductFile(
+ TestData.getFile("ProductActionTest", "licenseNoURL.product").toString());
performProductAction(productFile);
Collection<IInstallableUnit> ius = publisherResult.getIUs("licenseIU.product", IPublisherResult.NON_ROOT);
assertEquals("1.0", 1, ius.size());
@@ -126,7 +125,8 @@ public class ProductActionTest extends ActionTest {
}
public void testLicenseNoText() throws Exception {
- ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "licenseNoText.product").toString());
+ ProductFile productFile = new ProductFile(
+ TestData.getFile("ProductActionTest", "licenseNoText.product").toString());
performProductAction(productFile);
Collection<IInstallableUnit> ius = publisherResult.getIUs("licenseIU.product", IPublisherResult.NON_ROOT);
assertEquals("1.0", 1, ius.size());
@@ -136,7 +136,8 @@ public class ProductActionTest extends ActionTest {
}
public void testMissingLicense() throws Exception {
- ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "productWithNoLicense.product").toString());
+ ProductFile productFile = new ProductFile(
+ TestData.getFile("ProductActionTest", "productWithNoLicense.product").toString());
performProductAction(productFile);
Collection<IInstallableUnit> ius = publisherResult.getIUs("licenseIU.product", IPublisherResult.NON_ROOT);
assertEquals("1.0", 1, ius.size());
@@ -145,8 +146,10 @@ public class ProductActionTest extends ActionTest {
}
public void testMultiProductPublishing() throws Exception {
- ProductFile productFile1 = new ProductFile(TestData.getFile("ProductActionTest", "boundedVersionConfigurations.product").toString());
- ProductFile productFile2 = new ProductFile(TestData.getFile("ProductActionTest", "unboundedVersionConfigurations.product").toString());
+ ProductFile productFile1 = new ProductFile(
+ TestData.getFile("ProductActionTest", "boundedVersionConfigurations.product").toString());
+ ProductFile productFile2 = new ProductFile(
+ TestData.getFile("ProductActionTest", "unboundedVersionConfigurations.product").toString());
addContextIU("org.eclipse.core.runtime", "4.0.0");
performProductAction(productFile1);
@@ -158,7 +161,8 @@ public class ProductActionTest extends ActionTest {
}
public void testMultiPlatformCUs_DifferentPlatforms() throws Exception {
- ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "unboundedVersionConfigurations.product").toString());
+ ProductFile productFile = new ProductFile(
+ TestData.getFile("ProductActionTest", "unboundedVersionConfigurations.product").toString());
setConfiguration(LINUX_CONFIG_SPEC);
addContextIU("org.eclipse.core.runtime", "0.0.0", WIN_FILTER);
@@ -169,7 +173,8 @@ public class ProductActionTest extends ActionTest {
}
public void testMultiPlatformCUs_SamePlatforms() throws Exception {
- ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "unboundedVersionConfigurations.product").toString());
+ ProductFile productFile = new ProductFile(
+ TestData.getFile("ProductActionTest", "unboundedVersionConfigurations.product").toString());
setConfiguration(LINUX_CONFIG_SPEC);
addContextIU("org.eclipse.core.runtime", "0.0.0", LINUX_FILTER);
@@ -180,7 +185,8 @@ public class ProductActionTest extends ActionTest {
}
public void testMultiPlatformCUs_SamePlatforms_NoVersion() throws Exception {
- ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "unboundedVersionConfigurations.product").toString());
+ ProductFile productFile = new ProductFile(
+ TestData.getFile("ProductActionTest", "unboundedVersionConfigurations.product").toString());
setConfiguration(LINUX_CONFIG_SPEC);
addContextIU("org.eclipse.core.runtime", null, LINUX_FILTER);
@@ -191,11 +197,13 @@ public class ProductActionTest extends ActionTest {
}
public void testMultiPlatformCUs_SamePlatforms_BoundedVersions() throws Exception {
- ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "unboundedVersionConfigurations.product").toString());
+ ProductFile productFile = new ProductFile(
+ TestData.getFile("ProductActionTest", "unboundedVersionConfigurations.product").toString());
setConfiguration(LINUX_CONFIG_SPEC);
- // Set a specific version number, the one in the .product file uses 0.0.0. Let's see if it binds properly
- //filter is different from linuxConfigSpec, but will still match
+ // Set a specific version number, the one in the .product file uses 0.0.0. Let's
+ // see if it binds properly
+ // filter is different from linuxConfigSpec, but will still match
addContextIU("org.eclipse.core.runtime", "4.0.0", "(osgi.os=linux)");
performProductAction(productFile);
@@ -205,36 +213,45 @@ public class ProductActionTest extends ActionTest {
}
public void testCUsHost() throws Exception {
- ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "unboundedVersionConfigurations.product").toString());
+ ProductFile productFile = new ProductFile(
+ TestData.getFile("ProductActionTest", "unboundedVersionConfigurations.product").toString());
setConfiguration(LINUX_CONFIG_SPEC);
- // Set a specific version number, the one in the .product file uses 0.0.0. Let's see if it binds properly
- //filter is different from linuxConfigSpec, but will still match
+ // Set a specific version number, the one in the .product file uses 0.0.0. Let's
+ // see if it binds properly
+ // filter is different from linuxConfigSpec, but will still match
addContextIU("org.eclipse.core.runtime", "4.0.0", "(osgi.os=linux)");
performProductAction(productFile);
- IInstallableUnitFragment fragment = (IInstallableUnitFragment) getUniquePublishedIU(flavorArg + LINUX_CONFIG_SPEC + "org.eclipse.core.runtime");
- assertEquals("1.1", "org.eclipse.core.runtime", RequiredCapability.extractName(fragment.getHost().iterator().next().getMatches()));
- assertEquals("1.2", Version.create("4.0.0"), RequiredCapability.extractRange(fragment.getHost().iterator().next().getMatches()).getMinimum());
+ IInstallableUnitFragment fragment = (IInstallableUnitFragment) getUniquePublishedIU(
+ flavorArg + LINUX_CONFIG_SPEC + "org.eclipse.core.runtime");
+ assertEquals("1.1", "org.eclipse.core.runtime",
+ RequiredCapability.extractName(fragment.getHost().iterator().next().getMatches()));
+ assertEquals("1.2", Version.create("4.0.0"),
+ RequiredCapability.extractRange(fragment.getHost().iterator().next().getMatches()).getMinimum());
assertEquals("1.3", Version.create("1.0.0"), fragment.getVersion());
}
public void testMultiConfigspecProductPublishing() throws IOException, Exception {
ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "platform.product").toString());
- ((PublisherInfo) publisherInfo).setConfigurations(new String[] {"carbon.macos.x86", "cocoa.macos.x86"});
+ ((PublisherInfo) publisherInfo).setConfigurations(new String[] { "carbon.macos.x86", "cocoa.macos.x86" });
addContextIU("org.eclipse.platform.feature.group", "1.2.3");
performProductAction(productFile);
- Collection<IConfigAdvice> advice = publisherInfo.getAdvice("carbon.macos.x86", false, null, null, IConfigAdvice.class);
+ Collection<IConfigAdvice> advice = publisherInfo.getAdvice("carbon.macos.x86", false, null, null,
+ IConfigAdvice.class);
assertEquals("1.0", 1, advice.size());
}
public void testANYConfigSpecPublishing_GeneralBundle() throws Exception {
- ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "unboundedVersionConfigurations.product").toString());
- String configSpecANY = AbstractPublisherAction.createConfigSpec("ANY", "ANY", "ANY"); // configuration spec to create CUs without filters
+ ProductFile productFile = new ProductFile(
+ TestData.getFile("ProductActionTest", "unboundedVersionConfigurations.product").toString());
+ String configSpecANY = AbstractPublisherAction.createConfigSpec("ANY", "ANY", "ANY"); // configuration spec to
+ // create CUs without
+ // filters
setConfiguration(configSpecANY);
addContextIU("org.eclipse.core.runtime", "4.0.0");
@@ -242,16 +259,22 @@ public class ProductActionTest extends ActionTest {
performProductAction(productFile);
// there is a CU for the IU because it applies to all platforms
- IInstallableUnitFragment fragment = (IInstallableUnitFragment) getUniquePublishedIU(flavorArg + configSpecANY + "org.eclipse.core.runtime");
- assertEquals("1.1", "org.eclipse.core.runtime", RequiredCapability.extractName(fragment.getHost().iterator().next().getMatches()));
- assertEquals("1.2", Version.create("4.0.0"), RequiredCapability.extractRange(fragment.getHost().iterator().next().getMatches()).getMinimum());
+ IInstallableUnitFragment fragment = (IInstallableUnitFragment) getUniquePublishedIU(
+ flavorArg + configSpecANY + "org.eclipse.core.runtime");
+ assertEquals("1.1", "org.eclipse.core.runtime",
+ RequiredCapability.extractName(fragment.getHost().iterator().next().getMatches()));
+ assertEquals("1.2", Version.create("4.0.0"),
+ RequiredCapability.extractRange(fragment.getHost().iterator().next().getMatches()).getMinimum());
assertEquals("1.3", Version.create("1.0.0"), fragment.getVersion());
assertNull("1.3", fragment.getFilter());
}
public void testANYConfigSpecPublishing_PlatformSpecificBundle() throws Exception {
- ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "unboundedVersionConfigurations.product").toString());
- String configSpecANY = AbstractPublisherAction.createConfigSpec("ANY", "ANY", "ANY"); // configuration spec to create CUs without filters
+ ProductFile productFile = new ProductFile(
+ TestData.getFile("ProductActionTest", "unboundedVersionConfigurations.product").toString());
+ String configSpecANY = AbstractPublisherAction.createConfigSpec("ANY", "ANY", "ANY"); // configuration spec to
+ // create CUs without
+ // filters
setConfiguration(configSpecANY);
addContextIU("org.eclipse.core.runtime", "4.0.0", WIN_FILTER); // any valid filter can be set here
@@ -276,13 +299,15 @@ public class ProductActionTest extends ActionTest {
testAction = new ProductAction(source, productFile, flavorArg, executablesFeatureLocation);
PublisherInfo info = new PublisherInfo();
info.setContextMetadataRepository(repository);
- // TODO this line doesn't have any effect -> is this a bug in the implementation?
+ // TODO this line doesn't have any effect -> is this a bug in the
+ // implementation?
info.addAdvice(new QueryableFilterAdvice(info.getContextMetadataRepository()));
IStatus status = testAction.perform(info, publisherResult, null);
assertThat(status, is(okStatus()));
- IQueryResult<IInstallableUnit> results = publisherResult.query(QueryUtil.createIUQuery("org.eclipse.platform.ide", Version.create("3.5.0.I20081118")), null);
+ IQueryResult<IInstallableUnit> results = publisherResult
+ .query(QueryUtil.createIUQuery("org.eclipse.platform.ide", Version.create("3.5.0.I20081118")), null);
assertEquals("1.0", 1, queryResultSize(results));
IInstallableUnit unit = results.iterator().next();
Collection<IRequirement> requiredCapabilities = unit.getRequirements();
@@ -296,12 +321,14 @@ public class ProductActionTest extends ActionTest {
}
}
assertTrue("1.1", capability != null);
- assertEquals("1.2", InstallableUnit.parseFilter("(org.eclipse.update.install.features=true)"), capability.getFilter());
+ assertEquals("1.2", InstallableUnit.parseFilter("(org.eclipse.update.install.features=true)"),
+ capability.getFilter());
}
public void testProductWithAdviceFile() throws Exception {
// product file that has a corresponding advice file (p2.inf).
- ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest/productWithAdvice", "productWithAdvice.product").toString());
+ ProductFile productFile = new ProductFile(
+ TestData.getFile("ProductActionTest/productWithAdvice", "productWithAdvice.product").toString());
testAction = new ProductAction(source, productFile, flavorArg, executablesFeatureLocation);
IStatus status = testAction.perform(new PublisherInfo(), publisherResult, null);
assertThat(status, is(okStatus()));
@@ -310,27 +337,30 @@ public class ProductActionTest extends ActionTest {
Collection<ITouchpointData> data = product.getTouchpointData();
assertEquals("1.1", 1, data.size());
String configure = data.iterator().next().getInstruction("configure").getBody();
- assertEquals("1.2", "addRepository(type:0,location:http${#58}//download.eclipse.org/releases/fred);addRepository(type:1,location:http${#58}//download.eclipse.org/releases/fred);", configure);
-
- //update.id = com.zoobar
- //update.range = [4.0,4.3)
- //update.severity = 0
- //update.description = This is the description
+ assertEquals("1.2",
+ "addRepository(type:0,location:http${#58}//download.eclipse.org/releases/fred);addRepository(type:1,location:http${#58}//download.eclipse.org/releases/fred);",
+ configure);
+
+ // update.id = com.zoobar
+ // update.range = [4.0,4.3)
+ // update.severity = 0
+ // update.description = This is the description
IUpdateDescriptor update = product.getUpdateDescriptor();
assertEquals("2.0", 0, update.getSeverity());
assertEquals("2.1", "This is the description", update.getDescription());
- //unit that fits in range
+ // unit that fits in range
assertTrue("2.2", update.isUpdateOf(createIU("com.zoobar", Version.createOSGi(4, 1, 0))));
- //unit that is too old for range
+ // unit that is too old for range
assertFalse("2.3", update.isUpdateOf(createIU("com.zoobar", Version.createOSGi(3, 1, 0))));
- //version that is too new and outside of range
+ // version that is too new and outside of range
assertFalse("2.4", update.isUpdateOf(createIU("com.zoobar", Version.createOSGi(6, 1, 0))));
- //unit with matching version but not matching id
+ // unit with matching version but not matching id
assertFalse("2.6", update.isUpdateOf(createIU("com.other", Version.createOSGi(4, 1, 0))));
}
public void testFiltersOfInclusions() throws Exception {
- ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "productIncludingFragments.product").toString());
+ ProductFile productFile = new ProductFile(
+ TestData.getFile("ProductActionTest", "productIncludingFragments.product").toString());
addContextIU("generalbundle", "1.0.1");
addContextIU("fragment.win", "1.0.2", WIN_FILTER);
// no fragment.linux in the context
@@ -338,39 +368,48 @@ public class ProductActionTest extends ActionTest {
IStatus status = performProductActionAndReturnStatus(productFile);
IInstallableUnit productIU = getUniquePublishedIU("productIncludingFragments.uid");
- assertThat(productIU.getRequirements(), hasItem(createIURequirement("generalbundle", createStrictVersionRange("1.0.1"))));
- assertThat(productIU.getRequirements(), hasItem(createIURequirement("fragment.win", createStrictVersionRange("1.0.2"), WIN_FILTER)));
+ assertThat(productIU.getRequirements(),
+ hasItem(createIURequirement("generalbundle", createStrictVersionRange("1.0.1"))));
+ assertThat(productIU.getRequirements(),
+ hasItem(createIURequirement("fragment.win", createStrictVersionRange("1.0.2"), WIN_FILTER)));
- // this is bug 390361: the Linux fragment is required without filter, so the product cannot be installed for Windows ...
+ // this is bug 390361: the Linux fragment is required without filter, so the
+ // product cannot be installed for Windows ...
assertThat(productIU.getRequirements(), hasItem(createIURequirement("fragment.linux", ANY_VERSION)));
// ... therefore the action shall report an error
assertThat(status, is(errorStatus()));
- assertThat(Arrays.asList(status.getChildren()), hasItem(statusWithMessageWhich(containsString("Included element fragment.linux 0.0.0 is missing"))));
+ assertThat(Arrays.asList(status.getChildren()),
+ hasItem(statusWithMessageWhich(containsString("Included element fragment.linux 0.0.0 is missing"))));
}
public void testMessageForProductWithIgnoredContent() throws Exception {
- ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "mixedContentIgnored.product").toString());
+ ProductFile productFile = new ProductFile(
+ TestData.getFile("ProductActionTest", "mixedContentIgnored.product").toString());
IStatus status = performProductActionAndReturnStatus(productFile);
- // expect a warning about redundant, ignored content in product file -> requested in bug 325611
+ // expect a warning about redundant, ignored content in product file ->
+ // requested in bug 325611
assertThat(Arrays.asList(status.getChildren()), hasItem(statusWithMessageWhich(containsString("are ignored"))));
// TODO the message should have a code identifying it
}
public void testJREIncluded() throws Exception {
- ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "brandedProduct/branded.product").toString());
+ ProductFile productFile = new ProductFile(
+ TestData.getFile("ProductActionTest", "brandedProduct/branded.product").toString());
addContextIU("org.eclipse.platform.feature.group", "1.2.3");
performProductAction(productFile);
Collection<IInstallableUnit> ius = publisherResult.getIUs("branded.product", IPublisherResult.NON_ROOT);
assertEquals(1, ius.size());
assertEquals("Missing a.jre.javase", 1, publisherResult.getIUs("a.jre.javase", IPublisherResult.ROOT).size());
- assertEquals("Missing config.a.jre.javase", 1, publisherResult.getIUs("config.a.jre.javase", IPublisherResult.ROOT).size());
+ assertEquals("Missing config.a.jre.javase", 1,
+ publisherResult.getIUs("config.a.jre.javase", IPublisherResult.ROOT).size());
}
public void testRequiredEEAsSpecified() throws Exception {
- ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "productFileActionTest.product").toString());
+ ProductFile productFile = new ProductFile(
+ TestData.getFile("ProductActionTest", "productFileActionTest.product").toString());
addContextIU("org.eclipse.core.commands", "5.0.0");
performProductAction(productFile);
@@ -407,7 +446,7 @@ public class ProductActionTest extends ActionTest {
}
private void setConfiguration(String configSpec) {
- ((PublisherInfo) publisherInfo).setConfigurations(new String[] {configSpec});
+ ((PublisherInfo) publisherInfo).setConfigurations(new String[] { configSpec });
}
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductActionTestMac.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductActionTestMac.java
index 87a455079..7673a092c 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductActionTestMac.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductActionTestMac.java
@@ -13,30 +13,23 @@
*******************************************************************************/
package org.eclipse.equinox.p2.tests.publisher.actions;
-import static org.easymock.EasyMock.anyBoolean;
-import static org.easymock.EasyMock.anyObject;
-import static org.easymock.EasyMock.createNiceMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.expectLastCall;
import static org.eclipse.equinox.p2.tests.publisher.actions.StatusMatchers.okStatus;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.verify;
import java.io.File;
-import java.util.Collections;
-import org.easymock.Capture;
-import org.easymock.EasyMock;
+import java.util.stream.Collectors;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.equinox.internal.p2.publisher.eclipse.ProductFile;
-import org.eclipse.equinox.p2.metadata.Version;
import org.eclipse.equinox.p2.publisher.AbstractPublisherAction;
import org.eclipse.equinox.p2.publisher.IPublisherAdvice;
-import org.eclipse.equinox.p2.publisher.IPublisherInfo;
-import org.eclipse.equinox.p2.publisher.actions.RootIUAdvice;
import org.eclipse.equinox.p2.publisher.eclipse.IExecutableAdvice;
import org.eclipse.equinox.p2.publisher.eclipse.ProductAction;
import org.eclipse.equinox.p2.publisher.eclipse.ProductFileAdvice;
import org.eclipse.equinox.p2.tests.TestData;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
/**
* Tests for {@link ProductAction} specific to Mac.
@@ -44,30 +37,11 @@ import org.eclipse.equinox.p2.tests.TestData;
public class ProductActionTestMac extends ActionTest {
private File executablesFeatureLocation = null;
- private Capture<RootIUAdvice> rootIUAdviceCapture;
- private Capture<ProductFileAdvice> productFileAdviceCapture;
private String source = "";
@Override
- protected IPublisherInfo createPublisherInfoMock() {
- //override to create a nice mock, because we don't care about other method calls.
- return createNiceMock(IPublisherInfo.class);
- }
-
- @Override
- protected void insertPublisherInfoBehavior() {
- publisherInfo.addAdvice(EasyMock.and(EasyMock.isA(RootIUAdvice.class), EasyMock.capture(rootIUAdviceCapture)));
- publisherInfo.addAdvice(EasyMock.and(EasyMock.isA(ProductFileAdvice.class), EasyMock.capture(productFileAdviceCapture)));
- //Return an empty list every time getAdvice is called
- expect(publisherInfo.getAdvice((String) anyObject(), anyBoolean(), (String) anyObject(), (Version) anyObject(), (Class<IPublisherAdvice>) anyObject())).andReturn(Collections.emptyList());
- expectLastCall().anyTimes();
- }
-
- @Override
public void setUp() throws Exception {
configSpec = AbstractPublisherAction.createConfigSpec("carbon", "macosx", "x86");
- rootIUAdviceCapture = new Capture<>();
- productFileAdviceCapture = new Capture<>();
setupPublisherInfo();
setupPublisherResult();
}
@@ -76,13 +50,16 @@ public class ProductActionTestMac extends ActionTest {
* Tests that correct advice is created for the org.eclipse.platform product.
*/
public void testPlatformProduct() throws Exception {
+ ArgumentCaptor<IPublisherAdvice> productFileAdviceCapture = ArgumentCaptor.forClass(IPublisherAdvice.class);
ProductFile productFile = new ProductFile(TestData.getFile("ProductActionTest", "platform.product").toString());
addContextIU("org.eclipse.platform.feature.group", "3.8.3");
- testAction = new ProductAction(source, productFile, flavorArg, executablesFeatureLocation);
+ testAction = Mockito.spy(new ProductAction(source, productFile, flavorArg, executablesFeatureLocation));
IStatus status = testAction.perform(publisherInfo, publisherResult, null);
+ verify(publisherInfo, Mockito.atLeastOnce()).addAdvice(productFileAdviceCapture.capture());
assertThat(status, is(okStatus()));
- IExecutableAdvice launchAdvice = productFileAdviceCapture.getValue();
+ IExecutableAdvice launchAdvice = (IExecutableAdvice) productFileAdviceCapture.getAllValues().stream()
+ .filter(ProductFileAdvice.class::isInstance).collect(Collectors.toList()).get(0);
assertEquals("1.0", "eclipse", launchAdvice.getExecutableName());
String[] programArgs = launchAdvice.getProgramArguments();
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductFileAdviceTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductFileAdviceTest.java
index 3a93eb59a..91bc64d39 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductFileAdviceTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/ProductFileAdviceTest.java
@@ -208,7 +208,7 @@ public class ProductFileAdviceTest extends AbstractProvisioningTest {
configProperties.put("osgi.bundles", "org.eclipse.equinox.simpleconfigurator@1:start");
writeProperties(new File(rootFolder, "config.ini"), configProperties);
- StringBuffer buffer = new StringBuffer();
+ StringBuilder buffer = new StringBuilder();
buffer.append("org.eclipse.equinox.common,3.5.100.v20090817,plugins/org.eclipse.equinox.common_3.5.100.v20090817.jar,2,true\n");
buffer.append("org.eclipse.equinox.simpleconfigurator,1.0.200.v20090729-1800,plugins/org.eclipse.equinox.simpleconfigurator_1.0.200.v20090729-1800.jar,1,true\n");
writeBuffer(new File(rootFolder, "org.eclipse.equinox.simpleconfigurator/bundles.info"), buffer);
@@ -229,7 +229,7 @@ public class ProductFileAdviceTest extends AbstractProvisioningTest {
File root = getTestFolder("configNullLauncher");
File testProduct = new File(root, "test.product");
- StringBuffer buffer = new StringBuffer();
+ StringBuilder buffer = new StringBuilder();
buffer.append("<product id=\"test.product\" version=\"1\" useFeatures=\"false\"> \n");
buffer.append(" <configIni use=\"default\"> \n");
buffer.append(" <win32>config.ini</win32> \n");
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/RootFilesActionTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/RootFilesActionTest.java
index 9fa2a5d65..030cd8b2a 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/RootFilesActionTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/RootFilesActionTest.java
@@ -15,19 +15,30 @@
******************************************************************************/
package org.eclipse.equinox.p2.tests.publisher.actions;
-import static org.easymock.EasyMock.expect;
-
-import java.io.*;
-import java.util.*;
+import static org.mockito.Mockito.when;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
import java.util.zip.ZipInputStream;
-import org.eclipse.core.runtime.*;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
import org.eclipse.equinox.internal.p2.core.helpers.FileUtils;
import org.eclipse.equinox.internal.p2.metadata.ArtifactKey;
import org.eclipse.equinox.p2.metadata.IArtifactKey;
import org.eclipse.equinox.p2.metadata.Version;
import org.eclipse.equinox.p2.publisher.AbstractPublisherAction;
import org.eclipse.equinox.p2.publisher.IPublisherInfo;
-import org.eclipse.equinox.p2.publisher.actions.*;
+import org.eclipse.equinox.p2.publisher.actions.IRootFilesAdvice;
+import org.eclipse.equinox.p2.publisher.actions.ITouchpointAdvice;
+import org.eclipse.equinox.p2.publisher.actions.RootFilesAction;
+import org.eclipse.equinox.p2.publisher.actions.RootFilesAdvice;
import org.eclipse.equinox.p2.repository.artifact.IArtifactRepository;
import org.eclipse.equinox.p2.tests.TestActivator;
import org.eclipse.equinox.p2.tests.TestData;
@@ -68,10 +79,13 @@ public class RootFilesActionTest extends ActionTest {
@Override
public void insertPublisherInfoBehavior() {
- expect(publisherInfo.getArtifactRepository()).andReturn(artifactRepository).anyTimes();
- expect(publisherInfo.getArtifactOptions()).andReturn(IPublisherInfo.A_INDEX | IPublisherInfo.A_OVERWRITE | IPublisherInfo.A_PUBLISH).anyTimes();
- expect(publisherInfo.getAdvice(configSpec, true, null, null, IRootFilesAdvice.class)).andReturn(adviceCollection).anyTimes();
- expect(publisherInfo.getAdvice(configSpec, false, flavorArg + topArg, versionArg, ITouchpointAdvice.class)).andReturn(null).anyTimes();
+ when(publisherInfo.getArtifactRepository()).thenReturn(artifactRepository);
+ when(publisherInfo.getArtifactOptions())
+ .thenReturn(IPublisherInfo.A_INDEX | IPublisherInfo.A_OVERWRITE | IPublisherInfo.A_PUBLISH);
+ when(publisherInfo.getAdvice(configSpec, true, null, null, IRootFilesAdvice.class))
+ .thenReturn(adviceCollection);
+ when(publisherInfo.getAdvice(configSpec, false, flavorArg + topArg, versionArg, ITouchpointAdvice.class))
+ .thenReturn(null);
}
private void setupTestCase(int testArg) throws Exception {
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/RootIUActionTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/RootIUActionTest.java
index 21b4dd4b2..637465c39 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/RootIUActionTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/publisher/actions/RootIUActionTest.java
@@ -15,7 +15,7 @@
******************************************************************************/
package org.eclipse.equinox.p2.tests.publisher.actions;
-import static org.easymock.EasyMock.expect;
+import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Collection;
@@ -358,16 +358,22 @@ public class RootIUActionTest extends ActionTest {
@Override
public void insertPublisherInfoBehavior() {
- expect(publisherInfo.getAdvice(null, false, rootIU, versionArg, ICapabilityAdvice.class)).andReturn(new ArrayList<>()).anyTimes();
- expect(publisherInfo.getAdvice(null, true, null, null, IRootIUAdvice.class)).andReturn(rootIUAdviceCollection).anyTimes();
- expect(publisherInfo.getAdvice(null, true, null, null, IVersionAdvice.class)).andReturn(null).anyTimes();
- expect(publisherInfo.getAdvice(null, false, rootIU, versionArg, ITouchpointAdvice.class)).andReturn(new ArrayList<>()).anyTimes();
- expect(publisherInfo.getAdvice(null, false, rootIU, versionArg, IUpdateDescriptorAdvice.class)).andReturn(new ArrayList<>()).anyTimes();
- expect(publisherInfo.getAdvice(null, false, rootIU, versionArg, IPropertyAdvice.class)).andReturn(new ArrayList<>()).anyTimes();
- expect(publisherInfo.getAdvice(null, false, rootIU, versionArg, IAdditionalInstallableUnitAdvice.class)).andReturn(new ArrayList<>()).anyTimes();
- expect(publisherInfo.getAdvice(null, true, rootIU, versionArg, ILicenseAdvice.class)).andReturn(new ArrayList<>()).anyTimes();
- expect(publisherInfo.getMetadataRepository()).andReturn(metadataRepository).anyTimes();
- expect(publisherInfo.getContextMetadataRepository()).andReturn(null).anyTimes();
+ when(publisherInfo.getAdvice(null, false, rootIU, versionArg, ICapabilityAdvice.class))
+ .thenReturn(new ArrayList<>());
+ when(publisherInfo.getAdvice(null, true, null, null, IRootIUAdvice.class)).thenReturn(rootIUAdviceCollection);
+ when(publisherInfo.getAdvice(null, true, null, null, IVersionAdvice.class)).thenReturn(null);
+ when(publisherInfo.getAdvice(null, false, rootIU, versionArg, ITouchpointAdvice.class))
+ .thenReturn(new ArrayList<>());
+ when(publisherInfo.getAdvice(null, false, rootIU, versionArg, IUpdateDescriptorAdvice.class))
+ .thenReturn(new ArrayList<>());
+ when(publisherInfo.getAdvice(null, false, rootIU, versionArg, IPropertyAdvice.class))
+ .thenReturn(new ArrayList<>());
+ when(publisherInfo.getAdvice(null, false, rootIU, versionArg, IAdditionalInstallableUnitAdvice.class))
+ .thenReturn(new ArrayList<>());
+ when(publisherInfo.getAdvice(null, true, rootIU, versionArg, ILicenseAdvice.class))
+ .thenReturn(new ArrayList<>());
+ when(publisherInfo.getMetadataRepository()).thenReturn(metadataRepository);
+ when(publisherInfo.getContextMetadataRepository()).thenReturn(null);
}
@Override
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ql/PerformanceTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ql/PerformanceTest.java
index 2f070abf5..e0fb19b41 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ql/PerformanceTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ql/PerformanceTest.java
@@ -394,7 +394,7 @@ public class PerformanceTest extends AbstractProvisioningTest {
IInstallableUnit envIU = InstallableUnit.contextIU(env);
CompositeMetadataRepository compositeMetadataRepository = CompositeMetadataRepository.createMemoryComposite(getMetadataRepositoryManager().getAgent());
- compositeMetadataRepository.addChild(new URI("http://download.eclipse.org/releases/galileo"));
+ compositeMetadataRepository.addChild(new URI("https://download.eclipse.org/releases/galileo"));
IMetadataRepository repo = compositeMetadataRepository;
IQueryResult<IInstallableUnit> r = repo.query(QueryUtil.createIUQuery("org.eclipse.sdk.ide"), new NullProgressMonitor());
IInstallableUnit[] roots = r.toArray(IInstallableUnit.class);
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/AbstractReconcilerTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/AbstractReconcilerTest.java
index f1b090aa9..81d99b186 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/AbstractReconcilerTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/AbstractReconcilerTest.java
@@ -281,7 +281,7 @@ public class AbstractReconcilerTest extends AbstractProvisioningTest {
detailedMessage.append(" install location is ").append(getInstallLocation()).append('\n');
String message = "Need to set the \"org.eclipse.equinox.p2.reconciler.tests.platform.archive\" system property with a valid path to the platform binary drop or copy the archive to be a sibling of the install folder.";
assertNotNull(message + "\n" + detailedMessage, file);
- assertTrue(message, file.exists());
+ assertTrue(message + "\nThe file '" + file.getAbsolutePath() + "' does not exist", file.exists());
assertTrue("File is zero length: " + file.getAbsolutePath(), file.length() > 0);
return file;
}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/AbstractSharedBundleProductTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/AbstractSharedBundleProductTest.java
index 2a220009d..47ff21be0 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/AbstractSharedBundleProductTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/reconciler/dropins/AbstractSharedBundleProductTest.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2010, 2017 IBM Corporation and others.
+ * Copyright (c) 2010, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -13,9 +13,21 @@
*******************************************************************************/
package org.eclipse.equinox.p2.tests.reconciler.dropins;
-import java.io.*;
-import java.net.*;
-import java.util.*;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileFilter;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.URIUtil;
import org.eclipse.equinox.frameworkadmin.BundleInfo;
@@ -57,7 +69,7 @@ public class AbstractSharedBundleProductTest extends AbstractReconcilerTest {
"org.eclipse.ecf.ssl", //
"org.eclipse.equinox.app", //
"org.eclipse.equinox.common", //
- "org.eclipse.equinox.ds", //
+ "org.apache.felix.scr", //
"org.eclipse.equinox.frameworkadmin", //
"org.eclipse.equinox.frameworkadmin.equinox", //
"org.eclipse.equinox.p2.artifact.repository", //
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/repository/FileReaderTest2.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/repository/FileReaderTest2.java
index ea51e6291..a07f73ad8 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/repository/FileReaderTest2.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/repository/FileReaderTest2.java
@@ -201,7 +201,7 @@ public class FileReaderTest2 extends AbstractProvisioningTest {
}
private void doFileReaderTest(final PauseJob pauseJob, IProgressMonitor monitor) throws IOException, CoreException {
- final String testRemoteFileURL = "http://download.eclipse.org/releases/photon/201806271001/content.jar";
+ final String testRemoteFileURL = "https://download.eclipse.org/releases/2021-09/202109151000/content.jar";
File tmpFolder = getTempFolder();
File tmpFile = new File(tmpFolder, "testDownloadPauseResume.zip");
File tmpFile1 = new File(tmpFolder, "testDownloadWithoutPause.zip");
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/eclipse/CheckTrustActionTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/eclipse/CheckTrustActionTest.java
index fbc3fc5f4..b1cade2a0 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/eclipse/CheckTrustActionTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/eclipse/CheckTrustActionTest.java
@@ -14,7 +14,9 @@
package org.eclipse.equinox.p2.tests.touchpoint.eclipse;
import java.io.File;
-import java.util.*;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.equinox.internal.p2.engine.InstallableUnitOperand;
import org.eclipse.equinox.internal.p2.engine.phases.CheckTrust;
@@ -65,7 +67,7 @@ public class CheckTrustActionTest extends AbstractProvisioningTest {
Map<String, Object> parameters = new HashMap<>();
parameters.put(ActionConstants.PARM_AGENT, getAgent());
parameters.put(ActionConstants.PARM_PROFILE, profile);
- parameters.put(CheckTrust.PARM_ARTIFACT_FILES, new ArrayList<>());
+ parameters.put(CheckTrust.PARM_ARTIFACTS, new HashMap<>());
EclipseTouchpoint touchpoint = new EclipseTouchpoint();
touchpoint.initializePhase(null, profile, "test", parameters);
InstallableUnitOperand operand = new InstallableUnitOperand(null, iu);
@@ -73,13 +75,13 @@ public class CheckTrustActionTest extends AbstractProvisioningTest {
touchpoint.initializeOperand(profile, parameters);
parameters = Collections.unmodifiableMap(parameters);
- assertFalse(((List<?>) parameters.get(CheckTrust.PARM_ARTIFACT_FILES)).contains(osgiTarget));
+ assertFalse(((Map<?, File>) parameters.get(CheckTrust.PARM_ARTIFACTS)).values().contains(osgiTarget));
CheckTrustAction action = new CheckTrustAction();
action.execute(parameters);
- assertTrue(((List<?>) parameters.get(CheckTrust.PARM_ARTIFACT_FILES)).contains(osgiTarget));
+ assertTrue(((Map<?, File>) parameters.get(CheckTrust.PARM_ARTIFACTS)).values().contains(osgiTarget));
// does nothing so should not alter parameters
action.undo(parameters);
- assertTrue(((List<?>) parameters.get(CheckTrust.PARM_ARTIFACT_FILES)).contains(osgiTarget));
+ assertTrue(((Map<?, File>) parameters.get(CheckTrust.PARM_ARTIFACTS)).values().contains(osgiTarget));
}
} \ No newline at end of file
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/eclipse/SetLauncherNameActionTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/eclipse/SetLauncherNameActionTest.java
index de6ddd662..f01f88db3 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/eclipse/SetLauncherNameActionTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/eclipse/SetLauncherNameActionTest.java
@@ -14,7 +14,9 @@
package org.eclipse.equinox.p2.tests.touchpoint.eclipse;
import java.io.File;
-import java.util.*;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
import org.eclipse.equinox.frameworkadmin.BundleInfo;
import org.eclipse.equinox.internal.p2.engine.InstallableUnitOperand;
import org.eclipse.equinox.internal.p2.touchpoint.eclipse.EclipseTouchpoint;
@@ -99,7 +101,7 @@ public class SetLauncherNameActionTest extends AbstractProvisioningTest {
//profile will start using "eclipse" by default, give it some content and see if it
//survives a name change.
File eclipseIni = new File(tempFolder, "eclipse.ini");
- StringBuffer ini = new StringBuffer();
+ StringBuilder ini = new StringBuilder();
ini.append("-startup\n");
ini.append("plugins/org.eclipse.equinox.launcher_1.2.4.v1234.jar\n");
writeBuffer(eclipseIni, ini);
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/natives/AllTests.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/natives/AllTests.java
index 08ffbaf7c..27f0c1618 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/natives/AllTests.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/natives/AllTests.java
@@ -23,7 +23,7 @@ import org.junit.runners.Suite;
@Suite.SuiteClasses({
ChmodActionTest.class, CleanupzipActionTest.class, CollectActionTest.class, LinkActionTest.class,
MkdirActionTest.class, NativeTouchpointTest.class, RmdirActionTest.class, UnzipActionTest.class,
- CopyActionTest.class, RemoveActionTest.class, BackupStoreTest.class,
+ CopyActionTest.class, RemoveActionTest.class, SimpleBackupStoreTest.class,
CheckAndPromptNativePackageWindowsRegistryTest.class
})
public class AllTests {
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/natives/BackupStoreTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/natives/BackupStoreTest.java
deleted file mode 100644
index 011c4d3cd..000000000
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/natives/BackupStoreTest.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2014, 2017 EclipseSource 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:
- * EclipseSource - initial API and implementation
- *******************************************************************************/
-package org.eclipse.equinox.p2.tests.touchpoint.natives;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.Writer;
-import org.eclipse.equinox.internal.p2.touchpoint.natives.BackupStore;
-import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
-
-public class BackupStoreTest extends AbstractProvisioningTest {
-
- private static final String BUPREFIX = "BackupTest";
- private File sourceDir;
- private File aDir;
- private File aaDir;
- private File aTxt;
- private File bDir;
- private File bTxt;
-
- /**
- * Sets up directories and files under user.home
- * <ul><li>P2BUTEST/</li>
- * <ul><li>A/</li>
- * <ul><li>AA/</li>
- * <ul><li>a.txt</li>
- * </ul>
- * </ul>
- * </ul>
- * </ul>
- */
- @Override
- public void setUp() {
- // create some test files under user.home
- // do not want them under /tmp as it may be on its own file system (and even
- // be an in-memory file system).
- //
- String userHome = System.getProperty("user.home");
- sourceDir = new File(new File(userHome), "P2BUTEST");
- fullyDelete(sourceDir);
- aDir = new File(sourceDir, "A");
- aDir.mkdirs();
- aaDir = new File(aDir, "AA");
- aaDir.mkdir();
- aTxt = new File(aaDir, "eclipse.exe");
- bDir = new File(sourceDir, "B");
- bTxt = new File(bDir, "b.txt");
- try {
- writeToFile(aTxt, "A\nA file with an A");
- } catch (IOException e) {
- fail();
- }
- }
-
- private void writeToFile(File file, String content) throws IOException {
- file.getParentFile().mkdirs();
- file.createNewFile();
-
- try (Writer writer = new BufferedWriter(new FileWriter(file))) {
- writer.write(content);
- }
- }
-
- @Override
- public void tearDown() {
- fullyDelete(sourceDir);
- }
-
- /**
- * Deletes a file, or a directory with all of it's children.
- * @param file the file or directory to fully delete
- * @return true if, and only if the file is deleted
- */
- private boolean fullyDelete(File file) {
- if (!file.exists())
- return true;
- if (file.isDirectory()) {
- File[] children = file.listFiles();
- for (File child : children) {
- if (!fullyDelete(new File(file, child.getName()))) {
- return false;
- }
- }
- }
- return file.delete();
- }
-
- public void testBackupByRenamingFile() {
- String filePath = aTxt.getAbsolutePath();
- class TestBackupByRenamingFileBackupStore extends BackupStore {
- public TestBackupByRenamingFileBackupStore() {
- super(null, BUPREFIX);
- }
-
- @Override
- public void renameInPlace(File file) {
- super.renameInPlace(file);
- }
-
- @Override
- protected String getTimeStamp() {
- return "-123";
- }
- }
- TestBackupByRenamingFileBackupStore backupStore = new TestBackupByRenamingFileBackupStore();
- backupStore.renameInPlace(aTxt);
-
- assertFalse(aTxt.exists());
- assertTrue(new File(filePath + "-123.p2bu").exists());
-
- backupStore.discard();
- assertFalse(new File(filePath + "-123.p2bu").exists());
- }
-
- public void testRenameIfMoveToBackupFails() throws IOException {
- String filePath = aTxt.getAbsolutePath();
- class TestRenameIfMoveToBackupFailsBackupStore extends BackupStore {
- public TestRenameIfMoveToBackupFailsBackupStore() {
- super(null, BUPREFIX);
- }
-
- @Override
- public void renameInPlace(File file) {
- super.renameInPlace(file);
- }
-
- @Override
- public boolean moveToBackupStore(File a, File b) {
- return false;
- }
-
- @Override
- public void moveToBackup(File a, File b) throws IOException {
- super.moveToBackup(a, b);
- }
-
- @Override
- protected String getTimeStamp() {
- return "-123";
- }
- }
- TestRenameIfMoveToBackupFailsBackupStore backupStore = new TestRenameIfMoveToBackupFailsBackupStore();
- backupStore.moveToBackup(aTxt, bTxt);
-
- assertFalse(aTxt.exists());
- assertTrue(new File(filePath + "-123.p2bu").exists());
- assertFalse(bTxt.exists());
-
- backupStore.discard();
- assertFalse(new File(filePath + "-123.p2bu").exists());
- }
-
- public void testDoNotRenameIfMoveToBackupWorks() throws IOException {
- String filePath = aTxt.getAbsolutePath();
- new BackupStore(null, BUPREFIX) {
- @Override
- public void renameInPlace(File file) {
- super.renameInPlace(file);
- }
-
- @Override
- public boolean moveToBackupStore(File a, File b) {
- return super.moveToBackupStore(a, b);
- }
-
- @Override
- public void moveToBackup(File a, File b) throws IOException {
- super.moveToBackup(a, b);
- }
- }.moveToBackup(aTxt, bTxt);
-
- assertFalse(aTxt.exists());
- assertFalse(new File(filePath + ".p2bu").exists());
- assertTrue(bTxt.exists());
- }
-}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/natives/SimpleBackupStoreTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/natives/SimpleBackupStoreTest.java
new file mode 100644
index 000000000..a6f270835
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/touchpoint/natives/SimpleBackupStoreTest.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2021 EclipseSource 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:
+ * EclipseSource - initial API and implementation
+ * Todor Boev - refactor to the java 7 file api
+ *******************************************************************************/
+package org.eclipse.equinox.p2.tests.touchpoint.natives;
+
+import static java.nio.file.FileVisitResult.CONTINUE;
+
+import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import org.eclipse.equinox.internal.p2.touchpoint.natives.SimpleBackupStore;
+import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
+
+public class SimpleBackupStoreTest extends AbstractProvisioningTest {
+ private static final String BACKUP_PREFIX = "backup-test";
+
+ private Path sourceDir;
+
+ private Path aDir;
+ private Path aaDir;
+ private Path aFile;
+
+ /**
+ * <pre>
+ * /p2-backup-test
+ * /a
+ * /aa
+ * /eclipse.exe
+ * </pre>
+ */
+ @Override
+ public void setUp() throws IOException {
+ String userHome = System.getProperty("user.home");
+
+ sourceDir = Path.of(userHome, "p2-backup-test");
+ deleteAll(sourceDir);
+
+ aDir = sourceDir.resolve("a");
+ Files.createDirectories(aDir);
+
+ aaDir = aDir.resolve("aa");
+ Files.createDirectories(aaDir);
+
+ // The eclipse.exe is the only one eligible for backup-in-place
+ aFile = aaDir.resolve("eclipse.exe");
+ Files.createFile(aFile);
+ }
+
+ @Override
+ public void tearDown() throws IOException {
+ deleteAll(sourceDir);
+ }
+
+ private static void deleteAll(Path path) throws IOException {
+ if (!Files.exists(path)) {
+ return;
+ }
+
+ Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+ Files.delete(file);
+ return CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+ if (exc != null) {
+ throw exc;
+ }
+ Files.delete(dir);
+ return CONTINUE;
+ }
+ });
+ }
+
+ public void testBackupInPlace() throws IOException {
+ class TestMoveInPlaceStore extends SimpleBackupStore {
+ public TestMoveInPlaceStore() {
+ super(null, BACKUP_PREFIX);
+ }
+
+ @Override
+ public Path toInPlaceBackupPath(Path path) {
+ return super.toInPlaceBackupPath(path);
+ }
+
+ @Override
+ protected void move(Path a, Path b) throws IOException {
+ // In place backup - allow
+ if (b.equals(toInPlaceBackupPath(a))) {
+ super.move(a, b);
+ }
+ // In place restore - allow
+ else if (a.equals(toInPlaceBackupPath(b))) {
+ super.move(a, b);
+ }
+ // Everything else - fail
+ else if (a.getFileName().endsWith("eclipse.exe")) {
+ // Simulate what happens on Windows when moving a running executable between
+ // drives. In this case the file will be copied to the target but will not be
+ // removed from the source.
+ Files.copy(a, b);
+ } else {
+ throw new IOException("Test fail move: " + a + " -> " + b);
+ }
+ }
+ }
+
+ TestMoveInPlaceStore buStore = new TestMoveInPlaceStore();
+
+ final Path path = aFile;
+ final Path inPlaceBuPath = buStore.toInPlaceBackupPath(aFile);
+
+ buStore.backup(path.toFile());
+
+ assertFalse(Files.exists(path));
+ assertTrue(Files.exists(inPlaceBuPath));
+
+ buStore.restore();
+
+ assertTrue(Files.exists(path));
+ assertFalse(Files.exists(inPlaceBuPath));
+ }
+
+ public void testNoBackupInPlace() throws IOException {
+ class TestNoBackupInPlaceStore extends SimpleBackupStore {
+ public TestNoBackupInPlaceStore() {
+ super(null, BACKUP_PREFIX);
+ }
+
+ @Override
+ public Path toInPlaceBackupPath(Path path) {
+ return super.toInPlaceBackupPath(path);
+ }
+ }
+
+ TestNoBackupInPlaceStore buStore = new TestNoBackupInPlaceStore();
+
+ final Path path = aFile;
+ final Path inPlaceBuPath = buStore.toInPlaceBackupPath(aFile);
+
+ buStore.backup(path.toFile());
+
+ assertFalse(Files.exists(path));
+ assertFalse(Files.exists(inPlaceBuPath));
+
+ buStore.restore();
+
+ assertTrue(Files.exists(path));
+ }
+}
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/updatesite/SiteXMLActionTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/updatesite/SiteXMLActionTest.java
index c75a95bb9..05cfb29a8 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/updatesite/SiteXMLActionTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/updatesite/SiteXMLActionTest.java
@@ -16,20 +16,31 @@ package org.eclipse.equinox.p2.tests.updatesite;
import java.io.File;
import java.io.PrintStream;
import java.net.URI;
-import java.util.*;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.URIUtil;
import org.eclipse.equinox.internal.p2.updatesite.SiteXMLAction;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.metadata.IProvidedCapability;
-import org.eclipse.equinox.p2.publisher.*;
+import org.eclipse.equinox.p2.publisher.IPublisherAction;
+import org.eclipse.equinox.p2.publisher.IPublisherResult;
+import org.eclipse.equinox.p2.publisher.PublisherInfo;
+import org.eclipse.equinox.p2.publisher.PublisherResult;
import org.eclipse.equinox.p2.publisher.actions.MergeResultsAction;
import org.eclipse.equinox.p2.publisher.eclipse.BundlesAction;
import org.eclipse.equinox.p2.publisher.eclipse.FeaturesAction;
-import org.eclipse.equinox.p2.query.*;
+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.IRepository;
import org.eclipse.equinox.p2.repository.IRepositoryReference;
-import org.eclipse.equinox.p2.tests.*;
+import org.eclipse.equinox.p2.tests.AbstractProvisioningTest;
+import org.eclipse.equinox.p2.tests.StringBufferStream;
+import org.eclipse.equinox.p2.tests.TestData;
+import org.eclipse.equinox.p2.tests.TestMetadataRepository;
/**
* Tests for {@link org.eclipse.equinox.internal.p2.updatesite.SiteXMLAction}.
@@ -88,7 +99,7 @@ public class SiteXMLActionTest extends AbstractProvisioningTest {
assertEquals("1.0", 2, references.size());
boolean metadataFound = false, artifactFound = false;
for (IRepositoryReference ref : references) {
- assertEquals("1.1", "http://download.eclipse.org/eclipse/updates/3.5", ref.getLocation().toString());
+ assertEquals("1.1", "https://download.eclipse.org/eclipse/updates/4.21", ref.getLocation().toString());
assertEquals("1.2", IRepository.ENABLED, ref.getOptions());
assertEquals("1.3", "Eclipse Project Update Site", ref.getNickname());
@@ -103,7 +114,8 @@ public class SiteXMLActionTest extends AbstractProvisioningTest {
public void testMirrorsURL() {
String mirrorsURL = metadataRepository.getProperties().get(IRepository.PROP_MIRRORS_URL);
- assertEquals("1.0", "http://www.eclipse.org/downloads/download.php?file=/eclipse/updates/3.4&format=xml", mirrorsURL);
+ assertEquals("1.0", "https://www.eclipse.org/downloads/download.php?file=/eclipse/updates/4.21&format=xml",
+ mirrorsURL);
}
public void testBundleInCategory() {
diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/updatesite/UpdateSiteTest.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/updatesite/UpdateSiteTest.java
index a3204eb7d..67dde3c36 100644
--- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/updatesite/UpdateSiteTest.java
+++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/updatesite/UpdateSiteTest.java
@@ -711,8 +711,8 @@ public class UpdateSiteTest extends AbstractProvisioningTest {
public void _testFeatureSiteReferences() throws ProvisionException, URISyntaxException {
File site = getTestData("0.1", "/testData/updatesite/siteFeatureReferences");
URI siteURI = site.toURI();
- URI testUpdateSite = new URI("http://download.eclipse.org/test/updatesite/");
- URI testDiscoverySite = new URI("http://download.eclipse.org/test/discoverysite");
+ URI testUpdateSite = new URI("https://download.eclipse.org/test/updatesite/");
+ URI testDiscoverySite = new URI("https://download.eclipse.org/test/discoverysite");
IMetadataRepositoryManager manager = getAgent().getService(IMetadataRepositoryManager.class);
assertNotNull(manager);
@@ -800,6 +800,7 @@ public class UpdateSiteTest extends AbstractProvisioningTest {
// Should have a packed & canonical version
assertEquals(2, descriptors.length);
+ @SuppressWarnings("removal")
IArtifactDescriptor desc = IArtifactDescriptor.FORMAT_PACKED.equals(descriptors[0].getProperty(IArtifactDescriptor.FORMAT)) ? descriptors[0] : descriptors[1];
try (OutputStream out = new FileOutputStream(output)) {
@@ -815,6 +816,7 @@ public class UpdateSiteTest extends AbstractProvisioningTest {
}
}
+ @SuppressWarnings("removal")
public void testMirrors() {
String testDataLocation = "/testData/updatesite/packedSiteWithMirror";
File targetLocation = null;
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/CertificateChecker/selfsigned/artifacts.xml b/bundles/org.eclipse.equinox.p2.tests/testData/CertificateChecker/selfsigned/artifacts.xml
new file mode 100644
index 000000000..68b911bfa
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/CertificateChecker/selfsigned/artifacts.xml
@@ -0,0 +1,16 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?artifactRepository version='1.1.0'?>
+<repository name='file:/home/mistria/sandbox/repo/ - artifacts' type='org.eclipse.equinox.p2.artifact.repository.simpleRepository' version='1'>
+ <properties size='2'>
+ <property name='p2.timestamp' value='1618433231272'/>
+ <property name='p2.compressed' value='false'/>
+ </properties>
+ <mappings size='3'>
+ <rule filter='(&amp; (classifier=osgi.bundle))' output='${repoUrl}/plugins/${id}_${version}.jar'/>
+ <rule filter='(&amp; (classifier=binary))' output='${repoUrl}/binary/${id}_${version}'/>
+ <rule filter='(&amp; (classifier=org.eclipse.update.feature))' output='${repoUrl}/features/${id}_${version}.jar'/>
+ </mappings>
+ <artifacts size='1'>
+ <artifact classifier='osgi.bundle' id='blah' version='1.0.0.123456'/>
+ </artifacts>
+</repository>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/CertificateChecker/selfsigned/content.xml b/bundles/org.eclipse.equinox.p2.tests/testData/CertificateChecker/selfsigned/content.xml
new file mode 100644
index 000000000..db8f67ba2
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/CertificateChecker/selfsigned/content.xml
@@ -0,0 +1,49 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?metadataRepository version='1.2.0'?>
+<repository name='file:/home/mistria/sandbox/repo/ - metadata' type='org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository' version='1'>
+ <properties size='2'>
+ <property name='p2.timestamp' value='1618433231272'/>
+ <property name='p2.compressed' value='false'/>
+ </properties>
+ <units size='2'>
+ <unit id='blah' version='1.0.0.123456' singleton='false'>
+ <update id='blah' range='[0.0.0,1.0.0.123456)' severity='0'/>
+ <provides size='4'>
+ <provided namespace='org.eclipse.equinox.p2.iu' name='blah' version='1.0.0.123456'/>
+ <provided namespace='osgi.bundle' name='blah' version='1.0.0.123456'/>
+ <provided namespace='osgi.identity' name='blah' version='1.0.0.123456'>
+ <properties size='1'>
+ <property name='type' value='osgi.bundle'/>
+ </properties>
+ </provided>
+ <provided namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' version='1.0.0'/>
+ </provides>
+ <artifacts size='1'>
+ <artifact classifier='osgi.bundle' id='blah' version='1.0.0.123456'/>
+ </artifacts>
+ <touchpoint id='org.eclipse.equinox.p2.osgi' version='1.0.0'/>
+ <touchpointData size='1'>
+ <instructions size='2'>
+ <instruction key='zipped'>
+ true
+ </instruction>
+ <instruction key='manifest'>
+ Bundle-SymbolicName: blah&#xA;Bundle-Version: 1.0.0.qualifier&#xA;
+ </instruction>
+ </instructions>
+ </touchpointData>
+ </unit>
+ <unit id='Category' version='0.0.0'>
+ <properties size='3'>
+ <property name='org.eclipse.equinox.p2.type.category' value='true'/>
+ </properties>
+ <provides size='1'>
+ <provided namespace='org.eclipse.equinox.p2.iu' name='Category' version='0.0.0'/>
+ </provides>
+ <requires size='1'>
+ <required namespace='org.eclipse.equinox.p2.iu' name='blah' range='[1.0.0.123456,1.0.0.123456]'/>
+ </requires>
+ <touchpoint id='null' version='0.0.0'/>
+ </unit>
+ </units>
+</repository>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/CertificateChecker/selfsigned/plugins/blah_1.0.0.123456.jar b/bundles/org.eclipse.equinox.p2.tests/testData/CertificateChecker/selfsigned/plugins/blah_1.0.0.123456.jar
new file mode 100644
index 000000000..81573b2aa
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/CertificateChecker/selfsigned/plugins/blah_1.0.0.123456.jar
Binary files differ
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/artifactRepo/corruptedJarRepo/artifacts.xml b/bundles/org.eclipse.equinox.p2.tests/testData/artifactRepo/corruptedJarRepo/artifacts.xml
index 3093c3db4..126d69b9d 100644
--- a/bundles/org.eclipse.equinox.p2.tests/testData/artifactRepo/corruptedJarRepo/artifacts.xml
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/artifactRepo/corruptedJarRepo/artifacts.xml
@@ -13,7 +13,7 @@
<rule filter='(&amp; (classifier=org.eclipse.update.feature))' output='${repoUrl}/features/${id}_${version}.jar'/>
</mappings>
<artifacts size='1'>
- <artifact classifier='osgi.bundle' id='org.eclipse.equinox.common' version='3.5.0.corrupted'>
+ <artifact classifier='osgi.bundle' id='org.eclipse.equinox.common' version='3.15.0.v20210428-1632'>
<properties size='4'>
<property name='download.contentType' value='application/zip'/>
</properties>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/artifactRepo/corruptedJarRepo/content.xml b/bundles/org.eclipse.equinox.p2.tests/testData/artifactRepo/corruptedJarRepo/content.xml
index 0606c14e5..dd28b8da8 100644
--- a/bundles/org.eclipse.equinox.p2.tests/testData/artifactRepo/corruptedJarRepo/content.xml
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/artifactRepo/corruptedJarRepo/content.xml
@@ -7,18 +7,18 @@
<property name='site.checksum' value='2404093275'/>
</properties>
<units size='1'>
- <unit id='testBundle' version='3.5.0.corrupted'>
+ <unit id='testBundle' version='3.15.0.v20210428-1632'>
<properties size='3'>
<property name='org.eclipse.equinox.p2.name' value='Uncategorized'/>
<property name='org.eclipse.equinox.p2.description' value='Default category for otherwise uncategorized features'/>
<property name='org.eclipse.equinox.p2.type.category' value='true'/>
</properties>
<provides size='1'>
- <provided namespace='org.eclipse.equinox.p2.iu' name='testBundle' version='3.5.0.corrupted'/>
+ <provided namespace='org.eclipse.equinox.p2.iu' name='testBundle' version='3.15.0.v20210428-1632'/>
</provides>
<touchpoint id='org.eclipse.equinox.p2.osgi' version='1.0.0'/>
<artifacts size='1'>
- <artifact classifier='osgi.bundle' id='org.eclipse.equinox.common' version='3.5.0.corrupted'/>
+ <artifact classifier='osgi.bundle' id='org.eclipse.equinox.common' version='3.15.0.v20210428-1632'/>
</artifacts>
</unit>
</units>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/artifactRepo/corruptedJarRepo/plugins/org.eclipse.equinox.common_3.15.0.v20210428-1632.jar b/bundles/org.eclipse.equinox.p2.tests/testData/artifactRepo/corruptedJarRepo/plugins/org.eclipse.equinox.common_3.15.0.v20210428-1632.jar
new file mode 100644
index 000000000..ba48f48f9
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/artifactRepo/corruptedJarRepo/plugins/org.eclipse.equinox.common_3.15.0.v20210428-1632.jar
Binary files differ
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/artifactRepo/corruptedJarRepo/plugins/org.eclipse.equinox.common_3.5.0.corrupted.jar b/bundles/org.eclipse.equinox.p2.tests/testData/artifactRepo/corruptedJarRepo/plugins/org.eclipse.equinox.common_3.5.0.corrupted.jar
deleted file mode 100644
index 7fdbb530d..000000000
--- a/bundles/org.eclipse.equinox.p2.tests/testData/artifactRepo/corruptedJarRepo/plugins/org.eclipse.equinox.common_3.5.0.corrupted.jar
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/generator/Europa/site.xml b/bundles/org.eclipse.equinox.p2.tests/testData/generator/Europa/site.xml
index a9bf0170d..d9102ed21 100644
--- a/bundles/org.eclipse.equinox.p2.tests/testData/generator/Europa/site.xml
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/generator/Europa/site.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<site digestURL="http://download.eclipse.org/releases/europa/" mirrorsURL="http://www.eclipse.org/downloads/download.php?file=/releases/europa/site.xml&amp;format=xml&amp;protocol=http" pack200="true">
+<site digestURL="https://download.eclipse.org/releases/europa/" mirrorsURL="http://www.eclipse.org/downloads/download.php?file=/releases/europa/site.xml&amp;format=xml&amp;protocol=http" pack200="true">
<description url="http://www.eclipse.org/europa/">
This Europa Discovery Site contains a number of Eclipse based projects
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/generator/eclipse3.3/features/org.eclipse.platform.source_3.3.0.v20070612-_19UEkLEzwsdF9jSqQ-G/feature.xml b/bundles/org.eclipse.equinox.p2.tests/testData/generator/eclipse3.3/features/org.eclipse.platform.source_3.3.0.v20070612-_19UEkLEzwsdF9jSqQ-G/feature.xml
index b9cb4db57..5357a19cc 100644
--- a/bundles/org.eclipse.equinox.p2.tests/testData/generator/eclipse3.3/features/org.eclipse.platform.source_3.3.0.v20070612-_19UEkLEzwsdF9jSqQ-G/feature.xml
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/generator/eclipse3.3/features/org.eclipse.platform.source_3.3.0.v20070612-_19UEkLEzwsdF9jSqQ-G/feature.xml
@@ -10,9 +10,9 @@
%license
</license>
<url>
- <update label="%updateSiteName" url="http://update.eclipse.org/updates/3.3"/>
- <discovery label="%updateSiteName" url="http://update.eclipse.org/updates/3.3"/>
- <discovery label="%secondaryUpdateSiteName" url="http://download.eclipse.org/releases/europa"/>
+ <update label="%updateSiteName" url="https://update.eclipse.org/updates/3.3"/>
+ <discovery label="%updateSiteName" url="https://update.eclipse.org/updates/3.3"/>
+ <discovery label="%secondaryUpdateSiteName" url="https://download.eclipse.org/releases/europa"/>
</url>
<includes id="org.eclipse.rcp.source" version="3.3.0.v20070607-8y8eE8NEbsN3X_fjWS8HPNG"/>
<plugin fragment="false" unpack="false" download-size="0" install-size="0" id="org.eclipse.platform.doc.isv" version="3.3.0.v20070621"/>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/generator/eclipse3.3/features/org.eclipse.platform_3.3.0.v20070612-_19UEkLEzwsdF9jSqQ-G/feature.xml b/bundles/org.eclipse.equinox.p2.tests/testData/generator/eclipse3.3/features/org.eclipse.platform_3.3.0.v20070612-_19UEkLEzwsdF9jSqQ-G/feature.xml
index e4974b851..8f1ffb44d 100644
--- a/bundles/org.eclipse.equinox.p2.tests/testData/generator/eclipse3.3/features/org.eclipse.platform_3.3.0.v20070612-_19UEkLEzwsdF9jSqQ-G/feature.xml
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/generator/eclipse3.3/features/org.eclipse.platform_3.3.0.v20070612-_19UEkLEzwsdF9jSqQ-G/feature.xml
@@ -19,9 +19,9 @@
</license>
<url>
- <update label="%updateSiteName" url="http://update.eclipse.org/updates/3.3"/>
- <discovery label="%updateSiteName" url="http://update.eclipse.org/updates/3.3"/>
- <discovery label="%secondaryUpdateSiteName" url="http://download.eclipse.org/releases/europa"/>
+ <update label="%updateSiteName" url="https://update.eclipse.org/updates/3.3"/>
+ <discovery label="%updateSiteName" url="https://update.eclipse.org/updates/3.3"/>
+ <discovery label="%secondaryUpdateSiteName" url="https://download.eclipse.org/releases/europa"/>
</url>
<plugin
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/generator/eclipse3.3/features/org.eclipse.sdk_3.3.0.v20070607-7M7J-BIolz-OcxWxvWAPSfLPqevO/feature.xml b/bundles/org.eclipse.equinox.p2.tests/testData/generator/eclipse3.3/features/org.eclipse.sdk_3.3.0.v20070607-7M7J-BIolz-OcxWxvWAPSfLPqevO/feature.xml
index 0b59abbde..87abcbbfd 100644
--- a/bundles/org.eclipse.equinox.p2.tests/testData/generator/eclipse3.3/features/org.eclipse.sdk_3.3.0.v20070607-7M7J-BIolz-OcxWxvWAPSfLPqevO/feature.xml
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/generator/eclipse3.3/features/org.eclipse.sdk_3.3.0.v20070607-7M7J-BIolz-OcxWxvWAPSfLPqevO/feature.xml
@@ -19,9 +19,9 @@
</license>
<url>
- <update label="%updateSiteName" url="http://update.eclipse.org/updates/3.3"/>
- <discovery label="%updateSiteName" url="http://update.eclipse.org/updates/3.3"/>
- <discovery label="%secondaryUpdateSiteName" url="http://download.eclipse.org/releases/europa"/>
+ <update label="%updateSiteName" url="https://update.eclipse.org/updates/3.3"/>
+ <discovery label="%updateSiteName" url="https://update.eclipse.org/updates/3.3"/>
+ <discovery label="%secondaryUpdateSiteName" url="https://download.eclipse.org/releases/europa"/>
</url>
<includes
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/importexport/unknownformat.p2f b/bundles/org.eclipse.equinox.p2.tests/testData/importexport/unknownformat.p2f
index 9ae98bf32..56e172939 100644
--- a/bundles/org.eclipse.equinox.p2.tests/testData/importexport/unknownformat.p2f
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/importexport/unknownformat.p2f
@@ -131,7 +131,7 @@
</unit>
</units>
<repositories>
- <repository uri='http://download.eclipse.org/releases/helios'/>
+ <repository uri='https://download.eclipse.org/releases/helios'/>
<repository uri='file:/folk/kzhu0/tmp/plugins/'/>
<repository uri='http://hge.javaforge.com/hgeclipse'/>
</repositories>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/metadataRepo/unencodedreporeferences/content.xml b/bundles/org.eclipse.equinox.p2.tests/testData/metadataRepo/unencodedreporeferences/content.xml
index 3d6cd6174..814936f0c 100644
--- a/bundles/org.eclipse.equinox.p2.tests/testData/metadataRepo/unencodedreporeferences/content.xml
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/metadataRepo/unencodedreporeferences/content.xml
@@ -2,9 +2,9 @@
<?metadataRepository class='org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository' version='1.0.0'?>
<repository name='update site: file:/C:/1target/provmiddle/org.eclipse.equinox.p2.tests/testData/updatesite/site' type='org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository' version='1'>
<references size='4'>
- <repository url='http://download.eclipse.org/url/with/spaces/a b' type='0' options='0'/>
+ <repository url='https://download.eclipse.org/url/with/spaces/a b' type='0' options='0'/>
<repository url='file:/c:/tmp/url with spaces/' type='1' options='0'/>
- <repository uri='http://download.eclipse.org/uri/with/spaces/a%20b' type='0' options='0'/>
+ <repository uri='https://download.eclipse.org/uri/with/spaces/a%20b' type='0' options='0'/>
<repository uri='file:/c:/tmp/uri%20with%20spaces/' type='1' options='0'/>
</references>
<properties size='3'>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/mirror/mirrorSourceRepoWithRefs/content.xml b/bundles/org.eclipse.equinox.p2.tests/testData/mirror/mirrorSourceRepoWithRefs/content.xml
index 3a3575af8..d53fba1e4 100644
--- a/bundles/org.eclipse.equinox.p2.tests/testData/mirror/mirrorSourceRepoWithRefs/content.xml
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/mirror/mirrorSourceRepoWithRefs/content.xml
@@ -6,10 +6,10 @@
<property name='p2.timestamp' value='1222693511921'/>
</properties>
<references size='4'>
- <repository uri='http://download.eclipse.org/eclipse/updates/3.5/' url='http://download.eclipse.org/eclipse/updates/3.5/' type='0' options='0'/>
- <repository uri='http://download.eclipse.org/eclipse/updates/3.5/' url='http://download.eclipse.org/eclipse/updates/3.5/' type='1' options='0'/>
- <repository uri='http://download.eclipse.org/eclipse/updates/3.6/' url='http://download.eclipse.org/eclipse/updates/3.6/' type='0' options='0'/>
- <repository uri='http://download.eclipse.org/eclipse/updates/3.6/' url='http://download.eclipse.org/eclipse/updates/3.6/' type='1' options='0'/>
+ <repository uri='https://download.eclipse.org/eclipse/updates/3.5/' url='https://download.eclipse.org/eclipse/updates/3.5/' type='0' options='0'/>
+ <repository uri='https://download.eclipse.org/eclipse/updates/3.5/' url='https://download.eclipse.org/eclipse/updates/3.5/' type='1' options='0'/>
+ <repository uri='https://download.eclipse.org/eclipse/updates/3.6/' url='https://download.eclipse.org/eclipse/updates/3.6/' type='0' options='0'/>
+ <repository uri='https://download.eclipse.org/eclipse/updates/3.6/' url='https://download.eclipse.org/eclipse/updates/3.6/' type='1' options='0'/>
</references>
<units size='8'>
<unit id='helloworldfeature.feature.jar' version='1.0.1'>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pausefeature/artifacts.xml b/bundles/org.eclipse.equinox.p2.tests/testData/pausefeature/artifacts.xml
index baf533cae..a9f083ecd 100644
--- a/bundles/org.eclipse.equinox.p2.tests/testData/pausefeature/artifacts.xml
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pausefeature/artifacts.xml
@@ -12,14 +12,14 @@
</properties>
<mappings size='5'>
<rule filter='(&amp; (classifier=osgi.bundle) (format=packed))'
- output='http://download.eclipse.org/eclipse/updates/3.7/R-3.7.2-201202080800/plugins/${id}_${version}.jar.pack.gz' />
- <rule filter='(&amp; (classifier=osgi.bundle))' output='http://download.eclipse.org/eclipse/updates/3.7/R-3.7.2-201202080800/plugins/${id}_${version}.jar' />
- <rule filter='(&amp; (classifier=binary))' output='http://download.eclipse.org/eclipse/updates/3.7/R-3.7.2-201202080800/binary/${id}_${version}' />
+ output='https://download.eclipse.org/eclipse/updates/3.7/R-3.7.2-201202080800/plugins/${id}_${version}.jar.pack.gz' />
+ <rule filter='(&amp; (classifier=osgi.bundle))' output='https://download.eclipse.org/eclipse/updates/3.7/R-3.7.2-201202080800/plugins/${id}_${version}.jar' />
+ <rule filter='(&amp; (classifier=binary))' output='https://download.eclipse.org/eclipse/updates/3.7/R-3.7.2-201202080800/binary/${id}_${version}' />
<rule
filter='(&amp; (classifier=org.eclipse.update.feature) (format=packed))'
- output='http://download.eclipse.org/eclipse/updates/3.7/R-3.7.2-201202080800/features/${id}_${version}.jar.pack.gz' />
+ output='https://download.eclipse.org/eclipse/updates/3.7/R-3.7.2-201202080800/features/${id}_${version}.jar.pack.gz' />
<rule filter='(&amp; (classifier=org.eclipse.update.feature))'
- output='http://download.eclipse.org/eclipse/updates/3.7/R-3.7.2-201202080800/features/${id}_${version}.jar' />
+ output='https://download.eclipse.org/eclipse/updates/3.7/R-3.7.2-201202080800/features/${id}_${version}.jar' />
</mappings>
<artifacts size='13433'>
<artifact classifier='binary'
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/artifacts.xml b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/artifacts.xml
new file mode 100644
index 000000000..2ffef6a9f
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/artifacts.xml
@@ -0,0 +1,36 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?artifactRepository version='1.1.0'?>
+<repository name='file:/home/mistria/sandbox/repo/ - artifacts' type='org.eclipse.equinox.p2.artifact.repository.simpleRepository' version='1'>
+ <properties size='2'>
+ <property name='p2.timestamp' value='1618433231272'/>
+ <property name='p2.compressed' value='false'/>
+ <!-- See PGPSignatureVerifierTest about this public key-->
+ </properties>
+ <mappings size='3'>
+ <rule filter='(&amp; (classifier=osgi.bundle))' output='${repoUrl}/plugins/${id}_${version}.jar'/>
+ <rule filter='(&amp; (classifier=binary))' output='${repoUrl}/binary/${id}_${version}'/>
+ <rule filter='(&amp; (classifier=org.eclipse.update.feature))' output='${repoUrl}/features/${id}_${version}.jar'/>
+ </mappings>
+ <artifacts size='1'>
+ <artifact classifier='osgi.bundle' id='blah' version='1.0.0.123456'>
+ <properties size='1'>
+ <!-- gpg -u signer1@fakeuser.eclipse.org -a -detach-sig plugins/blah_1.0.0.123456.jar -->
+ <property name='pgp.signatures' value='-----BEGIN PGP SIGNATURE-----
+
+iQHRBAABCAA7FiEE6ZbGcKp/ZUCb9dtWE5442Q3tEfAFAmB4Bf8dHHNpZ25lcjFA
+ZmFrZXVzZXIuZWNsaXBzZS5vcmcACgkQE5442Q3tEfBPuAwAhE4zA7BswKFhEtzm
+DS3EbyRr/U13sV01YxqGtxYDCfrOt8TGVPXJSvo0AVP4vLFc5b+0jtVFoarFJNBu
+xhbVuyC72YdqudNbncSlW6KG5SgeWIM//ThKfl95pOWRWvJEoKJhmDwbDqhZYtL5
+SECegnWGtGx/klFtZihzHYJE/nfSnhySDaz5lCvXFFYRhIbNmNm2Yq7ztCOsN4Ys
+3uN+GEdoXGvv1DFg/xZPvwCOhZGsSQfkl1jmUwVltgKrw9OCFbdfYz7H6dbGWhRu
+2XpuKxPXGavKfpSvssVQIZ6aWi5W6wp5lZAQQddZvYAv3Gi5CZZcUT7ayFJYdD23
+p9jz76G7MXm0f0uNT9B57T72QryokUIEIJYsCb6lNjWUQB4cd0+JesM7sHwweOQ3
+7iTFc+WgVJkP0e695mm1tcvtQHUPbIItYJUsndyLgGInzglxN8+F4U4k8uapydI9
+RmV2NVAifYp8z95Am5AnlG8lqjwrWk5bMbJH82QsQESrNT/h
+=8Vrn
+-----END PGP SIGNATURE-----
+'/>
+ </properties>
+ </artifact>
+ </artifacts>
+</repository>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/content.xml b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/content.xml
new file mode 100644
index 000000000..db8f67ba2
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/content.xml
@@ -0,0 +1,49 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?metadataRepository version='1.2.0'?>
+<repository name='file:/home/mistria/sandbox/repo/ - metadata' type='org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository' version='1'>
+ <properties size='2'>
+ <property name='p2.timestamp' value='1618433231272'/>
+ <property name='p2.compressed' value='false'/>
+ </properties>
+ <units size='2'>
+ <unit id='blah' version='1.0.0.123456' singleton='false'>
+ <update id='blah' range='[0.0.0,1.0.0.123456)' severity='0'/>
+ <provides size='4'>
+ <provided namespace='org.eclipse.equinox.p2.iu' name='blah' version='1.0.0.123456'/>
+ <provided namespace='osgi.bundle' name='blah' version='1.0.0.123456'/>
+ <provided namespace='osgi.identity' name='blah' version='1.0.0.123456'>
+ <properties size='1'>
+ <property name='type' value='osgi.bundle'/>
+ </properties>
+ </provided>
+ <provided namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' version='1.0.0'/>
+ </provides>
+ <artifacts size='1'>
+ <artifact classifier='osgi.bundle' id='blah' version='1.0.0.123456'/>
+ </artifacts>
+ <touchpoint id='org.eclipse.equinox.p2.osgi' version='1.0.0'/>
+ <touchpointData size='1'>
+ <instructions size='2'>
+ <instruction key='zipped'>
+ true
+ </instruction>
+ <instruction key='manifest'>
+ Bundle-SymbolicName: blah&#xA;Bundle-Version: 1.0.0.qualifier&#xA;
+ </instruction>
+ </instructions>
+ </touchpointData>
+ </unit>
+ <unit id='Category' version='0.0.0'>
+ <properties size='3'>
+ <property name='org.eclipse.equinox.p2.type.category' value='true'/>
+ </properties>
+ <provides size='1'>
+ <provided namespace='org.eclipse.equinox.p2.iu' name='Category' version='0.0.0'/>
+ </provides>
+ <requires size='1'>
+ <required namespace='org.eclipse.equinox.p2.iu' name='blah' range='[1.0.0.123456,1.0.0.123456]'/>
+ </requires>
+ <touchpoint id='null' version='0.0.0'/>
+ </unit>
+ </units>
+</repository>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/plugins/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/plugins/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..b9fdcbf2f
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/plugins/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: blah
+Bundle-Version: 1.0.0.qualifier
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/plugins/blah_1.0.0.123456.jar b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/plugins/blah_1.0.0.123456.jar
new file mode 100644
index 000000000..9cc7b8da0
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/plugins/blah_1.0.0.123456.jar
Binary files differ
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/plugins/blah_1.0.0.123456.jar.asc b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/plugins/blah_1.0.0.123456.jar.asc
new file mode 100644
index 000000000..1489f2552
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoMissingPublicKey/plugins/blah_1.0.0.123456.jar.asc
@@ -0,0 +1,14 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQHRBAABCAA7FiEE6ZbGcKp/ZUCb9dtWE5442Q3tEfAFAmB4Bf8dHHNpZ25lcjFA
+ZmFrZXVzZXIuZWNsaXBzZS5vcmcACgkQE5442Q3tEfBPuAwAhE4zA7BswKFhEtzm
+DS3EbyRr/U13sV01YxqGtxYDCfrOt8TGVPXJSvo0AVP4vLFc5b+0jtVFoarFJNBu
+xhbVuyC72YdqudNbncSlW6KG5SgeWIM//ThKfl95pOWRWvJEoKJhmDwbDqhZYtL5
+SECegnWGtGx/klFtZihzHYJE/nfSnhySDaz5lCvXFFYRhIbNmNm2Yq7ztCOsN4Ys
+3uN+GEdoXGvv1DFg/xZPvwCOhZGsSQfkl1jmUwVltgKrw9OCFbdfYz7H6dbGWhRu
+2XpuKxPXGavKfpSvssVQIZ6aWi5W6wp5lZAQQddZvYAv3Gi5CZZcUT7ayFJYdD23
+p9jz76G7MXm0f0uNT9B57T72QryokUIEIJYsCb6lNjWUQB4cd0+JesM7sHwweOQ3
+7iTFc+WgVJkP0e695mm1tcvtQHUPbIItYJUsndyLgGInzglxN8+F4U4k8uapydI9
+RmV2NVAifYp8z95Am5AnlG8lqjwrWk5bMbJH82QsQESrNT/h
+=8Vrn
+-----END PGP SIGNATURE-----
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/artifacts.xml b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/artifacts.xml
new file mode 100644
index 000000000..68b911bfa
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/artifacts.xml
@@ -0,0 +1,16 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?artifactRepository version='1.1.0'?>
+<repository name='file:/home/mistria/sandbox/repo/ - artifacts' type='org.eclipse.equinox.p2.artifact.repository.simpleRepository' version='1'>
+ <properties size='2'>
+ <property name='p2.timestamp' value='1618433231272'/>
+ <property name='p2.compressed' value='false'/>
+ </properties>
+ <mappings size='3'>
+ <rule filter='(&amp; (classifier=osgi.bundle))' output='${repoUrl}/plugins/${id}_${version}.jar'/>
+ <rule filter='(&amp; (classifier=binary))' output='${repoUrl}/binary/${id}_${version}'/>
+ <rule filter='(&amp; (classifier=org.eclipse.update.feature))' output='${repoUrl}/features/${id}_${version}.jar'/>
+ </mappings>
+ <artifacts size='1'>
+ <artifact classifier='osgi.bundle' id='blah' version='1.0.0.123456'/>
+ </artifacts>
+</repository>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/content.xml b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/content.xml
new file mode 100644
index 000000000..db8f67ba2
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/content.xml
@@ -0,0 +1,49 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?metadataRepository version='1.2.0'?>
+<repository name='file:/home/mistria/sandbox/repo/ - metadata' type='org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository' version='1'>
+ <properties size='2'>
+ <property name='p2.timestamp' value='1618433231272'/>
+ <property name='p2.compressed' value='false'/>
+ </properties>
+ <units size='2'>
+ <unit id='blah' version='1.0.0.123456' singleton='false'>
+ <update id='blah' range='[0.0.0,1.0.0.123456)' severity='0'/>
+ <provides size='4'>
+ <provided namespace='org.eclipse.equinox.p2.iu' name='blah' version='1.0.0.123456'/>
+ <provided namespace='osgi.bundle' name='blah' version='1.0.0.123456'/>
+ <provided namespace='osgi.identity' name='blah' version='1.0.0.123456'>
+ <properties size='1'>
+ <property name='type' value='osgi.bundle'/>
+ </properties>
+ </provided>
+ <provided namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' version='1.0.0'/>
+ </provides>
+ <artifacts size='1'>
+ <artifact classifier='osgi.bundle' id='blah' version='1.0.0.123456'/>
+ </artifacts>
+ <touchpoint id='org.eclipse.equinox.p2.osgi' version='1.0.0'/>
+ <touchpointData size='1'>
+ <instructions size='2'>
+ <instruction key='zipped'>
+ true
+ </instruction>
+ <instruction key='manifest'>
+ Bundle-SymbolicName: blah&#xA;Bundle-Version: 1.0.0.qualifier&#xA;
+ </instruction>
+ </instructions>
+ </touchpointData>
+ </unit>
+ <unit id='Category' version='0.0.0'>
+ <properties size='3'>
+ <property name='org.eclipse.equinox.p2.type.category' value='true'/>
+ </properties>
+ <provides size='1'>
+ <provided namespace='org.eclipse.equinox.p2.iu' name='Category' version='0.0.0'/>
+ </provides>
+ <requires size='1'>
+ <required namespace='org.eclipse.equinox.p2.iu' name='blah' range='[1.0.0.123456,1.0.0.123456]'/>
+ </requires>
+ <touchpoint id='null' version='0.0.0'/>
+ </unit>
+ </units>
+</repository>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/plugins/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/plugins/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..b9fdcbf2f
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/plugins/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: blah
+Bundle-Version: 1.0.0.qualifier
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/plugins/blah_1.0.0.123456.jar b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/plugins/blah_1.0.0.123456.jar
new file mode 100644
index 000000000..9cc7b8da0
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/plugins/blah_1.0.0.123456.jar
Binary files differ
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/plugins/blah_1.0.0.123456.jar.asc b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/plugins/blah_1.0.0.123456.jar.asc
new file mode 100644
index 000000000..1489f2552
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoNoPGP/plugins/blah_1.0.0.123456.jar.asc
@@ -0,0 +1,14 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQHRBAABCAA7FiEE6ZbGcKp/ZUCb9dtWE5442Q3tEfAFAmB4Bf8dHHNpZ25lcjFA
+ZmFrZXVzZXIuZWNsaXBzZS5vcmcACgkQE5442Q3tEfBPuAwAhE4zA7BswKFhEtzm
+DS3EbyRr/U13sV01YxqGtxYDCfrOt8TGVPXJSvo0AVP4vLFc5b+0jtVFoarFJNBu
+xhbVuyC72YdqudNbncSlW6KG5SgeWIM//ThKfl95pOWRWvJEoKJhmDwbDqhZYtL5
+SECegnWGtGx/klFtZihzHYJE/nfSnhySDaz5lCvXFFYRhIbNmNm2Yq7ztCOsN4Ys
+3uN+GEdoXGvv1DFg/xZPvwCOhZGsSQfkl1jmUwVltgKrw9OCFbdfYz7H6dbGWhRu
+2XpuKxPXGavKfpSvssVQIZ6aWi5W6wp5lZAQQddZvYAv3Gi5CZZcUT7ayFJYdD23
+p9jz76G7MXm0f0uNT9B57T72QryokUIEIJYsCb6lNjWUQB4cd0+JesM7sHwweOQ3
+7iTFc+WgVJkP0e695mm1tcvtQHUPbIItYJUsndyLgGInzglxN8+F4U4k8uapydI9
+RmV2NVAifYp8z95Am5AnlG8lqjwrWk5bMbJH82QsQESrNT/h
+=8Vrn
+-----END PGP SIGNATURE-----
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/artifacts.xml b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/artifacts.xml
new file mode 100644
index 000000000..4ddbddbb3
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/artifacts.xml
@@ -0,0 +1,78 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?artifactRepository version='1.1.0'?>
+<repository name='file:/home/mistria/sandbox/repo/ - artifacts' type='org.eclipse.equinox.p2.artifact.repository.simpleRepository' version='1'>
+ <properties size='3'>
+ <property name='p2.timestamp' value='1618433231272'/>
+ <property name='p2.compressed' value='false'/>
+ <!-- See PGPSignatureVerifierTest about this public key-->
+ <property name='pgp.publicKeys' value='-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQGNBGB1bugBDADQ5l7YnS9hNFRkBKSrvVNHt/TxeHaNNIHkdTC56I1QdThsOt4Y
+oQRI27AEOaY1GFEi6+QqwxALcMMMSTgkCRs2NFGqlWMVzNYE7bJMWChVa7uQ/9CG
+1HRbXwVwQx3hFgU4kmw1Kl/IH4LX76d9gAMyFANPjYZJSjbAv54wOlKruDRgpQFF
+pZeuXW7SnerL6sgd/+ZroikdkrjIs5t18C2ofzf6YnOokYkEEJSAEoQK5svVzT4G
+H3sw6FlE41RvnYKpuhvvyQhKjISDYfRaIL4JIpvR9Uko48eN9x654lJaucbMiLP4
+ROI9q7RQ6t1IMCiIN9QKgS+nVtHnN9MnXS0czGxfLdStv6bB+xgUoyBc7Uiqf4X0
+x8z9PE6O1L6Rgy2JMJHPgLWCF8h/u1FO88Br3I7TMzu2q/cg3k18L7eujnxVyYiD
+YIMxDBXBNnGCKRC4shgt8e+PzAPXIDFvbv7HOaERnx5c6eLl0tD12ocQeZHp1VlW
+nQteQ6CfvN07dNUAEQEAAbQ3RWNsaXBzZSBwMiB0ZXN0IFNpZ25lciAxIDxzaWdu
+ZXIxQGZha2V1c2VyLmVjbGlwc2Uub3JnPokB1AQTAQgAPhYhBOmWxnCqf2VAm/Xb
+VhOeONkN7RHwBQJgdW7oAhsDBQkDwmcABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheA
+AAoJEBOeONkN7RHwuXYL/Ri2gHoXELN79dWnuC5hjh7XgKquqlZg3qLgkLyA/54/
+ERx7HLLMHjU5tVIVacZ9UWb30Bzx6iVx2hMtL/0FFJ1S0iwwTDXft/9EoPvsmmEx
+VYEiSx5HxsPXM+XofMvi75nN34iMUIU3SgKLzHqlWcC3T7XjDWKC8TkTcutIAaIz
+BMRssktJR3OYzWbbwzgz83sVpofWGfxIW91H19Zr8rjIXiNyy1ulRnfsaz+xXeXf
+KxZZs00FtIIOeWBhCtsb8/8Uv3FRDK6+lX3xAqfMG67azJXpFafWJGiymypfSwi6
+JA866WOzw9DfbqWIlY/EMIhyZrsWnGiGhhAavwOiSWYV65ooFYooKHNmIekpvRZS
+wlGuwvnZr+2471urkCoG8Yz2Ey28Qjc0NgXlXAkqFUkO2gNPFsXkk1EC+vzO2llp
+qROS9pt25dEBcUSgfcjFOFWv2Z5IdmGjFEe46CJNEVzNgkP+97wJP7wpcOCSF/nn
+eOBj4b7Q0suJ+MsE/Fx6SbkBjQRgdW7oAQwAst4QGHd9w+V3UHgRMYZISfYApcAK
+2qBT1Zvf01QE38JUtDPKJarDlgxcaXuX6jOcbF60OMd59dhNmpaZYpocJZMgnESj
+0/Tn4cZfWwtOo1Pom8Lbg1zGKIYAaR2mTb8mkCwJwsZCUZCmh+zspacxdVRdmWmC
+XcFxFc/6gBKxcPFZf93JZaI33qsLpxyA57AJV5ck/TY1iFmA6HFxehamsAVdd56g
+uyORekJJlZHXE9pICVEGqVUfdbSQXEiS386kZDftXe36phdj1gtFsRLHoBI8+L7o
+2vrdnj1UZgtvxBbJJ+QAfhF8+f84RFIi9CTY8cheX+YfDMEdg9J9LG54X5P3O1ZX
+eEvudKk/hqWBf+2rrdkhdFyyGRK0yTrO+PQ+tZHhcHPqfo4EiVktC4BTpB6QtLBY
+NAGYMRddmZMgp4lE2xGib8SYwonct3y1fmB+x67lq65IFVM/IAwN6BuMXtgb+Zkm
+iT+eKgc1pK4uCsZJbQAlPzkDGQV69GNyjlphABEBAAGJAbwEGAEIACYWIQTplsZw
+qn9lQJv121YTnjjZDe0R8AUCYHVu6AIbDAUJA8JnAAAKCRATnjjZDe0R8Oe8DADQ
+CTBXxrmTJTSZUeKVo0C1kDHQaaV+RiRmquYR3WxFI6ugJFFWpzgG9V8Q7vYGeZFM
+HYM/tDuY/gdMwHBcR13yYyozslar7qas4LL/bYgOqq+SiSGTDEBW+00+5Wlwmlrv
+ubLc6ow9q2sTmOprq3Q7fei+sEANVnymBxnVV/ZIVGPpm/Rkh1JFGT/8SEyKkCut
+G23JMM/06cIhZwdD6aWSZK4EFw0lwfXyr8l3ZqH0WydVEef1DUNIRM48O0YdwS9u
+jd5iKKKJlb4XxwGi6IKSzpXF7pFrm6vqS306u3Fnak5hb2gs8dpnNo7UL1gUm5pr
+8vJ3xhg15KCjYKz8k6ZDsIWULTXUJ23i8ZwqyQaj1bajwN0+/MfC0ZkoQtQ2I/TH
+cKLSMOR+Tji6n7FjOcVl6VoDKTjdxj9OgAlbZ7W9jEArrUjDdCk/m4jq9h9phpli
+BHoul/nauwtlUnQes1V+39Rk9l7gddKWg3dlwg6CjB5MkmcaeyxgANcyKgrunpg=
+=JYpC
+-----END PGP PUBLIC KEY BLOCK-----
+'/>
+ </properties>
+ <mappings size='3'>
+ <rule filter='(&amp; (classifier=osgi.bundle))' output='${repoUrl}/plugins/${id}_${version}.jar'/>
+ <rule filter='(&amp; (classifier=binary))' output='${repoUrl}/binary/${id}_${version}'/>
+ <rule filter='(&amp; (classifier=org.eclipse.update.feature))' output='${repoUrl}/features/${id}_${version}.jar'/>
+ </mappings>
+ <artifacts size='1'>
+ <artifact classifier='osgi.bundle' id='blah' version='1.0.0.123456'>
+ <properties size='1'>
+ <!-- gpg -u signer1@fakeuser.eclipse.org -a -detach-sig plugins/blah_1.0.0.123456.jar -->
+ <property name='pgp.signatures' value='-----BEGIN PGP SIGNATURE-----
+
+iQHRBAABCAA7FiEE6ZbGcKp/ZUCb9dtWE5442Q3tEfAFAmB4Bf8dHHNpZ25lcjFA
+ZmFrZXVzZXIuZWNsaXBzZS5vcmcACgkQE5442Q3tEfBPuAwAhE4zA7BswKFhEtzm
+DS3EbyRr/U13sV01YxqGtxYDCfrOt8TGVPXJSvo0AVP4vLFc5b+0jtVFoarFJNBu
+xhbVuyC72YdqudNbncSlW6KG5SgeWIM//ThKfl95pOWRWvJEoKJhmDwbDqhZYtL5
+SECegnWGtGx/klFtZihzHYJE/nfSnhySDaz5lCvXFFYRhIbNmNm2Yq7ztCOsN4Ys
+3uN+GEdoXGvv1DFg/xZPvwCOhZGsSQfkl1jmUwVltgKrw9OCFbdfYz7H6dbGWhRu
+2XpuKxPXGavKfpSvssVQIZ6aWi5W6wp5lZAQQddZvYAv3Gi5CZZcUT7ayFJYdD23
+p9jz76G7MXm0f0uNT9B57T72QryokUIEIJYsCb6lNjWUQB4cd0+JesM7sHwweOQ3
+7iTFc+WgVJkP0e695mm1tcvtQHUPbIItYJUsndyLgGInzglxN8+F4U4k8uapydI9
+RmV2NVAifYp8z95Am5AnlG8lqjwrWk5bMbJH82QsQESrNT/h
+=8Vrn
+-----END PGP SIGNATURE-----
+'/>
+ </properties>
+ </artifact>
+ </artifacts>
+</repository>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/content.xml b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/content.xml
new file mode 100644
index 000000000..db8f67ba2
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/content.xml
@@ -0,0 +1,49 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?metadataRepository version='1.2.0'?>
+<repository name='file:/home/mistria/sandbox/repo/ - metadata' type='org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository' version='1'>
+ <properties size='2'>
+ <property name='p2.timestamp' value='1618433231272'/>
+ <property name='p2.compressed' value='false'/>
+ </properties>
+ <units size='2'>
+ <unit id='blah' version='1.0.0.123456' singleton='false'>
+ <update id='blah' range='[0.0.0,1.0.0.123456)' severity='0'/>
+ <provides size='4'>
+ <provided namespace='org.eclipse.equinox.p2.iu' name='blah' version='1.0.0.123456'/>
+ <provided namespace='osgi.bundle' name='blah' version='1.0.0.123456'/>
+ <provided namespace='osgi.identity' name='blah' version='1.0.0.123456'>
+ <properties size='1'>
+ <property name='type' value='osgi.bundle'/>
+ </properties>
+ </provided>
+ <provided namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' version='1.0.0'/>
+ </provides>
+ <artifacts size='1'>
+ <artifact classifier='osgi.bundle' id='blah' version='1.0.0.123456'/>
+ </artifacts>
+ <touchpoint id='org.eclipse.equinox.p2.osgi' version='1.0.0'/>
+ <touchpointData size='1'>
+ <instructions size='2'>
+ <instruction key='zipped'>
+ true
+ </instruction>
+ <instruction key='manifest'>
+ Bundle-SymbolicName: blah&#xA;Bundle-Version: 1.0.0.qualifier&#xA;
+ </instruction>
+ </instructions>
+ </touchpointData>
+ </unit>
+ <unit id='Category' version='0.0.0'>
+ <properties size='3'>
+ <property name='org.eclipse.equinox.p2.type.category' value='true'/>
+ </properties>
+ <provides size='1'>
+ <provided namespace='org.eclipse.equinox.p2.iu' name='Category' version='0.0.0'/>
+ </provides>
+ <requires size='1'>
+ <required namespace='org.eclipse.equinox.p2.iu' name='blah' range='[1.0.0.123456,1.0.0.123456]'/>
+ </requires>
+ <touchpoint id='null' version='0.0.0'/>
+ </unit>
+ </units>
+</repository>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/plugins/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/plugins/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..b9fdcbf2f
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/plugins/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: blah
+Bundle-Version: 1.0.0.qualifier
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/plugins/blah_1.0.0.123456.jar b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/plugins/blah_1.0.0.123456.jar
new file mode 100644
index 000000000..9cc7b8da0
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/plugins/blah_1.0.0.123456.jar
Binary files differ
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/plugins/blah_1.0.0.123456.jar.asc b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/plugins/blah_1.0.0.123456.jar.asc
new file mode 100644
index 000000000..1489f2552
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK/plugins/blah_1.0.0.123456.jar.asc
@@ -0,0 +1,14 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQHRBAABCAA7FiEE6ZbGcKp/ZUCb9dtWE5442Q3tEfAFAmB4Bf8dHHNpZ25lcjFA
+ZmFrZXVzZXIuZWNsaXBzZS5vcmcACgkQE5442Q3tEfBPuAwAhE4zA7BswKFhEtzm
+DS3EbyRr/U13sV01YxqGtxYDCfrOt8TGVPXJSvo0AVP4vLFc5b+0jtVFoarFJNBu
+xhbVuyC72YdqudNbncSlW6KG5SgeWIM//ThKfl95pOWRWvJEoKJhmDwbDqhZYtL5
+SECegnWGtGx/klFtZihzHYJE/nfSnhySDaz5lCvXFFYRhIbNmNm2Yq7ztCOsN4Ys
+3uN+GEdoXGvv1DFg/xZPvwCOhZGsSQfkl1jmUwVltgKrw9OCFbdfYz7H6dbGWhRu
+2XpuKxPXGavKfpSvssVQIZ6aWi5W6wp5lZAQQddZvYAv3Gi5CZZcUT7ayFJYdD23
+p9jz76G7MXm0f0uNT9B57T72QryokUIEIJYsCb6lNjWUQB4cd0+JesM7sHwweOQ3
+7iTFc+WgVJkP0e695mm1tcvtQHUPbIItYJUsndyLgGInzglxN8+F4U4k8uapydI9
+RmV2NVAifYp8z95Am5AnlG8lqjwrWk5bMbJH82QsQESrNT/h
+=8Vrn
+-----END PGP SIGNATURE-----
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/artifacts.xml b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/artifacts.xml
new file mode 100644
index 000000000..43557706b
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/artifacts.xml
@@ -0,0 +1,25 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?artifactRepository version='1.1.0'?>
+<repository name='file:/home/mistria/sandbox/repo/ - artifacts' type='org.eclipse.equinox.p2.artifact.repository.simpleRepository' version='1'>
+ <properties size='3'>
+ <property name='p2.timestamp' value='1618433231272'/>
+ <property name='p2.compressed' value='false'/>
+ <!-- See PGPSignatureVerifierTest about this public key -->
+ <!-- encoded with org.eclipse.equinox.internal.p2.persistence.XMLWriter.escape() -->
+ <property name='pgp.publicKeys' value='-----BEGIN PGP PUBLIC KEY BLOCK-----&#xA;&#xA;mQGNBGB1bugBDADQ5l7YnS9hNFRkBKSrvVNHt/TxeHaNNIHkdTC56I1QdThsOt4Y&#xA;oQRI27AEOaY1GFEi6+QqwxALcMMMSTgkCRs2NFGqlWMVzNYE7bJMWChVa7uQ/9CG&#xA;1HRbXwVwQx3hFgU4kmw1Kl/IH4LX76d9gAMyFANPjYZJSjbAv54wOlKruDRgpQFF&#xA;pZeuXW7SnerL6sgd/+ZroikdkrjIs5t18C2ofzf6YnOokYkEEJSAEoQK5svVzT4G&#xA;H3sw6FlE41RvnYKpuhvvyQhKjISDYfRaIL4JIpvR9Uko48eN9x654lJaucbMiLP4&#xA;ROI9q7RQ6t1IMCiIN9QKgS+nVtHnN9MnXS0czGxfLdStv6bB+xgUoyBc7Uiqf4X0&#xA;x8z9PE6O1L6Rgy2JMJHPgLWCF8h/u1FO88Br3I7TMzu2q/cg3k18L7eujnxVyYiD&#xA;YIMxDBXBNnGCKRC4shgt8e+PzAPXIDFvbv7HOaERnx5c6eLl0tD12ocQeZHp1VlW&#xA;nQteQ6CfvN07dNUAEQEAAbQ3RWNsaXBzZSBwMiB0ZXN0IFNpZ25lciAxIDxzaWdu&#xA;ZXIxQGZha2V1c2VyLmVjbGlwc2Uub3JnPokB1AQTAQgAPhYhBOmWxnCqf2VAm/Xb&#xA;VhOeONkN7RHwBQJgdW7oAhsDBQkDwmcABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheA&#xA;AAoJEBOeONkN7RHwuXYL/Ri2gHoXELN79dWnuC5hjh7XgKquqlZg3qLgkLyA/54/&#xA;ERx7HLLMHjU5tVIVacZ9UWb30Bzx6iVx2hMtL/0FFJ1S0iwwTDXft/9EoPvsmmEx&#xA;VYEiSx5HxsPXM+XofMvi75nN34iMUIU3SgKLzHqlWcC3T7XjDWKC8TkTcutIAaIz&#xA;BMRssktJR3OYzWbbwzgz83sVpofWGfxIW91H19Zr8rjIXiNyy1ulRnfsaz+xXeXf&#xA;KxZZs00FtIIOeWBhCtsb8/8Uv3FRDK6+lX3xAqfMG67azJXpFafWJGiymypfSwi6&#xA;JA866WOzw9DfbqWIlY/EMIhyZrsWnGiGhhAavwOiSWYV65ooFYooKHNmIekpvRZS&#xA;wlGuwvnZr+2471urkCoG8Yz2Ey28Qjc0NgXlXAkqFUkO2gNPFsXkk1EC+vzO2llp&#xA;qROS9pt25dEBcUSgfcjFOFWv2Z5IdmGjFEe46CJNEVzNgkP+97wJP7wpcOCSF/nn&#xA;eOBj4b7Q0suJ+MsE/Fx6SbkBjQRgdW7oAQwAst4QGHd9w+V3UHgRMYZISfYApcAK&#xA;2qBT1Zvf01QE38JUtDPKJarDlgxcaXuX6jOcbF60OMd59dhNmpaZYpocJZMgnESj&#xA;0/Tn4cZfWwtOo1Pom8Lbg1zGKIYAaR2mTb8mkCwJwsZCUZCmh+zspacxdVRdmWmC&#xA;XcFxFc/6gBKxcPFZf93JZaI33qsLpxyA57AJV5ck/TY1iFmA6HFxehamsAVdd56g&#xA;uyORekJJlZHXE9pICVEGqVUfdbSQXEiS386kZDftXe36phdj1gtFsRLHoBI8+L7o&#xA;2vrdnj1UZgtvxBbJJ+QAfhF8+f84RFIi9CTY8cheX+YfDMEdg9J9LG54X5P3O1ZX&#xA;eEvudKk/hqWBf+2rrdkhdFyyGRK0yTrO+PQ+tZHhcHPqfo4EiVktC4BTpB6QtLBY&#xA;NAGYMRddmZMgp4lE2xGib8SYwonct3y1fmB+x67lq65IFVM/IAwN6BuMXtgb+Zkm&#xA;iT+eKgc1pK4uCsZJbQAlPzkDGQV69GNyjlphABEBAAGJAbwEGAEIACYWIQTplsZw&#xA;qn9lQJv121YTnjjZDe0R8AUCYHVu6AIbDAUJA8JnAAAKCRATnjjZDe0R8Oe8DADQ&#xA;CTBXxrmTJTSZUeKVo0C1kDHQaaV+RiRmquYR3WxFI6ugJFFWpzgG9V8Q7vYGeZFM&#xA;HYM/tDuY/gdMwHBcR13yYyozslar7qas4LL/bYgOqq+SiSGTDEBW+00+5Wlwmlrv&#xA;ubLc6ow9q2sTmOprq3Q7fei+sEANVnymBxnVV/ZIVGPpm/Rkh1JFGT/8SEyKkCut&#xA;G23JMM/06cIhZwdD6aWSZK4EFw0lwfXyr8l3ZqH0WydVEef1DUNIRM48O0YdwS9u&#xA;jd5iKKKJlb4XxwGi6IKSzpXF7pFrm6vqS306u3Fnak5hb2gs8dpnNo7UL1gUm5pr&#xA;8vJ3xhg15KCjYKz8k6ZDsIWULTXUJ23i8ZwqyQaj1bajwN0+/MfC0ZkoQtQ2I/TH&#xA;cKLSMOR+Tji6n7FjOcVl6VoDKTjdxj9OgAlbZ7W9jEArrUjDdCk/m4jq9h9phpli&#xA;BHoul/nauwtlUnQes1V+39Rk9l7gddKWg3dlwg6CjB5MkmcaeyxgANcyKgrunpg=&#xA;=JYpC&#xA;-----END PGP PUBLIC KEY BLOCK-----&#xA;'/>
+ </properties>
+ <mappings size='3'>
+ <rule filter='(&amp; (classifier=osgi.bundle))' output='${repoUrl}/plugins/${id}_${version}.jar'/>
+ <rule filter='(&amp; (classifier=binary))' output='${repoUrl}/binary/${id}_${version}'/>
+ <rule filter='(&amp; (classifier=org.eclipse.update.feature))' output='${repoUrl}/features/${id}_${version}.jar'/>
+ </mappings>
+ <artifacts size='1'>
+ <artifact classifier='osgi.bundle' id='blah' version='1.0.0.123456'>
+ <properties size='1'>
+ <!-- gpg -u signer1@fakeuser.eclipse.org -a -detach-sig plugins/blah_1.0.0.123456.jar -->
+ <!-- encoded with org.eclipse.equinox.internal.p2.persistence.XMLWriter.escape() -->
+ <property name='pgp.signatures' value='-----BEGIN PGP SIGNATURE-----&#xA;&#xA;iQHRBAABCAA7FiEE6ZbGcKp/ZUCb9dtWE5442Q3tEfAFAmB4Bf8dHHNpZ25lcjFA&#xA;ZmFrZXVzZXIuZWNsaXBzZS5vcmcACgkQE5442Q3tEfBPuAwAhE4zA7BswKFhEtzm&#xA;DS3EbyRr/U13sV01YxqGtxYDCfrOt8TGVPXJSvo0AVP4vLFc5b+0jtVFoarFJNBu&#xA;xhbVuyC72YdqudNbncSlW6KG5SgeWIM//ThKfl95pOWRWvJEoKJhmDwbDqhZYtL5&#xA;SECegnWGtGx/klFtZihzHYJE/nfSnhySDaz5lCvXFFYRhIbNmNm2Yq7ztCOsN4Ys&#xA;3uN+GEdoXGvv1DFg/xZPvwCOhZGsSQfkl1jmUwVltgKrw9OCFbdfYz7H6dbGWhRu&#xA;2XpuKxPXGavKfpSvssVQIZ6aWi5W6wp5lZAQQddZvYAv3Gi5CZZcUT7ayFJYdD23&#xA;p9jz76G7MXm0f0uNT9B57T72QryokUIEIJYsCb6lNjWUQB4cd0+JesM7sHwweOQ3&#xA;7iTFc+WgVJkP0e695mm1tcvtQHUPbIItYJUsndyLgGInzglxN8+F4U4k8uapydI9&#xA;RmV2NVAifYp8z95Am5AnlG8lqjwrWk5bMbJH82QsQESrNT/h&#xA;=8Vrn&#xA;-----END PGP SIGNATURE-----&#xA;'/>
+ </properties>
+ </artifact>
+ </artifacts>
+</repository>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/content.xml b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/content.xml
new file mode 100644
index 000000000..db8f67ba2
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/content.xml
@@ -0,0 +1,49 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?metadataRepository version='1.2.0'?>
+<repository name='file:/home/mistria/sandbox/repo/ - metadata' type='org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository' version='1'>
+ <properties size='2'>
+ <property name='p2.timestamp' value='1618433231272'/>
+ <property name='p2.compressed' value='false'/>
+ </properties>
+ <units size='2'>
+ <unit id='blah' version='1.0.0.123456' singleton='false'>
+ <update id='blah' range='[0.0.0,1.0.0.123456)' severity='0'/>
+ <provides size='4'>
+ <provided namespace='org.eclipse.equinox.p2.iu' name='blah' version='1.0.0.123456'/>
+ <provided namespace='osgi.bundle' name='blah' version='1.0.0.123456'/>
+ <provided namespace='osgi.identity' name='blah' version='1.0.0.123456'>
+ <properties size='1'>
+ <property name='type' value='osgi.bundle'/>
+ </properties>
+ </provided>
+ <provided namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' version='1.0.0'/>
+ </provides>
+ <artifacts size='1'>
+ <artifact classifier='osgi.bundle' id='blah' version='1.0.0.123456'/>
+ </artifacts>
+ <touchpoint id='org.eclipse.equinox.p2.osgi' version='1.0.0'/>
+ <touchpointData size='1'>
+ <instructions size='2'>
+ <instruction key='zipped'>
+ true
+ </instruction>
+ <instruction key='manifest'>
+ Bundle-SymbolicName: blah&#xA;Bundle-Version: 1.0.0.qualifier&#xA;
+ </instruction>
+ </instructions>
+ </touchpointData>
+ </unit>
+ <unit id='Category' version='0.0.0'>
+ <properties size='3'>
+ <property name='org.eclipse.equinox.p2.type.category' value='true'/>
+ </properties>
+ <provides size='1'>
+ <provided namespace='org.eclipse.equinox.p2.iu' name='Category' version='0.0.0'/>
+ </provides>
+ <requires size='1'>
+ <required namespace='org.eclipse.equinox.p2.iu' name='blah' range='[1.0.0.123456,1.0.0.123456]'/>
+ </requires>
+ <touchpoint id='null' version='0.0.0'/>
+ </unit>
+ </units>
+</repository>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/plugins/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/plugins/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..b9fdcbf2f
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/plugins/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: blah
+Bundle-Version: 1.0.0.qualifier
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/plugins/blah_1.0.0.123456.jar b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/plugins/blah_1.0.0.123456.jar
new file mode 100644
index 000000000..9cc7b8da0
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/plugins/blah_1.0.0.123456.jar
Binary files differ
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/plugins/blah_1.0.0.123456.jar.asc b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/plugins/blah_1.0.0.123456.jar.asc
new file mode 100644
index 000000000..1489f2552
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoPGPOK_encoded/plugins/blah_1.0.0.123456.jar.asc
@@ -0,0 +1,14 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQHRBAABCAA7FiEE6ZbGcKp/ZUCb9dtWE5442Q3tEfAFAmB4Bf8dHHNpZ25lcjFA
+ZmFrZXVzZXIuZWNsaXBzZS5vcmcACgkQE5442Q3tEfBPuAwAhE4zA7BswKFhEtzm
+DS3EbyRr/U13sV01YxqGtxYDCfrOt8TGVPXJSvo0AVP4vLFc5b+0jtVFoarFJNBu
+xhbVuyC72YdqudNbncSlW6KG5SgeWIM//ThKfl95pOWRWvJEoKJhmDwbDqhZYtL5
+SECegnWGtGx/klFtZihzHYJE/nfSnhySDaz5lCvXFFYRhIbNmNm2Yq7ztCOsN4Ys
+3uN+GEdoXGvv1DFg/xZPvwCOhZGsSQfkl1jmUwVltgKrw9OCFbdfYz7H6dbGWhRu
+2XpuKxPXGavKfpSvssVQIZ6aWi5W6wp5lZAQQddZvYAv3Gi5CZZcUT7ayFJYdD23
+p9jz76G7MXm0f0uNT9B57T72QryokUIEIJYsCb6lNjWUQB4cd0+JesM7sHwweOQ3
+7iTFc+WgVJkP0e695mm1tcvtQHUPbIItYJUsndyLgGInzglxN8+F4U4k8uapydI9
+RmV2NVAifYp8z95Am5AnlG8lqjwrWk5bMbJH82QsQESrNT/h
+=8Vrn
+-----END PGP SIGNATURE-----
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/artifacts.xml b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/artifacts.xml
new file mode 100644
index 000000000..67aec85fb
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/artifacts.xml
@@ -0,0 +1,78 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?artifactRepository version='1.1.0'?>
+<repository name='file:/home/mistria/sandbox/repo/ - artifacts' type='org.eclipse.equinox.p2.artifact.repository.simpleRepository' version='1'>
+ <properties size='3'>
+ <property name='p2.timestamp' value='1618433231272'/>
+ <property name='p2.compressed' value='false'/>
+ <!-- See PGPSignatureVerifierTest about this public key-->
+ <property name='pgp.publicKeys' value='-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQGNBGB1bugBDADQ5l7YnS9hNFRkBKSrvVNHt/TxeHaNNIHkdTC56I1QdThsOt4Y
+oQRI27AEOaY1GFEi6+QqwxALcMMMSTgkCRs2NFGqlWMVzNYE7bJMWChVa7uQ/9CG
+1HRbXwVwQx3hFgU4kmw1Kl/IH4LX76d9gAMyFANPjYZJSjbAv54wOlKruDRgpQFF
+pZeuXW7SnerL6sgd/+ZroikdkrjIs5t18C2ofzf6YnOokYkEEJSAEoQK5svVzT4G
+H3sw6FlE41RvnYKpuhvvyQhKjISDYfRaIL4JIpvR9Uko48eN9x654lJaucbMiLP4
+ROI9q7RQ6t1IMCiIN9QKgS+nVtHnN9MnXS0czGxfLdStv6bB+xgUoyBc7Uiqf4X0
+x8z9PE6O1L6Rgy2JMJHPgLWCF8h/u1FO88Br3I7TMzu2q/cg3k18L7eujnxVyYiD
+YIMxDBXBNnGCKRC4shgt8e+PzAPXIDFvbv7HOaERnx5c6eLl0tD12ocQeZHp1VlW
+nQteQ6CfvN07dNUAEQEAAbQ3RWNsaXBzZSBwMiB0ZXN0IFNpZ25lciAxIDxzaWdu
+ZXIxQGZha2V1c2VyLmVjbGlwc2Uub3JnPokB1AQTAQgAPhYhBOmWxnCqf2VAm/Xb
+VhOeONkN7RHwBQJgdW7oAhsDBQkDwmcABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheA
+AAoJEBOeONkN7RHwuXYL/Ri2gHoXELN79dWnuC5hjh7XgKquqlZg3qLgkLyA/54/
+ERx7HLLMHjU5tVIVacZ9UWb30Bzx6iVx2hMtL/0FFJ1S0iwwTDXft/9EoPvsmmEx
+VYEiSx5HxsPXM+XofMvi75nN34iMUIU3SgKLzHqlWcC3T7XjDWKC8TkTcutIAaIz
+BMRssktJR3OYzWbbwzgz83sVpofWGfxIW91H19Zr8rjIXiNyy1ulRnfsaz+xXeXf
+KxZZs00FtIIOeWBhCtsb8/8Uv3FRDK6+lX3xAqfMG67azJXpFafWJGiymypfSwi6
+JA866WOzw9DfbqWIlY/EMIhyZrsWnGiGhhAavwOiSWYV65ooFYooKHNmIekpvRZS
+wlGuwvnZr+2471urkCoG8Yz2Ey28Qjc0NgXlXAkqFUkO2gNPFsXkk1EC+vzO2llp
+qROS9pt25dEBcUSgfcjFOFWv2Z5IdmGjFEe46CJNEVzNgkP+97wJP7wpcOCSF/nn
+eOBj4b7Q0suJ+MsE/Fx6SbkBjQRgdW7oAQwAst4QGHd9w+V3UHgRMYZISfYApcAK
+2qBT1Zvf01QE38JUtDPKJarDlgxcaXuX6jOcbF60OMd59dhNmpaZYpocJZMgnESj
+0/Tn4cZfWwtOo1Pom8Lbg1zGKIYAaR2mTb8mkCwJwsZCUZCmh+zspacxdVRdmWmC
+XcFxFc/6gBKxcPFZf93JZaI33qsLpxyA57AJV5ck/TY1iFmA6HFxehamsAVdd56g
+uyORekJJlZHXE9pICVEGqVUfdbSQXEiS386kZDftXe36phdj1gtFsRLHoBI8+L7o
+2vrdnj1UZgtvxBbJJ+QAfhF8+f84RFIi9CTY8cheX+YfDMEdg9J9LG54X5P3O1ZX
+eEvudKk/hqWBf+2rrdkhdFyyGRK0yTrO+PQ+tZHhcHPqfo4EiVktC4BTpB6QtLBY
+NAGYMRddmZMgp4lE2xGib8SYwonct3y1fmB+x67lq65IFVM/IAwN6BuMXtgb+Zkm
+iT+eKgc1pK4uCsZJbQAlPzkDGQV69GNyjlphABEBAAGJAbwEGAEIACYWIQTplsZw
+qn9lQJv121YTnjjZDe0R8AUCYHVu6AIbDAUJA8JnAAAKCRATnjjZDe0R8Oe8DADQ
+CTBXxrmTJTSZUeKVo0C1kDHQaaV+RiRmquYR3WxFI6ugJFFWpzgG9V8Q7vYGeZFM
+HYM/tDuY/gdMwHBcR13yYyozslar7qas4LL/bYgOqq+SiSGTDEBW+00+5Wlwmlrv
+ubLc6ow9q2sTmOprq3Q7fei+sEANVnymBxnVV/ZIVGPpm/Rkh1JFGT/8SEyKkCut
+G23JMM/06cIhZwdD6aWSZK4EFw0lwfXyr8l3ZqH0WydVEef1DUNIRM48O0YdwS9u
+jd5iKKKJlb4XxwGi6IKSzpXF7pFrm6vqS306u3Fnak5hb2gs8dpnNo7UL1gUm5pr
+8vJ3xhg15KCjYKz8k6ZDsIWULTXUJ23i8ZwqyQaj1bajwN0+/MfC0ZkoQtQ2I/TH
+cKLSMOR+Tji6n7FjOcVl6VoDKTjdxj9OgAlbZ7W9jEArrUjDdCk/m4jq9h9phpli
+BHoul/nauwtlUnQes1V+39Rk9l7gddKWg3dlwg6CjB5MkmcaeyxgANcyKgrunpg=
+=JYpC
+-----END PGP PUBLIC KEY BLOCK-----
+'/>
+ </properties>
+ <mappings size='3'>
+ <rule filter='(&amp; (classifier=osgi.bundle))' output='${repoUrl}/plugins/${id}_${version}.jar'/>
+ <rule filter='(&amp; (classifier=binary))' output='${repoUrl}/binary/${id}_${version}'/>
+ <rule filter='(&amp; (classifier=org.eclipse.update.feature))' output='${repoUrl}/features/${id}_${version}.jar'/>
+ </mappings>
+ <artifacts size='1'>
+ <artifact classifier='osgi.bundle' id='blah' version='1.0.0.123456'>
+ <properties size='1'>
+ <!-- gpg -u signer1@fakeuser.eclipse.org -a -detach-sig plugins/blah_1.0.0.123456.jar -->
+ <property name='pgp.signatures' value='-----BEGIN PGP SIGNATURE-----
+
+iQHRBAABCAA7FiEE6ZbGcKp/ZUCb9dtWE5442Q3tEfAFAmB1+EodHHNpZ25lcjFA
+ZmFrZXVzZXIuZWNsaXBzZS5vcmcACgkQE5442Q3tEfD5LAwAyPl8TBsC0bYZAsRX
+BSGXjlJ+oBKci5VH6bgM/ldnZD5SsYv6PVoxxdOJA2R6S88xxd0DuWivYuG+9aiZ
+w98hx6g0vNH8AWL+yd+l+2yIS8i/MJ57MCvVztexq935fIYU5KGdUNNEjDIrGHQQ
+AR5QWfTiy9EGracG4W6F9twmMOfDlCJ3eRCetp5OTvqBzS2gLom8ECaw7tezYvA/
+09Ok88j7vMI5kL3FO3WzzR+obeYUc19F6602h4cEJs/yOTOj/gz6GCXsAnuYQs1L
+yhjv4Cp4sBnMw+zPX0jFeNHu35mPt8oOFz1NLN85GHO7v3FFXmtwxj8bVBWBQR3R
+Vfi+n8SfR3WO5pYpsqPHZgP95K+W53ere1BZd67cT6uuJDtoDWC6TYPjndm5tnN1
++AzDQO12cC4w2cgIt3ElNYK0T8ADvrmCMPZPRPJ+GeZb0jb871SLDU1MPGZ9NHUl
+hiuiOU3vTN/X/SbZM/Zcz2eahRAOBOc8sXzqcbjQHN/Akzbg
+=acJE
+-----END PGP SIGNATURE-----
+'/>
+ </properties>
+ </artifact>
+ </artifacts>
+</repository>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/content.xml b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/content.xml
new file mode 100644
index 000000000..db8f67ba2
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/content.xml
@@ -0,0 +1,49 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?metadataRepository version='1.2.0'?>
+<repository name='file:/home/mistria/sandbox/repo/ - metadata' type='org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository' version='1'>
+ <properties size='2'>
+ <property name='p2.timestamp' value='1618433231272'/>
+ <property name='p2.compressed' value='false'/>
+ </properties>
+ <units size='2'>
+ <unit id='blah' version='1.0.0.123456' singleton='false'>
+ <update id='blah' range='[0.0.0,1.0.0.123456)' severity='0'/>
+ <provides size='4'>
+ <provided namespace='org.eclipse.equinox.p2.iu' name='blah' version='1.0.0.123456'/>
+ <provided namespace='osgi.bundle' name='blah' version='1.0.0.123456'/>
+ <provided namespace='osgi.identity' name='blah' version='1.0.0.123456'>
+ <properties size='1'>
+ <property name='type' value='osgi.bundle'/>
+ </properties>
+ </provided>
+ <provided namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' version='1.0.0'/>
+ </provides>
+ <artifacts size='1'>
+ <artifact classifier='osgi.bundle' id='blah' version='1.0.0.123456'/>
+ </artifacts>
+ <touchpoint id='org.eclipse.equinox.p2.osgi' version='1.0.0'/>
+ <touchpointData size='1'>
+ <instructions size='2'>
+ <instruction key='zipped'>
+ true
+ </instruction>
+ <instruction key='manifest'>
+ Bundle-SymbolicName: blah&#xA;Bundle-Version: 1.0.0.qualifier&#xA;
+ </instruction>
+ </instructions>
+ </touchpointData>
+ </unit>
+ <unit id='Category' version='0.0.0'>
+ <properties size='3'>
+ <property name='org.eclipse.equinox.p2.type.category' value='true'/>
+ </properties>
+ <provides size='1'>
+ <provided namespace='org.eclipse.equinox.p2.iu' name='Category' version='0.0.0'/>
+ </provides>
+ <requires size='1'>
+ <required namespace='org.eclipse.equinox.p2.iu' name='blah' range='[1.0.0.123456,1.0.0.123456]'/>
+ </requires>
+ <touchpoint id='null' version='0.0.0'/>
+ </unit>
+ </units>
+</repository>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/plugins/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/plugins/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..b9fdcbf2f
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/plugins/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: blah
+Bundle-Version: 1.0.0.qualifier
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/plugins/blah_1.0.0.123456.jar b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/plugins/blah_1.0.0.123456.jar
new file mode 100644
index 000000000..9cc7b8da0
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/plugins/blah_1.0.0.123456.jar
Binary files differ
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/plugins/blah_1.0.0.123456.jar.asc b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/plugins/blah_1.0.0.123456.jar.asc
new file mode 100644
index 000000000..1489f2552
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoSignatureDoesntMatchContent/plugins/blah_1.0.0.123456.jar.asc
@@ -0,0 +1,14 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQHRBAABCAA7FiEE6ZbGcKp/ZUCb9dtWE5442Q3tEfAFAmB4Bf8dHHNpZ25lcjFA
+ZmFrZXVzZXIuZWNsaXBzZS5vcmcACgkQE5442Q3tEfBPuAwAhE4zA7BswKFhEtzm
+DS3EbyRr/U13sV01YxqGtxYDCfrOt8TGVPXJSvo0AVP4vLFc5b+0jtVFoarFJNBu
+xhbVuyC72YdqudNbncSlW6KG5SgeWIM//ThKfl95pOWRWvJEoKJhmDwbDqhZYtL5
+SECegnWGtGx/klFtZihzHYJE/nfSnhySDaz5lCvXFFYRhIbNmNm2Yq7ztCOsN4Ys
+3uN+GEdoXGvv1DFg/xZPvwCOhZGsSQfkl1jmUwVltgKrw9OCFbdfYz7H6dbGWhRu
+2XpuKxPXGavKfpSvssVQIZ6aWi5W6wp5lZAQQddZvYAv3Gi5CZZcUT7ayFJYdD23
+p9jz76G7MXm0f0uNT9B57T72QryokUIEIJYsCb6lNjWUQB4cd0+JesM7sHwweOQ3
+7iTFc+WgVJkP0e695mm1tcvtQHUPbIItYJUsndyLgGInzglxN8+F4U4k8uapydI9
+RmV2NVAifYp8z95Am5AnlG8lqjwrWk5bMbJH82QsQESrNT/h
+=8Vrn
+-----END PGP SIGNATURE-----
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/artifacts.xml b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/artifacts.xml
new file mode 100644
index 000000000..0d7b0204e
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/artifacts.xml
@@ -0,0 +1,78 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?artifactRepository version='1.1.0'?>
+<repository name='file:/home/mistria/sandbox/repo/ - artifacts' type='org.eclipse.equinox.p2.artifact.repository.simpleRepository' version='1'>
+ <properties size='3'>
+ <property name='p2.timestamp' value='1618433231272'/>
+ <property name='p2.compressed' value='false'/>
+ <!-- See PGPSignatureVerifierTest about this public key-->
+ <property name='pgp.publicKeys' value='-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQGNBGB1bugBDADQ5l7YnS9hNFRkBKSrvVNHt/TxeHaNNIHkdTC56I1QdThsOt4Y
+oQRI27AEOaY1GFEi6+QqwxALcMMMSTgkCRs2NFGqlWMVzNYE7bJMWChVa7uQ/9CG
+1HRbXwVwQx3hFgU4kmw1Kl/IH4LX76d9gAMyFANPjYZJSjbAv54wOlKruDRgpQFF
+pZeuXW7SnerL6sgd/+ZroikdkrjIs5t18C2ofzf6YnOokYkEEJSAEoQK5svVzT4G
+H3sw6FlE41RvnYKpuhvvyQhKjISDYfRaIL4JIpvR9Uko48eN9x654lJaucbMiLP4
+ROI9q7RQ6t1IMCiIN9QKgS+nVtHnN9MnXS0czGxfLdStv6bB+xgUoyBc7Uiqf4X0
+x8z9PE6O1L6Rgy2JMJHPgLWCF8h/u1FO88Br3I7TMzu2q/cg3k18L7eujnxVyYiD
+YIMxDBXBNnGCKRC4shgt8e+PzAPXIDFvbv7HOaERnx5c6eLl0tD12ocQeZHp1VlW
+nQteQ6CfvN07dNUAEQEAAbQ3RWNsaXBzZSBwMiB0ZXN0IFNpZ25lciAxIDxzaWdu
+ZXIxQGZha2V1c2VyLmVjbGlwc2Uub3JnPokB1AQTAQgAPhYhBOmWxnCqf2VAm/Xb
+VhOeONkN7RHwBQJgdW7oAhsDBQkDwmcABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheA
+AAoJEBOeONkN7RHwuXYL/Ri2gHoXELN79dWnuC5hjh7XgKquqlZg3qLgkLyA/54/
+ERx7HLLMHjU5tVIVacZ9UWb30Bzx6iVx2hMtL/0FFJ1S0iwwTDXft/9EoPvsmmEx
+VYEiSx5HxsPXM+XofMvi75nN34iMUIU3SgKLzHqlWcC3T7XjDWKC8TkTcutIAaIz
+BMRssktJR3OYzWbbwzgz83sVpofWGfxIW91H19Zr8rjIXiNyy1ulRnfsaz+xXeXf
+KxZZs00FtIIOeWBhCtsb8/8Uv3FRDK6+lX3xAqfMG67azJXpFafWJGiymypfSwi6
+JA866WOzw9DfbqWIlY/EMIhyZrsWnGiGhhAavwOiSWYV65ooFYooKHNmIekpvRZS
+wlGuwvnZr+2471urkCoG8Yz2Ey28Qjc0NgXlXAkqFUkO2gNPFsXkk1EC+vzO2llp
+qROS9pt25dEBcUSgfcjFOFWv2Z5IdmGjFEe46CJNEVzNgkP+97wJP7wpcOCSF/nn
+eOBj4b7Q0suJ+MsE/Fx6SbkBjQRgdW7oAQwAst4QGHd9w+V3UHgRMYZISfYApcAK
+2qBT1Zvf01QE38JUtDPKJarDlgxcaXuX6jOcbF60OMd59dhNmpaZYpocJZMgnESj
+0/Tn4cZfWwtOo1Pom8Lbg1zGKIYAaR2mTb8mkCwJwsZCUZCmh+zspacxdVRdmWmC
+XcFxFc/6gBKxcPFZf93JZaI33qsLpxyA57AJV5ck/TY1iFmA6HFxehamsAVdd56g
+uyORekJJlZHXE9pICVEGqVUfdbSQXEiS386kZDftXe36phdj1gtFsRLHoBI8+L7o
+2vrdnj1UZgtvxBbJJ+QAfhF8+f84RFIi9CTY8cheX+YfDMEdg9J9LG54X5P3O1ZX
+eEvudKk/hqWBf+2rrdkhdFyyGRK0yTrO+PQ+tZHhcHPqfo4EiVktC4BTpB6QtLBY
+NAGYMRddmZMgp4lE2xGib8SYwonct3y1fmB+x67lq65IFVM/IAwN6BuMXtgb+Zkm
+iT+eKgc1pK4uCsZJbQAlPzkDGQV69GNyjlphABEBAAGJAbwEGAEIACYWIQTplsZw
+qn9lQJv121YTnjjZDe0R8AUCYHVu6AIbDAUJA8JnAAAKCRATnjjZDe0R8Oe8DADQ
+CTBXxrmTJTSZUeKVo0C1kDHQaaV+RiRmquYR3WxFI6ugJFFWpzgG9V8Q7vYGeZFM
+HYM/tDuY/gdMwHBcR13yYyozslar7qas4LL/bYgOqq+SiSGTDEBW+00+5Wlwmlrv
+ubLc6ow9q2sTmOprq3Q7fei+sEANVnymBxnVV/ZIVGPpm/Rkh1JFGT/8SEyKkCut
+G23JMM/06cIhZwdD6aWSZK4EFw0lwfXyr8l3ZqH0WydVEef1DUNIRM48O0YdwS9u
+jd5iKKKJlb4XxwGi6IKSzpXF7pFrm6vqS306u3Fnak5hb2gs8dpnNo7UL1gUm5pr
+8vJ3xhg15KCjYKz8k6ZDsIWULTXUJ23i8ZwqyQaj1bajwN0+/MfC0ZkoQtQ2I/TH
+cKLSMOR+Tji6n7FjOcVl6VoDKTjdxj9OgAlbZ7W9jEArrUjDdCk/m4jq9h9phpli
+BHoul/nauwtlUnQes1V+39Rk9l7gddKWg3dlwg6CjB5MkmcaeyxgANcyKgrunpg=
+=JYpC
+-----END PGP PUBLIC KEY BLOCK-----
+'/>
+ </properties>
+ <mappings size='3'>
+ <rule filter='(&amp; (classifier=osgi.bundle))' output='${repoUrl}/plugins/${id}_${version}.jar'/>
+ <rule filter='(&amp; (classifier=binary))' output='${repoUrl}/binary/${id}_${version}'/>
+ <rule filter='(&amp; (classifier=org.eclipse.update.feature))' output='${repoUrl}/features/${id}_${version}.jar'/>
+ </mappings>
+ <artifacts size='1'>
+ <artifact classifier='osgi.bundle' id='blah' version='1.0.0.123456'>
+ <properties size='1'>
+ <!-- gpg -u signer1@fakeuser.eclipse.org -a -detach-sig plugins/blah_1.0.0.123456.jar -->
+ <property name='pgp.signatures' value='-----BEGIN PGP SIGNATURE-----
+
+iQHRBAABCAA7FiEE6ZbGcKp/ZUCb9dtWE5442Q3tEfAFAmB4Bf8dHHNpZ25lcjFA
+ZmFrZXVzZXIuZWNsaXBzZS5vcmcACgkQE5442Q3tEfBPuAwAhE4zA7BswKFhEtzm
+DS3EbyRr/U13sV01YxqGtxYDCfrOt8TGVPXJSvo0AVP4vLFc5b+0jtVFoarFJNBu
+xhbVuyC72YdqudNbncSlW6KG5SgeWIM//ThKfl95pOWRWvJEoKJhmDwbDqhZYtL5
+SECegnWG____TAMPERED_____________________________________COsN4Ys
+3uN+GEdoXGvv1DFg/xZPvwCOhZGsSQfkl1jmUwVltgKrw9OCFbdfYz7H6dbGWhRu
+2XpuKxPXGavKfpSvssVQIZ6aWi5W6wp5lZAQQddZvYAv3Gi5CZZcUT7ayFJYdD23
+p9jz76G7MXm0f0uNT9B57T72QryokUIEIJYsCb6lNjWUQB4cd0+JesM7sHwweOQ3
+7iTFc+WgVJkP0e695mm1tcvtQHUPbIItYJUsndyLgGInzglxN8+F4U4k8uapydI9
+RmV2NVAifYp8z95Am5AnlG8lqjwrWk5bMbJH82QsQESrNT/h
+=8Vrn
+-----END PGP SIGNATURE-----
+'/>
+ </properties>
+ </artifact>
+ </artifacts>
+</repository>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/content.xml b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/content.xml
new file mode 100644
index 000000000..db8f67ba2
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/content.xml
@@ -0,0 +1,49 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?metadataRepository version='1.2.0'?>
+<repository name='file:/home/mistria/sandbox/repo/ - metadata' type='org.eclipse.equinox.internal.p2.metadata.repository.LocalMetadataRepository' version='1'>
+ <properties size='2'>
+ <property name='p2.timestamp' value='1618433231272'/>
+ <property name='p2.compressed' value='false'/>
+ </properties>
+ <units size='2'>
+ <unit id='blah' version='1.0.0.123456' singleton='false'>
+ <update id='blah' range='[0.0.0,1.0.0.123456)' severity='0'/>
+ <provides size='4'>
+ <provided namespace='org.eclipse.equinox.p2.iu' name='blah' version='1.0.0.123456'/>
+ <provided namespace='osgi.bundle' name='blah' version='1.0.0.123456'/>
+ <provided namespace='osgi.identity' name='blah' version='1.0.0.123456'>
+ <properties size='1'>
+ <property name='type' value='osgi.bundle'/>
+ </properties>
+ </provided>
+ <provided namespace='org.eclipse.equinox.p2.eclipse.type' name='bundle' version='1.0.0'/>
+ </provides>
+ <artifacts size='1'>
+ <artifact classifier='osgi.bundle' id='blah' version='1.0.0.123456'/>
+ </artifacts>
+ <touchpoint id='org.eclipse.equinox.p2.osgi' version='1.0.0'/>
+ <touchpointData size='1'>
+ <instructions size='2'>
+ <instruction key='zipped'>
+ true
+ </instruction>
+ <instruction key='manifest'>
+ Bundle-SymbolicName: blah&#xA;Bundle-Version: 1.0.0.qualifier&#xA;
+ </instruction>
+ </instructions>
+ </touchpointData>
+ </unit>
+ <unit id='Category' version='0.0.0'>
+ <properties size='3'>
+ <property name='org.eclipse.equinox.p2.type.category' value='true'/>
+ </properties>
+ <provides size='1'>
+ <provided namespace='org.eclipse.equinox.p2.iu' name='Category' version='0.0.0'/>
+ </provides>
+ <requires size='1'>
+ <required namespace='org.eclipse.equinox.p2.iu' name='blah' range='[1.0.0.123456,1.0.0.123456]'/>
+ </requires>
+ <touchpoint id='null' version='0.0.0'/>
+ </unit>
+ </units>
+</repository>
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/plugins/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/plugins/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..b9fdcbf2f
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/plugins/META-INF/MANIFEST.MF
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: blah
+Bundle-Version: 1.0.0.qualifier
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/plugins/blah_1.0.0.123456.jar b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/plugins/blah_1.0.0.123456.jar
new file mode 100644
index 000000000..9cc7b8da0
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/plugins/blah_1.0.0.123456.jar
Binary files differ
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/plugins/blah_1.0.0.123456.jar.asc b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/plugins/blah_1.0.0.123456.jar.asc
new file mode 100644
index 000000000..1489f2552
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/repoTamperedInvalidSignature/plugins/blah_1.0.0.123456.jar.asc
@@ -0,0 +1,14 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQHRBAABCAA7FiEE6ZbGcKp/ZUCb9dtWE5442Q3tEfAFAmB4Bf8dHHNpZ25lcjFA
+ZmFrZXVzZXIuZWNsaXBzZS5vcmcACgkQE5442Q3tEfBPuAwAhE4zA7BswKFhEtzm
+DS3EbyRr/U13sV01YxqGtxYDCfrOt8TGVPXJSvo0AVP4vLFc5b+0jtVFoarFJNBu
+xhbVuyC72YdqudNbncSlW6KG5SgeWIM//ThKfl95pOWRWvJEoKJhmDwbDqhZYtL5
+SECegnWGtGx/klFtZihzHYJE/nfSnhySDaz5lCvXFFYRhIbNmNm2Yq7ztCOsN4Ys
+3uN+GEdoXGvv1DFg/xZPvwCOhZGsSQfkl1jmUwVltgKrw9OCFbdfYz7H6dbGWhRu
+2XpuKxPXGavKfpSvssVQIZ6aWi5W6wp5lZAQQddZvYAv3Gi5CZZcUT7ayFJYdD23
+p9jz76G7MXm0f0uNT9B57T72QryokUIEIJYsCb6lNjWUQB4cd0+JesM7sHwweOQ3
+7iTFc+WgVJkP0e695mm1tcvtQHUPbIItYJUsndyLgGInzglxN8+F4U4k8uapydI9
+RmV2NVAifYp8z95Am5AnlG8lqjwrWk5bMbJH82QsQESrNT/h
+=8Vrn
+-----END PGP SIGNATURE-----
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/pgp/signer2-publickey.asc b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/signer2-publickey.asc
new file mode 100644
index 000000000..0218bdce7
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/pgp/signer2-publickey.asc
@@ -0,0 +1,29 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQINBGHUyxYBEADATeNx4XA4H2fP9mD5xwlIyh7qvHLezgXpqCwNS9ATqBwnfrCV
+06a+pfSLsLoXrP/sdaB5WhijfuxTis18RMfoDVwGMRqyD2GiBCl2vwJDg3BUwHnc
+H7W6XkWKO7dkPmF+TUbD3cTWZ7cvrPmMjinmXaq8htuktGuE2VEGZRnuG1m+ChDM
+PnSb1ioFS2+MJv13P2fagVk2qC95DkPJGpMk3CY3ghLDEaY/KaJl+8axAlUUUk9N
+d3k/KVxxf5k3g26EVQkWWgH2mmolptGO101xW64iked97Cy4NK2yafOF/wmpsavx
+PGpOewnDgAJBBPkum6mPH0vcOZgxmLyh4uqfPfr3IaBQlbJLN2dXaDsV83j5t1wZ
+2qxOPcWBfORm6W7dC0TQgCXbEG0geMBpJtvnMX83Q2ORqDpjbHRJsV2k+8NxaXON
+pYXGr+Lj/9n0xfNEDXhCdGab0XP2tVZ5jfr2OQ5dAomEaPqK5Kq7akoWMddpDLNC
+G4IvH8G0cxwruJk00uwd6Nd2NVqVMRYCsBbA89VanUnutLUIpVnnOAetlX9blXHO
+JtmiCPGgHyp+iYGhKYVzfuZQyFhonbi0AhidJDvbHsoLT3p4Mcog1B9y6MODBE7R
+jwrU+qMqYsYeFhGYKbYyXv9TfEyUvtCQ/GnTtRJAQyicFdOdbK37WecS6QARAQAB
+tDdFY2xpcHNlIHAyIHRlc3QgU2lnbmVyIDIgPHNpZ25lcjJAZmFrZXVzZXIuZWNs
+aXBzZS5vcmc+iQJYBBMBCABCFiEEzZ1aK4a8T+GDlFHh4vaU9BsKs3AFAmHUyxYC
+GwMFCQPCZwAFCwkIBwIDIgIBBhUKCQgLAgQWAgMBAh4HAheAAAoJEOL2lPQbCrNw
+wH4QAIiCaw1mREgt4ldz7hQvmGxdMuQwVKZPzbOIAlYbZBo0q9SmeMf/CBCO90hg
+LFmJmsZV4KUU5NKI7UwkDVrpUCl00Ok6+gtiUTId2tRcwXI+25I478VX27j6OkQj
+7Xr6giv8cn8nstt5CF6xxeqrxvpmnZC0u30jE6CL6SdXSd0vViFDPQj3KgGJCRc9
+St+LHB3XJTsadihzQnscqI4E2i5Z3Uj1GogqxtR59M1NAXubl5dySM0qHhwn8O+6
+lcgCCeuyMLLde1M1v8w07jdRUM+IFqHrRnE89EPH3MQeZbQ3UfFXK2r7wx2BJCqL
+Irtn68kz834ByKchGR6DqaAw0q+iF2QkgzYxpwai41BgmtUCYnj+HxQNIF4KTzDe
+nd8mDAPWttGCoVuV2Tyu9peYOaqyAZ2PZwUEH5MqihPCbenU17RLXzRu/IT/SH47
+NGrN3yKGgLZr2EVWPWFibpoxP4G4NUCHsY75uiL2EWPVSjK/+OOeHIE5k3U3lYwB
+7clhBwMkIhQHJ+a0SHRkKixkwrQDw4veKY4LaD0NCBLHFoV5L9orH1ToGM729kr/
++4I1VQFkL3KvfLjmRbTUgwHeqEquQ96JtqowbNwlpujfHXQKDNsuiKGP5OazXll5
+sH2CR7e4ePqhhzxjLvi9e/79Khq+08eqllS3rs06EXEAJYTo
+=807V
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/updatesite/CategoryXMLActionTest/associateSites.xml b/bundles/org.eclipse.equinox.p2.tests/testData/updatesite/CategoryXMLActionTest/associateSites.xml
index 1238ec316..bddf9e047 100644
--- a/bundles/org.eclipse.equinox.p2.tests/testData/updatesite/CategoryXMLActionTest/associateSites.xml
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/updatesite/CategoryXMLActionTest/associateSites.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<associateSites>
-<associateSite url="http://download.eclipse.org/eclipse/updates/3.5" label="Eclipse Project Update Site"/>
+<associateSite url="https://download.eclipse.org/eclipse/updates/3.5" label="Eclipse Project Update Site"/>
<associateSite url="This is a bogus URI" label="broken"/>
</associateSites> \ No newline at end of file
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/updatesite/SiteXMLActionTest/associateSites.xml b/bundles/org.eclipse.equinox.p2.tests/testData/updatesite/SiteXMLActionTest/associateSites.xml
index 1238ec316..fb00b10b3 100644
--- a/bundles/org.eclipse.equinox.p2.tests/testData/updatesite/SiteXMLActionTest/associateSites.xml
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/updatesite/SiteXMLActionTest/associateSites.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<associateSites>
-<associateSite url="http://download.eclipse.org/eclipse/updates/3.5" label="Eclipse Project Update Site"/>
+<associateSite url="https://download.eclipse.org/eclipse/updates/4.21" label="Eclipse Project Update Site"/>
<associateSite url="This is a bogus URI" label="broken"/>
</associateSites> \ No newline at end of file
diff --git a/bundles/org.eclipse.equinox.p2.tests/testData/updatesite/SiteXMLActionTest/site.xml b/bundles/org.eclipse.equinox.p2.tests/testData/updatesite/SiteXMLActionTest/site.xml
index 3e0b2f175..63668e601 100644
--- a/bundles/org.eclipse.equinox.p2.tests/testData/updatesite/SiteXMLActionTest/site.xml
+++ b/bundles/org.eclipse.equinox.p2.tests/testData/updatesite/SiteXMLActionTest/site.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<site associateSitesURL="associateSites.xml" mirrorsURL="http://www.eclipse.org/downloads/download.php?file=/eclipse/updates/3.4&amp;format=xml">
+<site associateSitesURL="associateSites.xml" mirrorsURL="https://www.eclipse.org/downloads/download.php?file=/eclipse/updates/4.21&amp;format=xml">
<feature url="features/test.feature_1.0.0.jar" id="test.feature" version="1.0.0">
<category name="Test Category"/>
</feature>
diff --git a/bundles/org.eclipse.equinox.p2.testserver/.classpath b/bundles/org.eclipse.equinox.p2.testserver/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.testserver/.classpath
+++ b/bundles/org.eclipse.equinox.p2.testserver/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.testserver/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.testserver/.settings/org.eclipse.jdt.core.prefs
index 97d2ee121..b3d5b56d8 100644
--- a/bundles/org.eclipse.equinox.p2.testserver/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.testserver/.settings/org.eclipse.jdt.core.prefs
@@ -18,9 +18,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -37,6 +37,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -94,6 +95,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -131,10 +133,11 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=warning
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
@@ -142,20 +145,23 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
org.eclipse.jdt.core.formatter.alignment_for_enum_constants=16
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
org.eclipse.jdt.core.formatter.alignment_for_module_statements=16
org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
@@ -247,11 +253,12 @@ org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
@@ -282,6 +289,8 @@ org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
@@ -306,13 +315,17 @@ org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
@@ -360,6 +373,8 @@ org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do no
org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
@@ -396,9 +411,12 @@ org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not inser
org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
@@ -434,10 +452,14 @@ org.eclipse.jdt.core.formatter.tabulation.char=tab
org.eclipse.jdt.core.formatter.tabulation.size=4
org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
org.eclipse.jdt.core.incompatibleJDKLevel=ignore
org.eclipse.jdt.core.incompleteClasspath=error
diff --git a/bundles/org.eclipse.equinox.p2.testserver/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.testserver/META-INF/MANIFEST.MF
index f9c0c2733..46417adf1 100644
--- a/bundles/org.eclipse.equinox.p2.testserver/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.testserver/META-INF/MANIFEST.MF
@@ -2,13 +2,13 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Testserver
Bundle-SymbolicName: org.eclipse.equinox.p2.testserver;singleton:=true
-Bundle-Version: 1.1.100.qualifier
+Bundle-Version: 1.2.0.qualifier
Bundle-Activator: org.eclipse.equinox.p2.testserver.Activator
Bundle-Vendor: Eclipse
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Import-Package: org.osgi.framework;version="1.3.0"
Bundle-ActivationPolicy: lazy
-Require-Bundle: javax.servlet;bundle-version="2.4.0",
+Require-Bundle: jakarta.servlet-api;bundle-version="2.4.0",
org.eclipse.equinox.http.registry,
org.eclipse.equinox.http.servlet;bundle-version="1.0.200",
org.eclipse.osgi.services;bundle-version="3.2.0",
diff --git a/bundles/org.eclipse.equinox.p2.testserver/pom.xml b/bundles/org.eclipse.equinox.p2.testserver/pom.xml
index 99959390c..15046df14 100644
--- a/bundles/org.eclipse.equinox.p2.testserver/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.testserver/pom.xml
@@ -4,11 +4,11 @@
<parent>
<artifactId>org.eclipse.equinox.p2.tests-parent</artifactId>
<groupId>org.eclipse</groupId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../../org.eclipse.equinox.p2.releng/org.eclipse.equinox.p2.tests-parent</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.testserver</artifactId>
- <version>1.1.100-SNAPSHOT</version>
+ <version>1.2.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.testserver/src/org/eclipse/equinox/p2/testserver/Activator.java b/bundles/org.eclipse.equinox.p2.testserver/src/org/eclipse/equinox/p2/testserver/Activator.java
index b96c5afd3..31e6cffda 100644
--- a/bundles/org.eclipse.equinox.p2.testserver/src/org/eclipse/equinox/p2/testserver/Activator.java
+++ b/bundles/org.eclipse.equinox.p2.testserver/src/org/eclipse/equinox/p2/testserver/Activator.java
@@ -45,9 +45,9 @@ public class Activator implements BundleActivator, ServiceTrackerCustomizer<Http
private AlwaysFailContext alwaysFail;
private FlipFlopFailContext flipFlop;
- private static final String SITE = "http://download.eclipse.org/eclipse/updates/3.4"; //$NON-NLS-1$
- private static final String SITE2 = "http://www.eclipse.org/equinox/p2/testing/updateSite"; //$NON-NLS-1$
- private static final String SITE3 = "http://download.eclipse.org/eclipse/updates/3.5-I-builds/"; //$NON-NLS-1$
+ private static final String SITE = "https://download.eclipse.org/eclipse/updates/3.4"; //$NON-NLS-1$
+ private static final String SITE2 = "https://www.eclipse.org/equinox/p2/testing/updateSite"; //$NON-NLS-1$
+ private static final String SITE3 = "https://download.eclipse.org/eclipse/updates/3.5-I-builds/"; //$NON-NLS-1$
@Override
public void start(BundleContext aContext) throws Exception {
diff --git a/bundles/org.eclipse.equinox.p2.testserver/webfiles/index.html b/bundles/org.eclipse.equinox.p2.testserver/webfiles/index.html
index c07f8d265..9f1800e6e 100644
--- a/bundles/org.eclipse.equinox.p2.testserver/webfiles/index.html
+++ b/bundles/org.eclipse.equinox.p2.testserver/webfiles/index.html
@@ -8,10 +8,10 @@ log in. The credentials are: user: <b>Aladdin</b>, password: <b>open sesame</b>.
<a href="http://localhost:8080/private/index.html">here</a></p>
<p>The following real content is registered:</p>
<ul>
-<li>/proxy/private/ - goes to http://http://download.eclipse.org/eclipse/updates/3.4, but requires authentication.</li>
-<li>/proxy/public/ - goes to http://http://download.eclipse.org/eclipse/updates/3.4, (useful in redirects).</li>
-<li>/proxy/never/ - goes to http://http://download.eclipse.org/eclipse/updates/3.4, but always fail authentication.</li>
-<li>/proxy/flipFlop/ - goes to http://http://download.eclipse.org/eclipse/updates/3.4, but fails authentication every second attempt.</li>
+<li>/proxy/private/ - goes to https://download.eclipse.org/eclipse/updates/3.4, but requires authentication.</li>
+<li>/proxy/public/ - goes to https://download.eclipse.org/eclipse/updates/3.4, (useful in redirects).</li>
+<li>/proxy/never/ - goes to https://download.eclipse.org/eclipse/updates/3.4, but always fail authentication.</li>
+<li>/proxy/flipFlop/ - goes to https://download.eclipse.org/eclipse/updates/3.4, but fails authentication every second attempt.</li>
<li>/proxy/truncated - goes to updates/3.4, but truncates all files</li>
<li>/proxy/molested - goes to updates/3.4, but generates gibberish for all files</li>
<li>/proxy/decelerate - goes to updates/3.4, but delivers files in very small delayed packets - delay increases.</li>
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/.classpath b/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/.classpath
+++ b/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/.settings/org.eclipse.jdt.core.prefs
index 2575694e1..fc51c69b1 100644
--- a/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/.settings/org.eclipse.jdt.core.prefs
@@ -17,9 +17,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -36,6 +36,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -89,6 +90,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=warning
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -126,7 +128,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -140,7 +143,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -261,7 +263,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -332,7 +333,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -477,7 +477,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/META-INF/MANIFEST.MF
index 0c677003f..71901cee2 100644
--- a/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.touchpoint.eclipse;singleton:=true
-Bundle-Version: 2.2.700.qualifier
+Bundle-Version: 2.3.100.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.touchpoint.eclipse.Activator
Bundle-Vendor: %providerName
Bundle-Localization: plugin
@@ -15,12 +15,14 @@ Export-Package: org.eclipse.equinox.internal.p2.touchpoint.eclipse;version="2.0.
org.eclipse.equinox.internal.p2.update;version="2.0.0";x-friends:="org.eclipse.equinox.p2.reconciler.dropins,org.eclipse.equinox.p2.extensionlocation,org.eclipse.equinox.p2.directorywatcher",
org.eclipse.equinox.p2.touchpoint.eclipse.query;version="2.0.0"
Require-Bundle: org.eclipse.equinox.common;bundle-version="[3.5.0,4.0.0)"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Import-Package: javax.xml.parsers,
org.eclipse.equinox.frameworkadmin;version="[2.0.0,3.0.0)",
+ org.eclipse.equinox.internal.p2.artifact.processors.pgp,
org.eclipse.equinox.internal.p2.core.helpers,
org.eclipse.equinox.internal.p2.engine,
+ org.eclipse.equinox.internal.p2.engine.phases,
org.eclipse.equinox.internal.p2.garbagecollector,
org.eclipse.equinox.internal.p2.metadata,
org.eclipse.equinox.internal.provisional.frameworkadmin,
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/pom.xml b/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/pom.xml
index 0d5e0f7a2..7fff2566e 100644
--- a/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.touchpoint.eclipse</artifactId>
- <version>2.2.700-SNAPSHOT</version>
+ <version>2.3.100-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/src/org/eclipse/equinox/internal/p2/touchpoint/eclipse/actions/ActionConstants.java b/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/src/org/eclipse/equinox/internal/p2/touchpoint/eclipse/actions/ActionConstants.java
index ee394cfcf..ec918b53c 100644
--- a/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/src/org/eclipse/equinox/internal/p2/touchpoint/eclipse/actions/ActionConstants.java
+++ b/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/src/org/eclipse/equinox/internal/p2/touchpoint/eclipse/actions/ActionConstants.java
@@ -17,7 +17,6 @@ public class ActionConstants {
public static final String PARM_AGENT = "agent"; //$NON-NLS-1$
public static final String PARM_AT_ARTIFACT = "@artifact"; //$NON-NLS-1$
- public static final String PARM_ARTIFACT_FILES = "artifactFiles"; //$NON-NLS-1$
public static final String PARM_ARTIFACT_REQUESTS = "artifactRequests"; //$NON-NLS-1$
public static final String PARM_BUNDLE = "bundle"; //$NON-NLS-1$
public static final String PARM_FEATURE = "feature"; //$NON-NLS-1$
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/src/org/eclipse/equinox/internal/p2/touchpoint/eclipse/actions/AddJVMArgumentAction.java b/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/src/org/eclipse/equinox/internal/p2/touchpoint/eclipse/actions/AddJVMArgumentAction.java
index 6c11207de..1a5a5658e 100644
--- a/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/src/org/eclipse/equinox/internal/p2/touchpoint/eclipse/actions/AddJVMArgumentAction.java
+++ b/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/src/org/eclipse/equinox/internal/p2/touchpoint/eclipse/actions/AddJVMArgumentAction.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2010 IBM Corporation and others.
+ * Copyright (c) 2008, 2020 IBM Corporation and others.
*
* This
* program and the accompanying materials are made available under the terms of
@@ -10,6 +10,7 @@
* SPDX-License-Identifier: EPL-2.0
*
* Contributors: IBM Corporation - initial API and implementation
+ * Christoph Läubrich - Bug 569891
******************************************************************************/
package org.eclipse.equinox.internal.p2.touchpoint.eclipse.actions;
@@ -59,11 +60,11 @@ public class AddJVMArgumentAction extends ProvisioningAction {
File storageArea = (File) parameters.get(ActionConstants.PARM_PROFILE_DATA_DIRECTORY);
try {
if (arg.startsWith(XMS))
- addByteArg(arg, XMS, launcherData, storageArea);
+ addByteArg(arg.trim(), XMS, launcherData, storageArea);
else if (arg.startsWith(XMX))
- addByteArg(arg, XMX, launcherData, storageArea);
+ addByteArg(arg.trim(), XMX, launcherData, storageArea);
else if (arg.startsWith(XX_MAX_PERM_SIZE))
- addByteArg(arg, XX_MAX_PERM_SIZE, launcherData, storageArea);
+ addByteArg(arg.trim(), XX_MAX_PERM_SIZE, launcherData, storageArea);
else
// Argument with a non-byte value, no special handling
launcherData.addJvmArg(arg);
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/src/org/eclipse/equinox/internal/p2/touchpoint/eclipse/actions/CheckTrustAction.java b/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/src/org/eclipse/equinox/internal/p2/touchpoint/eclipse/actions/CheckTrustAction.java
index 201535517..7c7b51c17 100644
--- a/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/src/org/eclipse/equinox/internal/p2/touchpoint/eclipse/actions/CheckTrustAction.java
+++ b/bundles/org.eclipse.equinox.p2.touchpoint.eclipse/src/org/eclipse/equinox/internal/p2/touchpoint/eclipse/actions/CheckTrustAction.java
@@ -18,6 +18,7 @@ import java.util.Collection;
import java.util.Map;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
+import org.eclipse.equinox.internal.p2.engine.phases.CheckTrust;
import org.eclipse.equinox.internal.p2.touchpoint.eclipse.EclipseTouchpoint;
import org.eclipse.equinox.internal.p2.touchpoint.eclipse.Util;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
@@ -26,6 +27,8 @@ import org.eclipse.equinox.p2.engine.spi.ProvisioningAction;
import org.eclipse.equinox.p2.metadata.IArtifactKey;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.query.QueryUtil;
+import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor;
+import org.eclipse.equinox.p2.repository.artifact.IFileArtifactRepository;
/**
* This action collects the set of bundle files on which the signature trust
@@ -47,14 +50,21 @@ public class CheckTrustAction extends ProvisioningAction {
if (!profile.available(QueryUtil.createIUQuery(iu), null).isEmpty())
return null;
@SuppressWarnings("unchecked")
- Collection<File> bundleFiles = (Collection<File>) parameters.get(ActionConstants.PARM_ARTIFACT_FILES);
+ Map<IArtifactDescriptor, File> bundleFiles = (Map<IArtifactDescriptor, File>) parameters
+ .get(CheckTrust.PARM_ARTIFACTS);
Collection<IArtifactKey> artifacts = iu.getArtifacts();
- if (artifacts == null)
+ if (artifacts == null) {
return null;
+ }
+ IFileArtifactRepository repo = Util.getAggregatedBundleRepository(agent, profile);
for (IArtifactKey key : artifacts) {
- File bundleFile = Util.getArtifactFile(agent, key, profile);
- if (!bundleFiles.contains(bundleFile))
- bundleFiles.add(bundleFile);
+ for (IArtifactDescriptor descriptor : repo.getArtifactDescriptors(key)) {
+ IFileArtifactRepository currentRepo = descriptor.getRepository() instanceof IFileArtifactRepository
+ ? (IFileArtifactRepository) descriptor.getRepository()
+ : repo;
+ File artifactFile = currentRepo.getArtifactFile(descriptor);
+ bundleFiles.put(descriptor, artifactFile);
+ }
}
return null;
}
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.natives/.classpath b/bundles/org.eclipse.equinox.p2.touchpoint.natives/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.touchpoint.natives/.classpath
+++ b/bundles/org.eclipse.equinox.p2.touchpoint.natives/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.natives/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.touchpoint.natives/.settings/org.eclipse.jdt.core.prefs
index 4e79b56c0..26df1a4b1 100644
--- a/bundles/org.eclipse.equinox.p2.touchpoint.natives/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.touchpoint.natives/.settings/org.eclipse.jdt.core.prefs
@@ -16,9 +16,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -35,6 +35,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -88,6 +89,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -124,7 +126,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -138,7 +141,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -259,7 +261,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -330,7 +331,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -475,7 +475,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.natives/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.touchpoint.natives/META-INF/MANIFEST.MF
index c524327e1..3e794a0db 100644
--- a/bundles/org.eclipse.equinox.p2.touchpoint.natives/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.touchpoint.natives/META-INF/MANIFEST.MF
@@ -2,17 +2,20 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.touchpoint.natives;singleton:=true
-Bundle-Version: 1.3.600.qualifier
+Bundle-Version: 1.4.300.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.touchpoint.natives.Activator
Bundle-Vendor: %providerName
Bundle-Localization: plugin
-Export-Package: org.eclipse.equinox.internal.p2.touchpoint.natives;x-internal:=true,
+Export-Package:
+ org.eclipse.equinox.internal.p2.touchpoint.natives;x-internal:=true,
org.eclipse.equinox.internal.p2.touchpoint.natives.actions;x-internal:=true
-Require-Bundle: org.eclipse.equinox.common,
+Require-Bundle:
+ org.eclipse.equinox.common,
org.eclipse.equinox.app;bundle-version="1.3.0";resolution:=optional
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
-Import-Package: org.eclipse.equinox.internal.p2.core.helpers,
+Import-Package:
+ org.eclipse.equinox.internal.p2.core.helpers,
org.eclipse.equinox.internal.p2.engine,
org.eclipse.equinox.p2.core;version="[2.0.0,3.0.0)",
org.eclipse.equinox.p2.engine;version="[2.0.0,3.0.0)",
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.natives/META-INF/p2.inf b/bundles/org.eclipse.equinox.p2.touchpoint.natives/META-INF/p2.inf
deleted file mode 100644
index 2ea1bf303..000000000
--- a/bundles/org.eclipse.equinox.p2.touchpoint.natives/META-INF/p2.inf
+++ /dev/null
@@ -1,43 +0,0 @@
-provides.0.namespace=org.eclipse.equinox.p2.iu
-provides.0.name=org.eclipse.equinox.p2.touchpoint.natives
-provides.0.version=1.1.100.v20140523-0116
-
-provides.1.namespace=org.eclipse.equinox.p2.iu
-provides.1.name=org.eclipse.equinox.p2.touchpoint.natives
-provides.1.version=1.2.0.$qualifier$
-
-provides.2.namespace=org.eclipse.equinox.p2.iu
-provides.2.name=org.eclipse.equinox.p2.touchpoint.natives
-provides.2.version=1.2.100.$qualifier$
-
-provides.3.namespace=org.eclipse.equinox.p2.iu
-provides.3.name=org.eclipse.equinox.p2.touchpoint.natives
-provides.3.version=1.2.200.$qualifier$
-
-provides.4.namespace=org.eclipse.equinox.p2.iu
-provides.4.name=org.eclipse.equinox.p2.touchpoint.natives
-provides.4.version=1.3.0.$qualifier$
-
-provides.5.namespace=org.eclipse.equinox.p2.iu
-provides.5.name=org.eclipse.equinox.p2.touchpoint.natives
-provides.5.version=1.3.100.$qualifier$
-
-provides.6.namespace=org.eclipse.equinox.p2.iu
-provides.6.name=org.eclipse.equinox.p2.touchpoint.natives
-provides.6.version=1.3.200.$qualifier$
-
-provides.7.namespace=org.eclipse.equinox.p2.iu
-provides.7.name=org.eclipse.equinox.p2.touchpoint.natives
-provides.7.version=1.3.300.$qualifier$
-
-provides.8.namespace=org.eclipse.equinox.p2.iu
-provides.8.name=org.eclipse.equinox.p2.touchpoint.natives
-provides.8.version=1.3.400.$qualifier$
-
-provides.9.namespace=org.eclipse.equinox.p2.iu
-provides.9.name=org.eclipse.equinox.p2.touchpoint.natives
-provides.9.version=1.3.500.$qualifier$
-
-provides.10.namespace=org.eclipse.equinox.p2.iu
-provides.10.name=org.eclipse.equinox.p2.touchpoint.natives
-provides.10.version=1.3.600.$qualifier$
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.natives/pom.xml b/bundles/org.eclipse.equinox.p2.touchpoint.natives/pom.xml
index e1425c4e1..f90831920 100644
--- a/bundles/org.eclipse.equinox.p2.touchpoint.natives/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.touchpoint.natives/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.touchpoint.natives</artifactId>
- <version>1.3.600-SNAPSHOT</version>
+ <version>1.4.300-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/BackupStore.java b/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/BackupStore.java
deleted file mode 100644
index 3bd9b5fc5..000000000
--- a/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/BackupStore.java
+++ /dev/null
@@ -1,834 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2018 Cloudsmith Inc. 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:
- * Cloudsmith Inc. - initial API and implementation
- * SAP AG - Ongoing development
- *******************************************************************************/
-
-package org.eclipse.equinox.internal.p2.touchpoint.natives;
-
-import java.io.*;
-import java.net.*;
-import java.util.*;
-import java.util.Map.Entry;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.equinox.internal.p2.core.helpers.LogHelper;
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Stores files by copying them to a uniquely named temporary directory.
- * The BackupStore remembers filenames and can recreate them in their original location.
- *
- * <h3>Usage</h3>
- * The user of this class should instantiate the BackupStore with some prefix that is
- * meaningful to a human. Uniqueness is obtained without the prefix - the prefix is used to
- * be able to differentiate between different backup directories by a human (in case of crashes etc).
- *
- * If instantiated with a directory this directory will be used to store the backup root directory. If
- * this directory is null, the users home directory is used by default.
- *
- * Once instantiated, use the {@link #backup(File)} and {@link #backupDirectory(File)} methods
- * to move files to backup instead of deleting them. A file that
- * is backed up should not be deleted - it is simply moved out of the way.
- * Use {@link #backupCopy(File)} to
- * move the file out of harms way, but keep a copy of it in the original location.
- * The methods {@link #backupAll(File)} and {@link #backupCopyAll(File)} backs up an entire structure.
- *
- * When backup is finished - the user should either call {@link #restore()} to put all
- * of the files back, or call {@link #discard()} to remove all of the backed up "copies".
- *
- * If {@link #restore()} or {@link #discard()} is not called the backup files will never be deleted.
- *
- * The backup store does not synchronize directories - actions that write new files are
- * responsible for removing them. Overwriting existing files should be done by first backing
- * up the file, and then creating a new file. Modifying a file, should be done by
- * using {@link #backupCopy(File)} or
- * first making a copy, then backing up the original, and then renaming the copy.
- *
- * <h3>Read Only and Permissions</h3>
- * Directories that are read only (to current user) can not be backed up.
- * Backup is performed using {@link File#renameTo(File)} and handling of permissions
- * is operating system dependent. It is expected that a Un*x type system retains the
- * permissions as a file is moved to the backup store and later gets restored.
- * Backup directories are created as they are needed and will (at least on Un*x) inherit the
- * permissions from its parent directory.
- *
- * If a rename can not be performed, the backup store will make a copy and delete the original
- * file. This makes it possible to backup and restore across volume boundaries.
- *
- * When restoring directories they
- * will be created with permissions in a platform specific way (on UN*IX they will inherit the permissions
- * of the parent directory).
- *
- * <h3>Checkpointing</h3>
- * Checkpointing (i.e. to be able to rollback to a particular point) can be implemented by using
- * multiple instances of BackupStore. The client code will need to remember the individual order
- * among the backup stores.
- *
- * <h3>Restartability</h3>
- * Not implemented - it is possible to obtain the name of the backup directories,
- * so manual restore is possible after a crash. An idea is to add persistence to a file, and
- * be able to read it back in again.
- *
- * <h3>A note about exceptions</h3>
- * In general {@link IllegalArgumentException} is thrown when attempting an operation
- * that is considered "wrong use", and an {@link IllegalStateException} or subclass thereof is thrown on an overall
- * wrong use of BackupStore (i.e. attempt to backup when store has been restored). Some cases of
- * "wrong use" can not be differentiated from I/O errors (like a "file not found" as this could
- * be caused by an entire disk disappearing - in these case an {@link IOException} is thrown.
- *
- * <h3>Implementation Note</h3>
- * The backup root directory will contain folders that reflects file system roots. These are encoded using
- * "_" for the UNI*X root directory, "__" for a Windows network mounted directory, and single "drive letter" folders
- * corresponding to Windows drive letters. Typically, on UN*X there will only be a "_" directory in the backup root,
- * and on windows there will typically be a single directory called "C".
- *
- *
- */
-public class BackupStore implements IBackupStore {
-
- private static final String BACKUP_FILE_EXTENSION = ".p2bu"; //$NON-NLS-1$
-
- /**
- * The name to use for a directory that represents leading separator (i.e. "/" or "\").
- */
- private static final String ROOTCHAR = "_"; //$NON-NLS-1$
-
- /**
- * Map of directory File to backup root (File) - the backup root has
- * a directory named {@link #backupName} where the backup is found.
- */
- //private Map backups = new HashMap();
- private final File backupRoot;
-
- /**
- * The name of the backup directory (no path - relative to the backup root).
- */
- private final String backupName;
-
- /**
- * The name of a dummy file used to backup empty directories
- */
- private final String dummyName;
-
- /**
- * A server socket that is used to obtain a port (a shared resource on this machine)
- * and thus create a unique number. Used as part of the unique id of backup directories
- * and probe files.
- */
- private ServerSocket socket = null;
-
- /**
- * Counter of how many files where backed up. Used as a simple check mechanism if
- * everything was restored (a guard against manual/external tampering with the backup directories).
- */
- private long backupCounter;
-
- /**
- * Counter of how many files where restored. See {@link #backupCounter}.
- */
- private long restoreCounter;
-
- /**
- * Flag indicating if this BackupStore has been restored or canceled.
- */
- private boolean closed;
-
- private final Map<String, String> renamedInPlace = new HashMap<>();
-
- /**
- * Generates a BackupStore with a default prefix of ".p2bu" for backup directory and
- * probe file.
- * The full id of the store is on the format "prefix_hextime_hexIPport"
- * - see {@link #genUnique()} for more info.
- */
- public BackupStore() {
- this(null, BACKUP_FILE_EXTENSION);
- }
-
- /**
- * Generates a BackupStore with a specified prefix for backup directories and
- * probe file.
- * The full id of the store is on the format "prefix_hextime_hexipport"
- * - see {@link #genUnique()} for more info.
- *
- * @param buParentDirectory - name of directory where the backup directory should be created - if null, java.io.tmpdir is used
- * @param prefix - prefix used for human identification of backup directories
- */
- public BackupStore(File buParentDirectory, String prefix) {
- if (buParentDirectory == null)
- buParentDirectory = new File(System.getProperty("java.io.tmpdir")); //$NON-NLS-1$
- backupRoot = buParentDirectory;
-
- // generate a name for the backup store and the dummy file used for empty directories
- String unique = genUnique();
- dummyName = prefix + "d_" + unique; //$NON-NLS-1$
- backupName = prefix + "_" + unique; //$NON-NLS-1$
- backupCounter = 0;
- restoreCounter = 0;
- closed = false;
- }
-
- /**
- * Since a socket port is used to create a unique number, the socket
- * must be closed if this instance is garbage collected and the user
- * of the instance has not either restored or discarded.
- */
- @Override
- protected void finalize() throws Throwable {
- try {
- if (socket != null && !socket.isClosed())
- socket.close();
- } finally {
- super.finalize();
- }
- }
-
- /**
- * Returns the unique backup name (this is the name of generated backup directories).
- * @return the backup name.
- */
- @Override
- public String getBackupName() {
- return backupName;
- }
-
- public File getBackupRoot() {
- return backupRoot;
- }
-
- /**
- * Backup the file by moving it to the backup store (for later (optional) restore).
- * Calling this method with a file that represents a directory is equivalent to calling
- * {@link #backupDirectory(File)}.
- *
- * A file (path) can only be backed up once per BackupStore instance.
- * When the file is backed up, it is moved to a directory under this BackupStore instance's directory
- * with a relative path corresponding to the original relative path from the backup root e.g.
- * the file /A/B/C/foo.txt could be moved to /A/.p2bu_ffffff_ffffff/B/C/foo.txt when /A is the
- * backup root.
- *
- * If a directory is first backed up, and later replaced by a regular file, and this file
- * is backed up (or vice versa) - an {@link IllegalArgumentException} is thrown
- *
- * A backup can not be performed on a closed BackupStore.
- *
- * @param file - the file (or directory) to backup
- * @return true if the file was backed up, false if this file (path) has already been backed up (the file is not moved to the store).
- * @throws IOException - if the backup operation fails, or the file does not exist
- * @throws ClosedBackupStoreException - if the BackupStore has been closed
- * @throws IllegalArgumentException - on type mismatch (file vs. directory) of earlier backup, or if file does not exist
- */
- @Override
- public boolean backup(File file) throws IOException {
- if (closed)
- throw new ClosedBackupStoreException("Can not perform backup()"); //$NON-NLS-1$
- if (!file.exists())
- throw new IOException(NLS.bind(Messages.BackupStore_file_not_found, file.getAbsolutePath()));
- if (file.isDirectory())
- return backupDirectory(file);
- file = makeParentCanonical(file);
- File buFile = getBackupFile(file);
- // already backed up, but was a directory = wrong usage
- if (buFile.isDirectory())
- throw new IllegalArgumentException(NLS.bind(Messages.BackupStore_directory_file_mismatch, buFile.getAbsolutePath()));
- // has already been backed up - can only be done once with one BackupStore
- if (buFile.exists()) {
- // although backed up, the file can be still on the file system when, for example,
- // two IUs are unzipping their contents to the same location and share a few common file,
- // which have to be removed twice
- if (file.exists() && !file.delete())
- throw new IOException(NLS.bind(Messages.BackupStore_can_not_remove, file.getAbsolutePath()));
- return false;
- }
-
- moveToBackup(file, buFile);
-
- return true;
- }
-
- /**
- * Move/rename file to a backup file. Callers of the method must have ensured that the source file exists and the
- * backup file has not been created yet.
- *
- * @param file source file to move; should already exist and must not be directory
- * @param buFile destination backup file to move to; should not exist and must be a directory
- * @throws IOException if the backup operation fails
- */
- protected void moveToBackup(File file, File buFile) throws IOException {
- // make sure all of the directories exist / gets created
- buFile.getParentFile().mkdirs();
- if (buFile.getParentFile().exists() && !buFile.getParentFile().isDirectory())
- throw new IllegalArgumentException(NLS.bind(Messages.BackupStore_file_directory_mismatch, buFile.getParentFile().getAbsolutePath()));
- if (moveToBackupStore(file, buFile)) {
- backupCounter++;
- return;
- }
- // could not move - this can happen because source and target are on different volumes, or
- // that source is locked "in use" on a windows machine. The copy will work across volumes,
- // but the locked file will fail on the subsequent delete.
- //
- // Rename in place
- if (isEclipseExe(file))
- renameInPlace(file);
- else {
- Util.copyStream(new FileInputStream(file), true, new FileOutputStream(buFile), true);
- backupCounter++;
- }
-
- // File.exists() is not reliable so always attempt to delete first and check why it may have failed second.
- if (!file.delete() && file.exists())
- throw new IOException(NLS.bind(Messages.BackupStore_can_not_delete_after_copy_0, file));
- }
-
- private boolean isEclipseExe(File file) {
- String launcher = System.getProperty("eclipse.launcher"); //$NON-NLS-1$
- if (launcher != null) {
- String base = new File(launcher).getName();
- if (file.getName().equalsIgnoreCase(base))
- return true;
- }
- return file.getName().equalsIgnoreCase("eclipse.exe") || file.getName().equalsIgnoreCase("eclipsec.exe"); //$NON-NLS-1$ //$NON-NLS-2$
- }
-
- protected boolean moveToBackupStore(File file, File buFile) {
- if (file.renameTo(buFile)) {
- // if the original file still exists, we have a problem.
- if (file.exists()) {
- // If the renamed work, but the file still exists, remove the backup
- // and return false
- if (buFile.exists())
- buFile.delete();
- } else {
- return true;
- }
- }
- return false;
- }
-
- protected void renameInPlace(File file) {
- String newName = file.getAbsolutePath() + getTimeStamp() + BACKUP_FILE_EXTENSION;
- renamedInPlace.put(file.getAbsolutePath(), newName);
- file.renameTo(new File(newName));
- }
-
- protected String getTimeStamp() {
- return "-" + new Date().getTime(); //$NON-NLS-1$
- }
-
- private File getBackupFile(File file) {
- File buRoot = backupRoot;
- File buDir = new File(buRoot, backupName);
- // create the relative path from root and use that in buDir
- File buFile = new File(buDir, makeRelativeFromRoot(file).getPath());
- return buFile;
- }
-
- /**
- * Backs up a file, or everything under a directory.
- *
- * @param file - file to backup or directory
- * @throws IOException if backup operation failed
- */
- @Override
- public void backupAll(File file) throws IOException {
- if (!file.exists())
- return;
- file = makeParentCanonical(file);
- if (file.isDirectory()) {
- File[] files = file.listFiles();
- if (files != null)
- for (File f : files) {
- backupAll(f);
- }
- }
- backup(file);
- }
-
- /**
- * Backs up a file, or everything under a directory.
- * A copy of the backup is left in the original place.
- * @param file
- * @throws IOException
- */
- @Override
- public void backupCopyAll(File file) throws IOException {
- if (!file.exists())
- return;
- file = makeParentCanonical(file);
- if (file.isDirectory()) {
- File[] files = file.listFiles();
- if (files != null)
- for (File f : files) {
- backupCopyAll(f);
- }
- // if directory was empty, it needs to be backed up and then recreated
- //
- if (files == null || files.length == 0) {
- backupDirectory(file);
- file.mkdir();
- }
- } else
- backupCopy(file);
- }
-
- /**
- * Backup the file by moving it to the backup store (for later (optional) restore) but leaving
- * a copy of the contents in the original location.
- * Calling this method with a file that represents a directory throws an {@link IllegalArgumentException}.
- *
- * A file (path) can only be backed up once per BackupStore instance.
- * When the file is backed up, it is moved to a directory under this BackupStore instance's directory
- * with a relative path corresponding to the original relative path from the backup root e.g.
- * the file /A/B/C/foo.txt could be moved to /A/.p2bu_ffffff_ffffff/B/C/foo.txt when /A is the
- * backup root.
- *
- * If a directory is first backed up, and later replaced by a regular file, and this file
- * is backed up (or vice versa) - an {@link IllegalArgumentException} is thrown
- *
- * A backup can not be performed on a closed BackupStore.
- *
- * @param file - the file (or directory) to backup
- * @return true if the file was backed up, false if this file (path) has already been backed up (the file is not moved to the store).
- * @throws IOException - if the backup operation fails, or the file does not exist
- * @throws ClosedBackupStoreException - if the BackupStore has been closed
- * @throws IllegalArgumentException - on type mismatch (file vs. directory) of earlier backup, or if file is a Directory
- */
- @Override
- public boolean backupCopy(File file) throws IOException {
- if (closed)
- throw new ClosedBackupStoreException(Messages.BackupStore_backupCopy_closed_store);
- if (!file.exists())
- throw new IOException(NLS.bind(Messages.BackupStore_file_not_found, file.getAbsolutePath()));
- if (file.isDirectory())
- throw new IllegalArgumentException(NLS.bind(Messages.BackupStore_can_not_copy_directory, file.getAbsolutePath()));
- file = makeParentCanonical(file);
- //File buRoot = backupRoot;
- // File buRoot = findBackupRoot(file);
- File buDir = new File(backupRoot, backupName);
- // move the file
- // create the relative path from root and use that in buDir
- File buFile = new File(buDir, makeRelativeFromRoot(file).getPath());
- // already backed up, but was a directory = wrong usage
- if (buFile.isDirectory())
- throw new IllegalArgumentException(NLS.bind(Messages.BackupStore_directory_file_mismatch, buFile.getAbsolutePath()));
- // has already been backed up - can only be done once with one BackupStore
- if (buFile.exists())
- return false;
-
- // make sure all of the directories exist / gets created
- buFile.getParentFile().getCanonicalFile().mkdirs();
- if (buFile.getParentFile().exists() && !buFile.getParentFile().isDirectory())
- throw new IllegalArgumentException(NLS.bind(Messages.BackupStore_file_directory_mismatch, buFile.getParentFile().getAbsolutePath()));
-
- // just make a copy - one has to be made in one direction anyway
- // A renameTo followed by a copy is preferred as it preserves file permissions on the moved file
- // but it is easier to just copy and keep original.
- Util.copyStream(new FileInputStream(file), true, new FileOutputStream(buFile), true);
- backupCounter++;
- return true;
- }
-
- /**
- * Performs backup of an empty directory. The directory must be empty before it can be backed up (i.e.
- * similar to a delete of a directory). Backup the files of the directory first.
- * A call to backup a directory is really only needed for empty directories as a restore
- * of a file will also restore all of its parent directories.
- * @param file - the (empty) directory to back up
- * @return true if the directory was moved to backup. false if the directory was already backed up
- * @throws IllegalArgumentException if file is not a directory, or is not empty.
- * @throws IOException if directory can not be moved to the backup store, or if the directory is not writeable
- */
- @Override
- public boolean backupDirectory(File file) throws IOException {
- if (!file.isDirectory())
- throw new IllegalArgumentException(NLS.bind(Messages.BackupStore_not_a_directory, file.getAbsolutePath()));
- file = makeParentCanonical(file);
- if (file.list().length != 0)
- throw new IllegalArgumentException(NLS.bind(Messages.BackupStore_directory_not_empty, file.getAbsolutePath()));
- // the easiest way is to create a dummy file and back that up (the dummy is simply ignored when restoring).
- File dummy = new File(file, dummyName);
- dummy = makeParentCanonical(dummy);
- File buFile = getBackupFile(dummy);
- boolean backedUp = buFile.exists();
- // backup only if the folder has not been already backed up;
- // this can happen if, for example, two IUs unzip to the same folder and then want to delete it
- if (!backedUp) {
- if (closed)
- throw new ClosedBackupStoreException("Can not perform backup()"); //$NON-NLS-1$
- if (!dummy.createNewFile())
- throw new IOException(NLS.bind(Messages.BackupStore_can_not_create_dummy, dummy.getAbsolutePath()));
- moveToBackup(dummy, buFile);
- }
- // previous checks have verified that the directory exists
- if (!file.delete())
- throw new IOException(NLS.bind(Messages.BackupStore_can_not_remove, dummy.getAbsolutePath()));
- // will return true if the directory was already backed up at the beginning of the operation and false otherwise
- return !backedUp;
- }
-
- /**
- * Restores all backup files from backup store.
- * Note that restore of a (non directory) file deletes an existing file or directory found
- * in the restore location.
- * When the backup has been restored this BackupStore instance is closed and can not be
- * used for further backup or restore.
- *
- * If there are unrestorable items (non writable directories, or general IO exceptions) these items
- * are written to the log, and the backup copies remain in the file system and can be manually restored
- * (using a simple zip of the backup directory, and an unzip to the buRoot once the problem has been corrected).
- *
- * @throws IOException if the backup was not fully restored - unrestored items have been logged.
- * @throws ClosedBackupStoreException if the backup is already closed.
- */
- @Override
- public void restore() throws IOException {
- if (closed)
- throw new ClosedBackupStoreException(Messages.BackupStore_restore_closed_store);
- // put back all files
- // collect things that could not be restored (so final status can be reported)
- Set<File> unrestorable = new HashSet<>();
- boolean restored = true;
- if (!backupRoot.exists()) {
- logError(NLS.bind(Messages.BackupStore_missing_backup_directory, backupRoot.getAbsolutePath()));
- restored = false;
- } else
- restoreRoots(new File(backupRoot, backupName), unrestorable);
-
- logUnrestorables(unrestorable);
- if (unrestorable.size() > 0)
- restored = false;
- close(restored);
- closed = true;
- }
-
- private void logUnrestorables(Set<File> unrestorable) {
- // if there are unrestorable units log them
- //
- if (unrestorable != null && unrestorable.size() > 0) {
- for (File file : unrestorable)
- logError(NLS.bind(Messages.BackupStore_manual_restore_needed, file.getAbsolutePath()));
- }
- }
-
- /**
- * Discards and closes this BackupStore. Does nothing if this store is already
- * restored or discarded.
- */
- @Override
- public void discard() {
- if (closed)
- return;
- closeSocket();
- removeBackups();
- closed = true;
- }
-
- private void close(boolean fullyRestored) throws IOException {
- closeSocket();
- // check external tampering with backup store
- if (backupCounter != restoreCounter) {
- if (!fullyRestored)
- logError(NLS.bind(Messages.BackupStore_0_of_1_items_restored, Long.valueOf(restoreCounter), Long.valueOf(backupCounter)));
- else {
- logError(NLS.bind(Messages.BackupStore_externally_modified_0_of_1_restored, Long.valueOf(restoreCounter), Long.valueOf(backupCounter)));
- fullyRestored = false;
- }
- }
- if (!fullyRestored)
- throw new IOException(Messages.BackupStore_errors_while_restoring_see_log);
- // everything has been restored - the backup can now be removed
- removeBackups();
- }
-
- private void closeSocket() {
- if (socket != null && !socket.isClosed())
- try {
- socket.close();
- } catch (IOException e) { /* ignored */
- logWarning(NLS.bind(Messages.BackupStore_can_not_close_tcp_port, Integer.valueOf(socket.getLocalPort())));
- }
- }
-
- private void removeBackups() {
- File buRoot = new File(backupRoot, backupName);
- if (!fullyDelete(buRoot))
- logWarning(NLS.bind(Messages.BackupStore_can_not_remove_bu_directory, buRoot.getAbsolutePath()));
- for (String newName : renamedInPlace.values()) {
- File buFile = new File(newName);
- if (!fullyDelete(buFile)) {
- logWarning(NLS.bind(Messages.BackupStore_can_not_remove_bu_file, buRoot.getAbsolutePath()));
- }
- }
- }
-
- private static void logWarning(String message) {
- LogHelper.log(createWarning(message));
- }
-
- private static IStatus createWarning(String message) {
- return new Status(IStatus.WARNING, Activator.ID, message);
- }
-
- private static void logError(String message) {
- LogHelper.log(createError(message));
- }
-
- private static IStatus createError(String message) {
- return new Status(IStatus.ERROR, Activator.ID, message);
- }
-
- /**
- * Deletes a file, or a directory with all of it's children.
- * @param file the file or directory to fully delete
- * @return true if, and only if the file is deleted without errors
- */
- private boolean fullyDelete(File file) {
- if (file.isDirectory()) {
- File[] children = file.listFiles();
- if (children != null) {
- for (File child : children) {
- // we will not stop even if some deletion failed
- fullyDelete(new File(file, child.getName()));
- }
- }
- }
- // will attempt to delete before exists check to get rid of dead links
- if (file.delete()) {
- return true;
- }
- // will return true if files does not actually exist even delete fails
- return !file.exists();
- }
-
- private void restore(File root, File buRoot, Set<File> unrestorable) {
- File[] children = buRoot.listFiles();
- if (children == null) { // error - can't read the backup directory
- unrestorable.add(buRoot);
- return;
- }
- for (File child : children) {
- File bu = new File(buRoot, child.getName());
- File target = new File(root, bu.getName());
- if (bu.isDirectory()) {
- if (!target.exists() && !target.mkdir()) {
- unrestorable.add(bu);
- continue; // give up on this branch
- } else if (target.exists() && !target.isDirectory()) {
- // ouch, there is a file where we need a directory
- // that must be deleted.
- target.delete();
- if (!target.mkdir()) {
- unrestorable.add(bu);
- continue; // give up on branch
- }
- }
- restore(target, bu, unrestorable);
- } else {
- // do not restore the dummies (as they are used to trigger creation of
- // empty directories and are not wanted in the restored location.
- if (bu.getName().equals(dummyName)) {
- restoreCounter++; // count of the restored directory in this case.
- continue;
- }
- // if the original was overwritten by something and this file was not
- // removed, it needs to be deleted now. If it can't be deleted, the
- // renameTo will fail, and the bu is reported as not restorable.
- // fullyDelete will remove a directory completely - we are restoring a file so it can
- // not be kept.
- if (target.exists())
- fullyDelete(target);
-
- // rename if possible, but must copy if not possible to just rename
- if (!bu.renameTo(target)) {
- // did not work to rename, probably because of volume boundaries. Try to copy instead,
- try {
- Util.copyStream(new FileInputStream(bu), true, new FileOutputStream(target), true);
- restoreCounter++; // consider it restored
- } catch (FileNotFoundException e) {
- unrestorable.add(bu);
- continue;
- } catch (IOException e) {
- unrestorable.add(bu);
- continue;
- }
- if (!bu.delete()) { // cleanup
- // could not remove the backup after copy - log, safe to remove manually
- logWarning(NLS.bind(Messages.BackupStore_can_not_delete_tmp_file, bu.getAbsolutePath()));
- }
- } else
- restoreCounter++;
- }
- }
- }
-
- /**
- * Restores everything backed up in the buRoot. Responsible for decoding the specially named root
- * target directories (i.e. _/, __/, C/, etc.) into the real system names.
- * @param buRoot
- * @param unrestorable
- */
- private void restoreRoots(File buRoot, Set<File> unrestorable) {
- File[] children = buRoot.listFiles();
- if (children == null) { // error - can't read the backup directory
- unrestorable.add(buRoot);
- return;
- }
- for (File child : children) {
- // Names are root-chars, or drive letters in the root bu directory
- String name = child.getName();
- String rName = name;
- String prefix = ""; //$NON-NLS-1$
- while (rName.startsWith(ROOTCHAR)) {
- prefix += File.separator;
- rName = rName.substring(1);
- }
- if (prefix.length() < 1) {
- // The name is a drive name
- rName = rName + ":" + File.separator; //$NON-NLS-1$
- } else
- rName = prefix + rName;
- // File root = new File(rName);
- File bu = new File(buRoot, name);
- File target = new File(rName);
- if (!bu.isDirectory()) {
- // the roots should all be directories - so this can only happen if someone manually
- // stored files in the backup root - mark them as unrestorable and continue.
- unrestorable.add(bu);
- continue;
- }
- // the backup roots are system roots, and can not be created - but check root is directory and exists.
- // (Network drives could have gone away etc).
- //
- if (!(target.exists() && target.isDirectory())) {
- unrestorable.add(bu);
- continue; // give up on this branch
- }
- // then perform a recursive restore
- restore(target, bu, unrestorable);
- }
- restoreRenamedFiles(unrestorable);
- }
-
- private void restoreRenamedFiles(Set<File> unrestorable) {
- for (Entry<String, String> entry : renamedInPlace.entrySet()) {
- File bu = new File(entry.getValue());
- if (!bu.renameTo(new File(entry.getKey())))
- unrestorable.add(bu);
- }
- }
-
- private static long msCounter = 0;
-
- /**
- * Generates a unique hex string by taking currentTimeMillis + sequence
- * number at the end allowing for 32 numbers to be generated per ms.
- * This is sufficient uniqueness in the same VM. (And is still just a fallback solution
- * if there is no access to a TCP port)
- *
- * To make number unique over multiple VMs - the PID of the process would be enough, but
- * it is complicated to get hold of - a separate program must be launched and its PPID
- * investigated. There is no standard API in Java to get the PID. Instead, a socket port is bound
- * to ensure local uniqueness.
- *
- * To make number unique across multiple hosts (we may be provisioning over NFS), the
- * 48 LS bits of the IP address is used (this is more than enough for an IPv4 address).
- * (If there is no IP address, the machine is not on a
- * network) - unfortunately the MAC address can not be used as this requires Java 6 (where
- * there also is a UUID that should be used instead of this method).
- *
- * This method needs to be modified when IPv6 addressing is the norm - at that time, the
- * restriction on Java 1.4 has hopefully been lifted, and it is possible to use the MAC address,
- * or the UUID provided since java 1.6
- *
- * @return a unique string
- */
- private String genUnique() {
- // use 5 LSB bits for counter within ms - i.e. 32 instances can be created
- // per millisecond.
- long timePart = (System.currentTimeMillis() << 5) | (msCounter++ & 31);
- // can't use the MAC address - but take IP address if provisioning across NFS
- long ipPart = 0;
- try {
- // the returned address can be 32 bits IPv4, or 128 bits IPv6 (?)
- // In any case use the LSB bits (as many as will fit
- byte[] address = InetAddress.getLocalHost().getAddress();
- for (int i = 0; i < address.length; i++)
- ipPart = ((ipPart << 8) | (address[i] & 0xff));
- } catch (UnknownHostException e) {
- // there is no IP address, and there and hence no concurrency from other machines.
- // use the default ip part 0
- }
- int port = 0;
- try {
- // TODO: this should be replaced by InetAddress.getLoopbackAddress() when 1.7 compatibility is OK
- // on a system where solely IPv6 is available this address resolution will fail:
- socket = new ServerSocket(0, 1, InetAddress.getByName("127.0.0.1")); //$NON-NLS-1$
- port = socket.getLocalPort();
- } catch (IOException e) {
- try {
- if (socket != null)
- socket.close();
- } catch (IOException e1) { // ignore failure to close -
- }
- // use a random number as port in this case
- port = new Random().nextInt() & 0xffff;
- }
- // port is never > 0xffff
- long aPart = (ipPart << 16) | (port & 0xffff);
- return Long.toHexString(timePart) + "_" + Long.toHexString(aPart); //$NON-NLS-1$
-
- }
-
- /**
- * Turns a file into a "relativized" absolute file.
- * A leading "root" is transformed to the ROOTCHAR character. On Windows, network mapped drives starts
- * with two separators - and are encoded as two ROOTCHAR.
- * e.g.
- * \\Host\C$\File becomes __\Host\C$\File
- * /users/test/file becomes _/users/test/file
- * C:/somewhere/file becomes C/somewhere/file
- *
- * @param file
- * @return a relativized absolute abstract file
- */
- private File makeRelativeFromRoot(File file) {
- File absolute = file.getAbsoluteFile();
- String path = absolute.getPath();
- String prefix = ""; //$NON-NLS-1$
- while (path.startsWith(File.separator)) {
- prefix += ROOTCHAR;
- path = path.substring(1);
- }
- if (prefix.length() > 0) {
- path = prefix + File.separator + path;
- return new File(path);
- }
- // it is a windows drive letter first.
- // Transform C:/foo to C/foo
- //
- int idx = path.indexOf(":"); //$NON-NLS-1$
- if (idx < 1)
- throw new InternalError("File is neither absolute nor has a drive name: " + path); //$NON-NLS-1$
- path = path.substring(0, idx) + path.substring(idx + 1);
-
- return new File(path);
- }
-
- /**
- * The parent path may include ".." as a directory name - this must be made canonical. But if the file itself is
- * a symbolic link, it should not be resolved.
- */
- private File makeParentCanonical(File file) throws IOException {
- return new File(file.getParentFile().getCanonicalFile(), file.getName());
- }
-}
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/LazyBackupStore.java b/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/LazyBackupStore.java
index 9ea5d5f56..f0aae9319 100644
--- a/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/LazyBackupStore.java
+++ b/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/LazyBackupStore.java
@@ -21,7 +21,7 @@ import java.io.IOException;
* when needed.
*/
public class LazyBackupStore implements IBackupStore {
- private BackupStore delegate;
+ private SimpleBackupStore delegate;
private final String prefix;
/**
@@ -61,7 +61,7 @@ public class LazyBackupStore implements IBackupStore {
private void loadDelegate() {
if (delegate != null)
return;
- delegate = new BackupStore(null, prefix);
+ delegate = new SimpleBackupStore(null, prefix);
}
@Override
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/Messages.java b/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/Messages.java
index 87e0a837e..9a3bd9c03 100644
--- a/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/Messages.java
+++ b/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/Messages.java
@@ -26,10 +26,10 @@ public class Messages extends NLS {
}
public static String BackupStore_0_of_1_items_restored;
- public static String BackupStore_backupCopy_closed_store;
- public static String BackupStore_can_not_close_tcp_port;
+ public static String BackupStore_externally_modified_0_of_1_restored;
+ public static String BackupStore_errors_while_restoring_see_log;
public static String BackupStore_can_not_copy_directory;
- public static String BackupStore_can_not_create_dummy;
+ public static String BackupStore_can_not_create_placeholder;
public static String BackupStore_can_not_delete_after_copy_0;
public static String BackupStore_can_not_delete_tmp_file;
public static String BackupStore_can_not_remove;
@@ -37,14 +37,12 @@ public class Messages extends NLS {
public static String BackupStore_can_not_remove_bu_file;
public static String BackupStore_directory_file_mismatch;
public static String BackupStore_directory_not_empty;
- public static String BackupStore_errors_while_restoring_see_log;
- public static String BackupStore_externally_modified_0_of_1_restored;
public static String BackupStore_file_directory_mismatch;
public static String BackupStore_file_not_found;
public static String BackupStore_manual_restore_needed;
public static String BackupStore_missing_backup_directory;
public static String BackupStore_not_a_directory;
- public static String BackupStore_restore_closed_store;
+ public static String BackupStore_closed_store;
public static String BlockMacUpdate_0;
public static String BlockMacUpdate_1;
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/SimpleBackupStore.java b/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/SimpleBackupStore.java
new file mode 100644
index 000000000..b1c0261d7
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/SimpleBackupStore.java
@@ -0,0 +1,895 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2018 Cloudsmith Inc. 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:
+ * Cloudsmith Inc. - initial API and implementation
+ * SAP AG - Ongoing development
+ *******************************************************************************/
+
+package org.eclipse.equinox.internal.p2.touchpoint.natives;
+
+import static java.nio.file.FileVisitResult.CONTINUE;
+import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
+import static java.util.stream.Collectors.joining;
+import static org.eclipse.equinox.internal.p2.touchpoint.natives.Util.logError;
+import static org.eclipse.equinox.internal.p2.touchpoint.natives.Util.logWarning;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.*;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.*;
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * Stores files by moving them to a uniquely named temporary directory.
+ *
+ * TheBackupStore remembers filenames and can recreate them in their original
+ * location.
+ *
+ * <h3>Usage</h3> The user of this class should instantiate the BackupStore with
+ * some prefix that is meaningful to a human. Uniqueness is obtained without the
+ * prefix - the prefix is used to be able to differentiate between different
+ * backup directories by a human (in case of crashes etc).
+ *
+ * If instantiated with a directory this directory will be used to store the
+ * backup root directory. If this directory is null, the users home directory is
+ * used by default.
+ *
+ * Once instantiated, use the {@link #backup(File)} and
+ * {@link #backupDirectory(File)} methods to move files to backup instead of
+ * deleting them. A file that is backed up should not be deleted - it is simply
+ * moved out of the way. Use {@link #backupCopy(File)} to move the file out of
+ * harms way, but keep a copy of it in the original location. The methods
+ * {@link #backupAll(File)} and {@link #backupCopyAll(File)} backs up an entire
+ * structure.
+ *
+ * When backup is finished - the user should either call {@link #restore()} to
+ * put all of the files back, or call {@link #discard()} to remove all of the
+ * backed up "copies".
+ *
+ * If {@link #restore()} or {@link #discard()} is not called the backup files
+ * will never be deleted.
+ *
+ * The backup store does not synchronize directories - actions that write new
+ * files are responsible for removing them. Overwriting existing files should be
+ * done by first backing up the file, and then creating a new file. Modifying a
+ * file, should be done by using {@link #backupCopy(File)} or first making a
+ * copy, then backing up the original, and then renaming the copy.
+ *
+ * <h3>Read Only and Permissions</h3> Directories that are read only (to current
+ * user) can not be backed up. Backup is performed using
+ * {@link File#renameTo(File)} and handling of permissions is operating system
+ * dependent. It is expected that a Un*x type system retains the permissions as
+ * a file is moved to the backup store and later gets restored. Backup
+ * directories are created as they are needed and will (at least on Un*x)
+ * inherit the permissions from its parent directory.
+ *
+ * If a rename can not be performed, the backup store will make a copy and
+ * delete the original file. This makes it possible to backup and restore across
+ * volume boundaries.
+ *
+ * When restoring directories they will be created with permissions in a
+ * platform specific way (on UN*IX they will inherit the permissions of the
+ * parent directory).
+ *
+ * <h3>Checkpointing</h3> Checkpointing (i.e. to be able to rollback to a
+ * particular point) can be implemented by using multiple instances of
+ * BackupStore. The client code will need to remember the individual order among
+ * the backup stores.
+ *
+ * <h3>Restartability</h3> Not implemented - it is possible to obtain the name
+ * of the backup directories, so manual restore is possible after a crash. An
+ * idea is to add persistence to a file, and be able to read it back in again.
+ *
+ * <h3>A note about exceptions</h3> In general {@link IllegalArgumentException}
+ * is thrown when attempting an operation that is considered "wrong use", and an
+ * {@link IllegalStateException} or subclass thereof is thrown on an overall
+ * wrong use of BackupStore (i.e. attempt to backup when store has been
+ * restored). Some cases of "wrong use" can not be differentiated from I/O
+ * errors (like a "file not found" as this could be caused by an entire disk
+ * disappearing - in these case an {@link IOException} is thrown.
+ *
+ * <h3>Implementation Note</h3> The backup root directory will contain folders
+ * that reflects file system roots. These are encoded using "_" for the UNI*X
+ * root directory, "__" for a Windows network mounted directory, and single
+ * "drive letter" folders corresponding to Windows drive letters. Typically, on
+ * UN*X there will only be a "_" directory in the backup root, and on windows
+ * there will typically be a single directory called "C".
+ */
+public class SimpleBackupStore implements IBackupStore {
+ public static final String BACKUP_FILE_EXTENSION = "p2bu"; //$NON-NLS-1$
+
+ public static final String DIR_PLACEHOLDER = "emptydir"; //$NON-NLS-1$
+
+ /**
+ * The name to use for a directory that represents leading separator (i.e. "/"
+ * or "\").
+ */
+ private static final String ROOTCHAR = "_"; //$NON-NLS-1$
+
+ /**
+ * Map of directory File to backup root (File) - the backup root has a directory
+ * named {@link #buStoreName} where the backup is found.
+ */
+ private final Path buStoreRoot;
+
+ private String buInPlaceSuffix;
+
+ /**
+ * Backup files that sit next to the original rather than in the backup store.
+ */
+ private List<Path> buInPlace;
+
+ /**
+ * Counter of how many files where backed up. Used as a simple check mechanism
+ * if everything was restored (a guard against manual/external tampering with
+ * the backup directories).
+ */
+ private long backupCounter;
+
+ /**
+ * Counter of how many files where restored. See {@link #backupCounter}.
+ */
+ private long restoreCounter;
+
+ /**
+ * Flag indicating if this BackupStore has been restored or canceled.
+ */
+ private boolean closed;
+
+ /**
+ * Generates a BackupStore with a default prefix of ".p2bu" for backup directory
+ * and probe file.
+ */
+ public SimpleBackupStore() {
+ this(null, "." + BACKUP_FILE_EXTENSION); //$NON-NLS-1$
+ }
+
+ /**
+ * Generates a BackupStore with a specified prefix for backup directories and
+ * probe file.
+ *
+ * @param buStoreParent Parent under which the backup store will be created. If
+ * null, java.io.tmpdir is used
+ * @param prefix Prefix used for human identification of backup stores.
+ */
+ public SimpleBackupStore(File buStoreParent, String prefix) {
+ String unique = UUID.randomUUID().toString();
+
+ String buStoreName = prefix + "_" + unique; //$NON-NLS-1$
+ this.buStoreRoot = (buStoreParent != null) ? buStoreParent.toPath().resolve(buStoreName)
+ : Paths.get(System.getProperty("java.io.tmpdir")).resolve(buStoreName); //$NON-NLS-1$
+
+ this.buInPlaceSuffix = String.format("-%s.%s", unique, BACKUP_FILE_EXTENSION); //$NON-NLS-1$
+ this.buInPlace = new ArrayList<>();
+ }
+
+ /**
+ * Returns the unique backup name (this is the name of generated backup
+ * directories).
+ *
+ * @return the backup name.
+ */
+ @Override
+ public String getBackupName() {
+ return buStoreRoot.getFileName().toString();
+ }
+
+ /**
+ * @return the parent dire under which backups are created
+ */
+ public File getBackupRoot() {
+ return buStoreRoot.toFile();
+ }
+
+ /**
+ * Backup the file by moving it to the backup store (for later (optional)
+ * restore). Calling this method with a file that represents a directory is
+ * equivalent to calling {@link #backupDirectory(File)}.
+ *
+ * A file (path) can only be backed up once per BackupStore instance. When the
+ * file is backed up, it is moved to a directory under this BackupStore
+ * instance's directory with a relative path corresponding to the original
+ * relative path from the backup root e.g. the file /A/B/C/foo.txt could be
+ * moved to /A/.p2bu_ffffff_ffffff/B/C/foo.txt when /A is the backup root.
+ *
+ * If a directory is first backed up, and later replaced by a regular file, and
+ * this file is backed up (or vice versa) - an {@link IllegalArgumentException}
+ * is thrown
+ *
+ * A backup can not be performed on a closed BackupStore.
+ *
+ * @param file - the file (or directory) to backup
+ *
+ * @return true if the file was backed up, false if this file (path) has already
+ * been backed up (the file is not moved to the store).
+ *
+ * @throws IOException - if the backup operation fails, or the
+ * file does not exist
+ * @throws ClosedBackupStoreException - if the BackupStore has been closed
+ * @throws IllegalArgumentException - on type mismatch (file vs. directory) of
+ * earlier backup, or if file does not exist
+ */
+ @Override
+ public boolean backup(File file) throws IOException {
+ assertOpen();
+
+ Path path = file.toPath();
+
+ if (Files.isDirectory(path)) {
+ return backupDirectory(path.toFile());
+ }
+
+ if (!Files.exists(path)) {
+ throw new IOException(NLS.bind(Messages.BackupStore_file_not_found, path.toAbsolutePath()));
+ }
+
+ Path buPath = toBackupPath(path);
+
+ // Already backed up, but was a directory - wrong usage
+ if (Files.isDirectory(buPath)) {
+ throw new IllegalArgumentException(
+ NLS.bind(Messages.BackupStore_directory_file_mismatch, buPath.toAbsolutePath()));
+ }
+
+ return moveToBackup(path, buPath);
+ }
+
+ /**
+ * Performs backup of an empty directory.
+ *
+ * The directory must be empty before it can be backed up (i.e. similar to a
+ * delete of a directory). The called must backup the files of the directory
+ * first. A call to backup a directory is really only needed for empty
+ * directories as a restore of a file will also restore all of its parent
+ * directories.
+ *
+ * @param file - the (empty) directory to back up
+ *
+ * @return true if the directory was moved to backup. false if the directory was
+ * already backed up.
+ *
+ * @throws IllegalArgumentException if file is not a directory, or is not empty.
+ * @throws IOException if directory can not be moved to the backup
+ * store, or if the directory is not writeable
+ */
+ @Override
+ public boolean backupDirectory(File file) throws IOException {
+ assertOpen();
+
+ Path path = file.toPath();
+
+ if (!Files.isDirectory(path)) {
+ throw new IllegalArgumentException(NLS.bind(Messages.BackupStore_not_a_directory, file.getAbsolutePath()));
+ }
+
+ if (Files.list(path).count() > 0) {
+ throw new IllegalArgumentException(
+ NLS.bind(Messages.BackupStore_directory_not_empty, file.getAbsolutePath()));
+ }
+
+ return moveDirToBackup(path);
+ }
+
+ /**
+ * Backs up a file, or everything under a directory.
+ *
+ * @param file - file to backup or directory
+ *
+ * @throws IOException if backup operation failed
+ */
+ @Override
+ public void backupAll(File file) throws IOException {
+ assertOpen();
+
+ Path path = file.toPath().normalize();
+
+ Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
+ @Override
+ public FileVisitResult visitFile(Path f, BasicFileAttributes attrs) throws IOException {
+ backup(f.toFile());
+ return CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+ if (exc != null) {
+ throw exc;
+ }
+ moveDirToBackup(dir);
+ return CONTINUE;
+ }
+ });
+ }
+
+ /**
+ * Backup the file by leaving a copy of the contents in the original location.
+ *
+ * Calling this method with a file that represents a directory throws an
+ * {@link IllegalArgumentException}.
+ *
+ * A file (path) can only be backed up once per BackupStore instance. When the
+ * file is backed up, it is moved to a directory under this BackupStore
+ * instance's directory with a relative path corresponding to the original
+ * relative path from the backup root e.g. the file /A/B/C/foo.txt could be
+ * moved to /A/.p2bu_ffffff_ffffff/B/C/foo.txt when /A is the backup root.
+ *
+ * If a directory is first backed up, and later replaced by a regular file, and
+ * this file is backed up (or vice versa) - an {@link IllegalArgumentException}
+ * is thrown
+ *
+ * A backup can not be performed on a closed BackupStore.
+ *
+ * @param file - the file (or directory) to backup
+ *
+ * @return true if the file was backed up, false if this file (path) has already
+ * been backed up (the file is not moved to the store).
+ *
+ * @throws IOException if the backup operation fails, or the file
+ * does not exist
+ * @throws ClosedBackupStoreException if the BackupStore has been closed
+ * @throws IllegalArgumentException on type mismatch (file vs. directory) of
+ * earlier backup, or if file is a Directory
+ */
+ @Override
+ public boolean backupCopy(File file) throws IOException {
+ assertOpen();
+
+ Path path = file.toPath();
+
+ if (!Files.exists(path)) {
+ throw new IOException(NLS.bind(Messages.BackupStore_file_not_found, file.getAbsolutePath()));
+ }
+
+ if (Files.isDirectory(path)) {
+ throw new IllegalArgumentException(
+ NLS.bind(Messages.BackupStore_can_not_copy_directory, file.getAbsolutePath()));
+ }
+
+ Path buPath = toBackupPath(path);
+
+ // Already backed up, but was a directory = wrong usage
+ if (Files.isDirectory(buPath)) {
+ throw new IllegalArgumentException(
+ NLS.bind(Messages.BackupStore_directory_file_mismatch, buPath.toAbsolutePath()));
+ }
+
+ // Already backed up, can only be done once with one BackupStore
+ if (Files.exists(buPath)) {
+ return false;
+ }
+
+ Files.createDirectories(buPath.getParent());
+ Files.copy(path, buPath, REPLACE_EXISTING);
+
+ backupCounter++;
+ return true;
+ }
+
+ /**
+ * Backs up a file, or everything under a directory.
+ *
+ * A copy of the backup is left in the original place.
+ *
+ * @param file
+ *
+ * @throws IOException
+ */
+ @Override
+ public void backupCopyAll(File file) throws IOException {
+ assertOpen();
+
+ Path path = file.toPath();
+ if (!Files.exists(path)) {
+ return;
+ }
+
+ path = path.normalize();
+
+ if (Files.isRegularFile(path, LinkOption.NOFOLLOW_LINKS)) {
+ backupCopy(file);
+ } else if (Files.isDirectory(path)) {
+ Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
+ @Override
+ public FileVisitResult visitFile(Path f, BasicFileAttributes attrs) throws IOException {
+ backupCopy(f.toFile());
+ return CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+ if (exc != null) {
+ throw exc;
+ }
+ copyDirToBackup(dir);
+ return CONTINUE;
+ }
+ });
+ }
+ }
+
+ /**
+ * Restores all backup files from backup store. Note that restore of a (non
+ * directory) file deletes an existing file or directory found in the restore
+ * location. When the backup has been restored this BackupStore instance is
+ * closed and can not be used for further backup or restore.
+ *
+ * If there are unrestorable items (non writable directories, or general IO
+ * exceptions) these items are written to the log, and the backup copies remain
+ * in the file system and can be manually restored (using a simple zip of the
+ * backup directory, and an unzip to the buRoot once the problem has been
+ * corrected).
+ *
+ * @throws IOException if the backup was not fully restored -
+ * unrestored items have been logged.
+ * @throws ClosedBackupStoreException if the backup is already closed.
+ */
+ @Override
+ public void restore() throws IOException {
+ assertOpen();
+ closed = true;
+
+ // Put back all files.
+ // Collect things that could not be restored
+ Map<Path, Throwable> unrestorable = new HashMap<>();
+
+ restoreBackups(unrestorable);
+ restoreInPlaceBackups(unrestorable);
+
+ boolean restored = true;
+
+ // Checked failed attempts to restore
+ if (!unrestorable.isEmpty()) {
+ restored = false;
+
+ unrestorable.forEach((p, err) -> {
+ logError(NLS.bind(Messages.BackupStore_manual_restore_needed, err, p.toAbsolutePath()));
+ });
+ }
+
+ // Check external tampering with backup store
+ if (backupCounter != restoreCounter) {
+ restored = false;
+
+ if (!unrestorable.isEmpty()) {
+ logError(NLS.bind(Messages.BackupStore_0_of_1_items_restored, restoreCounter, backupCounter));
+ } else {
+ logError(NLS.bind(Messages.BackupStore_externally_modified_0_of_1_restored, restoreCounter,
+ backupCounter));
+ }
+ }
+
+ if (!restored) {
+ throw new IOException(Messages.BackupStore_errors_while_restoring_see_log);
+ }
+ }
+
+ /**
+ * Discards and closes this BackupStore. Does nothing if this store is already
+ * restored or discarded.
+ */
+ @Override
+ public void discard() {
+ if (closed) {
+ return;
+ }
+ closed = true;
+
+ try {
+ deleteAll(buStoreRoot);
+ } catch (IOException e) {
+ logWarning(NLS.bind(Messages.BackupStore_can_not_remove_bu_directory, buStoreRoot.toAbsolutePath()));
+ }
+
+ for (Path buFile : buInPlace) {
+ try {
+ deleteAll(buFile);
+ } catch (IOException e) {
+ logWarning(NLS.bind(Messages.BackupStore_can_not_remove_bu_file, buFile.toAbsolutePath()));
+ }
+ }
+ }
+
+ private void assertOpen() {
+ if (closed) {
+ throw new ClosedBackupStoreException(Messages.BackupStore_closed_store);
+ }
+ }
+
+ /**
+ * Makes sure a directory exists in the backup store without touching the original directory content
+ *
+ * @param path
+ *
+ * @return false if the directory is already created in the backup store, false if a placeholder had
+ * to be created and backed up.
+ *
+ * @throws IOException
+ */
+ private boolean copyDirToBackup(Path path) throws IOException {
+ Path buPath = toBackupPath(path);
+
+ if (Files.exists(buPath)) {
+ return false;
+ }
+
+ Path placeholderPath = path.resolve(DIR_PLACEHOLDER);
+ try {
+ Files.createFile(placeholderPath);
+ } catch (IOException e) {
+ throw new IOException(
+ NLS.bind(Messages.BackupStore_can_not_create_placeholder, placeholderPath.toAbsolutePath()), e);
+ }
+
+ Path buPlaceholderPath = buPath.resolve(DIR_PLACEHOLDER);
+ moveToBackup(placeholderPath, buPlaceholderPath);
+ return true;
+ }
+
+ private boolean moveDirToBackup(Path dir) throws IOException {
+ boolean copied = copyDirToBackup(dir);
+
+ try {
+ Files.delete(dir);
+ } catch (IOException e) {
+ throw new IOException(NLS.bind(Messages.BackupStore_can_not_remove, dir.toAbsolutePath()));
+ }
+
+ return copied;
+ }
+
+ /**
+ * Move/rename file to a backup file.
+ *
+ * Exposed for testing purposes.
+ *
+ * Callers of the method must have ensured that the source file exists and the
+ * backup file does not exist.
+ *
+ * @param file source file to move; should already exist and must not be
+ * directory
+ * @param buFile destination backup file to move to; should not exist and must
+ * be a directory
+ *
+ * @throws IOException if the backup operation fails
+ */
+ private boolean moveToBackup(Path path, Path buPath) throws IOException {
+ // Already backed up. Can only be done once with one BackupStore.
+ if (Files.exists(buPath)) {
+ /*
+ * Although backed up, the file can be still on the file system. For example,
+ * two IUs may be unzipping their contents to the same location and share a few
+ * common files, which have to be removed twice.
+ */
+ try {
+ Files.delete(path);
+ } catch (IOException e) {
+ throw new IOException(NLS.bind(Messages.BackupStore_can_not_remove, path.toAbsolutePath()), e);
+ }
+
+ return false;
+ }
+
+ // make sure all of the directories exist / gets created
+ Path buPathDir = buPath.getParent();
+ try {
+ Files.createDirectories(buPathDir);
+ } catch (IOException e) {
+ throw new IllegalArgumentException(
+ NLS.bind(Messages.BackupStore_file_directory_mismatch, buPathDir.toAbsolutePath()), e);
+ }
+
+ move(path, buPath);
+ if (isEclipseExe(path) && Files.isRegularFile(path)) {
+ // The original is the launcher executable and it still exists at the original
+ // location although the move succeeded.
+ // This happens when it is the Windows executable that is locked because it's
+ // running and we are attempting to move it to a different drive.
+ // In this case the target will exist as a copy, so we should delete it.
+ // Then backup in place which will necessarily be on the same drive.
+ Files.delete(buPath);
+ Path inPlaceBuPath = toInPlaceBackupPath(path);
+ move(path, inPlaceBuPath);
+ buInPlace.add(inPlaceBuPath);
+ }
+
+ backupCounter++;
+ return true;
+ }
+
+ /**
+ * Restores everything stored in the backup root
+ *
+ * Responsible for converting the root prefix of the path from backup format
+ * back to the original real OS names. I.e. "_/" to "//", "__/" to "///", "C/"
+ * to "C:", etc.
+ *
+ * @param unrestorable accumulate unrestorable paths (including the entire
+ * backup store).
+ *
+ * @throws IOException
+ */
+ private void restoreBackups(Map<Path, Throwable> unrestorable) throws IOException {
+ if (!Files.exists(buStoreRoot)) {
+ unrestorable.put(buStoreRoot, new IOException(
+ NLS.bind(Messages.BackupStore_missing_backup_directory, buStoreRoot.toAbsolutePath())));
+ return;
+ }
+
+ Files.walkFileTree(buStoreRoot, new SimpleFileVisitor<Path>() {
+ @Override
+ public FileVisitResult preVisitDirectory(Path buDir, BasicFileAttributes attrs) {
+ try {
+ if (Files.isSameFile(buStoreRoot, buDir)) {
+ return CONTINUE;
+ }
+
+ Path dir = toSourcePath(buDir);
+
+ // There is a file where we the original directory used to be - delete it
+ if (Files.isRegularFile(dir)) {
+ Files.delete(dir);
+ }
+
+ // Make the original directory if needed
+ Files.createDirectories(dir);
+ } catch (IOException e) {
+ unrestorable.put(buDir, e);
+ }
+ return CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult visitFile(Path buFile, BasicFileAttributes attrs) {
+ Path file = toSourcePath(buFile);
+ try {
+ // The first level children of buStoreRoot are always directories since they
+ // model file system roots
+ if (Files.isSameFile(buFile.getParent(), buStoreRoot)) {
+ unrestorable.put(buFile, new IOException("Not a directory")); //$NON-NLS-1$
+ } else {
+ /*
+ * Do not restore the place-holders as they are used to trigger creation of
+ * empty directories and are not wanted in the restored location.
+ *
+ * They are counted as restored non the less.
+ */
+ if (!DIR_PLACEHOLDER.equals(buFile.getFileName().toString())) {
+ // Clean up the site where the original used to be.
+ // It may be that a file or a directory now occupies it.
+ deleteAll(file);
+
+ // Move the backup to the original location
+ move(buFile, file);
+ } else {
+ Files.delete(buFile);
+ }
+
+ restoreCounter++;
+ }
+ } catch (IOException e) {
+ unrestorable.put(buFile, e);
+ }
+ return CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
+ unrestorable.put(file, exc);
+ throw exc;
+ }
+
+ @Override
+ public FileVisitResult postVisitDirectory(Path buDir, IOException exc) throws IOException {
+ if (exc != null) {
+ unrestorable.put(buDir, exc);
+ throw exc;
+ }
+ try {
+ Files.delete(buDir);
+ } catch (DirectoryNotEmptyException e) {
+ String children = Files.list(buDir)
+ .map(p -> p.relativize(buDir))
+ .map(Path::toString)
+ .collect(joining(",")); //$NON-NLS-1$
+ unrestorable.put(buDir, new IOException(String.format(
+ "Directory %s not empty: %s", buDir, children, e))); //$NON-NLS-1$
+ } catch (IOException e) {
+ unrestorable.put(buDir, e);
+ }
+ return CONTINUE;
+ }
+ });
+ }
+
+ private void restoreInPlaceBackups(Map<Path, Throwable> unrestorable) {
+ for (Path buPath : buInPlace) {
+ Path path = toInPlaceSourcePath(buPath);
+
+ try {
+ move(buPath, path);
+ restoreCounter++;
+ } catch (IOException e) {
+ unrestorable.put(buPath, e);
+ }
+ }
+ }
+
+ /**
+ * Converts a source path to a backup path.
+ *
+ * Exposed for testing purposes.
+ *
+ * A leading "root" is transformed to the ROOTCHAR character. On Windows,
+ * network mapped drives starts with two separators - and are encoded as two
+ * ROOTCHAR.
+ *
+ * E.g. \\Host\C$\file becomes __\Host\C$\file /users/test/file becomes
+ * _/users/test/file C:/file becomes C/file
+ *
+ * @param file a source file that needs to be backed up
+ *
+ * @return a file to which the original content can be backed up
+ *
+ * @throws IOException
+ */
+ protected Path toBackupPath(Path path) throws IOException {
+ Path pathNormal = path.normalize();
+
+ String buPath = pathNormal.toAbsolutePath().toString();
+
+ String buPrefix = ""; //$NON-NLS-1$
+ while (buPath.startsWith(File.separator)) {
+ buPrefix += ROOTCHAR;
+ buPath = buPath.substring(1);
+ }
+
+ // Linux or Windows net mount
+ if (!buPrefix.isEmpty()) {
+ buPath = Paths.get(buPrefix, buPath).toString();
+ }
+ // Windows
+ else {
+ // It is a windows drive letter first.
+ // Transform C:/foo to C/foo
+ int idx = buPath.indexOf(":"); //$NON-NLS-1$
+ if (idx < 1) {
+ throw new IllegalArgumentException("File is neither absolute nor has a drive name: " + buPath); //$NON-NLS-1$
+ }
+ buPath = buPath.substring(0, idx) + buPath.substring(idx + 1);
+ }
+
+ Path buFile = buStoreRoot.resolve(buPath);
+ return buFile;
+ }
+
+ /**
+ * Converts a backup file to the original source file.
+ *
+ * ///x/y/z -> ___x/y/z \\x\y\z c:\x\y\z -> c\x\y\z
+ *
+ * @param buPath an absolute file under {@link #buStoreRoot} to which some
+ * content is backed up.
+ *
+ * @return the original source file to which the content can be restored.
+ */
+ protected Path toSourcePath(Path buPath) {
+ Path buPathRel = buStoreRoot.relativize(buPath);
+
+ String pathName = buPathRel.toString();
+
+ String prefix = ""; //$NON-NLS-1$
+ while (pathName.startsWith(ROOTCHAR)) {
+ prefix += File.separator;
+ pathName = pathName.substring(1);
+ }
+
+ if (prefix.isEmpty()) {
+ // The first char is a windows drive name
+ pathName = pathName.charAt(0) + ":" + pathName.substring(1); //$NON-NLS-1$
+ } else {
+ pathName = prefix + pathName;
+ }
+
+ return Paths.get(pathName);
+ }
+
+ /**
+ * Converts a path to an in-place backup path.
+ *
+ * Exposed for testing purposes.
+ *
+ * @param path
+ *
+ * @return a path next to the original where the original will be moved, rather
+ * than will be moved
+ */
+ protected Path toInPlaceBackupPath(Path path) {
+ String buPathName = path.getFileName() + buInPlaceSuffix;
+ Path buPath = path.toAbsolutePath().resolveSibling(buPathName);
+ return buPath;
+ }
+
+ /**
+ * Converts a in-place backup path to the original source path.
+ *
+ * Exposed for testing purposes.
+ *
+ * @param path
+ *
+ * @return a source path
+ */
+ protected Path toInPlaceSourcePath(Path buPath) {
+ String buPathName = buPath.getFileName().toString();
+
+ int suffixIdx = buPathName.indexOf(buInPlaceSuffix);
+ if (suffixIdx <= 0) {
+ throw new IllegalArgumentException();
+ }
+
+ String pathName = buPathName.substring(0, suffixIdx);
+ Path path = buPath.resolveSibling(pathName);
+ return path;
+ }
+
+ /**
+ * A generic file operation that attempts to move a file.
+ *
+ * Exposed in a separate method for testing purposes.
+ */
+ protected void move(Path source, Path target) throws IOException {
+ Files.move(source, target, REPLACE_EXISTING);
+ }
+
+ private static boolean isEclipseExe(Path file) {
+ String name = file.getFileName().toString();
+
+ String launcher = System.getProperty("eclipse.launcher"); //$NON-NLS-1$
+ if (launcher != null) {
+ String launcherName = Paths.get(launcher).getFileName().toString();
+ if (name.equalsIgnoreCase(launcherName)) {
+ return true;
+ }
+ }
+
+ return name.equalsIgnoreCase("eclipse.exe") || name.equalsIgnoreCase("eclipsec.exe"); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+
+ /**
+ * Deletes a file, or a directory with all of it's children.
+ *
+ * @param path
+ *
+ * @throws IOException
+ */
+ private static void deleteAll(Path path) throws IOException {
+ if (!Files.exists(path)) {
+ return;
+ }
+
+ Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+ Files.delete(file);
+ return CONTINUE;
+ }
+
+ @Override
+ public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+ if (exc != null) {
+ throw exc;
+ }
+ Files.delete(dir);
+ return CONTINUE;
+ }
+ });
+ }
+}
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/Util.java b/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/Util.java
index 3edabc078..afde945b3 100644
--- a/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/Util.java
+++ b/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/Util.java
@@ -31,10 +31,9 @@ import org.eclipse.equinox.p2.repository.artifact.*;
import org.eclipse.osgi.util.NLS;
public class Util {
-
- public static void log(String message) {
- LogHelper.log(createError(message));
- }
+ /*
+ * Logging
+ */
public static IStatus createError(String message) {
return new Status(IStatus.ERROR, Activator.ID, message);
@@ -44,6 +43,34 @@ public class Util {
return new Status(IStatus.ERROR, Activator.ID, message, exception);
}
+ public static void logError(String message, Throwable exception) {
+ LogHelper.log(createError(message, exception));
+ }
+
+ public static void logError(String message) {
+ LogHelper.log(createError(message));
+ }
+
+ public static IStatus createWarning(String message) {
+ return new Status(IStatus.WARNING, Activator.ID, message);
+ }
+
+ public static IStatus createWarning(String message, Throwable exception) {
+ return new Status(IStatus.WARNING, Activator.ID, message, exception);
+ }
+
+ public static void logWarning(String message, Throwable exception) {
+ LogHelper.log(createWarning(message, exception));
+ }
+
+ public static void logWarning(String message) {
+ LogHelper.log(createWarning(message));
+ }
+
+ /*
+ * Locations and caches
+ */
+
public static String getInstallFolder(IProfile profile) {
return profile.getProperty(IProfile.PROP_INSTALL_FOLDER);
}
@@ -58,11 +85,13 @@ public class Util {
public static IFileArtifactRepository getDownloadCacheRepo(IProvisioningAgent agent) throws ProvisionException {
URI location = getDownloadCacheLocation(agent);
- if (location == null)
+ if (location == null) {
throw new IllegalStateException(Messages.could_not_obtain_download_cache);
+ }
IArtifactRepositoryManager manager = getArtifactRepositoryManager(agent);
- if (manager == null)
+ if (manager == null) {
throw new IllegalStateException(Messages.artifact_repo_not_found);
+ }
IArtifactRepository repository;
try {
repository = manager.loadRepository(location, null);
@@ -76,18 +105,24 @@ public class Util {
}
IFileArtifactRepository downloadCache = repository.getAdapter(IFileArtifactRepository.class);
- if (downloadCache == null)
+ if (downloadCache == null) {
throw new ProvisionException(NLS.bind(Messages.download_cache_not_writeable, location));
+ }
return downloadCache;
}
- static private URI getDownloadCacheLocation(IProvisioningAgent agent) {
+ private static URI getDownloadCacheLocation(IProvisioningAgent agent) {
IAgentLocation location = getAgentLocation(agent);
- if (location == null)
+ if (location == null) {
return null;
+ }
return URIUtil.append(location.getDataArea("org.eclipse.equinox.p2.core"), "cache/"); //$NON-NLS-1$ //$NON-NLS-2$
}
+ /*
+ * File operations
+ */
+
/**
* Unzip from a File to an output directory, with progress indication and
* backup. monitor and backup store may be null.
@@ -113,9 +148,8 @@ public class Util {
monitor);
} catch (IOException e) {
// add the file name to the message
- IOException ioException = new IOException(NLS.bind(Messages.Util_Error_Unzipping, zipFile, e.getMessage()));
- ioException.initCause(e);
- throw ioException;
+ IOException ioExc = new IOException(NLS.bind(Messages.Util_Error_Unzipping, zipFile, e.getMessage()), e);
+ throw ioExc;
}
}
@@ -150,8 +184,9 @@ public class Util {
throw new IOException(Messages.Util_Invalid_Zip_File_Format);
}
- if (path != null && path.trim().length() == 0)
+ if (path != null && path.trim().length() == 0) {
path = null;
+ }
Pattern pathRegex = path == null ? null : createAntStylePattern("(" + path + ")(*)"); //$NON-NLS-1$ //$NON-NLS-2$
Collection<Pattern> includeRegexp = new ArrayList<>();
@@ -177,8 +212,9 @@ public class Util {
boolean unzip = includeRegexp.isEmpty();
for (Pattern pattern : includeRegexp) {
unzip = pattern.matcher(name).matches();
- if (unzip)
+ if (unzip) {
break;
+ }
}
if (unzip && !excludeRegexp.isEmpty()) {
for (Pattern pattern : excludeRegexp) {
@@ -193,8 +229,9 @@ public class Util {
Matcher matcher = pathRegex.matcher(name);
if (matcher.matches()) {
name = matcher.group(2);
- if (name.startsWith("/")) //$NON-NLS-1$
+ if (name.startsWith("/")) { //$NON-NLS-1$
name = name.substring(1);
+ }
}
}
File outFile = createSubPathFile(outputDir, name);
@@ -203,10 +240,11 @@ public class Util {
outFile.mkdirs();
} else {
if (outFile.exists()) {
- if (store != null)
+ if (store != null) {
store.backup(outFile);
- else
+ } else {
outFile.delete();
+ }
} else {
outFile.getParentFile().mkdirs();
}
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/actions/CleanupcopyAction.java b/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/actions/CleanupcopyAction.java
index 840c891b3..eaa8e60fc 100644
--- a/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/actions/CleanupcopyAction.java
+++ b/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/actions/CleanupcopyAction.java
@@ -40,7 +40,8 @@ public class CleanupcopyAction extends ProvisioningAction {
/**
* Perform a cleanup of a previously made copy action.
- * @param parameters action parameters
+ *
+ * @param parameters action parameters
* @param restoreable flag indicating if the operation should be backed up
* @return status
*/
@@ -56,7 +57,7 @@ public class CleanupcopyAction extends ProvisioningAction {
IInstallableUnit iu = (IInstallableUnit) parameters.get(ActionConstants.PARM_IU);
IProfile profile = (IProfile) parameters.get(ActionConstants.PARM_PROFILE);
- String copied = profile.getInstallableUnitProperty(iu, "copied" + ActionConstants.PIPE + source + ActionConstants.PIPE + target); //$NON-NLS-1$
+ String copied = profile.getInstallableUnitProperty(iu, CopyAction.buildCopiedFileIUPropertyKey(target, source));
if (copied == null)
return Status.OK_STATUS;
@@ -69,8 +70,8 @@ public class CleanupcopyAction extends ProvisioningAction {
if (!file.exists())
continue;
- //directories need to be deleted from the bottom-up, but directories are listed
- //in traversal order during copy, so we need to reverse the directory list
+ // directories need to be deleted from the bottom-up, but directories are listed
+ // in traversal order during copy, so we need to reverse the directory list
if (file.isDirectory())
directories.add(0, file);
else {
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/actions/CopyAction.java b/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/actions/CopyAction.java
index 427e40bd4..94404fdf4 100644
--- a/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/actions/CopyAction.java
+++ b/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/actions/CopyAction.java
@@ -26,12 +26,12 @@ import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.osgi.util.NLS;
/**
- * Copies from PARM_COPY_SOURCE to PARAM_COPY_TARGET
- * The optional parameter PARAM_COPY_OVERWRITE overwrites and existing file if set to true, else
- * and existing file with the same name is an error. The default is false.
- * If the source is a directory, a merge copy to the target is performed.
- * Copy will copy files and directories (recursively).
- *
+ * Copies from PARM_COPY_SOURCE to PARAM_COPY_TARGET The optional parameter
+ * PARAM_COPY_OVERWRITE overwrites and existing file if set to true, else and
+ * existing file with the same name is an error. The default is false. If the
+ * source is a directory, a merge copy to the target is performed. Copy will
+ * copy files and directories (recursively).
+ *
*/
public class CopyAction extends ProvisioningAction {
public static final String ID = "cp"; //$NON-NLS-1$
@@ -41,10 +41,11 @@ public class CopyAction extends ProvisioningAction {
return copy(parameters, true);
}
- /** Perform the copy.
+ /**
+ * Perform the copy.
*
- * @param parameters action parameters
- * @param restoreable flag indicating if the operation should be backed up
+ * @param parameters action parameters
+ * @param restoreable flag indicating if the operation should be backed up
* @return status
*/
public static IStatus copy(Map<String, Object> parameters, boolean restoreable) {
@@ -52,11 +53,13 @@ public class CopyAction extends ProvisioningAction {
IBackupStore backupStore = restoreable ? (IBackupStore) parameters.get(NativeTouchpoint.PARM_BACKUP) : null;
if (target == null)
- return new Status(IStatus.ERROR, Activator.ID, IStatus.OK, NLS.bind(Messages.param_not_set, ActionConstants.PARM_COPY_TARGET, ID), null);
+ return new Status(IStatus.ERROR, Activator.ID, IStatus.OK,
+ NLS.bind(Messages.param_not_set, ActionConstants.PARM_COPY_TARGET, ID), null);
String source = (String) parameters.get(ActionConstants.PARM_COPY_SOURCE);
if (source == null)
- return new Status(IStatus.ERROR, Activator.ID, IStatus.OK, NLS.bind(Messages.param_not_set, ActionConstants.PARM_COPY_SOURCE, ID), null);
+ return new Status(IStatus.ERROR, Activator.ID, IStatus.OK,
+ NLS.bind(Messages.param_not_set, ActionConstants.PARM_COPY_SOURCE, ID), null);
String overwrite = (String) parameters.get(ActionConstants.PARM_COPY_OVERWRITE);
Profile profile = (Profile) parameters.get(ActionConstants.PARM_PROFILE);
@@ -78,7 +81,8 @@ public class CopyAction extends ProvisioningAction {
try {
copiedFiles = mergeCopy(sourceFile, targetFile, Boolean.parseBoolean(overwrite), backupStore);
} catch (IOException e) {
- return new Status(IStatus.ERROR, Activator.ID, IStatus.OK, NLS.bind(Messages.copy_failed, sourceFile.getPath()), e);
+ return new Status(IStatus.ERROR, Activator.ID, IStatus.OK,
+ NLS.bind(Messages.copy_failed, sourceFile.getPath()), e);
}
// keep copied file in the profile as memento for CleanupCopy
StringBuffer copiedFileNameBuffer = new StringBuffer();
@@ -86,11 +90,16 @@ public class CopyAction extends ProvisioningAction {
copiedFileNameBuffer.append(copiedFile.getAbsolutePath()).append(ActionConstants.PIPE);
}
- profile.setInstallableUnitProperty(iu, "copied" + ActionConstants.PIPE + originalSource + ActionConstants.PIPE + target, copiedFileNameBuffer.toString()); //$NON-NLS-1$
+ profile.setInstallableUnitProperty(iu, buildCopiedFileIUPropertyKey(target, originalSource),
+ copiedFileNameBuffer.toString());
return Status.OK_STATUS;
}
+ static String buildCopiedFileIUPropertyKey(String target, String originalSource) {
+ return "copied" + ActionConstants.PIPE + originalSource + ActionConstants.PIPE + target; //$NON-NLS-1$
+ }
+
@Override
public IStatus undo(Map<String, Object> parameters) {
return CleanupcopyAction.cleanupcopy(parameters, false);
@@ -98,12 +107,14 @@ public class CopyAction extends ProvisioningAction {
/**
* Merge-copy file or directory.
+ *
* @param source
* @param target
* @param overwrite
* @throws IOException
*/
- private static File[] mergeCopy(File source, File target, boolean overwrite, IBackupStore backupStore) throws IOException {
+ private static File[] mergeCopy(File source, File target, boolean overwrite, IBackupStore backupStore)
+ throws IOException {
ArrayList<File> copiedFiles = new ArrayList<>();
xcopy(copiedFiles, source, target, overwrite, backupStore);
return copiedFiles.toArray(new File[copiedFiles.size()]);
@@ -111,15 +122,17 @@ public class CopyAction extends ProvisioningAction {
/**
* Merge-copy file or directory.
+ *
* @param copiedFiles - ArrayList where copied files are collected
* @param source
* @param target
* @param overwrite
* @throws IOException
*/
- private static void xcopy(ArrayList<File> copiedFiles, File source, File target, boolean overwrite, IBackupStore backupStore) throws IOException {
+ private static void xcopy(ArrayList<File> copiedFiles, File source, File target, boolean overwrite,
+ IBackupStore backupStore) throws IOException {
if (!source.exists())
- throw new IOException("Source: " + source + "does not exists"); //$NON-NLS-1$//$NON-NLS-2$
+ throw new IOException("Source: " + source + " does not exists"); //$NON-NLS-1$//$NON-NLS-2$
if (source.isDirectory()) {
if (target.exists() && target.isFile()) {
@@ -152,7 +165,7 @@ public class CopyAction extends ProvisioningAction {
} catch (IOException e) {
// get the original IOException to the log
e.printStackTrace();
- throw new IOException("Error while copying:" + source.getAbsolutePath()); //$NON-NLS-1$
+ throw new IOException("Error while copying: " + source.getAbsolutePath()); //$NON-NLS-1$
}
copiedFiles.add(target);
}
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/actions/UnzipAction.java b/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/actions/UnzipAction.java
index 77961095b..6dc4cf962 100644
--- a/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/actions/UnzipAction.java
+++ b/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/actions/UnzipAction.java
@@ -44,19 +44,22 @@ public class UnzipAction extends ProvisioningAction {
/**
* Unzip as directed by parameters.
* Record what was zipped in the profile.
+ *
* @param parameters
* @param restoreable - if the unzip should be backed up
* @return status
*/
public IStatus unzip(Map<String, Object> parameters, boolean restoreable) {
String source = (String) parameters.get(ActionConstants.PARM_SOURCE);
- if (source == null)
+ if (source == null) {
return Util.createError(NLS.bind(Messages.param_not_set, ActionConstants.PARM_SOURCE, ACTION_UNZIP));
+ }
String originalSource = source;
String target = (String) parameters.get(ActionConstants.PARM_TARGET);
- if (target == null)
+ if (target == null) {
return Util.createError(NLS.bind(Messages.param_not_set, ActionConstants.PARM_TARGET, ACTION_UNZIP));
+ }
IInstallableUnit iu = (IInstallableUnit) parameters.get(ActionConstants.PARM_IU);
Profile profile = (Profile) parameters.get(ActionConstants.PARM_PROFILE);
@@ -87,7 +90,9 @@ public class UnzipAction extends ProvisioningAction {
unzippedFileNameBuffer.append(unzippedFile.getAbsolutePath()).append(ActionConstants.PIPE);
}
- profile.setInstallableUnitProperty(iu, "unzipped" + ActionConstants.PIPE + originalSource + ActionConstants.PIPE + target, unzippedFileNameBuffer.toString()); //$NON-NLS-1$
+ profile.setInstallableUnitProperty(iu,
+ "unzipped" + ActionConstants.PIPE + originalSource + ActionConstants.PIPE + target, //$NON-NLS-1$
+ unzippedFileNameBuffer.toString());
return Status.OK_STATUS;
}
@@ -96,18 +101,23 @@ public class UnzipAction extends ProvisioningAction {
* Unzips a source zip into the given destination. Any existing contents in the destination
* are backed up in the provided backup store.
*/
- private static File[] unzip(String source, String destination, String path, String includePattern, String excludePattern, IBackupStore store) {
+ private static File[] unzip(String source, String destination, String path, String includePattern,
+ String excludePattern, IBackupStore store) {
File zipFile = new File(source);
if (zipFile == null || !zipFile.exists()) {
- Util.log(UnzipAction.class.getName() + " the files to be unzipped is not here"); //$NON-NLS-1$
+ Util.logError(UnzipAction.class.getName() + " the files to be unzipped is not here", null); //$NON-NLS-1$
}
try {
String taskName = NLS.bind(Messages.unzipping, source);
String[] includes = includePattern == null ? null : includePattern.split("\\s+"); //$NON-NLS-1$
String[] excludes = excludePattern == null ? null : excludePattern.split("\\s+"); //$NON-NLS-1$
- return Util.unzipFile(zipFile, new File(destination), path, includes, excludes, store, taskName, new NullProgressMonitor());
+ return Util.unzipFile(zipFile, new File(destination), path, includes, excludes, store, taskName,
+ new NullProgressMonitor());
} catch (IOException e) {
- Util.log(UnzipAction.class.getName() + " error unzipping zipfile: " + zipFile.getAbsolutePath() + "destination: " + destination); //$NON-NLS-1$ //$NON-NLS-2$
+ Util.logError(
+ UnzipAction.class.getName() + " error unzipping zipfile: " + zipFile.getAbsolutePath() //$NON-NLS-1$
+ + "destination: " + destination, //$NON-NLS-1$
+ null);
}
return new File[0];
}
diff --git a/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/messages.properties b/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/messages.properties
index b5885bc36..298d24fa7 100644
--- a/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/messages.properties
+++ b/bundles/org.eclipse.equinox.p2.touchpoint.natives/src/org/eclipse/equinox/internal/p2/touchpoint/natives/messages.properties
@@ -14,11 +14,10 @@
# SAP SE - bug 465602
###############################################################################
-BackupStore_backupCopy_closed_store=Can not perform backup on closed backup store.
+BackupStore_closed_store=Can not perform operation on closed backup store.
BackupStore_0_of_1_items_restored={0} items out of {1} items restored.
-BackupStore_can_not_close_tcp_port=Could not close tcp socket for port: {0}
BackupStore_can_not_copy_directory=Can not copy a directory: {0}
-BackupStore_can_not_create_dummy=Can not create dummy file: {0}
+BackupStore_can_not_create_placeholder=Can not create placeholder file: {0}
BackupStore_can_not_delete_after_copy_0=File that was copied to backup could not be deleted: {0}
BackupStore_can_not_delete_tmp_file=Can not delete temporary file - it is safe to delete it manually: {0}
BackupStore_can_not_remove=Can not remove : {0}
@@ -30,12 +29,11 @@ BackupStore_errors_while_restoring_see_log=Errors while restoring - see earlier
BackupStore_externally_modified_0_of_1_restored=Backup store modified externally\! {0} items out of {1} items restored. Remaining items can not be found.
BackupStore_file_directory_mismatch=File already backed up as a file - and is now required as a directory: {0}
BackupStore_file_not_found=File does not exist: {0}.
-BackupStore_manual_restore_needed=Manual restore of backup needed for: {0}
+BackupStore_manual_restore_needed=Restore failed: {0}. Manual restore of backup needed for: {1}
BackupStore_missing_backup_directory=Missing backup directory - can not restore: {0}
BackupStore_not_a_directory=File is not a directory: {0}
-BackupStore_restore_closed_store=Can not perform restore on closed backup store
BlockMacUpdate_0=Installation impossible
-BlockMacUpdate_1=The installation/update you are trying to perform can not be completed because of structural changes to Eclipse. The installation/update will stop and will leave your existing Eclipse installation intact. You need to retrieve a new version of Eclipse from http://download.eclipse.org/.
+BlockMacUpdate_1=The installation/update you are trying to perform can not be completed because of structural changes to Eclipse. The installation/update will stop and will leave your existing Eclipse installation intact. You need to retrieve a new version of Eclipse from https://download.eclipse.org/.
action_0_status=The action {0} was performed.
action_0_failed_on_file_1_reason_2=The action {0} on file {1} failed. Reason: {2}
diff --git a/bundles/org.eclipse.equinox.p2.transport.ecf/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.transport.ecf/META-INF/MANIFEST.MF
index bbceef3db..31f2492ff 100644
--- a/bundles/org.eclipse.equinox.p2.transport.ecf/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.transport.ecf/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.transport.ecf
-Bundle-Version: 1.3.0.qualifier
+Bundle-Version: 1.3.300.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-11
Require-Bundle: org.eclipse.ecf;bundle-version="3.1.0",
org.eclipse.ecf.filetransfer;bundle-version="4.0.0",
diff --git a/bundles/org.eclipse.equinox.p2.transport.ecf/pom.xml b/bundles/org.eclipse.equinox.p2.transport.ecf/pom.xml
index fc0cffc91..7d8611d3e 100644
--- a/bundles/org.eclipse.equinox.p2.transport.ecf/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.transport.ecf/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.transport.ecf</artifactId>
- <version>1.3.0-SNAPSHOT</version>
+ <version>1.3.300-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/Activator.java b/bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/Activator.java
index d0e8b4e7b..7b6649c20 100644
--- a/bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/Activator.java
+++ b/bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/Activator.java
@@ -16,6 +16,7 @@
******************************************************************************/
package org.eclipse.equinox.internal.p2.transport.ecf;
+import java.util.Optional;
import org.eclipse.ecf.filetransfer.service.IRetrieveFileTransferFactory;
import org.eclipse.ecf.provider.filetransfer.IFileTransferProtocolToFactoryMapper;
import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper;
@@ -173,4 +174,18 @@ public class Activator implements BundleActivator {
return false;
}
+ public static String getProperty(String key) {
+ if (context != null) {
+ return context.getProperty(key);
+ }
+ return System.getProperty(key);
+ }
+
+ public static Optional<Version> getVersion() {
+ return Optional.ofNullable(context) //
+ .map(BundleContext::getBundle) //
+ .or(() -> Optional.ofNullable(FrameworkUtil.getBundle(FileReader.class)))//
+ .map(Bundle::getVersion);
+ }
+
}
diff --git a/bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/FileInfoReader.java b/bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/FileInfoReader.java
index 8a45c5486..cfca3d832 100644
--- a/bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/FileInfoReader.java
+++ b/bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/FileInfoReader.java
@@ -163,7 +163,7 @@ public class FileInfoReader extends Job implements IRemoteFileSystemListener {
try {
container = ContainerFactory.getDefault().createContainer();
} catch (ContainerCreateException e) {
- throw RepositoryStatusHelper.fromMessage(Messages.ecf_configuration_error);
+ throw RepositoryStatusHelper.fromExceptionMessage(e ,Messages.ecf_configuration_error);
}
IRemoteFileSystemBrowserContainerAdapter adapter = container.getAdapter(IRemoteFileSystemBrowserContainerAdapter.class);
diff --git a/bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/FileReader.java b/bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/FileReader.java
index 6e6d6b916..7d95289f4 100644
--- a/bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/FileReader.java
+++ b/bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/FileReader.java
@@ -34,7 +34,7 @@ import org.eclipse.equinox.internal.p2.repository.*;
import org.eclipse.equinox.internal.p2.repository.Messages;
import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.osgi.util.NLS;
-import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.Version;
/**
* FileReader is an ECF FileTransferJob implementation.
@@ -64,11 +64,11 @@ public final class FileReader extends FileTransferJob implements IFileTransferLi
static Map<String, Map<String, String>> options;
static private String getProperty(String key, String defaultValue) {
- String value = FrameworkUtil.getBundle(FileReader.class).getBundleContext().getProperty(key);
- if (value == null) {
- value = defaultValue;
+ String value = Activator.getProperty(key);
+ if (value != null) {
+ return value;
}
- return value;
+ return defaultValue;
}
static {
@@ -80,7 +80,7 @@ public final class FileReader extends FileTransferJob implements IFileTransferLi
String osgiArch = getProperty("org.osgi.framework.processor", "unknownArch");//$NON-NLS-1$//$NON-NLS-2$
String language = getProperty("osgi.nl", "unknownLanguage");//$NON-NLS-1$//$NON-NLS-2$
String osVersion = getProperty("org.osgi.framework.os.version", "unknownOSVersion"); //$NON-NLS-1$ //$NON-NLS-2$
- String p2Version = FrameworkUtil.getBundle(FileReader.class).getVersion().toString();
+ String p2Version = Activator.getVersion().map(Version::toString).orElse("unknownVersion"); //$NON-NLS-1$
userAgent = "p2/" + p2Version + " (Java " + javaSpec + ' ' + javaVendor + "; " + osName + ' ' + osVersion + ' ' //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ osgiArch + "; " + language + ") "; //$NON-NLS-1$ //$NON-NLS-2$
String userAgentProvided = getProperty("p2.userAgent", null); //$NON-NLS-1$
@@ -108,6 +108,8 @@ public final class FileReader extends FileTransferJob implements IFileTransferLi
private ProgressStatistics statistics;
private final int connectionRetryCount;
private final long connectionRetryDelay;
+ /** See bug 574173: allow to retry download if specified */
+ private final boolean retryOnSocketTimeout;
private final IConnectContext connectContext;
private URI requestUri;
protected IFileTransferConnectStartEvent connectEvent;
@@ -130,6 +132,7 @@ public final class FileReader extends FileTransferJob implements IFileTransferLi
setUser(false);
connectionRetryCount = RepositoryPreferences.getConnectionRetryCount();
connectionRetryDelay = RepositoryPreferences.getConnectionMsRetryDelay();
+ retryOnSocketTimeout = RepositoryPreferences.getRetryOnSocketTimeout();
connectContext = aConnectContext;
this.agent = aAgent;
}
@@ -512,11 +515,14 @@ public final class FileReader extends FileTransferJob implements IFileTransferLi
if (t instanceof CoreException)
throw RepositoryStatusHelper.unwindCoreException((CoreException) t);
- // not meaningful to try 'timeout again' - if a server is that busy, we
- // need to wait for quite some time before retrying- it is not likely it is
- // just a temporary network thing.
- if (t instanceof SocketTimeoutException)
- throw RepositoryStatusHelper.wrap(t);
+ if (!retryOnSocketTimeout) {
+ // not meaningful to try 'timeout again' - if a server is that busy, we
+ // need to wait for quite some time before retrying- it is not likely it is
+ // just a temporary network thing.
+ if (t instanceof SocketTimeoutException) {
+ throw RepositoryStatusHelper.wrap(t);
+ }
+ }
if (t instanceof IOException && attemptCounter < connectionRetryCount) {
// TODO: Retry only certain exceptions or filter out
diff --git a/bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/RepositoryTransport.java b/bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/RepositoryTransport.java
index ba13b7fc4..a705ddcc0 100644
--- a/bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/RepositoryTransport.java
+++ b/bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/RepositoryTransport.java
@@ -192,8 +192,8 @@ public class RepositoryTransport extends Transport {
// must translate this core exception as it is most likely not informative to a
// user
if (e.getStatus().getException() == null)
- throw new CoreException(RepositoryStatus.forException(e, toDownload));
- throw new CoreException(RepositoryStatus.forStatus(e.getStatus(), toDownload));
+ throw new CoreException(forException(e, toDownload));
+ throw new CoreException(forStatus(e.getStatus(), toDownload));
} catch (LoginCanceledException e) {
// i.e. same behavior when user cancels as when failing n attempts.
throw new AuthenticationFailedException();
@@ -253,8 +253,8 @@ public class RepositoryTransport extends Transport {
// must translate this core exception as it is most likely not informative to a
// user
if (e.getStatus().getException() == null)
- throw new CoreException(RepositoryStatus.forException(e, toDownload));
- throw new CoreException(RepositoryStatus.forStatus(e.getStatus(), toDownload));
+ throw new CoreException(forException(e, toDownload));
+ throw new CoreException(forStatus(e.getStatus(), toDownload));
} catch (AuthenticationFailedException e) {
promptUser = true;
} catch (LoginCanceledException e) {
@@ -278,6 +278,8 @@ public class RepositoryTransport extends Transport {
return true;
else if (t instanceof SocketException)
return true;
+ else if (t instanceof IncomingFileTransferException && ((IncomingFileTransferException) t).getErrorCode() == 503)
+ return true;
return false;
}
@@ -308,7 +310,7 @@ public class RepositoryTransport extends Transport {
retryCount = Integer.valueOf(alreadyRetryCount.intValue() + 1);
}
}
- if (retryCount != null) {
+ if (retryCount != null && retryCount.intValue() <= retry) {
socketExceptionRetry.put(toDownload, retryCount);
return new DownloadStatus(IStatus.ERROR, Activator.ID, IArtifactRepository.CODE_RETRY,
NLS.bind(Messages.connection_to_0_failed_on_1_retry_attempt_2, new String[] {
diff --git a/bundles/org.eclipse.equinox.p2.ui.admin.rcp/.classpath b/bundles/org.eclipse.equinox.p2.ui.admin.rcp/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.ui.admin.rcp/.classpath
+++ b/bundles/org.eclipse.equinox.p2.ui.admin.rcp/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.ui.admin.rcp/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.ui.admin.rcp/.settings/org.eclipse.jdt.core.prefs
index 7f57486db..b8c25ff3b 100644
--- a/bundles/org.eclipse.equinox.p2.ui.admin.rcp/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.ui.admin.rcp/.settings/org.eclipse.jdt.core.prefs
@@ -16,9 +16,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -35,6 +35,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -88,6 +89,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -125,7 +127,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -139,7 +142,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -260,7 +262,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -331,7 +332,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -476,7 +476,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.ui.admin.rcp/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.ui.admin.rcp/META-INF/MANIFEST.MF
index 2da82a17e..78f885414 100644
--- a/bundles/org.eclipse.equinox.p2.ui.admin.rcp/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.ui.admin.rcp/META-INF/MANIFEST.MF
@@ -4,9 +4,9 @@ Bundle-Name: %bundleName
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Bundle-SymbolicName: org.eclipse.equinox.p2.ui.admin.rcp; singleton:=true
-Bundle-Version: 1.2.100.qualifier
+Bundle-Version: 1.3.200.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.ui.admin.rcp.Activator
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Require-Bundle: org.eclipse.ui,
org.eclipse.core.runtime
Bundle-ActivationPolicy: lazy
diff --git a/bundles/org.eclipse.equinox.p2.ui.admin.rcp/pom.xml b/bundles/org.eclipse.equinox.p2.ui.admin.rcp/pom.xml
index 7eaa0d2ec..be007c637 100644
--- a/bundles/org.eclipse.equinox.p2.ui.admin.rcp/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.ui.admin.rcp/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.ui.admin.rcp</artifactId>
- <version>1.2.100-SNAPSHOT</version>
+ <version>1.3.200-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.ui.admin.rcp/rcp.product b/bundles/org.eclipse.equinox.p2.ui.admin.rcp/rcp.product
index 6b02be252..9ba3bcdc0 100644
--- a/bundles/org.eclipse.equinox.p2.ui.admin.rcp/rcp.product
+++ b/bundles/org.eclipse.equinox.p2.ui.admin.rcp/rcp.product
@@ -136,9 +136,21 @@ Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in t
<plugins>
<plugin id="com.ibm.icu"/>
+ <plugin id="com.sun.jna"/>
+ <plugin id="com.sun.jna.platform"/>
+ <plugin id="javax.annotation"/>
+ <plugin id="javax.inject"/>
+ <plugin id="org.apache.batik.constants"/>
+ <plugin id="org.apache.batik.css"/>
+ <plugin id="org.apache.batik.i18n"/>
+ <plugin id="org.apache.batik.util"/>
<plugin id="org.apache.commons.codec"/>
<plugin id="org.apache.commons.httpclient"/>
+ <plugin id="org.apache.commons.io"/>
+ <plugin id="org.apache.commons.jxpath"/>
<plugin id="org.apache.commons.logging"/>
+ <plugin id="org.apache.felix.scr"/>
+ <plugin id="org.apache.xmlgraphics"/>
<plugin id="org.eclipse.compare"/>
<plugin id="org.eclipse.compare.core"/>
<plugin id="org.eclipse.core.commands"/>
@@ -149,11 +161,37 @@ Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in t
<plugin id="org.eclipse.core.expressions"/>
<plugin id="org.eclipse.core.filebuffers"/>
<plugin id="org.eclipse.core.filesystem"/>
+ <plugin id="org.eclipse.core.filesystem.linux.x86_64" fragment="true"/>
<plugin id="org.eclipse.core.filesystem.macosx" fragment="true"/>
<plugin id="org.eclipse.core.jobs"/>
<plugin id="org.eclipse.core.net"/>
+ <plugin id="org.eclipse.core.net.linux" fragment="true"/>
<plugin id="org.eclipse.core.resources"/>
<plugin id="org.eclipse.core.runtime"/>
+ <plugin id="org.eclipse.e4.core.commands"/>
+ <plugin id="org.eclipse.e4.core.contexts"/>
+ <plugin id="org.eclipse.e4.core.di"/>
+ <plugin id="org.eclipse.e4.core.di.annotations"/>
+ <plugin id="org.eclipse.e4.core.di.extensions"/>
+ <plugin id="org.eclipse.e4.core.di.extensions.supplier"/>
+ <plugin id="org.eclipse.e4.core.services"/>
+ <plugin id="org.eclipse.e4.emf.xpath"/>
+ <plugin id="org.eclipse.e4.ui.bindings"/>
+ <plugin id="org.eclipse.e4.ui.css.core"/>
+ <plugin id="org.eclipse.e4.ui.css.swt"/>
+ <plugin id="org.eclipse.e4.ui.css.swt.theme"/>
+ <plugin id="org.eclipse.e4.ui.di"/>
+ <plugin id="org.eclipse.e4.ui.dialogs"/>
+ <plugin id="org.eclipse.e4.ui.ide"/>
+ <plugin id="org.eclipse.e4.ui.model.workbench"/>
+ <plugin id="org.eclipse.e4.ui.services"/>
+ <plugin id="org.eclipse.e4.ui.swt.gtk" fragment="true"/>
+ <plugin id="org.eclipse.e4.ui.widgets"/>
+ <plugin id="org.eclipse.e4.ui.workbench"/>
+ <plugin id="org.eclipse.e4.ui.workbench.addons.swt"/>
+ <plugin id="org.eclipse.e4.ui.workbench.renderers.swt"/>
+ <plugin id="org.eclipse.e4.ui.workbench.swt"/>
+ <plugin id="org.eclipse.e4.ui.workbench3"/>
<plugin id="org.eclipse.ecf"/>
<plugin id="org.eclipse.ecf.filetransfer"/>
<plugin id="org.eclipse.ecf.identity"/>
@@ -162,13 +200,20 @@ Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in t
<plugin id="org.eclipse.ecf.provider.filetransfer.httpclient.ssl" fragment="true"/>
<plugin id="org.eclipse.ecf.provider.filetransfer.ssl" fragment="true"/>
<plugin id="org.eclipse.ecf.ssl" fragment="true"/>
+ <plugin id="org.eclipse.emf.common"/>
+ <plugin id="org.eclipse.emf.ecore"/>
+ <plugin id="org.eclipse.emf.ecore.change"/>
+ <plugin id="org.eclipse.emf.ecore.xmi"/>
<plugin id="org.eclipse.equinox.app"/>
+ <plugin id="org.eclipse.equinox.bidi"/>
<plugin id="org.eclipse.equinox.common"/>
- <plugin id="org.eclipse.equinox.ds"/>
+ <plugin id="org.eclipse.equinox.concurrent"/>
<plugin id="org.eclipse.equinox.frameworkadmin"/>
<plugin id="org.eclipse.equinox.frameworkadmin.equinox"/>
<plugin id="org.eclipse.equinox.launcher"/>
- <plugin id="org.eclipse.equinox.launcher.cocoa.macosx" fragment="true"/>
+ <plugin id="org.eclipse.equinox.launcher.cocoa.macosx.aarch64" fragment="true"/>
+ <plugin id="org.eclipse.equinox.launcher.cocoa.macosx.x86_64" fragment="true"/>
+ <plugin id="org.eclipse.equinox.launcher.gtk.linux.x86_64" fragment="true"/>
<plugin id="org.eclipse.equinox.p2.artifact.repository"/>
<plugin id="org.eclipse.equinox.p2.console"/>
<plugin id="org.eclipse.equinox.p2.core"/>
@@ -181,6 +226,7 @@ Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in t
<plugin id="org.eclipse.equinox.p2.metadata.repository"/>
<plugin id="org.eclipse.equinox.p2.operations"/>
<plugin id="org.eclipse.equinox.p2.publisher"/>
+ <plugin id="org.eclipse.equinox.p2.publisher.eclipse"/>
<plugin id="org.eclipse.equinox.p2.repository"/>
<plugin id="org.eclipse.equinox.p2.repository.tools"/>
<plugin id="org.eclipse.equinox.p2.touchpoint.eclipse"/>
@@ -193,6 +239,7 @@ Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in t
<plugin id="org.eclipse.equinox.preferences"/>
<plugin id="org.eclipse.equinox.registry"/>
<plugin id="org.eclipse.equinox.security"/>
+ <plugin id="org.eclipse.equinox.security.linux" fragment="true"/>
<plugin id="org.eclipse.equinox.security.macosx" fragment="true"/>
<plugin id="org.eclipse.equinox.security.ui"/>
<plugin id="org.eclipse.equinox.simpleconfigurator"/>
@@ -201,29 +248,40 @@ Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in t
<plugin id="org.eclipse.help"/>
<plugin id="org.eclipse.jface"/>
<plugin id="org.eclipse.jface.databinding"/>
+ <plugin id="org.eclipse.jface.notifications"/>
<plugin id="org.eclipse.jface.text"/>
<plugin id="org.eclipse.osgi"/>
+ <plugin id="org.eclipse.osgi.compatibility.state" fragment="true"/>
<plugin id="org.eclipse.osgi.services"/>
+ <plugin id="org.eclipse.osgi.util"/>
<plugin id="org.eclipse.swt"/>
<plugin id="org.eclipse.swt.cocoa.macosx" fragment="true"/>
+ <plugin id="org.eclipse.swt.gtk.linux.x86_64" fragment="true"/>
<plugin id="org.eclipse.text"/>
<plugin id="org.eclipse.ui"/>
<plugin id="org.eclipse.ui.cocoa" fragment="true"/>
<plugin id="org.eclipse.ui.editors"/>
<plugin id="org.eclipse.ui.forms"/>
<plugin id="org.eclipse.ui.ide"/>
+ <plugin id="org.eclipse.ui.navigator"/>
<plugin id="org.eclipse.ui.net"/>
<plugin id="org.eclipse.ui.views"/>
<plugin id="org.eclipse.ui.workbench"/>
<plugin id="org.eclipse.ui.workbench.texteditor"/>
+ <plugin id="org.eclipse.urischeme"/>
<plugin id="org.sat4j.core"/>
<plugin id="org.sat4j.pb"/>
+ <plugin id="org.tukaani.xz"/>
+ <plugin id="org.w3c.css.sac"/>
+ <plugin id="org.w3c.dom.events"/>
+ <plugin id="org.w3c.dom.smil"/>
+ <plugin id="org.w3c.dom.svg"/>
</plugins>
<configurations>
+ <plugin id="org.apache.felix.scr" autoStart="true" startLevel="2" />
<plugin id="org.eclipse.core.runtime" autoStart="true" startLevel="4" />
<plugin id="org.eclipse.equinox.common" autoStart="true" startLevel="2" />
- <plugin id="org.eclipse.equinox.ds" autoStart="true" startLevel="2" />
<plugin id="org.eclipse.equinox.simpleconfigurator" autoStart="true" startLevel="1" />
</configurations>
diff --git a/bundles/org.eclipse.equinox.p2.ui.admin/.classpath b/bundles/org.eclipse.equinox.p2.ui.admin/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.ui.admin/.classpath
+++ b/bundles/org.eclipse.equinox.p2.ui.admin/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.ui.admin/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.ui.admin/.settings/org.eclipse.jdt.core.prefs
index 3ff983cfa..1fd15eacb 100644
--- a/bundles/org.eclipse.equinox.p2.ui.admin/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.ui.admin/.settings/org.eclipse.jdt.core.prefs
@@ -16,9 +16,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -35,6 +35,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -88,6 +89,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -124,7 +126,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -138,7 +141,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -259,7 +261,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -330,7 +331,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -475,7 +475,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.ui.admin/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.ui.admin/META-INF/MANIFEST.MF
index ba2230e0d..81450429b 100644
--- a/bundles/org.eclipse.equinox.p2.ui.admin/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.ui.admin/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %bundleName
Bundle-SymbolicName: org.eclipse.equinox.p2.ui.admin;singleton:=true
-Bundle-Version: 1.1.300.qualifier
+Bundle-Version: 1.2.0.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.ui.admin.ProvAdminUIActivator
Bundle-Vendor: %providerName
Bundle-Localization: plugin
@@ -11,7 +11,7 @@ Export-Package: org.eclipse.equinox.internal.p2.ui.admin;x-friends:="org.eclipse
org.eclipse.equinox.internal.p2.ui.admin.preferences;x-internal:=true
Require-Bundle: org.eclipse.core.runtime,
org.eclipse.ui
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Import-Package: org.eclipse.equinox.internal.p2.core.helpers,
org.eclipse.equinox.internal.p2.ui,
diff --git a/bundles/org.eclipse.equinox.p2.ui.admin/pom.xml b/bundles/org.eclipse.equinox.p2.ui.admin/pom.xml
index aa1d44aed..af1847806 100644
--- a/bundles/org.eclipse.equinox.p2.ui.admin/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.ui.admin/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.ui.admin</artifactId>
- <version>1.1.300-SNAPSHOT</version>
+ <version>1.2.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.ui.discovery/.classpath b/bundles/org.eclipse.equinox.p2.ui.discovery/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.ui.discovery/.classpath
+++ b/bundles/org.eclipse.equinox.p2.ui.discovery/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.ui.discovery/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.ui.discovery/META-INF/MANIFEST.MF
index c3173614a..7adb2a1e0 100644
--- a/bundles/org.eclipse.equinox.p2.ui.discovery/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.ui.discovery/META-INF/MANIFEST.MF
@@ -2,13 +2,13 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %Bundle-Name
Bundle-SymbolicName: org.eclipse.equinox.p2.ui.discovery;singleton:=true
-Bundle-Version: 1.2.0.qualifier
+Bundle-Version: 1.2.300.qualifier
Bundle-Vendor: %Bundle-Vendor
Bundle-Localization: plugin
Bundle-RequiredExecutionEnvironment: JavaSE-11
Require-Bundle: org.eclipse.core.runtime,
org.eclipse.ui;bundle-version="[3.118.0,4.0.0)",
- org.eclipse.equinox.p2.discovery;bundle-version="[1.0.0,1.2.0)",
+ org.eclipse.equinox.p2.discovery;bundle-version="[1.0.0,1.3.0)",
org.eclipse.ui.browser,
org.eclipse.equinox.p2.discovery.compatibility;bundle-version="[1.0.0,1.3.0)";resolution:=optional,
org.eclipse.equinox.p2.core;bundle-version="[2.0.0,3.0.0)",
diff --git a/bundles/org.eclipse.equinox.p2.ui.discovery/pom.xml b/bundles/org.eclipse.equinox.p2.ui.discovery/pom.xml
index b9ae5ed9c..54fa0b47d 100644
--- a/bundles/org.eclipse.equinox.p2.ui.discovery/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.ui.discovery/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.ui.discovery</artifactId>
- <version>1.2.0-SNAPSHOT</version>
+ <version>1.2.300-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.ui.discovery/src/org/eclipse/equinox/internal/p2/ui/discovery/wizards/CatalogViewer.java b/bundles/org.eclipse.equinox.p2.ui.discovery/src/org/eclipse/equinox/internal/p2/ui/discovery/wizards/CatalogViewer.java
index f7ad21549..f4df92354 100644
--- a/bundles/org.eclipse.equinox.p2.ui.discovery/src/org/eclipse/equinox/internal/p2/ui/discovery/wizards/CatalogViewer.java
+++ b/bundles/org.eclipse.equinox.p2.ui.discovery/src/org/eclipse/equinox/internal/p2/ui/discovery/wizards/CatalogViewer.java
@@ -275,7 +275,7 @@ public class CatalogViewer extends FilteredViewer {
return null;
}
String regex = filterText;
- regex.replace("\\", "\\\\").replace("?", ".").replace("*", ".*?"); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
+ regex = regex.replace("\\", "\\\\").replace("?", ".").replace("*", ".*?"); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
return Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
}
diff --git a/bundles/org.eclipse.equinox.p2.ui.importexport/.classpath b/bundles/org.eclipse.equinox.p2.ui.importexport/.classpath
index eca7bdba8..e801ebfb4 100755
--- a/bundles/org.eclipse.equinox.p2.ui.importexport/.classpath
+++ b/bundles/org.eclipse.equinox.p2.ui.importexport/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.ui.importexport/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.ui.importexport/.settings/org.eclipse.jdt.core.prefs
index 56dc6fd12..6411527bd 100755
--- a/bundles/org.eclipse.equinox.p2.ui.importexport/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.ui.importexport/.settings/org.eclipse.jdt.core.prefs
@@ -17,9 +17,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -35,6 +35,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -88,6 +89,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -123,7 +125,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -137,7 +140,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -258,7 +260,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -329,7 +330,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -474,7 +474,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.ui.importexport/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.ui.importexport/META-INF/MANIFEST.MF
index 94d29544d..467432a6b 100755
--- a/bundles/org.eclipse.equinox.p2.ui.importexport/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.ui.importexport/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.ui.importexport;singleton:=true
-Bundle-Version: 1.2.600.qualifier
+Bundle-Version: 1.3.200.qualifier
Bundle-Vendor: %providerName
Require-Bundle: org.eclipse.ui,
org.eclipse.core.runtime;bundle-version="[3.11.0,4.0.0)",
@@ -10,7 +10,7 @@ Require-Bundle: org.eclipse.ui,
org.eclipse.equinox.p2.extensionlocation,
org.eclipse.equinox.p2.metadata;bundle-version="2.1.0",
org.eclipse.ui.forms;bundle-version="3.5.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-Localization: plugin
Bundle-ActivationPolicy: lazy
Import-Package: org.eclipse.equinox.internal.p2.metadata.repository.io,
@@ -35,5 +35,4 @@ Import-Package: org.eclipse.equinox.internal.p2.metadata.repository.io,
Service-Component: OSGI-INF/importexport.xml
Export-Package: org.eclipse.equinox.internal.p2.importexport;version="1.3.0";x-friends:="org.eclipse.equinox.p2.tests",
org.eclipse.equinox.internal.p2.importexport.internal;x-friends:="org.eclipse.equinox.p2.tests"
-Bundle-Activator: org.eclipse.equinox.internal.p2.importexport.internal.ImportExportActivator
Automatic-Module-Name: org.eclipse.equinox.p2.ui.importexport
diff --git a/bundles/org.eclipse.equinox.p2.ui.importexport/P2 Replication.launch b/bundles/org.eclipse.equinox.p2.ui.importexport/P2 Replication.launch
index fa6b4f110..0d47c0a51 100644
--- a/bundles/org.eclipse.equinox.p2.ui.importexport/P2 Replication.launch
+++ b/bundles/org.eclipse.equinox.p2.ui.importexport/P2 Replication.launch
@@ -1,418 +1,32 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.pde.ui.RuntimeWorkbench">
-<booleanAttribute key="append.args" value="true"/>
-<booleanAttribute key="askclear" value="true"/>
-<booleanAttribute key="automaticAdd" value="true"/>
-<booleanAttribute key="automaticValidate" value="false"/>
-<stringAttribute key="bootstrap" value=""/>
-<stringAttribute key="checked" value="[NONE]"/>
-<booleanAttribute key="clearConfig" value="true"/>
-<booleanAttribute key="clearws" value="true"/>
-<booleanAttribute key="clearwslog" value="false"/>
-<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/P2 Replication"/>
-<booleanAttribute key="default" value="true"/>
-<booleanAttribute key="generateProfile" value="true"/>
-<booleanAttribute key="includeOptional" value="true"/>
-<stringAttribute key="location" value="${workspace_loc}/runtime-New_configuration"/>
-<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-console"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Declipse.p2.profile=SDKProfile&#13;&#13;&#10;-Declipse.p2.data.area=${target_home}/p2"/>
-<stringAttribute key="pde.version" value="3.3"/>
-<stringAttribute key="product" value="org.eclipse.platform.ide"/>
-<booleanAttribute key="show_selected_only" value="false"/>
-<stringAttribute key="templateConfig" value="${target_home}/configuration/config.ini"/>
-<booleanAttribute key="tracing" value="false"/>
-<mapAttribute key="tracingOptions">
-<mapEntry key="org.eclipse.cdt.core/debug" value="true"/>
-<mapEntry key="org.eclipse.cdt.core/debug/ASTCache" value="false"/>
-<mapEntry key="org.eclipse.cdt.core/debug/deltaprocessor" value="false"/>
-<mapEntry key="org.eclipse.cdt.core/debug/formatter" value="false"/>
-<mapEntry key="org.eclipse.cdt.core/debug/index/locks" value="false"/>
-<mapEntry key="org.eclipse.cdt.core/debug/indexer/activity" value="false"/>
-<mapEntry key="org.eclipse.cdt.core/debug/indexer/problems" value="false"/>
-<mapEntry key="org.eclipse.cdt.core/debug/indexer/problems/inclusion" value="false"/>
-<mapEntry key="org.eclipse.cdt.core/debug/indexer/problems/scanner" value="false"/>
-<mapEntry key="org.eclipse.cdt.core/debug/indexer/problems/syntax" value="false"/>
-<mapEntry key="org.eclipse.cdt.core/debug/indexer/statistics" value="false"/>
-<mapEntry key="org.eclipse.cdt.core/debug/matchlocator" value="false"/>
-<mapEntry key="org.eclipse.cdt.core/debug/model" value="false"/>
-<mapEntry key="org.eclipse.cdt.core/debug/parser" value="false"/>
-<mapEntry key="org.eclipse.cdt.core/debug/parser/exceptions" value="false"/>
-<mapEntry key="org.eclipse.cdt.core/debug/scanner" value="false"/>
-<mapEntry key="org.eclipse.cdt.core/debug/search" value="false"/>
-<mapEntry key="org.eclipse.cdt.core/debug/typeresolver" value="false"/>
-<mapEntry key="org.eclipse.cdt.debug.mi.core/debug" value="true"/>
-<mapEntry key="org.eclipse.cdt.dsf.gdb/debug" value="false"/>
-<mapEntry key="org.eclipse.cdt.dsf.ui/debug" value="false"/>
-<mapEntry key="org.eclipse.cdt.dsf.ui/debug/disassembly" value="false"/>
-<mapEntry key="org.eclipse.cdt.dsf.ui/debug/stepping" value="false"/>
-<mapEntry key="org.eclipse.cdt.dsf.ui/debug/vm/atomicUpdate" value="false"/>
-<mapEntry key="org.eclipse.cdt.dsf.ui/debug/vm/cache" value="false"/>
-<mapEntry key="org.eclipse.cdt.dsf.ui/debug/vm/contentProvider" value="false"/>
-<mapEntry key="org.eclipse.cdt.dsf.ui/debug/vm/delta" value="false"/>
-<mapEntry key="org.eclipse.cdt.dsf.ui/debug/vm/presentationId" value=""/>
-<mapEntry key="org.eclipse.cdt.dsf/debug" value="false"/>
-<mapEntry key="org.eclipse.cdt.dsf/debug/executor" value="false"/>
-<mapEntry key="org.eclipse.cdt.dsf/debug/executorName" value=""/>
-<mapEntry key="org.eclipse.cdt.ui/debug" value="true"/>
-<mapEntry key="org.eclipse.cdt.ui/debug/SemanticHighlighting" value="false"/>
-<mapEntry key="org.eclipse.cdt.ui/debug/contentassist" value="false"/>
-<mapEntry key="org.eclipse.cdt.ui/debug/folding" value="false"/>
-<mapEntry key="org.eclipse.core.contenttype/debug" value="false"/>
-<mapEntry key="org.eclipse.core.expressions/debug/TypeExtensionManager" value="false"/>
-<mapEntry key="org.eclipse.core.expressions/tracePropertyResolving" value="false"/>
-<mapEntry key="org.eclipse.core.jobs/jobs" value="false"/>
-<mapEntry key="org.eclipse.core.jobs/jobs/beginend" value="false"/>
-<mapEntry key="org.eclipse.core.jobs/jobs/errorondeadlock" value="false"/>
-<mapEntry key="org.eclipse.core.jobs/jobs/locks" value="false"/>
-<mapEntry key="org.eclipse.core.jobs/jobs/shutdown" value="false"/>
-<mapEntry key="org.eclipse.core.jobs/jobs/timing" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/delta" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/failure" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/interrupt" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/invoking" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/needbuild" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/needbuildstack" value="false"/>
-<mapEntry key="org.eclipse.core.resources/build/stacktrace" value="false"/>
-<mapEntry key="org.eclipse.core.resources/contenttype" value="false"/>
-<mapEntry key="org.eclipse.core.resources/contenttype/cache" value="false"/>
-<mapEntry key="org.eclipse.core.resources/debug" value="false"/>
-<mapEntry key="org.eclipse.core.resources/history" value="false"/>
-<mapEntry key="org.eclipse.core.resources/natures" value="false"/>
-<mapEntry key="org.eclipse.core.resources/perf/builders" value="10000"/>
-<mapEntry key="org.eclipse.core.resources/perf/listeners" value="500"/>
-<mapEntry key="org.eclipse.core.resources/perf/save.participants" value="500"/>
-<mapEntry key="org.eclipse.core.resources/perf/snapshot" value="1000"/>
-<mapEntry key="org.eclipse.core.resources/preferences" value="false"/>
-<mapEntry key="org.eclipse.core.resources/refresh" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore/markers" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore/mastertable" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore/metainfo" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore/snapshots" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore/syncinfo" value="false"/>
-<mapEntry key="org.eclipse.core.resources/restore/tree" value="false"/>
-<mapEntry key="org.eclipse.core.resources/save" value="false"/>
-<mapEntry key="org.eclipse.core.resources/save/markers" value="false"/>
-<mapEntry key="org.eclipse.core.resources/save/mastertable" value="false"/>
-<mapEntry key="org.eclipse.core.resources/save/metainfo" value="false"/>
-<mapEntry key="org.eclipse.core.resources/save/syncinfo" value="false"/>
-<mapEntry key="org.eclipse.core.resources/save/tree" value="false"/>
-<mapEntry key="org.eclipse.core.resources/strings" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/compatibility/debug" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/debug" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/debug/context" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/perf" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/perf/success" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/preferences/plugin" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/url/debug" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/url/debug/cachecopy" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/url/debug/cachelookup" value="false"/>
-<mapEntry key="org.eclipse.core.runtime/url/debug/connect" value="false"/>
-<mapEntry key="org.eclipse.debug.core/debug" value="false"/>
-<mapEntry key="org.eclipse.debug.core/debug/commands" value="false"/>
-<mapEntry key="org.eclipse.debug.core/debug/events" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/breadcrumb" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/contextlaunching" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/launchhistory" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/contentProvider" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/deltas" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/model" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/presentationId" value=""/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/stateSaveRestore" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/updateSequence" value="false"/>
-<mapEntry key="org.eclipse.debug.ui/debug/viewers/viewer" value="false"/>
-<mapEntry key="org.eclipse.equinox.ds/debug" value="false"/>
-<mapEntry key="org.eclipse.equinox.ds/instantiate_all" value="false"/>
-<mapEntry key="org.eclipse.equinox.ds/performance" value="true"/>
-<mapEntry key="org.eclipse.equinox.ds/print_on_console" value="true"/>
-<mapEntry key="org.eclipse.equinox.p2.engine/engine/debug" value="false"/>
-<mapEntry key="org.eclipse.equinox.p2.engine/enginesession/debug" value="false"/>
-<mapEntry key="org.eclipse.equinox.p2.engine/profileregistry/debug" value="false"/>
-<mapEntry key="org.eclipse.equinox.preferences/general" value="false"/>
-<mapEntry key="org.eclipse.equinox.preferences/get" value="false"/>
-<mapEntry key="org.eclipse.equinox.preferences/set" value="false"/>
-<mapEntry key="org.eclipse.equinox.registry/debug" value="false"/>
-<mapEntry key="org.eclipse.equinox.registry/debug/events" value="false"/>
-<mapEntry key="org.eclipse.equinox.security.ui/debug" value="false"/>
-<mapEntry key="org.eclipse.equinox.security.ui/debug/storage" value="false"/>
-<mapEntry key="org.eclipse.equinox.security/debug" value="false"/>
-<mapEntry key="org.eclipse.equinox.security/debug/loginFramework" value="false"/>
-<mapEntry key="org.eclipse.help.ui/debug" value="true"/>
-<mapEntry key="org.eclipse.help.ui/debug/embeddedBrowser" value="false"/>
-<mapEntry key="org.eclipse.help.ui/debug/embeddedBrowser/inprocess" value="false"/>
-<mapEntry key="org.eclipse.help.ui/debug/infopop" value="false"/>
-<mapEntry key="org.eclipse.help.webapp/debug" value="true"/>
-<mapEntry key="org.eclipse.help.webapp/debug/workingsets" value="false"/>
-<mapEntry key="org.eclipse.help/debug" value="true"/>
-<mapEntry key="org.eclipse.help/debug/context" value="false"/>
-<mapEntry key="org.eclipse.help/debug/search" value="false"/>
-<mapEntry key="org.eclipse.help/debug/toc" value="false"/>
-<mapEntry key="org.eclipse.jdt.apt.core/debug" value="false"/>
-<mapEntry key="org.eclipse.jdt.apt.core/debug/compilationEnv" value="false"/>
-<mapEntry key="org.eclipse.jdt.apt.core/debug/generatedFileMaps" value="false"/>
-<mapEntry key="org.eclipse.jdt.apt.core/debug/generatedFiles" value="false"/>
-<mapEntry key="org.eclipse.jdt.apt.pluggable.core/debug" value="false"/>
-<mapEntry key="org.eclipse.jdt.core.manipulation/debug" value="true"/>
-<mapEntry key="org.eclipse.jdt.core/debug" value="true"/>
-<mapEntry key="org.eclipse.jdt.core/debug/buffermanager" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/builder" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/builder/stats" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/compiler" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/completion" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/cpresolution" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/cpresolution/advanced" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/cpresolution/failure" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/formatter" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/hierarchy" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/indexmanager" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/indexmanager/advanced" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/javadelta" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/javadelta/verbose" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/javamodel" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/javamodel/cache" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/postaction" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/resolution" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/search" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/selection" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/sourcemapper" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/debug/zipaccess" value="false"/>
-<mapEntry key="org.eclipse.jdt.core/perf/completion" value="300"/>
-<mapEntry key="org.eclipse.jdt.core/perf/containerinitializer" value="5000"/>
-<mapEntry key="org.eclipse.jdt.core/perf/javadeltalistener" value="500"/>
-<mapEntry key="org.eclipse.jdt.core/perf/reconcile" value="1000"/>
-<mapEntry key="org.eclipse.jdt.core/perf/selection" value="300"/>
-<mapEntry key="org.eclipse.jdt.core/perf/variableinitializer" value="5000"/>
-<mapEntry key="org.eclipse.jdt.ui/debug" value="true"/>
-<mapEntry key="org.eclipse.jdt.ui/debug/ASTProvider" value="false"/>
-<mapEntry key="org.eclipse.jdt.ui/debug/BreadcrumbItemDropDown" value="false"/>
-<mapEntry key="org.eclipse.jdt.ui/debug/ResultCollector" value="false"/>
-<mapEntry key="org.eclipse.jdt.ui/debug/TypeConstraints" value="false"/>
-<mapEntry key="org.eclipse.jdt.ui/perf/content_assist/extensions" value="1000"/>
-<mapEntry key="org.eclipse.jdt.ui/perf/content_assist_sorters/extensions" value=""/>
-<mapEntry key="org.eclipse.jdt.ui/perf/explorer/RefactorActionGroup" value="150"/>
-<mapEntry key="org.eclipse.jdt.ui/perf/explorer/createPartControl" value="1300"/>
-<mapEntry key="org.eclipse.jdt.ui/perf/explorer/makeActions" value="1000"/>
-<mapEntry key="org.eclipse.jdt.ui/perf/search/participants" value="300"/>
-<mapEntry key="org.eclipse.jem.util/debug/loglevel" value="WARNING"/>
-<mapEntry key="org.eclipse.jem.util/debug/logtrace" value="false"/>
-<mapEntry key="org.eclipse.jem.util/debug/logtracefile" value="false"/>
-<mapEntry key="org.eclipse.jface.text.source/debug/RevisionRulerColumn" value="false"/>
-<mapEntry key="org.eclipse.jface.text/assert/TextSelection/validConstructorArguments" value="false"/>
-<mapEntry key="org.eclipse.jface.text/debug/AbstractInformationControlManager" value="false"/>
-<mapEntry key="org.eclipse.jface.text/debug/AnnotationPainter" value="false"/>
-<mapEntry key="org.eclipse.jface.text/debug/ContentAssistSubjectAdapters" value="false"/>
-<mapEntry key="org.eclipse.jface.text/debug/FastPartitioner/PositionCache" value="false"/>
-<mapEntry key="org.eclipse.ltk.core.refactoring/perf/participants/checkConditions" value="300"/>
-<mapEntry key="org.eclipse.ltk.core.refactoring/perf/participants/createChanges" value="300"/>
-<mapEntry key="org.eclipse.osgi/debug" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/bundleTime" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/events" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/filter" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/loader" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/manifest" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/messageBundles" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/packageadmin" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/security" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/services" value="false"/>
-<mapEntry key="org.eclipse.osgi/debug/startlevel" value="false"/>
-<mapEntry key="org.eclipse.osgi/defaultprofile/buffersize" value="256"/>
-<mapEntry key="org.eclipse.osgi/defaultprofile/logfilename" value=""/>
-<mapEntry key="org.eclipse.osgi/defaultprofile/logsynchronously" value="false"/>
-<mapEntry key="org.eclipse.osgi/eclipseadaptor/converter/debug" value="false"/>
-<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug" value="false"/>
-<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/location" value="false"/>
-<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin" value="false"/>
-<mapEntry key="org.eclipse.osgi/eclipseadaptor/debug/platformadmin/resolver" value="false"/>
-<mapEntry key="org.eclipse.osgi/monitor/activation" value="false"/>
-<mapEntry key="org.eclipse.osgi/monitor/classes" value="false"/>
-<mapEntry key="org.eclipse.osgi/monitor/resources" value="false"/>
-<mapEntry key="org.eclipse.osgi/profile/benchmark" value="false"/>
-<mapEntry key="org.eclipse.osgi/profile/debug" value="false"/>
-<mapEntry key="org.eclipse.osgi/profile/impl" value="org.eclipse.osgi.internal.profile.DefaultProfileLogger"/>
-<mapEntry key="org.eclipse.osgi/profile/startup" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/cycles" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/debug" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/generics" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/imports" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/requires" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/uses" value="false"/>
-<mapEntry key="org.eclipse.osgi/resolver/wiring" value="false"/>
-<mapEntry key="org.eclipse.osgi/trace/activation" value="false"/>
-<mapEntry key="org.eclipse.osgi/trace/classLoading" value="false"/>
-<mapEntry key="org.eclipse.osgi/trace/filename" value="runtime.traces"/>
-<mapEntry key="org.eclipse.osgi/trace/filters" value="trace.properties"/>
-<mapEntry key="org.eclipse.pde.build/debug" value="false"/>
-<mapEntry key="org.eclipse.pde.core/cache" value="false"/>
-<mapEntry key="org.eclipse.pde.core/classpath" value="false"/>
-<mapEntry key="org.eclipse.pde.core/debug" value="true"/>
-<mapEntry key="org.eclipse.pde.core/validation" value="false"/>
-<mapEntry key="org.eclipse.team.core/backgroundevents" value="false"/>
-<mapEntry key="org.eclipse.team.core/debug" value="false"/>
-<mapEntry key="org.eclipse.team.core/refreshjob" value="false"/>
-<mapEntry key="org.eclipse.team.core/streams" value="false"/>
-<mapEntry key="org.eclipse.team.core/threading" value="false"/>
-<mapEntry key="org.eclipse.team.cvs.core/cvsprotocol" value="true"/>
-<mapEntry key="org.eclipse.team.cvs.core/debug" value="false"/>
-<mapEntry key="org.eclipse.team.cvs.core/dirtycaching" value="false"/>
-<mapEntry key="org.eclipse.team.cvs.core/metafiles" value="false"/>
-<mapEntry key="org.eclipse.team.cvs.core/syncchangeevents" value="false"/>
-<mapEntry key="org.eclipse.team.cvs.core/threading" value="false"/>
-<mapEntry key="org.eclipse.ui.browser/debug" value="false"/>
-<mapEntry key="org.eclipse.ui.ide/debug" value="false"/>
-<mapEntry key="org.eclipse.ui.ide/debug/gc" value="false"/>
-<mapEntry key="org.eclipse.ui.ide/debug/internalerror/openDialog" value="false"/>
-<mapEntry key="org.eclipse.ui.ide/debug/markers" value="false"/>
-<mapEntry key="org.eclipse.ui.ide/debug/undomonitor" value="false"/>
-<mapEntry key="org.eclipse.ui.intro.universal/debug" value="true"/>
-<mapEntry key="org.eclipse.ui.intro.universal/trace/logInfo" value="true"/>
-<mapEntry key="org.eclipse.ui.intro.universal/trace/logPerformance" value="false"/>
-<mapEntry key="org.eclipse.ui.intro/debug" value="true"/>
-<mapEntry key="org.eclipse.ui.intro/debug/toolbar" value="false"/>
-<mapEntry key="org.eclipse.ui.intro/flags/noBrowser" value="false"/>
-<mapEntry key="org.eclipse.ui.intro/trace/logInfo" value="true"/>
-<mapEntry key="org.eclipse.ui.intro/trace/logPerformance" value="false"/>
-<mapEntry key="org.eclipse.ui.intro/trace/printHTML" value="false"/>
-<mapEntry key="org.eclipse.ui.navigator/debug" value="false"/>
-<mapEntry key="org.eclipse.ui.navigator/debug/dnd" value="false"/>
-<mapEntry key="org.eclipse.ui.navigator/debug/resolution" value="false"/>
-<mapEntry key="org.eclipse.ui.navigator/debug/setup" value="false"/>
-<mapEntry key="org.eclipse.ui.navigator/debug/sort" value="false"/>
-<mapEntry key="org.eclipse.ui.navigator/debug/viewermap" value="false"/>
-<mapEntry key="org.eclipse.ui.navigator/perf/explorer/createPartControl" value="1300"/>
-<mapEntry key="org.eclipse.ui.workbench/debug" value="false"/>
-<mapEntry key="org.eclipse.ui/debug" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/contributions" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/declaredImages" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/job.stale" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/showAllJobs" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/swtdebug" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/swtdebugglobal" value="false"/>
-<mapEntry key="org.eclipse.ui/debug/workingSets" value="false"/>
-<mapEntry key="org.eclipse.ui/experimental/menus" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPage.IPartListener" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPage.IPartListener2" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPage.IPropertyChangeListener" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchPartReference" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPageListener" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPartListener" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPartListener2" value="false"/>
-<mapEntry key="org.eclipse.ui/listeners/IWorkbenchWindow.IPerspectiveListener" value="false"/>
-<mapEntry key="org.eclipse.ui/perf/contentTypes" value="200"/>
-<mapEntry key="org.eclipse.ui/perf/page.listeners" value="200"/>
-<mapEntry key="org.eclipse.ui/perf/part.activate" value="200"/>
-<mapEntry key="org.eclipse.ui/perf/part.control" value="800"/>
-<mapEntry key="org.eclipse.ui/perf/part.create" value="800"/>
-<mapEntry key="org.eclipse.ui/perf/part.init" value="800"/>
-<mapEntry key="org.eclipse.ui/perf/part.input" value="200"/>
-<mapEntry key="org.eclipse.ui/perf/part.listeners" value="200"/>
-<mapEntry key="org.eclipse.ui/perf/perspective.create" value="800"/>
-<mapEntry key="org.eclipse.ui/perf/perspective.listeners" value="200"/>
-<mapEntry key="org.eclipse.ui/perf/perspective.switch" value="800"/>
-<mapEntry key="org.eclipse.ui/perf/showHeapStatus" value="true"/>
-<mapEntry key="org.eclipse.ui/perf/uijob" value="200"/>
-<mapEntry key="org.eclipse.ui/perf/workbench.restore" value="30000"/>
-<mapEntry key="org.eclipse.ui/perf/workbench.start" value="45000"/>
-<mapEntry key="org.eclipse.ui/trace/commands" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/contexts" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/contexts.performance" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/contexts.verbose" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/graphics" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/handlers" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/handlers.performance" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/handlers.verbose" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/handlers.verbose.commandId" value=""/>
-<mapEntry key="org.eclipse.ui/trace/keyBindings" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/keyBindings.verbose" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/multipageeditor" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/operations" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/operations.verbose" value="false"/>
-<mapEntry key="org.eclipse.ui/trace/sources" value="false"/>
-<mapEntry key="org.eclipse.wst.common.environment/debug" value="true"/>
-<mapEntry key="org.eclipse.wst.common.environment/trace/command" value="true"/>
-<mapEntry key="org.eclipse.wst.common.environment/trace/data" value="true"/>
-<mapEntry key="org.eclipse.wst.common.environment/trace/emitter" value="true"/>
-<mapEntry key="org.eclipse.wst.common.environment/trace/error" value="true"/>
-<mapEntry key="org.eclipse.wst.common.environment/trace/info" value="true"/>
-<mapEntry key="org.eclipse.wst.common.environment/trace/warning" value="true"/>
-<mapEntry key="org.eclipse.wst.common.environment/trace/ws_ant" value="true"/>
-<mapEntry key="org.eclipse.wst.common.environment/trace/ws_dt_cmd_engine" value="true"/>
-<mapEntry key="org.eclipse.wst.common.environment/trace/ws_framework" value="true"/>
-<mapEntry key="org.eclipse.wst.common.project.facet.core/actionSorting" value="false"/>
-<mapEntry key="org.eclipse.wst.common.project.facet.core/activation" value="false"/>
-<mapEntry key="org.eclipse.wst.common.project.facet.core/delegate/calls" value="false"/>
-<mapEntry key="org.eclipse.wst.common.project.facet.core/events/project" value="false"/>
-<mapEntry key="org.eclipse.wst.common.project.facet.core/events/project/stacktrace" value="false"/>
-<mapEntry key="org.eclipse.wst.dtd.ui/projectionperf" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.core/debug" value="true"/>
-<mapEntry key="org.eclipse.wst.sse.core/dom/adapter/notification/time" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.core/dom/adapter/notification/time/criteria" value="10"/>
-<mapEntry key="org.eclipse.wst.sse.core/filebuffers/leaks" value="true"/>
-<mapEntry key="org.eclipse.wst.sse.core/filebuffers/lifecycle" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.core/filebuffers/modelmanagement" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.core/format" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.core/structureddocument" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.core/structuredmodel/lifecycle" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.core/structuredmodel/locks" value="true"/>
-<mapEntry key="org.eclipse.wst.sse.core/structuredmodel/modelmanager" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.core/structuredmodel/state" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.core/tasks" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.core/tasks/detection" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.core/tasks/job" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.core/tasks/overalltime" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.core/tasks/preferences" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.core/tasks/registry" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.core/tasks/time" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/actioncontributor/debugstatusfields" value="true"/>
-<mapEntry key="org.eclipse.wst.sse.ui/contentOutline" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/debug" value="true"/>
-<mapEntry key="org.eclipse.wst.sse.ui/debug/reconcilerSpelling" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/debug/reconcilerSpelling/showProblems" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/debug/reconcilerValidators" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/debug/reconcilerjob" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/debug/tracefilter" value=""/>
-<mapEntry key="org.eclipse.wst.sse.ui/extendedconfigurationbuilder" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/extendedconfigurationbuilder/time" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/extendededitoractionbuilder" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/extendededitoractionbuilder/contributetime" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/extendededitoractionbuilder/debugmenu" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/extendededitoractionbuilder/debugpopup" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/extendededitoractionbuilder/debugtoolbar" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/extendededitoractionbuilder/readtime" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/filemodelprovider/lifecyclelistener" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/filemodelprovider/modelstatelistener" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/filemodelprovider/operations" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/gotoNextAnnotation" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/preferences-properties" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/propertyChangeUpdateActionContributionItem" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/propertySheet" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/storagemodelprovider/elementstatelistener" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/storagemodelprovider/operations" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/structuredPresentationReconciler" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/structuredPresentationReconciler/time" value="false"/>
-<mapEntry key="org.eclipse.wst.sse.ui/transferbuilder/time" value="false"/>
-<mapEntry key="org.eclipse.wst.validation/debug" value="true"/>
-<mapEntry key="org.eclipse.wst.validation/extraValDetail" value=""/>
-<mapEntry key="org.eclipse.wst.validation/filter/allExcept" value=""/>
-<mapEntry key="org.eclipse.wst.validation/timings" value="false"/>
-<mapEntry key="org.eclipse.wst.validation/timings/tracefile" value=""/>
-<mapEntry key="org.eclipse.wst.validation/timings/useDoubles" value="false"/>
-<mapEntry key="org.eclipse.wst.validation/trace/level" value=""/>
-<mapEntry key="org.eclipse.wst.validation/v1" value="false"/>
-<mapEntry key="org.eclipse.wst.xml.core/debug" value="true"/>
-<mapEntry key="org.eclipse.wst.xml.core/debug/cmdocumentcache" value="false"/>
-<mapEntry key="org.eclipse.wst.xml.core/debug/cmdocumentmanager" value="false"/>
-<mapEntry key="org.eclipse.wst.xml.core/debug/tracefilter" value=""/>
-<mapEntry key="org.eclipse.wst.xml.ui/projectionperf" value="false"/>
-<mapEntry key="org.eclipse.wtp.common/debug/loglevel" value="WARNING"/>
-<mapEntry key="org.eclipse.wtp.common/debug/logtrace" value="false"/>
-<mapEntry key="org.eclipse.wtp.common/debug/logtracefile" value="false"/>
-</mapAttribute>
-<booleanAttribute key="useCustomFeatures" value="false"/>
-<booleanAttribute key="useDefaultConfig" value="true"/>
-<booleanAttribute key="useDefaultConfigArea" value="true"/>
-<booleanAttribute key="useProduct" value="true"/>
-<booleanAttribute key="usefeatures" value="false"/>
+ <booleanAttribute key="append.args" value="true"/>
+ <booleanAttribute key="askclear" value="true"/>
+ <booleanAttribute key="automaticAdd" value="true"/>
+ <booleanAttribute key="automaticValidate" value="false"/>
+ <stringAttribute key="bootstrap" value=""/>
+ <stringAttribute key="checked" value="[NONE]"/>
+ <booleanAttribute key="clearConfig" value="true"/>
+ <booleanAttribute key="clearws" value="true"/>
+ <booleanAttribute key="clearwslog" value="false"/>
+ <stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/P2 Replication"/>
+ <booleanAttribute key="default" value="true"/>
+ <booleanAttribute key="generateProfile" value="true"/>
+ <booleanAttribute key="includeOptional" value="true"/>
+ <stringAttribute key="location" value="${workspace_loc}/runtime-New_configuration"/>
+ <booleanAttribute key="org.eclipse.jdt.launching.ATTR_ATTR_USE_ARGFILE" value="false"/>
+ <stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+ <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-console"/>
+ <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+ <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Declipse.p2.profile=SDKProfile&#13;&#13;&#10;-Declipse.p2.data.area=${target_home}/p2"/>
+ <stringAttribute key="pde.version" value="3.3"/>
+ <stringAttribute key="product" value="org.eclipse.platform.ide"/>
+ <booleanAttribute key="show_selected_only" value="false"/>
+ <stringAttribute key="templateConfig" value="${target_home}/configuration/config.ini"/>
+ <booleanAttribute key="tracing" value="false"/>
+ <booleanAttribute key="useCustomFeatures" value="false"/>
+ <booleanAttribute key="useDefaultConfig" value="true"/>
+ <booleanAttribute key="useDefaultConfigArea" value="true"/>
+ <booleanAttribute key="useProduct" value="true"/>
+ <booleanAttribute key="usefeatures" value="false"/>
</launchConfiguration>
diff --git a/bundles/org.eclipse.equinox.p2.ui.importexport/forceQualifierUpdate.txt b/bundles/org.eclipse.equinox.p2.ui.importexport/forceQualifierUpdate.txt
index 56f1032a8..03b2dab4b 100644
--- a/bundles/org.eclipse.equinox.p2.ui.importexport/forceQualifierUpdate.txt
+++ b/bundles/org.eclipse.equinox.p2.ui.importexport/forceQualifierUpdate.txt
@@ -1,2 +1,3 @@
# To force a version qualifier update add the bug here
Bug 403352 - Update all parent versions to match our build stream
+Bug 572789 - Comparator errors in I20210412-1800 after moving to compiler from 4.20 M1 \ No newline at end of file
diff --git a/bundles/org.eclipse.equinox.p2.ui.importexport/icons/obj16/install-handler.png b/bundles/org.eclipse.equinox.p2.ui.importexport/icons/obj16/install-handler.png
new file mode 100644
index 000000000..07986bf79
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.ui.importexport/icons/obj16/install-handler.png
Binary files differ
diff --git a/bundles/org.eclipse.equinox.p2.ui.importexport/icons/obj16/install-handler@2x.png b/bundles/org.eclipse.equinox.p2.ui.importexport/icons/obj16/install-handler@2x.png
new file mode 100644
index 000000000..88a3e73cf
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.ui.importexport/icons/obj16/install-handler@2x.png
Binary files differ
diff --git a/bundles/org.eclipse.equinox.p2.ui.importexport/plugin.xml b/bundles/org.eclipse.equinox.p2.ui.importexport/plugin.xml
index d3b4800bf..f67a5b6a5 100755
--- a/bundles/org.eclipse.equinox.p2.ui.importexport/plugin.xml
+++ b/bundles/org.eclipse.equinox.p2.ui.importexport/plugin.xml
@@ -10,7 +10,7 @@
<wizard
category="org.eclipse.equinox.p2.category"
class="org.eclipse.equinox.internal.p2.importexport.internal.wizard.ExportWizard"
- icon="icons/wizban/install_wiz.png"
+ icon="icons/obj16/install-handler.png"
id="org.eclipse.equinox.p2.replication.export"
name="%export.name">
<description>
@@ -27,7 +27,7 @@
<wizard
category="org.eclipse.equinox.p2.category"
class="org.eclipse.equinox.internal.p2.importexport.internal.wizard.ImportWizard"
- icon="icons/wizban/install_wiz.png"
+ icon="icons/obj16/install-handler.png"
id="org.eclipse.equinox.p2.replication.import"
name="%import.name">
<description>
@@ -37,7 +37,7 @@
<wizard
category="org.eclipse.equinox.p2.category"
class="org.eclipse.equinox.internal.p2.importexport.internal.wizard.ImportFromInstallationWizard"
- icon="icons/wizban/install_wiz.png"
+ icon="icons/obj16/install-handler.png"
id="org.eclipse.equinox.p2.replication.importfrominstallation"
name="%importfrominstallation.name">
<description>
diff --git a/bundles/org.eclipse.equinox.p2.ui.importexport/pom.xml b/bundles/org.eclipse.equinox.p2.ui.importexport/pom.xml
index c20bdba3c..0d01faecf 100644
--- a/bundles/org.eclipse.equinox.p2.ui.importexport/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.ui.importexport/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.ui.importexport</artifactId>
- <version>1.2.600-SNAPSHOT</version>
+ <version>1.3.200-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/ImportExportActivator.java b/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/ImportExportActivator.java
deleted file mode 100644
index 0be4d6f81..000000000
--- a/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/ImportExportActivator.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2011 WindRiver 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:
- * WindRiver Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.equinox.internal.p2.importexport.internal;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-public class ImportExportActivator extends AbstractUIPlugin {
-
- private static ImportExportActivator instance = null;
-
- public static ImportExportActivator getDefault() {
- return instance;
- }
-
- @Override
- public void start(BundleContext context) throws Exception {
- super.start(context);
-
- instance = this;
- }
-}
diff --git a/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ExportWizard.java b/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ExportWizard.java
index 33f7a1ee7..07e3d9654 100755
--- a/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ExportWizard.java
+++ b/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ExportWizard.java
@@ -15,19 +15,21 @@ package org.eclipse.equinox.internal.p2.importexport.internal.wizard;
import java.io.File;
import org.eclipse.core.runtime.Platform;
-import org.eclipse.equinox.internal.p2.importexport.internal.*;
+import org.eclipse.equinox.internal.p2.importexport.internal.Constants;
+import org.eclipse.equinox.internal.p2.importexport.internal.Messages;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.osgi.util.NLS;
-import org.eclipse.ui.IExportWizard;
-import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.*;
+import org.osgi.framework.FrameworkUtil;
public class ExportWizard extends AbstractWizard implements IExportWizard {
public ExportWizard() {
- IDialogSettings workbenchSettings = ImportExportActivator.getDefault().getDialogSettings();
+ IDialogSettings workbenchSettings = PlatformUI
+ .getDialogSettingsProvider(FrameworkUtil.getBundle(ExportWizard.class)).getDialogSettings();
String sectionName = "ExportWizard"; //$NON-NLS-1$
IDialogSettings section = workbenchSettings.getSection(sectionName);
if (section == null) {
@@ -46,7 +48,8 @@ public class ExportWizard extends AbstractWizard implements IExportWizard {
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
setWindowTitle(Messages.ExportWizard_WizardTitle);
- setDefaultPageImageDescriptor(ImageDescriptor.createFromURL(Platform.getBundle(Constants.Bundle_ID).getEntry("icons/wizban/install_wiz.png"))); //$NON-NLS-1$
+ setDefaultPageImageDescriptor(ImageDescriptor
+ .createFromURL(Platform.getBundle(Constants.Bundle_ID).getEntry("icons/wizban/install_wiz.png"))); //$NON-NLS-1$
setNeedsProgressMonitor(true);
}
@@ -54,7 +57,8 @@ public class ExportWizard extends AbstractWizard implements IExportWizard {
public boolean performFinish() {
File file = new File(((ExportPage) mainPage).getDestinationValue());
if (file.exists()) {
- if (!MessageDialog.openConfirm(this.getShell(), Messages.ExportWizard_ConfirmDialogTitle, NLS.bind(Messages.ExportWizard_OverwriteConfirm, file.getAbsolutePath())))
+ if (!MessageDialog.openConfirm(this.getShell(), Messages.ExportWizard_ConfirmDialogTitle,
+ NLS.bind(Messages.ExportWizard_OverwriteConfirm, file.getAbsolutePath())))
return false;
}
return super.performFinish();
diff --git a/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportFromInstallationPage.java b/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportFromInstallationPage.java
index e9574252e..34acd48a2 100644
--- a/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportFromInstallationPage.java
+++ b/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportFromInstallationPage.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2011, 2017 WindRiver Corporation and others.
+ * Copyright (c) 2011, 2021 WindRiver Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -112,7 +112,7 @@ public class ImportFromInstallationPage extends AbstractImportPage implements IS
boolean rt;
if (Display.findDisplay(Thread.currentThread()) == null) {
- Callable<Boolean> getSuperValidateDest = new Callable<Boolean>() {
+ Callable<Boolean> getSuperValidateDest = new Callable<>() {
Boolean validated;
@Override
@@ -139,7 +139,7 @@ public class ImportFromInstallationPage extends AbstractImportPage implements IS
try {
String destination;
if (Display.findDisplay(Thread.currentThread()) == null) {
- Callable<String> getDestinationValue = new Callable<String>() {
+ Callable<String> getDestinationValue = new Callable<>() {
String des;
@Override
@@ -418,7 +418,7 @@ public class ImportFromInstallationPage extends AbstractImportPage implements IS
@Override
public void setCheckedElements(Object[] elements) {
- new UnsupportedOperationException();
+ throw new UnsupportedOperationException();
}
public ProvisioningContext getProvisioningContext() {
diff --git a/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportFromInstallationWizard.java b/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportFromInstallationWizard.java
index 0fb83516b..8d4568601 100644
--- a/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportFromInstallationWizard.java
+++ b/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportFromInstallationWizard.java
@@ -15,7 +15,8 @@ package org.eclipse.equinox.internal.p2.importexport.internal.wizard;
import java.util.Collection;
import org.eclipse.core.runtime.Platform;
-import org.eclipse.equinox.internal.p2.importexport.internal.*;
+import org.eclipse.equinox.internal.p2.importexport.internal.Constants;
+import org.eclipse.equinox.internal.p2.importexport.internal.Messages;
import org.eclipse.equinox.internal.p2.ui.dialogs.ISelectableIUsPage;
import org.eclipse.equinox.internal.p2.ui.dialogs.InstallWizard;
import org.eclipse.equinox.internal.p2.ui.model.IUElementListRoot;
@@ -27,8 +28,8 @@ import org.eclipse.equinox.p2.ui.ProvisioningUI;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IImportWizard;
-import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.*;
+import org.osgi.framework.FrameworkUtil;
public class ImportFromInstallationWizard extends InstallWizard implements IImportWizard {
@@ -36,9 +37,12 @@ public class ImportFromInstallationWizard extends InstallWizard implements IImpo
this(ProvisioningUI.getDefaultUI(), null, null, null);
}
- public ImportFromInstallationWizard(ProvisioningUI ui, InstallOperation operation, Collection<IInstallableUnit> initialSelections, LoadMetadataRepositoryJob preloadJob) {
+ public ImportFromInstallationWizard(ProvisioningUI ui, InstallOperation operation,
+ Collection<IInstallableUnit> initialSelections, LoadMetadataRepositoryJob preloadJob) {
super(ui, operation, initialSelections, preloadJob);
- IDialogSettings workbenchSettings = ImportExportActivator.getDefault().getDialogSettings();
+ IDialogSettings workbenchSettings = PlatformUI
+ .getDialogSettingsProvider(FrameworkUtil.getBundle(ImportFromInstallationWizard.class))
+ .getDialogSettings();
String sectionName = "ImportFromInstallationWizard"; //$NON-NLS-1$
IDialogSettings section = workbenchSettings.getSection(sectionName);
if (section == null) {
@@ -50,7 +54,8 @@ public class ImportFromInstallationWizard extends InstallWizard implements IImpo
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
setWindowTitle(Messages.ImportWizard_WINDOWTITLE);
- setDefaultPageImageDescriptor(ImageDescriptor.createFromURL(Platform.getBundle(Constants.Bundle_ID).getEntry("icons/wizban/install_wiz.png"))); //$NON-NLS-1$
+ setDefaultPageImageDescriptor(ImageDescriptor
+ .createFromURL(Platform.getBundle(Constants.Bundle_ID).getEntry("icons/wizban/install_wiz.png"))); //$NON-NLS-1$
setNeedsProgressMonitor(true);
}
diff --git a/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportPage.java b/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportPage.java
index 63084646a..d782893bd 100644
--- a/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportPage.java
+++ b/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportPage.java
@@ -367,7 +367,7 @@ public class ImportPage extends AbstractImportPage implements ISelectableIUsPage
@Override
public void setCheckedElements(Object[] elements) {
- new UnsupportedOperationException();
+ throw new UnsupportedOperationException();
}
public ProvisioningContext getProvisioningContext() {
diff --git a/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportWizard.java b/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportWizard.java
index 075f603fa..22a8b1905 100644
--- a/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportWizard.java
+++ b/bundles/org.eclipse.equinox.p2.ui.importexport/src/org/eclipse/equinox/internal/p2/importexport/internal/wizard/ImportWizard.java
@@ -19,7 +19,8 @@ import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import org.eclipse.core.runtime.*;
-import org.eclipse.equinox.internal.p2.importexport.internal.*;
+import org.eclipse.equinox.internal.p2.importexport.internal.Constants;
+import org.eclipse.equinox.internal.p2.importexport.internal.Messages;
import org.eclipse.equinox.internal.p2.ui.ProvUI;
import org.eclipse.equinox.internal.p2.ui.ProvUIMessages;
import org.eclipse.equinox.internal.p2.ui.dialogs.ISelectableIUsPage;
@@ -36,9 +37,9 @@ import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IImportWizard;
-import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.*;
import org.eclipse.ui.statushandlers.StatusManager;
+import org.osgi.framework.FrameworkUtil;
public class ImportWizard extends InstallWizard implements IImportWizard {
@@ -46,9 +47,12 @@ public class ImportWizard extends InstallWizard implements IImportWizard {
this(ProvisioningUI.getDefaultUI(), null, null, null);
}
- public ImportWizard(ProvisioningUI ui, InstallOperation operation, Collection<IInstallableUnit> initialSelections, LoadMetadataRepositoryJob preloadJob) {
+ public ImportWizard(ProvisioningUI ui, InstallOperation operation, Collection<IInstallableUnit> initialSelections,
+ LoadMetadataRepositoryJob preloadJob) {
super(ui, operation, initialSelections, preloadJob);
- IDialogSettings workbenchSettings = ImportExportActivator.getDefault().getDialogSettings();
+ IDialogSettings workbenchSettings = PlatformUI
+ .getDialogSettingsProvider(FrameworkUtil.getBundle(ImportFromInstallationWizard.class))
+ .getDialogSettings();
String sectionName = "ImportWizard"; //$NON-NLS-1$
IDialogSettings section = workbenchSettings.getSection(sectionName);
if (section == null) {
@@ -60,7 +64,8 @@ public class ImportWizard extends InstallWizard implements IImportWizard {
@Override
public void init(IWorkbench workbench, IStructuredSelection selection) {
setWindowTitle(Messages.ImportWizard_WINDOWTITLE);
- setDefaultPageImageDescriptor(ImageDescriptor.createFromURL(Platform.getBundle(Constants.Bundle_ID).getEntry("icons/wizban/install_wiz.png"))); //$NON-NLS-1$
+ setDefaultPageImageDescriptor(ImageDescriptor
+ .createFromURL(Platform.getBundle(Constants.Bundle_ID).getEntry("icons/wizban/install_wiz.png"))); //$NON-NLS-1$
setNeedsProgressMonitor(true);
}
@@ -80,8 +85,9 @@ public class ImportWizard extends InstallWizard implements IImportWizard {
}
/**
- * Recompute the provisioning plan based on the items in the IUElementListRoot and the given provisioning context.
- * Report progress using the specified runnable context. This method may be called before the page is created.
+ * Recompute the provisioning plan based on the items in the IUElementListRoot
+ * and the given provisioning context. Report progress using the specified
+ * runnable context. This method may be called before the page is created.
*
* @param runnableContext
*/
@@ -98,9 +104,11 @@ public class ImportWizard extends InstallWizard implements IImportWizard {
ProvisioningContext context = getProvisioningContext();
initializeResolutionModelElements(getOperationSelections());
if (planSelections.length == 0) {
- operation = new InstallOperation(new ProvisioningSession(AbstractPage.agent), new ArrayList<IInstallableUnit>()) {
+ operation = new InstallOperation(new ProvisioningSession(AbstractPage.agent),
+ new ArrayList<IInstallableUnit>()) {
@Override
- protected void computeProfileChangeRequest(MultiStatus status, IProgressMonitor progressMonitor) {
+ protected void computeProfileChangeRequest(MultiStatus status,
+ IProgressMonitor progressMonitor) {
progressMonitor.done();
}
@@ -108,7 +116,8 @@ public class ImportWizard extends InstallWizard implements IImportWizard {
public IStatus getResolutionResult() {
if (sub.isCanceled())
return Status.CANCEL_STATUS;
- return new Status(IStatus.ERROR, Constants.Bundle_ID, Messages.ImportWizard_CannotQuerySelection);
+ return new Status(IStatus.ERROR, Constants.Bundle_ID,
+ Messages.ImportWizard_CannotQuerySelection);
}
};
} else {
@@ -129,7 +138,8 @@ public class ImportWizard extends InstallWizard implements IImportWizard {
Display.getDefault().asyncExec(this::planChanged);
});
} catch (InterruptedException e) {
- operation = new InstallOperation(new ProvisioningSession(AbstractPage.agent), new ArrayList<IInstallableUnit>()) {
+ operation = new InstallOperation(new ProvisioningSession(AbstractPage.agent),
+ new ArrayList<IInstallableUnit>()) {
@Override
public IStatus getResolutionResult() {
@@ -149,7 +159,8 @@ public class ImportWizard extends InstallWizard implements IImportWizard {
if (message != null) {
couldNotResolveStatus = new Status(IStatus.ERROR, Constants.Bundle_ID, message, null);
} else {
- couldNotResolveStatus = new Status(IStatus.ERROR, Constants.Bundle_ID, ProvUIMessages.ProvisioningOperationWizard_UnexpectedFailureToResolve, null);
+ couldNotResolveStatus = new Status(IStatus.ERROR, Constants.Bundle_ID,
+ ProvUIMessages.ProvisioningOperationWizard_UnexpectedFailureToResolve, null);
}
StatusManager.getManager().handle(couldNotResolveStatus, StatusManager.LOG);
}
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/META-INF/MANIFEST.MF
index 905c3b1d9..f6a0f04ed 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %bundleName
Bundle-SymbolicName: org.eclipse.equinox.p2.ui.sdk.scheduler;singleton:=true
-Bundle-Version: 1.5.0.qualifier
+Bundle-Version: 1.5.300.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.ui.sdk.scheduler.AutomaticUpdatePlugin
Bundle-Vendor: %providerName
Bundle-Localization: plugin
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/pom.xml b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/pom.xml
index 659746fdb..f5f8a49f1 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.ui.sdk.scheduler</artifactId>
- <version>1.5.0-SNAPSHOT</version>
+ <version>1.5.300-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdateScheduler.java b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdateScheduler.java
index 19833a9a0..6d56f31c9 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdateScheduler.java
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/AutomaticUpdateScheduler.java
@@ -19,8 +19,7 @@ package org.eclipse.equinox.internal.p2.ui.sdk.scheduler;
import java.util.Date;
import java.util.Random;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.*;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper;
import org.eclipse.equinox.internal.p2.garbagecollector.GarbageCollector;
@@ -34,6 +33,7 @@ import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.query.IQuery;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.ui.IStartup;
+import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.statushandlers.StatusManager;
/**
@@ -52,38 +52,59 @@ public class AutomaticUpdateScheduler implements IStartup {
private static final int ONE_HOUR_IN_MS = 60 * 60 * 1000;
private static final int ONE_DAY_IN_MS = 24 * ONE_HOUR_IN_MS;
- private IUpdateListener listener = null;
- private IUpdateChecker checker = null;
-
- private IProvisioningAgent agent;
+ private IUpdateListener listener;
+ private IUpdateChecker checker;
@Override
public void earlyStartup() {
AutomaticUpdatePlugin.getDefault().setScheduler(this);
- Job updateJob = Job.create("Update Job", e -> { //$NON-NLS-1$
- agent = ServiceHelper.getService(AutomaticUpdatePlugin.getContext(), IProvisioningAgent.class);
- IProfileRegistry registry = agent.getService(IProfileRegistry.class);
- IProfile currentProfile = registry.getProfile(IProfileRegistry.SELF);
- if (currentProfile != null && new MigrationSupport().performMigration(agent, registry, currentProfile)) {
- return;
+ Job updateJob = new Job("Update Job") { //$NON-NLS-1$
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ IProvisioningAgent agent = ServiceHelper.getService(AutomaticUpdatePlugin.getContext(),
+ IProvisioningAgent.class);
+ if (agent == null) {
+ String message = "No provisioning agent service found"; //$NON-NLS-1$
+ AutomaticUpdatePlugin.getDefault().getLog().warn(message, new IllegalStateException(message));
+ return Status.CANCEL_STATUS;
+ }
+ IProfileRegistry registry = agent.getService(IProfileRegistry.class);
+ IProfile currentProfile = registry.getProfile(IProfileRegistry.SELF);
+ if (currentProfile != null
+ && new MigrationSupport().performMigration(agent, registry, currentProfile)) {
+ return Status.OK_STATUS;
+ }
+
+ removeUnusedPlugins(registry, agent);
+ scheduleUpdate();
+ return Status.OK_STATUS;
}
- removeUnusedPlugins(registry);
- scheduleUpdate();
- });
+ @Override
+ public boolean belongsTo(Object family) {
+ return AutomaticUpdateScheduler.class == family;
+ }
+
+ @Override
+ public boolean shouldRun() {
+ return PlatformUI.isWorkbenchRunning();
+ }
+ };
+
updateJob.setSystem(true);
// allow the system to settle
updateJob.schedule(20000);
-
}
/**
* Invokes the garbage collector to discard unused plugins, if specified by a
* corresponding preference.
*
+ * @param agent non null
*/
- private void removeUnusedPlugins(IProfileRegistry registry) {
+ private void removeUnusedPlugins(IProfileRegistry registry, IProvisioningAgent agent) {
// check if gc is enabled
IPreferenceStore pref = AutomaticUpdatePlugin.getDefault().getPreferenceStore();
if (!pref.getBoolean(PreferenceConstants.PREF_GC_ON_STARTUP)) {
@@ -139,7 +160,14 @@ public class AutomaticUpdateScheduler implements IStartup {
}
};
- checker = agent.getService(IUpdateChecker.class);
+ IProvisioningAgent pagent = ServiceHelper.getService(AutomaticUpdatePlugin.getContext(),
+ IProvisioningAgent.class);
+ if (pagent == null) {
+ String message = "No provisioning agent service found"; //$NON-NLS-1$
+ AutomaticUpdatePlugin.getDefault().getLog().warn(message, new IllegalStateException(message));
+ return;
+ }
+ checker = pagent.getService(IUpdateChecker.class);
if (checker == null) {
// Something did not initialize properly
IStatus status = new Status(IStatus.ERROR, AutomaticUpdatePlugin.PLUGIN_ID,
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/PreviousConfigurationFinder.java b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/PreviousConfigurationFinder.java
index f435ef242..a87721308 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/PreviousConfigurationFinder.java
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/PreviousConfigurationFinder.java
@@ -93,6 +93,11 @@ public class PreviousConfigurationFinder {
}
@Override
+ public int hashCode() {
+ return Objects.hash(major, minor, service);
+ }
+
+ @Override
public String toString() {
return "" + major + '.' + minor + '.' + service; //$NON-NLS-1$
}
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/MigrationPage.java b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/MigrationPage.java
index 8a52a05e5..7cedadb2a 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/MigrationPage.java
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk.scheduler/src/org/eclipse/equinox/internal/p2/ui/sdk/scheduler/migration/MigrationPage.java
@@ -815,7 +815,7 @@ public class MigrationPage extends WizardPage implements ISelectableIUsPage, Lis
@Override
public void setCheckedElements(Object[] elements) {
- new UnsupportedOperationException();
+ throw new UnsupportedOperationException();
}
// Look for update of the current selected installation units and replace the
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk/.classpath b/bundles/org.eclipse.equinox.p2.ui.sdk/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk/.classpath
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.ui.sdk/.settings/org.eclipse.jdt.core.prefs
index b6ee06ea1..3c15076cc 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk/.settings/org.eclipse.jdt.core.prefs
@@ -17,9 +17,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -36,6 +36,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -89,6 +90,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -125,7 +127,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -139,7 +142,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -260,7 +262,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -331,7 +332,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -476,7 +476,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.ui.sdk/META-INF/MANIFEST.MF
index 0deb76a1f..4293409db 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %bundleName
Bundle-SymbolicName: org.eclipse.equinox.p2.ui.sdk;singleton:=true
-Bundle-Version: 1.1.700.qualifier
+Bundle-Version: 1.2.4.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.ui.sdk.ProvSDKUIActivator
Bundle-Vendor: %providerName
Bundle-Localization: plugin
@@ -12,8 +12,12 @@ Require-Bundle: org.eclipse.ui;bundle-version="3.6.0",
org.eclipse.core.runtime,
org.eclipse.equinox.p2.ui;bundle-version="2.6.0"
Import-Package: javax.xml.parsers,
+ org.bouncycastle.bcpg;version="1.69.0",
+ org.bouncycastle.openpgp;version="1.69.0",
org.eclipse.compare;resolution:=optional,
org.eclipse.compare.structuremergeviewer;resolution:=optional,
+ org.eclipse.equinox.internal.p2.artifact.processors.pgp,
+ org.eclipse.equinox.internal.p2.engine.phases,
org.eclipse.equinox.p2.core;version="[2.0.0,3.0.0)",
org.eclipse.equinox.p2.engine;version="[2.0.0,3.0.0)",
org.eclipse.equinox.p2.engine.query;version="[2.0.0,3.0.0)",
@@ -21,11 +25,12 @@ Import-Package: javax.xml.parsers,
org.eclipse.equinox.p2.operations;version="[2.0.0,3.0.0)",
org.eclipse.equinox.p2.planner;version="2.0.0",
org.eclipse.equinox.p2.query;version="[2.0.0,3.0.0)",
+ org.eclipse.equinox.p2.repository.spi;version="2.0.0",
org.eclipse.osgi.util;version="1.1.0",
org.osgi.framework;version="1.6.0",
org.w3c.dom,
org.xml.sax
Service-Component: OSGI-INF/policy_component.xml, OSGI-INF/licenseManager_component.xml
Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Automatic-Module-Name: org.eclipse.equinox.p2.ui.sdk
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk/plugin.properties b/bundles/org.eclipse.equinox.p2.ui.sdk/plugin.properties
index 672cb238d..372fe98ce 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk/plugin.properties
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk/plugin.properties
@@ -28,5 +28,7 @@ provisioningPrefPage = Install/Update
sitesPrefPage = Available Software Sites
installedSoftwarePage = Installed Software
installHistoryPage = Installation History
+trustPrefPage = Trust
preferenceKeywords.general=automatic update schedule remove download site software uninstall install import bundle
+preferenceKeywords.trust=trust security keys pgp gpg
preferences=Update and Install Preferences
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk/plugin.xml b/bundles/org.eclipse.equinox.p2.ui.sdk/plugin.xml
index 249d78378..69e973118 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk/plugin.xml
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk/plugin.xml
@@ -22,6 +22,14 @@
<keywordReference id="org.eclipse.equinox.p2.ui.sdk.updates.general"/>
</page>
+ <page
+ name="%trustPrefPage"
+ category="org.eclipse.equinox.internal.p2.ui.sdk.ProvisioningPreferencePage"
+ class="org.eclipse.equinox.internal.p2.ui.sdk.TrustPreferencePage"
+ id="org.eclipse.equinox.internal.p2.ui.sdk.TrustPreferencePage">
+ <keywordReference id="org.eclipse.equinox.p2.ui.sdk.updates.trust"/>
+ </page>
+
</extension>
<extension
@@ -29,6 +37,10 @@
<keyword
label="%preferenceKeywords.general"
id="org.eclipse.equinox.p2.ui.sdk.updates.general"/>
+ <keyword
+ id="org.eclipse.equinox.p2.ui.sdk.updates.trust"
+ label="%preferenceKeywords.trust">
+ </keyword>
</extension>
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk/pom.xml b/bundles/org.eclipse.equinox.p2.ui.sdk/pom.xml
index ea8becc29..bcca1f5ac 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.ui.sdk</artifactId>
- <version>1.1.700-SNAPSHOT</version>
+ <version>1.2.4-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/ProvSDKMessages.java b/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/ProvSDKMessages.java
index e985ebb74..26d979317 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/ProvSDKMessages.java
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/ProvSDKMessages.java
@@ -50,5 +50,32 @@ public class ProvSDKMessages extends NLS {
public static String UpdateHandler_ProgressTaskName;
public static String RemediationOperation_ResolveJobName;
public static String RemediationOperation_ResolveJobTask;
+ public static String TrustPreferencePage_title;
+ public static String TrustPreferencePage_export;
+ public static String TrustPreferencePage_fileExportTitle;
+ public static String TrustPreferencePage_pgpIntro;
+ public static String TrustPreferencePage_fileImportTitle;
+ public static String TrustPreferencePage_addPGPKeyButtonLabel;
+ public static String TrustPreferencePage_Contributor;
+ public static String TrustPreferencePage_CopyFingerprint;
+ public static String TrustPreferencePage_DataValidExpires;
+ public static String TrustPreferencePage_DateExpired;
+ public static String TrustPreferencePage_DateExpiredSince;
+ public static String TrustPreferencePage_DateNotYetvalid;
+ public static String TrustPreferencePage_DateNotYetValid;
+ public static String TrustPreferencePage_DateValid;
+ public static String TrustPreferencePage_Details;
+ public static String TrustPreferencePage_Export;
+ public static String TrustPreferencePage_FingerprintIdColumn;
+ public static String TrustPreferencePage_NameColumn;
+ public static String TrustPreferencePage_PreferenceContributor;
+ public static String TrustPreferencePage_removePGPKeyButtonLabel;
+ public static String TrustPreferencePage_TrustAll;
+ public static String TrustPreferencePage_TrustAllConfirmationDescription;
+ public static String TrustPreferencePage_TrustAllConfirmationTitle;
+ public static String TrustPreferencePage_TrustAllNo;
+ public static String TrustPreferencePage_TrustAllYes;
+ public static String TrustPreferencePage_TypeColumn;
+ public static String TrustPreferencePage_ValidityColumn;
}
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/SimpleLicenseManager.java b/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/SimpleLicenseManager.java
index 160fdf055..b5972a964 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/SimpleLicenseManager.java
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/SimpleLicenseManager.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2017 IBM Corporation and others.
+ * Copyright (c) 2007, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -11,17 +11,21 @@
* Contributors:
* IBM Corporation - initial API and implementation
* Genuitec, LLC - added license support
+ * Hannes Wellmann - Bug 574622: Persist remembered accepted licenses
*******************************************************************************/
package org.eclipse.equinox.internal.p2.ui.sdk;
import java.util.HashSet;
-import java.util.StringTokenizer;
+import java.util.Set;
+import java.util.regex.Pattern;
+import org.eclipse.core.runtime.Platform;
import org.eclipse.equinox.internal.p2.ui.sdk.prefs.PreferenceConstants;
import org.eclipse.equinox.p2.core.IAgentLocation;
import org.eclipse.equinox.p2.engine.IProfileRegistry;
import org.eclipse.equinox.p2.engine.ProfileScope;
import org.eclipse.equinox.p2.metadata.ILicense;
import org.eclipse.equinox.p2.ui.LicenseManager;
+import org.osgi.service.prefs.BackingStoreException;
import org.osgi.service.prefs.Preferences;
/**
@@ -32,8 +36,8 @@ import org.osgi.service.prefs.Preferences;
* @since 3.6
*/
public class SimpleLicenseManager extends LicenseManager {
- java.util.Set<String> accepted = new HashSet<>();
- String profileId;
+ private final Set<String> accepted = new HashSet<>();
+ private final String profileId;
public SimpleLicenseManager(String profileId) {
super();
@@ -75,26 +79,25 @@ public class SimpleLicenseManager extends LicenseManager {
return new ProfileScope(location, profileId).getNode(ProvSDKUIActivator.PLUGIN_ID);
}
+ private static final Pattern DIGESTS_DELIMITER = Pattern.compile(","); //$NON-NLS-1$
+
private void initializeFromPreferences() {
Preferences pref = getPreferences();
if (pref != null) {
String digestList = pref.get(PreferenceConstants.PREF_LICENSE_DIGESTS, ""); //$NON-NLS-1$
- StringTokenizer tokenizer = new StringTokenizer(digestList, ","); //$NON-NLS-1$
- while (tokenizer.hasMoreTokens()) {
- accepted.add(tokenizer.nextToken().trim());
- }
+ DIGESTS_DELIMITER.splitAsStream(digestList).filter(s -> !s.isBlank()).map(String::strip)
+ .forEach(accepted::add);
}
}
private void updatePreferences() {
Preferences pref = getPreferences();
- StringBuilder result = new StringBuilder();
- Object[] indexedList = accepted.toArray();
- for (int i = 0; i < indexedList.length; i++) {
- if (i != 0)
- result.append(","); //$NON-NLS-1$
- result.append((String) indexedList[i]);
+ String acceptedLicenseDigests = String.join(",", accepted); //$NON-NLS-1$
+ pref.put(PreferenceConstants.PREF_LICENSE_DIGESTS, acceptedLicenseDigests);
+ try {
+ pref.flush();
+ } catch (BackingStoreException e) {
+ Platform.getLog(SimpleLicenseManager.class).error("Persisting remembered licenses failed", e); //$NON-NLS-1$
}
- pref.put(PreferenceConstants.PREF_LICENSE_DIGESTS, result.toString());
}
}
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/TrustPreferencePage.java b/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/TrustPreferencePage.java
new file mode 100644
index 000000000..bb0ef513e
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/TrustPreferencePage.java
@@ -0,0 +1,491 @@
+/*******************************************************************************
+ * Copyright (c) 2021 Red Hat Inc.
+ *
+ * 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
+ *******************************************************************************/
+package org.eclipse.equinox.internal.p2.ui.sdk;
+
+import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter;
+
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.security.cert.*;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
+import java.util.List;
+import java.util.function.Function;
+import org.bouncycastle.bcpg.ArmoredOutputStream;
+import org.bouncycastle.openpgp.PGPPublicKey;
+import org.eclipse.core.runtime.*;
+import org.eclipse.equinox.internal.p2.artifact.processors.pgp.PGPPublicKeyStore;
+import org.eclipse.equinox.internal.p2.engine.phases.CertificateChecker;
+import org.eclipse.equinox.internal.p2.ui.dialogs.PGPPublicKeyViewDialog;
+import org.eclipse.equinox.internal.p2.ui.viewers.CertificateLabelProvider;
+import org.eclipse.equinox.p2.core.IProvisioningAgent;
+import org.eclipse.equinox.p2.engine.IProfileRegistry;
+import org.eclipse.equinox.p2.repository.spi.PGPPublicKeyService;
+import org.eclipse.jface.dialogs.*;
+import org.eclipse.jface.layout.TableColumnLayout;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.util.Policy;
+import org.eclipse.jface.viewers.*;
+import org.eclipse.jface.widgets.LabelFactory;
+import org.eclipse.jface.widgets.WidgetFactory;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.*;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.Constants;
+
+public class TrustPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+
+ private static final String EXPORT_FILTER_PATH = "exportFilterPath"; //$NON-NLS-1$
+ private static final String ADD_FILTER_PATH = "addFilterPath"; //$NON-NLS-1$
+
+ private CertificateChecker certificateChecker;
+ private Set<Certificate> trustedCertificates;
+ private PGPPublicKeyStore trustedKeys;
+ private Map<PGPPublicKey, Set<Bundle>> contributedTrustedKeys;
+ private boolean dirty;
+ private TableViewer viewer;
+
+ public TrustPreferencePage() {
+ super(ProvSDKMessages.TrustPreferencePage_title);
+ }
+
+ @Override
+ public void init(IWorkbench workbench) {
+ // nothing to do
+ }
+
+ @Override
+ protected Control createContents(Composite parent) {
+ IProvisioningAgent provisioningAgent = ProvSDKUIActivator.getDefault().getProvisioningAgent();
+ certificateChecker = new CertificateChecker(provisioningAgent);
+ certificateChecker
+ .setProfile(provisioningAgent.getService(IProfileRegistry.class).getProfile(IProfileRegistry.SELF));
+ trustedCertificates = new LinkedHashSet<>(certificateChecker.getPreferenceTrustedCertificates());
+ contributedTrustedKeys = certificateChecker.getContributedTrustedKeys();
+ trustedKeys = certificateChecker.getPreferenceTrustedKeys();
+
+ Composite res = new Composite(parent, SWT.NONE);
+ res.setLayout(new GridLayout(2, false));
+
+ // Ensure that the message supports wrapping for a long text message.
+ GridData data = new GridData(SWT.FILL, SWT.DEFAULT, true, false, 2, 1);
+ data.widthHint = convertWidthInCharsToPixels(90);
+ LabelFactory factory = WidgetFactory.label(SWT.WRAP).text(ProvSDKMessages.TrustPreferencePage_pgpIntro)
+ .font(parent.getFont()).layoutData(data);
+ factory.create(res);
+
+ TableColumnLayout tableColumnLayout = new TableColumnLayout();
+ Composite tableComposite = WidgetFactory.composite(SWT.NONE)
+ .layoutData(new GridData(SWT.FILL, SWT.FILL, true, true)).layout(tableColumnLayout).create(res);
+ Table keyTable = WidgetFactory.table(SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION)
+ .headerVisible(true).linesVisible(true).font(parent.getFont()).create(tableComposite);
+ viewer = new TableViewer(keyTable);
+ keyTable.setHeaderVisible(true);
+ viewer.setContentProvider(new ArrayContentProvider());
+
+ // This column is packed later.
+ TableViewerColumn typeColumn = createColumn(viewer, ProvSDKMessages.TrustPreferencePage_TypeColumn,
+ key -> "PGP", cert -> "x509", tableColumnLayout, 1); //$NON-NLS-1$ //$NON-NLS-2$
+
+ createColumn(viewer, ProvSDKMessages.TrustPreferencePage_FingerprintIdColumn,
+ key -> PGPPublicKeyService.toHexFingerprint(key),
+ cert -> cert.getSerialNumber().toString(), tableColumnLayout, 10);
+
+ createColumn(viewer, ProvSDKMessages.TrustPreferencePage_NameColumn, key -> {
+ List<String> userIds = new ArrayList<>();
+ key.getUserIDs().forEachRemaining(userIds::add);
+ return String.join(", ", userIds); //$NON-NLS-1$
+ }, cert -> CertificateLabelProvider.getText(cert), tableColumnLayout, 15);
+
+ createColumn(viewer, ProvSDKMessages.TrustPreferencePage_Contributor, key -> {
+ {
+ Set<String> contributors = new LinkedHashSet<>();
+ if (trustedKeys.all().contains(key)) {
+ contributors.add(ProvSDKMessages.TrustPreferencePage_PreferenceContributor);
+ }
+ Set<Bundle> bundles = contributedTrustedKeys.get(key);
+ if (bundles != null) {
+ Set<String> bundleContributors = new TreeSet<>(Policy.getComparator());
+ bundles.stream().map(bundle -> getBundleName(bundle)).forEach(bundleContributors::add);
+ contributors.addAll(bundleContributors);
+ }
+ return String.join(", ", contributors); //$NON-NLS-1$
+ }
+ }, cert -> ProvSDKMessages.TrustPreferencePage_PreferenceContributor, tableColumnLayout,
+ contributedTrustedKeys.isEmpty() ? 8 : 15);
+
+ createColumn(viewer, ProvSDKMessages.TrustPreferencePage_ValidityColumn, pgp -> {
+ if (pgp.getCreationTime().after(Date.from(Instant.now()))) {
+ return NLS.bind(ProvSDKMessages.TrustPreferencePage_DateNotYetValid, pgp.getCreationTime());
+ }
+ long validSeconds = pgp.getValidSeconds();
+ if (validSeconds == 0) {
+ return ProvSDKMessages.TrustPreferencePage_DateValid;
+ }
+ Instant expires = pgp.getCreationTime().toInstant().plus(validSeconds, ChronoUnit.SECONDS);
+ return expires.isBefore(Instant.now())
+ ? NLS.bind(ProvSDKMessages.TrustPreferencePage_DateExpiredSince, expires)
+ : NLS.bind(ProvSDKMessages.TrustPreferencePage_DataValidExpires, expires);
+ }, x509 -> {
+ try {
+ x509.checkValidity();
+ return ProvSDKMessages.TrustPreferencePage_DateValid;
+ } catch (CertificateExpiredException expired) {
+ return ProvSDKMessages.TrustPreferencePage_DateExpired;
+ } catch (CertificateNotYetValidException notYetValid) {
+ return ProvSDKMessages.TrustPreferencePage_DateNotYetvalid;
+ }
+ }, tableColumnLayout, 8);
+
+ updateInput();
+
+ Composite buttonComposite = createVerticalButtonBar(res);
+ buttonComposite.setLayoutData(new GridData(SWT.DEFAULT, SWT.BEGINNING, false, false));
+
+ Button exportButton = new Button(buttonComposite, SWT.PUSH);
+ exportButton.setText(ProvSDKMessages.TrustPreferencePage_export);
+ setVerticalButtonLayoutData(exportButton);
+ exportButton.setEnabled(false);
+
+ exportButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+ Object element = viewer.getStructuredSelection().getFirstElement();
+ FileDialog dialog = new FileDialog(getShell(), SWT.SAVE);
+ dialog.setFilterPath(getFilterPath(EXPORT_FILTER_PATH));
+ dialog.setText(ProvSDKMessages.TrustPreferencePage_fileExportTitle);
+ dialog.setFilterExtensions(new String[] { "*.asc" }); //$NON-NLS-1$
+ FileDialog destination = new FileDialog(exportButton.getShell(), SWT.SAVE);
+ destination.setFilterPath(getFilterPath(EXPORT_FILTER_PATH));
+ destination.setText(ProvSDKMessages.TrustPreferencePage_Export);
+ if (element instanceof X509Certificate) {
+ X509Certificate cert = (X509Certificate) element;
+ destination.setFilterExtensions(new String[] { "*.der" }); //$NON-NLS-1$
+ destination.setFileName(cert.getSerialNumber().toString() + ".der"); //$NON-NLS-1$
+ String path = destination.open();
+ setFilterPath(EXPORT_FILTER_PATH, destination.getFilterPath());
+ if (path == null) {
+ return;
+ }
+ File destinationFile = new File(path);
+ try (FileOutputStream output = new FileOutputStream(destinationFile)) {
+ output.write(cert.getEncoded());
+ } catch (IOException | CertificateEncodingException ex) {
+ ProvSDKUIActivator.getDefault().getLog()
+ .log(new Status(IStatus.ERROR, ProvSDKUIActivator.PLUGIN_ID, ex.getMessage(), ex));
+ }
+ } else {
+ PGPPublicKey key = (PGPPublicKey) element;
+ destination.setFilterExtensions(new String[] { "*.asc" }); //$NON-NLS-1$
+ destination.setFileName(PGPPublicKeyService.toHexFingerprint(key) + ".asc"); //$NON-NLS-1$
+ String path = destination.open();
+ setFilterPath(EXPORT_FILTER_PATH, destination.getFilterPath());
+ if (path == null) {
+ return;
+ }
+ File destinationFile = new File(path);
+ try (OutputStream output = new ArmoredOutputStream(new FileOutputStream(destinationFile))) {
+ key.encode(output);
+ } catch (IOException ex) {
+ ProvSDKUIActivator.getDefault().getLog()
+ .log(new Status(IStatus.ERROR, ProvSDKUIActivator.PLUGIN_ID, ex.getMessage(), ex));
+ }
+ }
+ }));
+
+ Button addButton = new Button(buttonComposite, SWT.PUSH);
+ addButton.setText(ProvSDKMessages.TrustPreferencePage_addPGPKeyButtonLabel);
+ addButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+ FileDialog dialog = new FileDialog(getShell(), SWT.OPEN);
+ dialog.setFilterPath(getFilterPath(ADD_FILTER_PATH));
+ dialog.setText(ProvSDKMessages.TrustPreferencePage_fileImportTitle);
+ dialog.setFilterExtensions(new String[] { "*.asc;*.der" }); //$NON-NLS-1$
+ String path = dialog.open();
+ setFilterPath(ADD_FILTER_PATH, dialog.getFilterPath());
+ if (path == null) {
+ return;
+ }
+
+ if (path.endsWith(".der")) { //$NON-NLS-1$
+ try {
+ CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); //$NON-NLS-1$
+ try (InputStream input = Files.newInputStream(Paths.get(path))) {
+ Collection<? extends Certificate> certificates = certificateFactory.generateCertificates(input);
+ trustedCertificates.addAll(certificates);
+ updateInput();
+ viewer.setSelection(new StructuredSelection(certificates.toArray()), true);
+ }
+ } catch (IOException | CertificateException ex) {
+ ProvSDKUIActivator.getDefault().getLog()
+ .log(new Status(IStatus.ERROR, ProvSDKUIActivator.PLUGIN_ID, ex.getMessage(), ex));
+ }
+ } else {
+ HashSet<Object> oldKeys = new HashSet<>(trustedKeys.all());
+ trustedKeys.add(new File(path));
+
+ HashSet<Object> newKeys = new HashSet<>(trustedKeys.all());
+ newKeys.removeAll(oldKeys);
+ updateInput();
+ viewer.setSelection(new StructuredSelection(newKeys.toArray()), true);
+ }
+ dirty = true;
+ }));
+ setVerticalButtonLayoutData(addButton);
+
+ Button removeButton = new Button(buttonComposite, SWT.PUSH);
+ removeButton.setText(ProvSDKMessages.TrustPreferencePage_removePGPKeyButtonLabel);
+ removeButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
+ for (Object key : getSelectedKeys()) {
+ if (key instanceof PGPPublicKey) {
+ trustedKeys.remove((PGPPublicKey) key);
+ } else {
+ trustedCertificates.remove(key);
+ }
+ }
+ updateInput();
+ dirty = true;
+ }));
+ removeButton.setEnabled(false);
+ setVerticalButtonLayoutData(removeButton);
+
+ Runnable details = () -> {
+ Object element = viewer.getStructuredSelection().getFirstElement();
+ if (element instanceof X509Certificate) {
+ // create and open dialog for certificate chain
+ CertificateLabelProvider.openDialog(getShell(), (X509Certificate) element);
+ } else {
+ new PGPPublicKeyViewDialog(getShell(), (PGPPublicKey) element,
+ provisioningAgent.getService(PGPPublicKeyService.class)).open();
+ }
+ };
+
+ Button detailsButton = new Button(buttonComposite, SWT.PUSH);
+ detailsButton.setText(ProvSDKMessages.TrustPreferencePage_Details);
+ detailsButton.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> details.run()));
+ detailsButton.setEnabled(false);
+ setVerticalButtonLayoutData(detailsButton);
+
+ viewer.addPostSelectionChangedListener(e -> {
+ List<Object> selectedKeys = getSelectedKeys();
+ exportButton.setEnabled(selectedKeys.size() == 1);
+ Collection<PGPPublicKey> keys = trustedKeys.all();
+ removeButton.setEnabled(
+ selectedKeys.stream().anyMatch(o -> keys.contains(o) || trustedCertificates.contains(o)));
+ detailsButton.setEnabled(selectedKeys.size() == 1);
+ });
+
+ Button trustAllButton = WidgetFactory.button(SWT.CHECK).text(ProvSDKMessages.TrustPreferencePage_TrustAll)
+ .font(JFaceResources.getDialogFont()).create(res);
+ setButtonLayoutData(trustAllButton).verticalSpan = 2;
+ trustAllButton.setSelection(certificateChecker.isTrustAlways());
+ trustAllButton.addSelectionListener(widgetSelectedAdapter(e -> {
+ if (trustAllButton.getSelection()) {
+ // Prompt the user to ensure they really understand what they've chosen, the
+ // risk, and where the preference is stored if they wish to change it in the
+ // future. Also ensure that the default button is no so that they must
+ // explicitly click the yes button, not just hit enter.
+ MessageDialog messageDialog = new MessageDialog(getShell(),
+ ProvSDKMessages.TrustPreferencePage_TrustAllConfirmationTitle, null,
+ ProvSDKMessages.TrustPreferencePage_TrustAllConfirmationDescription, MessageDialog.QUESTION,
+ new String[] { ProvSDKMessages.TrustPreferencePage_TrustAllYes,
+ ProvSDKMessages.TrustPreferencePage_TrustAllNo },
+ 1) {
+ @Override
+ public Image getImage() {
+ return getWarningImage();
+ }
+ };
+ int result = messageDialog.open();
+ if (result != Window.OK) {
+ certificateChecker.setTrustAlways(false);
+ // Restore the setting.
+ trustAllButton.setSelection(false);
+ } else {
+ certificateChecker.setTrustAlways(true);
+ }
+
+ }
+ }));
+
+ viewer.addDoubleClickListener(e -> details.run());
+
+ typeColumn.getColumn().pack();
+
+ createMenu();
+
+ return res;
+ }
+
+ private void createMenu() {
+ Control control = viewer.getControl();
+ Menu menu = new Menu(control);
+ control.setMenu(menu);
+ MenuItem item = new MenuItem(menu, SWT.PUSH);
+ item.setText(ProvSDKMessages.TrustPreferencePage_CopyFingerprint);
+ item.addSelectionListener(widgetSelectedAdapter(e -> {
+ Object element = viewer.getStructuredSelection().getFirstElement();
+ if (element instanceof PGPPublicKey) {
+ Clipboard clipboard = new Clipboard(getShell().getDisplay());
+ clipboard.setContents(new Object[] {
+ PGPPublicKeyService.toHexFingerprint((PGPPublicKey) element) },
+ new Transfer[] { TextTransfer.getInstance() });
+ clipboard.dispose();
+ }
+ }));
+
+ viewer.addSelectionChangedListener(
+ e -> item.setEnabled(viewer.getStructuredSelection().getFirstElement() instanceof PGPPublicKey));
+ }
+
+ private TableViewerColumn createColumn(TableViewer tableViewer, String text, Function<PGPPublicKey, String> pgpMap,
+ Function<X509Certificate, String> x509Map, TableColumnLayout tableColumnLayout, int columnWeight) {
+ TableViewerColumn column = new TableViewerColumn(tableViewer, SWT.NONE);
+ column.getColumn().setText(text);
+ column.setLabelProvider(new PGPOrX509ColumnLabelProvider(pgpMap, x509Map));
+
+ tableColumnLayout.setColumnData(column.getColumn(), new ColumnWeightData(columnWeight));
+ return column;
+ }
+
+ private void updateInput() {
+ Set<PGPPublicKey> input = new TreeSet<>((k1, k2) -> {
+ return Arrays.compare(k1.getFingerprint(), k2.getFingerprint());
+ });
+ input = new LinkedHashSet<>();
+ Collection<PGPPublicKey> all = trustedKeys.all();
+ input = new TreeSet<>((k1, k2) -> {
+ boolean contains1 = all.contains(k1);
+ boolean contains2 = all.contains(k2);
+ if (contains1 != contains2) {
+ if (contains1) {
+ return -1;
+ }
+ return 1;
+ }
+ return PGPPublicKeyService.toHexFingerprint(k1).compareTo(PGPPublicKeyService.toHexFingerprint(k2));
+ });
+ input.addAll(all);
+ input.addAll(contributedTrustedKeys.keySet());
+
+ LinkedHashSet<Object> allInput = new LinkedHashSet<>();
+ allInput.addAll(trustedCertificates);
+ allInput.addAll(input);
+ viewer.setInput(allInput);
+ }
+
+ @SuppressWarnings("unchecked")
+ private List<Object> getSelectedKeys() {
+ return viewer.getStructuredSelection().toList();
+ }
+
+ private Composite createVerticalButtonBar(Composite parent) {
+ // Create composite.
+ Composite composite = new Composite(parent, SWT.NONE);
+ initializeDialogUnits(composite);
+
+ // create a layout with spacing and margins appropriate for the font
+ // size.
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ layout.marginWidth = 5;
+ layout.marginHeight = 0;
+ layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+ layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+ composite.setLayout(layout);
+
+ return composite;
+ }
+
+ private GridData setVerticalButtonLayoutData(Button button) {
+ GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+ int widthHint = convertHorizontalDLUsToPixels(IDialogConstants.BUTTON_WIDTH);
+ Point minSize = button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
+ data.widthHint = Math.max(widthHint, minSize.x);
+ button.setLayoutData(data);
+ return data;
+ }
+
+ private String getFilterPath(String key) {
+ IDialogSettings dialogSettings = DialogSettings
+ .getOrCreateSection(ProvSDKUIActivator.getDefault().getDialogSettings(), getClass().getName());
+ String filterPath = dialogSettings.get(key);
+ if (filterPath == null) {
+ filterPath = System.getProperty("user.home"); //$NON-NLS-1$
+ }
+ return filterPath;
+ }
+
+ private void setFilterPath(String key, String filterPath) {
+ if (filterPath != null) {
+ IDialogSettings dialogSettings = DialogSettings
+ .getOrCreateSection(ProvSDKUIActivator.getDefault().getDialogSettings(), getClass().getName());
+ dialogSettings.put(key, filterPath);
+ }
+ }
+
+ private String getBundleName(Bundle bundle) {
+ String value = bundle.getHeaders().get(Constants.BUNDLE_NAME);
+ return value == null ? bundle.getSymbolicName() : Platform.getResourceString(bundle, value);
+ }
+
+ @Override
+ protected void performDefaults() {
+ trustedCertificates = new LinkedHashSet<>(certificateChecker.getPreferenceTrustedCertificates());
+ trustedKeys = certificateChecker.getPreferenceTrustedKeys();
+ updateInput();
+ super.performDefaults();
+ }
+
+ @Override
+ public boolean performOk() {
+ if (dirty) {
+ IStatus persistTrustedCertificates = certificateChecker.persistTrustedCertificates(trustedCertificates);
+ IStatus persistTrustedKeys = certificateChecker.persistTrustedKeys(trustedKeys);
+ dirty = false;
+ return persistTrustedKeys.isOK() && persistTrustedCertificates.isOK();
+ }
+ return true;
+ }
+
+ private static class PGPOrX509ColumnLabelProvider extends ColumnLabelProvider {
+ private Function<PGPPublicKey, String> pgpMap;
+ private Function<X509Certificate, String> x509map;
+
+ public PGPOrX509ColumnLabelProvider(Function<PGPPublicKey, String> pgpMap,
+ Function<X509Certificate, String> x509map) {
+ this.pgpMap = pgpMap;
+ this.x509map = x509map;
+ }
+
+ @Override
+ public String getText(Object element) {
+ if (element instanceof PGPPublicKey) {
+ return pgpMap.apply((PGPPublicKey) element);
+ }
+ if (element instanceof X509Certificate) {
+ return x509map.apply((X509Certificate) element);
+ }
+ return super.getText(element);
+ }
+ }
+
+}
diff --git a/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/messages.properties b/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/messages.properties
index e91eb07b5..93df84f7f 100644
--- a/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/messages.properties
+++ b/bundles/org.eclipse.equinox.p2.ui.sdk/src/org/eclipse/equinox/internal/p2/ui/sdk/messages.properties
@@ -34,4 +34,31 @@ UpdateHandler_NoSitesMessage=There are no update sites to search. Do you wish to
UpdateHandler_NoSitesTitle=No Updates Found
UpdateHandler_ProgressTaskName=Checking for updates...
RemediationOperation_ResolveJobName=Searching alternate solutions...
-RemediationOperation_ResolveJobTask=Some items cannot be at the highest version. Searching for the highest common denominator ... \ No newline at end of file
+RemediationOperation_ResolveJobTask=Some items cannot be at the highest version. Searching for the highest common denominator ...
+TrustPreferencePage_title=Trust
+TrustPreferencePage_export=\uD83D\uDCE5 E&xport...
+TrustPreferencePage_fileExportTitle=Export PGP public key
+TrustPreferencePage_fileImportTitle=Import PGP public key to trust
+TrustPreferencePage_addPGPKeyButtonLabel=\u2795 &Add...
+TrustPreferencePage_Contributor=Contributor
+TrustPreferencePage_CopyFingerprint=Copy Fingerprint
+TrustPreferencePage_DataValidExpires=\u2714\uFE0F Valid, expires {0}
+TrustPreferencePage_DateExpired=\u274C Expired
+TrustPreferencePage_DateExpiredSince=\u274C Expired since {0}
+TrustPreferencePage_DateNotYetvalid=\u274C Not yet valid
+TrustPreferencePage_DateNotYetValid=\u274C Not yet valid, starts {0}
+TrustPreferencePage_DateValid=\u2714\uFE0F Valid
+TrustPreferencePage_Details=\uD83D\uDD0D D&etails...
+TrustPreferencePage_Export=Export...
+TrustPreferencePage_FingerprintIdColumn=Fingerprint/Id
+TrustPreferencePage_NameColumn=Name
+TrustPreferencePage_PreferenceContributor=<preferences>
+TrustPreferencePage_removePGPKeyButtonLabel=\uD83D\uDDD1\uFE0F &Remove
+TrustPreferencePage_pgpIntro=Artifacts verifiably signed by the following trusted certificates and PGP public keys will be installed without confirmation.
+TrustPreferencePage_TrustAll=Trust all content
+TrustPreferencePage_TrustAllConfirmationDescription=Are you certain you wish to trust all content, including unsigned content of unknown origin, with no confirmation for all future operations?
+TrustPreferencePage_TrustAllConfirmationTitle=Always Trust Everything Confirmation
+TrustPreferencePage_TrustAllNo=No, Prompt Me Instead
+TrustPreferencePage_TrustAllYes=Yes, I Accept the Risk
+TrustPreferencePage_TypeColumn=Type
+TrustPreferencePage_ValidityColumn=Validity Dates
diff --git a/bundles/org.eclipse.equinox.p2.ui/.classpath b/bundles/org.eclipse.equinox.p2.ui/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.ui/.classpath
+++ b/bundles/org.eclipse.equinox.p2.ui/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.ui/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.ui/.settings/org.eclipse.jdt.core.prefs
index 792214af7..8d3182a1a 100644
--- a/bundles/org.eclipse.equinox.p2.ui/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.ui/.settings/org.eclipse.jdt.core.prefs
@@ -17,9 +17,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -35,6 +35,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=error
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -88,6 +89,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=erro
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -123,8 +125,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -138,7 +140,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -259,7 +260,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -330,7 +330,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -475,7 +474,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.ui/META-INF/MANIFEST.MF
index 70d352ab6..433d2e820 100644
--- a/bundles/org.eclipse.equinox.p2.ui/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %bundleName
Bundle-SymbolicName: org.eclipse.equinox.p2.ui;singleton:=true
-Bundle-Version: 2.6.100.qualifier
+Bundle-Version: 2.7.400.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.ui.ProvUIActivator
Bundle-Vendor: %providerName
Bundle-Localization: plugin
@@ -19,6 +19,7 @@ Export-Package: org.eclipse.equinox.internal.p2.ui;
org.eclipse.equinox.internal.p2.ui.dialogs;
x-friends:="org.eclipse.equinox.p2.ui.admin,
org.eclipse.equinox.p2.ui.sdk.scheduler,
+ org.eclipse.equinox.p2.ui.sdk,
org.eclipse.pde.ui,
org.eclipse.equinox.p2.ui.importexport",
org.eclipse.equinox.internal.p2.ui.model;
@@ -28,7 +29,7 @@ Export-Package: org.eclipse.equinox.internal.p2.ui;
org.eclipse.equinox.p2.ui.sdk,
org.eclipse.equinox.p2.ui.importexport",
org.eclipse.equinox.internal.p2.ui.query;x-friends:="org.eclipse.equinox.internal.p2.ui.analysis,org.eclipse.equinox.p2.ui.admin",
- org.eclipse.equinox.internal.p2.ui.viewers;x-friends:="org.eclipse.equinox.p2.ui.admin,org.eclipse.equinox.p2.ui.sdk.scheduler,org.eclipse.equinox.p2.ui.importexport",
+ org.eclipse.equinox.internal.p2.ui.viewers;x-friends:="org.eclipse.equinox.p2.ui.admin,org.eclipse.equinox.p2.ui.sdk,org.eclipse.equinox.p2.ui.sdk.scheduler,org.eclipse.equinox.p2.ui.importexport",
org.eclipse.equinox.p2.ui;version="2.6.0"
Require-Bundle: org.eclipse.ui;bundle-version="3.107.0",
org.eclipse.core.runtime;bundle-version="[3.18.0,4.0.0)",
@@ -36,9 +37,14 @@ Require-Bundle: org.eclipse.ui;bundle-version="3.107.0",
org.eclipse.equinox.security.ui;bundle-version="[1.0.0,2.0.0)",
org.eclipse.e4.ui.dialogs;bundle-version="1.1.600"
Import-Package: javax.xml.parsers,
+ org.bouncycastle.bcpg;version="1.65.0",
+ org.bouncycastle.openpgp;version="1.65.0",
+ org.bouncycastle.util;version="1.65.1",
+ org.eclipse.equinox.internal.p2.artifact.processors.pgp,
org.eclipse.equinox.internal.p2.artifact.repository,
org.eclipse.equinox.internal.p2.core.helpers,
org.eclipse.equinox.internal.p2.director,
+ org.eclipse.equinox.internal.p2.extensionlocation,
org.eclipse.equinox.internal.p2.metadata,
org.eclipse.equinox.internal.p2.metadata.repository,
org.eclipse.equinox.internal.p2.operations,
@@ -46,7 +52,7 @@ Import-Package: javax.xml.parsers,
org.eclipse.equinox.internal.provisional.configurator,
org.eclipse.equinox.internal.provisional.p2.core.eventbus,
org.eclipse.equinox.internal.provisional.p2.repository,
- org.eclipse.equinox.p2.core;version="[2.0.0,3.0.0)",
+ org.eclipse.equinox.p2.core;version="[2.7.0,3.0.0)",
org.eclipse.equinox.p2.core.spi;version="[2.0.0,3.0.0)",
org.eclipse.equinox.p2.engine;version="[2.0.0,3.0.0)",
org.eclipse.equinox.p2.engine.query;version="[2.0.0,3.0.0)",
@@ -57,12 +63,14 @@ Import-Package: javax.xml.parsers,
org.eclipse.equinox.p2.query;version="[2.0.0,3.0.0)",
org.eclipse.equinox.p2.repository;version="[2.0.0,3.0.0)",
org.eclipse.equinox.p2.repository.artifact;version="[2.0.0,3.0.0)",
+ org.eclipse.equinox.p2.repository.artifact.spi;version="[2.0.0,3.0.0)",
org.eclipse.equinox.p2.repository.metadata;version="[2.0.0,3.0.0)",
+ org.eclipse.equinox.p2.repository.spi;version="2.0.0",
org.osgi.framework;version="1.6.0",
org.osgi.service.packageadmin;version="1.2.0",
org.w3c.dom,
org.xml.sax
Service-Component: OSGI-INF/repositoryTracker_component.xml, OSGI-INF/serviceui.xml
Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Automatic-Module-Name: org.eclipse.equinox.p2.ui
diff --git a/bundles/org.eclipse.equinox.p2.ui/forceQualifierUpdate.txt b/bundles/org.eclipse.equinox.p2.ui/forceQualifierUpdate.txt
index a7d33c907..1cb35fada 100644
--- a/bundles/org.eclipse.equinox.p2.ui/forceQualifierUpdate.txt
+++ b/bundles/org.eclipse.equinox.p2.ui/forceQualifierUpdate.txt
@@ -1,3 +1,4 @@
# To force a version qualifier update add the bug here
Bug 403352 - Update all parent versions to match our build stream
Bug 509973 - Comparator errors in I20170105-0320
+Bug 572789 - Comparator errors in I20210412-1800 after moving to compiler from 4.20 M1 \ No newline at end of file
diff --git a/bundles/org.eclipse.equinox.p2.ui/plugin.xml b/bundles/org.eclipse.equinox.p2.ui/plugin.xml
index 6f6031e2e..87e8645fd 100644
--- a/bundles/org.eclipse.equinox.p2.ui/plugin.xml
+++ b/bundles/org.eclipse.equinox.p2.ui/plugin.xml
@@ -12,6 +12,13 @@
<adapter type="org.eclipse.equinox.p2.repository.metadata.IMetadataRepository"/>
<adapter type="org.eclipse.equinox.p2.repository.artifact.IArtifactRepository"/>
</factory>
+ <factory
+ adaptableType="org.eclipse.ui.internal.about.AboutPluginsPage"
+ class="org.eclipse.equinox.internal.p2.ui.KeySigningInfoFactory">
+ <adapter
+ type="org.eclipse.ui.internal.about.AboutBundleData$ExtendedSigningInfo">
+ </adapter>
+ </factory>
</extension>
<extension
diff --git a/bundles/org.eclipse.equinox.p2.ui/pom.xml b/bundles/org.eclipse.equinox.p2.ui/pom.xml
index 87aac8e5f..13cace16e 100644
--- a/bundles/org.eclipse.equinox.p2.ui/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.ui/pom.xml
@@ -14,11 +14,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.ui</artifactId>
- <version>2.6.100-SNAPSHOT</version>
+ <version>2.7.400-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/IProvHelpContextIds.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/IProvHelpContextIds.java
index cba53aa52..3c75aa5e9 100644
--- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/IProvHelpContextIds.java
+++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/IProvHelpContextIds.java
@@ -13,35 +13,37 @@
*******************************************************************************/
package org.eclipse.equinox.internal.p2.ui;
-
/**
* Help context ids for the P2 UI
* <p>
* This interface contains constants only; it is not intended to be implemented
* or extended.
* </p>
+ *
* @since 3.4
* @noextend This interface is not intended to be extended by clients.
* @noimplement This interface is not intended to be implemented by clients.
*/
public interface IProvHelpContextIds {
- public static final String PREFIX = ProvUIActivator.PLUGIN_ID + "."; //$NON-NLS-1$
+ String PREFIX = ProvUIActivator.PLUGIN_ID + "."; //$NON-NLS-1$
+
+ String REVERT_CONFIGURATION_WIZARD = PREFIX + "revert_configuration_wizard_context"; //$NON-NLS-1$
- public static final String REVERT_CONFIGURATION_WIZARD = PREFIX + "revert_configuration_wizard_context"; //$NON-NLS-1$
+ String UNINSTALL_WIZARD = PREFIX + "uinstall_wizard_context"; //$NON-NLS-1$
- public static final String UNINSTALL_WIZARD = PREFIX + "uinstall_wizard_context"; //$NON-NLS-1$
+ String UPDATE_WIZARD = PREFIX + "update_wizard_context"; //$NON-NLS-1$
- public static final String UPDATE_WIZARD = PREFIX + "update_wizard_context"; //$NON-NLS-1$
+ String ADD_REPOSITORY_DIALOG = PREFIX + "add_repository_dialog_context"; //$NON-NLS-1$
- public static final String ADD_REPOSITORY_DIALOG = PREFIX + "add_repository_dialog_context"; //$NON-NLS-1$
+ String INSTALL_WIZARD = PREFIX + "install_wizard_context"; //$NON-NLS-1$
- public static final String INSTALL_WIZARD = PREFIX + "install_wizard_context"; //$NON-NLS-1$
+ String REPOSITORY_MANIPULATION_DIALOG = PREFIX + "repository_manipulation_dialog_context"; //$NON-NLS-1$
- public static final String REPOSITORY_MANIPULATION_DIALOG = PREFIX + "repository_manipulation_dialog_context"; //$NON-NLS-1$
+ String INSTALLED_SOFTWARE = PREFIX + "installed_software_context"; //$NON-NLS-1$
- public static final String INSTALLED_SOFTWARE = PREFIX + "installed_software_context"; //$NON-NLS-1$
+ String AVAILABLE_SOFTWARE = PREFIX + "available_software_context"; //$NON-NLS-1$
- public static final String AVAILABLE_SOFTWARE = PREFIX + "available_software_context"; //$NON-NLS-1$
+ String TRUST_DIALOG = PREFIX + "trust_dialog_context"; //$NON-NLS-1$
}
diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/KeySigningInfoFactory.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/KeySigningInfoFactory.java
new file mode 100644
index 000000000..1134dbb56
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/KeySigningInfoFactory.java
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * Copyright (c) 2022 Eclipse contributors 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
+ *******************************************************************************/
+package org.eclipse.equinox.internal.p2.ui;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.*;
+import org.bouncycastle.openpgp.*;
+import org.eclipse.core.runtime.*;
+import org.eclipse.equinox.internal.p2.artifact.processors.pgp.PGPPublicKeyStore;
+import org.eclipse.equinox.internal.p2.artifact.processors.pgp.PGPSignatureVerifier;
+import org.eclipse.equinox.p2.core.IProvisioningAgent;
+import org.eclipse.equinox.p2.metadata.IArtifactKey;
+import org.eclipse.equinox.p2.query.IQueryResult;
+import org.eclipse.equinox.p2.repository.artifact.*;
+import org.eclipse.equinox.p2.repository.spi.PGPPublicKeyService;
+import org.eclipse.ui.internal.about.AboutBundleData;
+import org.eclipse.ui.internal.about.AboutPluginsPage;
+import org.osgi.framework.Bundle;
+
+/**
+ * A factory used by the {@link AboutPluginsPage} to provide extended signing
+ * information, in particular information about PGP signing.
+ *
+ * @since 2.7.400
+ */
+public class KeySigningInfoFactory implements IAdapterFactory {
+
+ private static final Class<?>[] CLASSES = new Class[] { AboutBundleData.ExtendedSigningInfo.class };
+
+ @Override
+ public <T> T getAdapter(Object adaptableObject, Class<T> adapterType) {
+ if (adapterType == AboutBundleData.ExtendedSigningInfo.class) {
+ return adapterType.cast(new AboutBundleData.ExtendedSigningInfo() {
+ private final Map<File, Map<PGPSignature, PGPPublicKey>> bundlePoolArtficactSigningDetails = getBundlePoolArtficactPGPSigningDetails();
+
+ @Override
+ public boolean isSigned(Bundle bundle) {
+ return getDetails(bundle) != null;
+ }
+
+ @Override
+ public String getSigningType(Bundle bundle) {
+ return ProvUIMessages.KeySigningInfoFactory_PGPSigningType;
+ }
+
+ @Override
+ public String getSigningDetails(Bundle bundle) {
+ Map<PGPSignature, PGPPublicKey> details = getDetails(bundle);
+ if (details != null) {
+ PGPPublicKeyService keyService = getKeyService();
+ List<String> lines = new ArrayList<>();
+ for (PGPPublicKey key : details.values()) {
+ if (keyService != null) {
+ // Be sure to normalize/enhance the key so we properly don't show
+ // self-signatures.
+ key = keyService.addKey(key);
+ }
+ if (!lines.isEmpty()) {
+ lines.add(""); //$NON-NLS-1$
+ }
+ addDetails(key, lines, ""); //$NON-NLS-1$
+ if (keyService != null) {
+ Set<PGPPublicKey> verifiedCertifications = keyService.getVerifiedCertifications(key);
+ boolean first = true;
+ for (PGPPublicKey verifyingKey : verifiedCertifications) {
+ /// Don't show self-signatures.
+ if (!verifyingKey.equals(key)) {
+ if (first) {
+ lines.add(" " + ProvUIMessages.KeySigningInfoFactory_KeySignersSection); //$NON-NLS-1$
+ first = false;
+ }
+ addDetails(verifyingKey, lines, " "); //$NON-NLS-1$
+ }
+ }
+ }
+ }
+ return String.join("\n", lines); //$NON-NLS-1$
+ }
+ return null;
+ }
+
+ @Override
+ public Date getSigningTime(Bundle bundle) {
+ Map<PGPSignature, PGPPublicKey> details = getDetails(bundle);
+ return details == null ? null : details.keySet().iterator().next().getCreationTime();
+ }
+
+ private void addDetails(PGPPublicKey key, List<String> lines, String indentation) {
+ lines.add(indentation + ProvUIMessages.KeySigningInfoFactory_FingerprintItem
+ + PGPPublicKeyService.toHexFingerprint(key));
+ for (Iterator<String> userIDs = key.getUserIDs(); userIDs.hasNext();) {
+ lines.add(indentation + ProvUIMessages.KeySigningInfoFactory_UserIDItem + userIDs.next());
+ }
+ }
+
+ private PGPPublicKeyService getKeyService() {
+ IProvisioningAgent agent = org.eclipse.equinox.internal.p2.extensionlocation.Activator
+ .getCurrentAgent();
+ return agent == null ? null : agent.getService(PGPPublicKeyService.class);
+ }
+
+ private Map<PGPSignature, PGPPublicKey> getDetails(Bundle bundle) {
+ try {
+ File bundleFile = FileLocator.getBundleFile(bundle).getCanonicalFile();
+ Map<PGPSignature, PGPPublicKey> details = bundlePoolArtficactSigningDetails.get(bundleFile);
+ return details;
+ } catch (IOException | RuntimeException e) {
+ ProvUIActivator.getDefault().getLog()
+ .log(new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, e.getMessage(), e));
+ return null;
+ }
+ }
+ });
+ }
+
+ return null;
+ }
+
+ @Override
+ public Class<?>[] getAdapterList() {
+ return CLASSES;
+ }
+
+ /**
+ * Returns a map from artifact files to the PGP signature/key pairs that were
+ * used to {@link PGPSignatureVerifier#close() verify} the artifact while it was
+ * being downloaded.
+ *
+ * @return a map of all the PGP signed artifact files to their signature/key
+ * pairs.
+ */
+ private static Map<File, Map<PGPSignature, PGPPublicKey>> getBundlePoolArtficactPGPSigningDetails() {
+ Map<File, Map<PGPSignature, PGPPublicKey>> result = new LinkedHashMap<>();
+ try {
+ // Look up artifact metadata for all the bundle pool repository of the
+ // installation.
+ IFileArtifactRepository bundlePoolRepository = org.eclipse.equinox.internal.p2.extensionlocation.Activator
+ .getBundlePoolRepository();
+ IQueryResult<IArtifactKey> allArtifactKeys = bundlePoolRepository.query(ArtifactKeyQuery.ALL_KEYS,
+ new NullProgressMonitor());
+ for (IArtifactKey key : allArtifactKeys) {
+ for (IArtifactDescriptor descriptor : bundlePoolRepository.getArtifactDescriptors(key)) {
+ File file = bundlePoolRepository.getArtifactFile(descriptor);
+ if (file != null) {
+ try {
+ Collection<PGPSignature> signatures = PGPSignatureVerifier.getSignatures(descriptor);
+ if (!signatures.isEmpty()) {
+ Map<PGPSignature, PGPPublicKey> details = new LinkedHashMap<>();
+ PGPPublicKeyStore keys = PGPSignatureVerifier.getKeys(descriptor);
+ for (PGPSignature signature : signatures) {
+ Collection<PGPPublicKey> signingKeys = keys.getKeys(signature.getKeyID());
+ if (!signingKeys.isEmpty()) {
+ // There is vanishingly small chance that two keys with colliding key IDs were
+ // used on two different signatures on the same artifact.
+ details.put(signature, signingKeys.iterator().next());
+ }
+ }
+ if (!details.isEmpty()) {
+ result.put(file.getCanonicalFile(), details);
+ }
+ }
+ } catch (IOException | PGPException | RuntimeException e) {
+ ProvUIActivator.getDefault().getLog()
+ .log(new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, e.getMessage(), e));
+ }
+ }
+ }
+ }
+ } catch (RuntimeException e) {
+ ProvUIActivator.getDefault().getLog()
+ .log(new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, e.getMessage(), e));
+ }
+ return result;
+ }
+}
diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIMessages.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIMessages.java
index 05b8efc91..f79aacc0b 100644
--- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIMessages.java
+++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ProvUIMessages.java
@@ -78,6 +78,7 @@ public class ProvUIMessages extends NLS {
public static String IUGeneralInfoPropertyPage_VersionLabel;
public static String IULicensePropertyPage_NoLicense;
public static String IULicensePropertyPage_ViewLicenseLabel;
+ public static String PGPPublicKeyViewDialog_Title;
public static String ProfileModificationAction_InvalidSelections;
public static String ProfileModificationWizardPage_DetailsLabel;
public static String ProfileSnapshots_Label;
@@ -247,6 +248,10 @@ public class ProvUIMessages extends NLS {
public static String SelectableIUsPage_Deselect_All;
public static String InstallRemediationPage_Title;
public static String InstallRemediationPage_Description;
+ public static String KeySigningInfoFactory_FingerprintItem;
+ public static String KeySigningInfoFactory_KeySignersSection;
+ public static String KeySigningInfoFactory_PGPSigningType;
+ public static String KeySigningInfoFactory_UserIDItem;
public static String UpdateRemediationPage_Title;
public static String UpdateRemediationPage_Description;
public static String RemediationPage_SubDescription;
@@ -271,11 +276,38 @@ public class ProvUIMessages extends NLS {
public static String RemedyElementNotHighestVersion;
public static String TrustCertificateDialog_Details;
+ public static String TrustCertificateDialog_Export;
public static String TrustCertificateDialog_Title;
public static String TrustCertificateDialog_Message;
+ public static String TrustCertificateDialog_MessageUnsigned;
+ public static String TrustCertificateDialog_MessageNameWarning;
+ public static String TrustCertificateDialog_MessagePGP;
public static String TrustCertificateDialog_AcceptSelectedButtonLabel;
+ public static String TrustCertificateDialog_AlwaysTrust;
+ public static String TrustCertificateDialog_AlwaysTrustConfirmationMessage;
+ public static String TrustCertificateDialog_AlwaysTrustConfirmationTitle;
+ public static String TrustCertificateDialog_AlwaysTrustNo;
+ public static String TrustCertificateDialog_AlwaysTrustYes;
+ public static String TrustCertificateDialog_ArtifactId;
public static String TrustCertificateDialog_SelectAll;
public static String TrustCertificateDialog_DeselectAll;
+ public static String TrustCertificateDialog_ObjectType;
+ public static String TrustCertificateDialog_Id;
+ public static String TrustCertificateDialog_Name;
+ public static String TrustCertificateDialog_Classifier;
+ public static String TrustCertificateDialog_CopyFingerprint;
+ public static String TrustCertificateDialog_dates;
+ public static String TrustCertificateDialog_NotApplicable;
+ public static String TrustCertificateDialog_NotYetValidStartDate;
+ public static String TrustCertificateDialog_expiredSince;
+ public static String TrustCertificateDialog_validExpires;
+ public static String TrustCertificateDialog_valid;
+ public static String TrustCertificateDialog_expired;
+ public static String TrustCertificateDialog_notYetValid;
+ public static String TrustCertificateDialog_RememberSigners;
+ public static String TrustCertificateDialog_Unknown;
+ public static String TrustCertificateDialog_Unsigned;
+ public static String TrustCertificateDialog_Version;
// Operations
public static String UpdateManagerCompatibility_ExportSitesTitle;
public static String UpdateManagerCompatibility_ImportSitesTitle;
diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ServiceUIComponent.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ServiceUIComponent.java
index fcea5da5a..cad8f35b9 100644
--- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ServiceUIComponent.java
+++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ServiceUIComponent.java
@@ -13,9 +13,8 @@
*******************************************************************************/
package org.eclipse.equinox.internal.p2.ui;
-import org.eclipse.equinox.p2.core.UIServices;
-
import org.eclipse.equinox.p2.core.IProvisioningAgent;
+import org.eclipse.equinox.p2.core.UIServices;
import org.eclipse.equinox.p2.core.spi.IAgentServiceFactory;
/**
@@ -26,7 +25,7 @@ public class ServiceUIComponent implements IAgentServiceFactory {
@Override
public Object createService(IProvisioningAgent agent) {
- return new ValidationDialogServiceUI();
+ return new ValidationDialogServiceUI(agent);
}
}
diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ValidationDialogServiceUI.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ValidationDialogServiceUI.java
index 1c9135553..ae451f4c7 100644
--- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ValidationDialogServiceUI.java
+++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/ValidationDialogServiceUI.java
@@ -14,17 +14,29 @@
*******************************************************************************/
package org.eclipse.equinox.internal.p2.ui;
+import java.io.File;
import java.net.URL;
import java.security.cert.Certificate;
+import java.util.*;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import org.bouncycastle.openpgp.PGPPublicKey;
import org.eclipse.core.runtime.*;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.equinox.internal.p2.ui.dialogs.TrustCertificateDialog;
import org.eclipse.equinox.internal.p2.ui.dialogs.UserValidationDialog;
-import org.eclipse.equinox.internal.p2.ui.viewers.CertificateLabelProvider;
+import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.core.UIServices;
+import org.eclipse.equinox.p2.metadata.IArtifactKey;
+import org.eclipse.equinox.p2.repository.artifact.spi.IArtifactUIServices;
+import org.eclipse.equinox.p2.repository.spi.PGPPublicKeyService;
import org.eclipse.equinox.p2.ui.LoadMetadataRepositoryJob;
import org.eclipse.jface.dialogs.*;
-import org.eclipse.jface.viewers.*;
+import org.eclipse.jface.viewers.TreeNode;
+import org.eclipse.jface.window.IShellProvider;
import org.eclipse.jface.window.Window;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
@@ -34,18 +46,49 @@ import org.eclipse.swt.widgets.*;
import org.eclipse.ui.PlatformUI;
/**
- * The default GUI-based implementation of {@link UIServices}.
- * The service declaration is made in the serviceui_component.xml file.
-
+ * The default GUI-based implementation of {@link UIServices}. The service
+ * declaration is made in the serviceui_component.xml file.
+ *
*/
-public class ValidationDialogServiceUI extends UIServices {
+public class ValidationDialogServiceUI extends UIServices implements IArtifactUIServices {
+
+ private final IProvisioningAgent agent;
+
+ private Display display;
+
+ private Consumer<String> linkHandler = link -> {
+ if (PlatformUI.isWorkbenchRunning()) {
+ try {
+ URL url = new URL(link);
+ PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser().openURL(url);
+ } catch (Exception x) {
+ ProvUIActivator.getDefault().getLog()
+ .log(new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, x.getMessage(), x));
+ }
+ }
+ };
+
+ private IShellProvider shellProvider = () -> ProvUI.getDefaultParentShell();
+
+ public ValidationDialogServiceUI() {
+ this(null);
+ }
+
+ public ValidationDialogServiceUI(IProvisioningAgent agent) {
+ this.agent = agent;
+ }
static final class MessageDialogWithLink extends MessageDialog {
private final String linkText;
+ private final Consumer<String> linkOpener;
- MessageDialogWithLink(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage, int dialogImageType, String[] dialogButtonLabels, int defaultIndex, String linkText) {
- super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels, defaultIndex);
+ MessageDialogWithLink(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage,
+ int dialogImageType, String[] dialogButtonLabels, int defaultIndex, String linkText,
+ Consumer<String> linkOpener) {
+ super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels,
+ defaultIndex);
this.linkText = linkText;
+ this.linkOpener = linkOpener;
}
@Override
@@ -56,13 +99,7 @@ public class ValidationDialogServiceUI extends UIServices {
Link link = new Link(parent, SWT.NONE);
link.setText(linkText);
link.addSelectionListener(SelectionListener.widgetSelectedAdapter(e -> {
- try {
- URL url = new URL(e.text);
- PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser().openURL(url);
- } catch (Exception x) {
- ProvUIActivator.getDefault().getLog().log(//
- new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, x.getMessage(), x));
- }
+ linkOpener.accept(e.text);
}));
return link;
}
@@ -73,7 +110,8 @@ public class ValidationDialogServiceUI extends UIServices {
*/
static class OkCancelErrorDialog extends ErrorDialog {
- public OkCancelErrorDialog(Shell parentShell, String dialogTitle, String message, IStatus status, int displayMask) {
+ public OkCancelErrorDialog(Shell parentShell, String dialogTitle, String message, IStatus status,
+ int displayMask) {
super(parentShell, dialogTitle, message, status, displayMask);
}
@@ -91,10 +129,11 @@ public class ValidationDialogServiceUI extends UIServices {
final AuthenticationInfo[] result = new AuthenticationInfo[1];
if (!suppressAuthentication() && !isHeadless()) {
- PlatformUI.getWorkbench().getDisplay().syncExec(() -> {
- Shell shell = ProvUI.getDefaultParentShell();
+ getDisplay().syncExec(() -> {
+ Shell shell = shellProvider.getShell();
String message = NLS.bind(ProvUIMessages.ServiceUI_LoginDetails, location);
- UserValidationDialog dialog = new UserValidationDialog(shell, ProvUIMessages.ServiceUI_LoginRequired, null, message);
+ UserValidationDialog dialog = new UserValidationDialog(shell, ProvUIMessages.ServiceUI_LoginRequired,
+ null, message);
int dialogCode = dialog.open();
if (dialogCode == Window.OK) {
result[0] = dialog.getResult();
@@ -116,23 +155,37 @@ public class ValidationDialogServiceUI extends UIServices {
@Override
public TrustInfo getTrustInfo(Certificate[][] untrustedChains, final String[] unsignedDetail) {
+ return getTrustInfo(untrustedChains, Collections.emptyList(), unsignedDetail);
+ }
+
+ @Override
+ public TrustInfo getTrustInfo(Certificate[][] untrustedChains, Collection<PGPPublicKey> untrustedPublicKeys,
+ final String[] unsignedDetail) {
+ if (untrustedChains == null) {
+ untrustedChains = new Certificate[][] {};
+ }
boolean trustUnsigned = true;
boolean persistTrust = false;
- Certificate[] trusted = new Certificate[0];
- // Some day we may summarize all of this in one UI, or perhaps we'll have a preference to honor regarding
- // unsigned content. For now we prompt separately first as to whether unsigned detail should be trusted
+ List<Certificate> trustedCertificates = new ArrayList<>();
+ List<PGPPublicKey> trustedKeys = new ArrayList<>();
+ // Some day we may summarize all of this in one UI, or perhaps we'll have a
+ // preference to honor regarding
+ // unsigned content. For now we prompt separately first as to whether unsigned
+ // detail should be trusted
if (!isHeadless() && unsignedDetail != null && unsignedDetail.length > 0) {
- final boolean[] result = new boolean[] {false};
- PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+ final boolean[] result = new boolean[] { false };
+ getDisplay().syncExec(new Runnable() {
@Override
public void run() {
- Shell shell = ProvUI.getDefaultParentShell();
- OkCancelErrorDialog dialog = new OkCancelErrorDialog(shell, ProvUIMessages.ServiceUI_warning_title, null, createStatus(), IStatus.WARNING);
+ Shell shell = shellProvider.getShell();
+ OkCancelErrorDialog dialog = new OkCancelErrorDialog(shell, ProvUIMessages.ServiceUI_warning_title,
+ null, createStatus(), IStatus.WARNING);
result[0] = dialog.open() == IDialogConstants.OK_ID;
}
private IStatus createStatus() {
- MultiStatus parent = new MultiStatus(ProvUIActivator.PLUGIN_ID, 0, ProvUIMessages.ServiceUI_unsigned_message, null);
+ MultiStatus parent = new MultiStatus(ProvUIActivator.PLUGIN_ID, 0,
+ ProvUIMessages.ServiceUI_unsigned_message, null);
for (String element : unsignedDetail) {
parent.add(new Status(IStatus.WARNING, ProvUIActivator.PLUGIN_ID, element));
}
@@ -141,63 +194,156 @@ public class ValidationDialogServiceUI extends UIServices {
});
trustUnsigned = result[0];
}
- // For now, there is no need to show certificates if there was unsigned content and we don't trust it.
+ // For now, there is no need to show certificates if there was unsigned content
+ // and we don't trust it.
if (!trustUnsigned)
- return new TrustInfo(trusted, persistTrust, trustUnsigned);
-
- // We've established trust for unsigned content, now examine the untrusted chains
- if (!isHeadless() && untrustedChains != null && untrustedChains.length > 0) {
-
- final Object[] result = new Object[1];
- final TreeNode[] input = createTreeNodes(untrustedChains);
-
- PlatformUI.getWorkbench().getDisplay().syncExec(() -> {
- Shell shell = ProvUI.getDefaultParentShell();
- ILabelProvider labelProvider = new CertificateLabelProvider();
- TreeNodeContentProvider contentProvider = new TreeNodeContentProvider();
- TrustCertificateDialog trustCertificateDialog = new TrustCertificateDialog(shell, input, labelProvider, contentProvider);
- trustCertificateDialog.open();
- Certificate[] values = new Certificate[trustCertificateDialog.getResult() == null ? 0 : trustCertificateDialog.getResult().length];
- for (int i = 0; i < values.length; i++) {
- values[i] = (Certificate) ((TreeNode) trustCertificateDialog.getResult()[i]).getValue();
+ return new TrustInfo(trustedCertificates, trustedKeys, persistTrust, trustUnsigned);
+
+ // We've established trust for unsigned content, now examine the untrusted
+ // chains
+ if (!isHeadless() && (untrustedChains.length > 0 || !untrustedPublicKeys.isEmpty())) {
+ return getTrustInfo(
+ Arrays.stream(untrustedChains).collect(
+ Collectors.toMap(Arrays::asList, it -> Set.of(), (e1, e2) -> e1, LinkedHashMap::new)),
+ untrustedPublicKeys.stream().collect(
+ Collectors.toMap(Function.identity(), it -> Set.of(), (e1, e2) -> e1, LinkedHashMap::new)),
+ null, null);
+
+ }
+
+ return new TrustInfo(trustedCertificates, trustedKeys, persistTrust, trustUnsigned);
+ }
+
+ @Override
+ public TrustInfo getTrustInfo(Map<List<Certificate>, Set<IArtifactKey>> untrustedCertificates,
+ Map<PGPPublicKey, Set<IArtifactKey>> untrustedPGPKeys, //
+ Set<IArtifactKey> unsignedArtifacts, //
+ Map<IArtifactKey, File> artifacts) {
+ boolean trustUnsigned = true;
+ AtomicBoolean persistTrust = new AtomicBoolean();
+ AtomicBoolean trustAlways = new AtomicBoolean();
+ List<Certificate> trustedCertificates = new ArrayList<>();
+ List<PGPPublicKey> trustedKeys = new ArrayList<>();
+ if (!isHeadless()) {
+ TreeNode[] input = createTreeNodes(untrustedCertificates, untrustedPGPKeys, unsignedArtifacts, artifacts);
+ if (input.length != 0) {
+ trustUnsigned = unsignedArtifacts == null || unsignedArtifacts.isEmpty();
+ List<Object> result = new ArrayList<>();
+ getDisplay().syncExec(() -> {
+ Shell shell = shellProvider.getShell();
+ TrustCertificateDialog trustCertificateDialog = new TrustCertificateDialog(shell, input);
+ if (trustCertificateDialog.open() == Window.OK) {
+ Object[] dialogResult = trustCertificateDialog.getResult();
+ if (dialogResult != null) {
+ result.addAll(Arrays.asList(dialogResult));
+ }
+ persistTrust.set(trustCertificateDialog.isRememberSelectedSigners());
+ trustAlways.set(trustCertificateDialog.isTrustAlways());
+ }
+ });
+ for (Object o : result) {
+ if (o instanceof TreeNode) {
+ o = ((TreeNode) o).getValue();
+ }
+ if (o instanceof Certificate) {
+ trustedCertificates.add((Certificate) o);
+ } else if (o instanceof PGPPublicKey) {
+ trustedKeys.add((PGPPublicKey) o);
+ } else if (o == null) {
+ trustUnsigned = true;
+ }
+ }
+ }
+ }
+
+ return new TrustInfo(trustedCertificates, trustedKeys, persistTrust.get(), trustUnsigned, trustAlways.get());
+ }
+
+ private TreeNode[] createTreeNodes(Map<List<Certificate>, Set<IArtifactKey>> untrustedCertificates,
+ Map<PGPPublicKey, Set<IArtifactKey>> untrustedPGPKeys, //
+ Set<IArtifactKey> unsignedArtifacts, //
+ Map<IArtifactKey, File> artifacts) {
+
+ List<ExtendedTreeNode> children = new ArrayList<>();
+ if (untrustedCertificates != null && !untrustedCertificates.isEmpty()) {
+ for (Map.Entry<List<Certificate>, Set<IArtifactKey>> entry : untrustedCertificates.entrySet()) {
+ ExtendedTreeNode parent = null;
+ List<Certificate> key = entry.getKey();
+ Set<IArtifactKey> associatedArtifacts = entry.getValue();
+ for (Certificate certificate : key) {
+ ExtendedTreeNode node = new ExtendedTreeNode(certificate, associatedArtifacts);
+ if (parent == null) {
+ children.add(node);
+ } else {
+ node.setParent(parent);
+ parent.setChildren(new TreeNode[] { node });
+ }
+ parent = node;
+ }
+ }
+ }
+
+ if (untrustedPGPKeys != null && !untrustedPGPKeys.isEmpty()) {
+ PGPPublicKeyService keyService = agent == null ? null : agent.getService(PGPPublicKeyService.class);
+ for (Map.Entry<PGPPublicKey, Set<IArtifactKey>> entry : untrustedPGPKeys.entrySet()) {
+ PGPPublicKey key = entry.getKey();
+ Set<IArtifactKey> associatedArtifacts = entry.getValue();
+ ExtendedTreeNode node = new ExtendedTreeNode(key, associatedArtifacts);
+ children.add(node);
+ expandChildren(node, key, keyService, new HashSet<>(), Integer.getInteger("p2.pgp.trust.depth", 3)); //$NON-NLS-1$
+ }
+ }
+
+ if (unsignedArtifacts != null && !unsignedArtifacts.isEmpty()) {
+ ExtendedTreeNode node = new ExtendedTreeNode(null, unsignedArtifacts);
+ children.add(node);
+
+ }
+
+ return children.toArray(TreeNode[]::new);
+ }
+
+ private void expandChildren(TreeNode result, PGPPublicKey key, PGPPublicKeyService keyService,
+ Set<PGPPublicKey> visited, int remainingDepth) {
+ if (keyService != null && remainingDepth > 0 && visited.add(key)) {
+ Set<PGPPublicKey> certifications = keyService.getVerifiedCertifications(key);
+ if (certifications != null && !certifications.isEmpty()) {
+ List<TreeNode> children = new ArrayList<>();
+ for (PGPPublicKey certifyingKey : certifications) {
+ if (visited.add(certifyingKey)) {
+ TreeNode treeNode = new TreeNode(certifyingKey);
+ children.add(treeNode);
+ }
+ }
+
+ if (!children.isEmpty()) {
+ result.setChildren(children.toArray(TreeNode[]::new));
+ children.forEach(child -> {
+ child.setParent(result);
+ PGPPublicKey certifyingKey = (PGPPublicKey) child.getValue();
+ visited.remove(certifyingKey);
+ expandChildren(child, certifyingKey, keyService, visited, remainingDepth - 1);
+ visited.add(certifyingKey);
+ });
}
- result[0] = values;
- });
- persistTrust = true;
- trusted = (Certificate[]) result[0];
- }
- return new TrustInfo(trusted, persistTrust, trustUnsigned);
- }
-
- private TreeNode[] createTreeNodes(Certificate[][] certificates) {
- TreeNode[] children = new TreeNode[certificates.length];
- for (int i = 0; i < certificates.length; i++) {
- TreeNode head = new TreeNode(certificates[i][0]);
- TreeNode parent = head;
- children[i] = head;
- for (int j = 0; j < certificates[i].length; j++) {
- TreeNode node = new TreeNode(certificates[i][j]);
- node.setParent(parent);
- parent.setChildren(new TreeNode[] {node});
- parent = node;
}
}
- return children;
}
@Override
public AuthenticationInfo getUsernamePassword(final String location, final AuthenticationInfo previousInfo) {
final AuthenticationInfo[] result = new AuthenticationInfo[1];
if (!suppressAuthentication() && !isHeadless()) {
- PlatformUI.getWorkbench().getDisplay().syncExec(() -> {
- Shell shell = ProvUI.getDefaultParentShell();
+ getDisplay().syncExec(() -> {
+ Shell shell = shellProvider.getShell();
String message = null;
if (previousInfo.saveResult())
message = NLS.bind(ProvUIMessages.ProvUIMessages_SavedNotAccepted_EnterFor_0, location);
else
message = NLS.bind(ProvUIMessages.ProvUIMessages_NotAccepted_EnterFor_0, location);
- UserValidationDialog dialog = new UserValidationDialog(previousInfo, shell, ProvUIMessages.ServiceUI_LoginRequired, null, message);
+ UserValidationDialog dialog = new UserValidationDialog(previousInfo, shell,
+ ProvUIMessages.ServiceUI_LoginRequired, null, message);
int dialogCode = dialog.open();
if (dialogCode == Window.OK) {
result[0] = dialog.getResult();
@@ -215,17 +361,131 @@ public class ValidationDialogServiceUI extends UIServices {
super.showInformationMessage(title, text, linkText);
return;
}
- PlatformUI.getWorkbench().getDisplay().syncExec(() -> {
- MessageDialog dialog = new MessageDialogWithLink(ProvUI.getDefaultParentShell(), title, null, text, MessageDialog.INFORMATION, new String[] {IDialogConstants.OK_LABEL}, 0, linkText);
+ getDisplay().syncExec(() -> {
+ MessageDialog dialog = new MessageDialogWithLink(shellProvider.getShell(), title, null, text,
+ MessageDialog.INFORMATION, new String[] { IDialogConstants.OK_LABEL }, 0, linkText, linkHandler);
dialog.open();
});
}
+ /**
+ * Returns a handler (used by
+ * {@link #showInformationMessage(String, String, String)}) to open a link in an
+ * external browser.
+ *
+ * @return a handler to open a link in an external browser.
+ *
+ * @since 2.7.400
+ */
+ public Consumer<String> getLinkHandler() {
+ return linkHandler;
+ }
+
+ /**
+ * Sets the handler used by
+ * {@link #showInformationMessage(String, String, String)} to open a link in an
+ * external browser.
+ *
+ * @param linkHandler the handler for opening links in an external browser.
+ *
+ * @since 2.7.400
+ */
+ public void setLinkHandler(Consumer<String> linkHandler) {
+ this.linkHandler = linkHandler;
+ }
+
+ /**
+ * Returns a shell that is appropriate to use as the parent for a modal dialog
+ * about to be opened.
+ *
+ * @return a shell that is appropriate to use as the parent for a modal dialog
+ * about to be opened.
+ *
+ * @see ProvUI#getDefaultParentShell()
+ *
+ * @since 2.7.400
+ */
+ public IShellProvider getShellProvider() {
+ return shellProvider;
+ }
+
+ /**
+ * Set the provider that yields a shell that is appropriate to use as the parent
+ * for a modal dialog about to be opened.
+ *
+ * @param shellProvider the provider of a shell that is appropriate to use as
+ * the parent for a modal dialog about to be opened.
+ */
+ public void setShellProvider(IShellProvider shellProvider) {
+ this.shellProvider = shellProvider;
+ }
+
+ /**
+ * Returns the display of the workbench or the display set by
+ * {@link #setDisplay(Display)} in a non-workbench application.
+ *
+ * @since 2.7.400
+ */
+ public Display getDisplay() {
+ if (display == null && PlatformUI.isWorkbenchRunning()) {
+ display = PlatformUI.getWorkbench().getDisplay();
+ }
+ return display;
+ }
+
+ /**
+ * Can be called once to set the display in a non-workbench application.
+ *
+ * @throws IllegalStateException if there is a workbench running or the display
+ * has already been set differently.
+ *
+ * @since 2.7.400
+ */
+ public void setDisplay(Display display) {
+ if (this.display != null && this.display != display) {
+ throw new IllegalStateException("Cannot change the display"); //$NON-NLS-1$
+ }
+ this.display = display;
+ }
+
private boolean isHeadless() {
// If there is no UI available and we are still the IServiceUI,
- // assume that the operation should proceed. See
+ // assume that the operation should proceed. See
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=291049
- return !PlatformUI.isWorkbenchRunning();
+ //
+ // But we shouldn't just assume that no workbench mean no display and no head.
+ // It should be possible to reuse this class in an application without a
+ // workbench, e.g., the Eclipse Installer.
+ return getDisplay() == null;
+ }
+
+ private static class ExtendedTreeNode extends TreeNode implements IAdaptable {
+ private final Set<IArtifactKey> artifacts;
+
+ public ExtendedTreeNode(Object value) {
+ super(value);
+ artifacts = null;
+ }
+
+ public ExtendedTreeNode(Object value, Set<IArtifactKey> artifacts) {
+ super(value);
+ this.artifacts = artifacts;
+ }
+
+ @Override
+ public <T> T getAdapter(Class<T> adapter) {
+ if (adapter.isInstance(this)) {
+ return adapter.cast(this);
+ }
+ if (adapter.isInstance(getValue())) {
+ return adapter.cast(value);
+ }
+ if (adapter == IArtifactKey[].class && artifacts != null) {
+ return adapter.cast(artifacts.toArray(IArtifactKey[]::new));
+ }
+
+ return null;
+ }
}
}
diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/PGPPublicKeyViewDialog.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/PGPPublicKeyViewDialog.java
new file mode 100644
index 000000000..a6cbf3be1
--- /dev/null
+++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/PGPPublicKeyViewDialog.java
@@ -0,0 +1,248 @@
+/*******************************************************************************
+ * Copyright (c) 2022 Eclipse contributors 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
+ *******************************************************************************/
+package org.eclipse.equinox.internal.p2.ui.dialogs;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.List;
+import org.bouncycastle.bcpg.*;
+import org.bouncycastle.openpgp.PGPPublicKey;
+import org.bouncycastle.openpgp.PGPSignature;
+import org.eclipse.core.runtime.*;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.equinox.internal.p2.ui.ProvUIMessages;
+import org.eclipse.equinox.p2.repository.spi.PGPPublicKeyService;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.*;
+
+/**
+ * Presents information about a key in a format similar to what key servers
+ * display.
+ *
+ * @since 1.2.4
+ */
+public class PGPPublicKeyViewDialog extends TitleAreaDialog {
+
+ private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); //$NON-NLS-1$
+
+ final private PGPPublicKey originalKey;
+
+ final private PGPPublicKeyService keyService;
+
+ private StyledText styledText;
+
+ public PGPPublicKeyViewDialog(Shell parentShell, PGPPublicKey key, PGPPublicKeyService keyService) {
+ super(parentShell);
+ this.originalKey = key;
+ this.keyService = keyService;
+ DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC")); //$NON-NLS-1$
+ }
+
+ @Override
+ protected void configureShell(Shell newShell) {
+ super.configureShell(newShell);
+ newShell.setText(ProvUIMessages.PGPPublicKeyViewDialog_Title);
+ if (keyService != null) {
+ computeVerifiedCertifications(newShell);
+ }
+ }
+
+ @Override
+ protected void setShellStyle(int newShellStyle) {
+ super.setShellStyle(newShellStyle | SWT.RESIZE | SWT.DIALOG_TRIM);
+ }
+
+ @Override
+ protected Control createDialogArea(Composite parent) {
+ Composite composite = (Composite) super.createDialogArea(parent);
+ GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
+ composite.setLayoutData(data);
+
+ styledText = new StyledText(composite, SWT.READ_ONLY | SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
+ styledText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ // Create a sightly smaller text (mono-space) font.
+ FontData[] fontData = JFaceResources.getTextFont().getFontData();
+ for (FontData fontDataElement : fontData) {
+ fontDataElement.setHeight(fontDataElement.getHeight() - 1);
+ }
+ Font font = new Font(styledText.getDisplay(), fontData);
+ styledText.setFont(font);
+ styledText.addDisposeListener(e -> font.dispose());
+
+ GC gc = new GC(styledText);
+ gc.setFont(font);
+ data.widthHint = convertWidthInCharsToPixels(gc.getFontMetrics(), 110);
+ gc.dispose();
+
+ update(originalKey, Set.of());
+ return composite;
+ }
+
+ @Override
+ protected void createButtonsForButtonBar(Composite parent) {
+ createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CLOSE_LABEL, true).setFocus();
+ }
+
+ @SuppressWarnings("nls")
+ protected void update(PGPPublicKey key, Set<PGPPublicKey> verifiedCertifications) {
+ StyledString content = new StyledString();
+ String fingerprint = PGPPublicKeyService.toHexFingerprint(key);
+
+ PublicKeyPacket publicKeyPacket = key.getPublicKeyPacket();
+ publicKeyPacket.getAlgorithm();
+ content.append(" ");
+ content.append(publicKeyPacket instanceof PublicSubkeyPacket ? "sub" : "pub", StyledString.QUALIFIER_STYLER);
+ content.append(" ");
+
+ int algorithm = publicKeyPacket.getAlgorithm();
+ switch (algorithm) {
+ case PublicKeyAlgorithmTags.RSA_GENERAL:
+ case PublicKeyAlgorithmTags.RSA_ENCRYPT:
+ case PublicKeyAlgorithmTags.RSA_SIGN: {
+ content.append("rsa");
+ break;
+ }
+ case PublicKeyAlgorithmTags.DSA: {
+ content.append("dsa");
+ break;
+ }
+ case PublicKeyAlgorithmTags.ELGAMAL_ENCRYPT:
+ case PublicKeyAlgorithmTags.ELGAMAL_GENERAL: {
+ content.append("elgamal");
+ break;
+ }
+ default: {
+ content.append("[");
+ content.append(Integer.toString(algorithm));
+ content.append("]");
+ break;
+ }
+
+ }
+ int bitStrength = key.getBitStrength();
+ content.append(Integer.toString(bitStrength));
+ content.append("/");
+ content.append(fingerprint);
+
+ content.append(" ");
+ content.append(DATE_FORMAT.format(key.getCreationTime()));
+
+ content.append(" ");
+ content.append("\n");
+
+ List<String> users = new ArrayList<>();
+ key.getUserIDs().forEachRemaining(users::add);
+ if (!users.isEmpty()) {
+ for (String user : users) {
+ content.append(" ");
+ content.append("uid", StyledString.QUALIFIER_STYLER);
+ content.append(" ");
+ content.append(user, StyledString.COUNTER_STYLER);
+ content.append("\n");
+ }
+ }
+
+ Long subKeyOf = null;
+
+ for (Iterator<PGPSignature> signatures = key.getSignatures(); signatures.hasNext();) {
+ PGPSignature signature = signatures.next();
+ long keyID = signature.getKeyID();
+
+ if (signature.getSignatureType() == PGPSignature.SUBKEY_BINDING) {
+ subKeyOf = keyID;
+ }
+
+ content.append(" ");
+ content.append("sig", StyledString.QUALIFIER_STYLER);
+ content.append(" ");
+ content.append(PGPPublicKeyService.toHex(keyID));
+ content.append(" ");
+ Date creationTime = signature.getCreationTime();
+ String formattedCreationTime = DATE_FORMAT.format(creationTime);
+ content.append(formattedCreationTime);
+ long signatureExpirationTime = signature.getHashedSubPackets().getSignatureExpirationTime();
+ content.append(" ");
+ content.append(signatureExpirationTime == 0 ? formattedCreationTime.replaceAll(".", "_")
+ : DATE_FORMAT.format(new Date(creationTime.getTime() + 1000 * signatureExpirationTime)));
+
+ content.append(" ");
+ Optional<PGPPublicKey> resolvedKey = verifiedCertifications.stream().filter(k -> k.getKeyID() == keyID)
+ .findFirst();
+
+ long keyExpirationTime = signature.getHashedSubPackets().getKeyExpirationTime();
+ content.append(keyExpirationTime == 0 || resolvedKey == null || !resolvedKey.isPresent()
+ ? formattedCreationTime.replaceAll(".", "_")
+ : DATE_FORMAT.format(
+ new Date(resolvedKey.get().getCreationTime().getTime() + 1000 * keyExpirationTime)));
+
+ if (resolvedKey != null && resolvedKey.isPresent()) {
+ content.append(" ");
+ content.append(getLabel(resolvedKey.get()), StyledString.COUNTER_STYLER);
+ }
+
+ content.append("\n");
+ }
+
+ styledText.setText(content.getString());
+ styledText.setStyleRanges(content.getStyleRanges());
+
+ List<String> title = new ArrayList<>();
+ if (subKeyOf != null) {
+ long keyID = subKeyOf;
+ verifiedCertifications.stream().filter(k -> k.getKeyID() == keyID).findFirst()
+ .ifPresentOrElse(k -> title.add(getLabel(k)), () -> title.add(PGPPublicKeyService.toHex(keyID)));
+ }
+ title.add((subKeyOf == null ? "" : "sub ") + (users.isEmpty() ? fingerprint : users.get(0)));
+
+ setTitle(String.join("\n", title));
+ }
+
+ private String getLabel(PGPPublicKey key) {
+ Iterator<String> userIDs = key.getUserIDs();
+ if (userIDs.hasNext()) {
+ return userIDs.next();
+
+ }
+ return PGPPublicKeyService.toHexFingerprint(key);
+ }
+
+ private void computeVerifiedCertifications(Shell shell) {
+ Display display = shell.getDisplay();
+ new Job(PGPPublicKeyViewDialog.class.getName()) {
+ {
+ setSystem(true);
+ setPriority(Job.SHORT);
+ }
+
+ @Override
+ protected IStatus run(IProgressMonitor monitor) {
+ synchronized (keyService) {
+ PGPPublicKey enhancedKey = keyService.addKey(originalKey);
+ Set<PGPPublicKey> verifiedCertifications = keyService.getVerifiedCertifications(originalKey);
+ display.asyncExec(() -> {
+ if (!shell.isDisposed()) {
+ update(enhancedKey, verifiedCertifications);
+ }
+ });
+ }
+ return Status.OK_STATUS;
+ }
+ }.schedule();
+ }
+}
diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ProvisioningOperationWizard.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ProvisioningOperationWizard.java
index 71479559e..47901c652 100644
--- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ProvisioningOperationWizard.java
+++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ProvisioningOperationWizard.java
@@ -204,7 +204,7 @@ public abstract class ProvisioningOperationWizard extends Wizard {
if (!operation.hasResolved()) {
operation.resolveModal(monitor);
}
- if (operation.hasResolved()) {
+ if (operation.getProfileChangeRequest() != null) {
this.localJRECheckPlan = ProvUI.toCompabilityWithCurrentJREProvisioningPlan(operation, null);
if (!compatibleWithCurrentEE()) {
couldNotResolveStatus = localJRECheckPlan.getStatus();
@@ -215,6 +215,10 @@ public abstract class ProvisioningOperationWizard extends Wizard {
return false;
}
}
+ if (localJRECheckPlan == null) {
+ return true;
+ }
+
IStatus currentEEPlanStatus = localJRECheckPlan.getStatus();
if (currentEEPlanStatus.getSeverity() != IStatus.ERROR) {
return true;
@@ -337,7 +341,8 @@ public abstract class ProvisioningOperationWizard extends Wizard {
try {
runnableContext.run(true, true, monitor -> {
operation.resolveModal(monitor);
- if (getPolicy().getCheckAgainstCurrentExecutionEnvironment()) {
+ if (operation.getProfileChangeRequest() != null
+ && getPolicy().getCheckAgainstCurrentExecutionEnvironment()) {
this.localJRECheckPlan = ProvUI.toCompabilityWithCurrentJREProvisioningPlan(operation, monitor);
if (!compatibleWithCurrentEE()) {
couldNotResolveStatus = localJRECheckPlan.getStatus();
diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/TrustCertificateDialog.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/TrustCertificateDialog.java
index 8ee921daa..2d6cc8237 100644
--- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/TrustCertificateDialog.java
+++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/TrustCertificateDialog.java
@@ -16,100 +16,256 @@ package org.eclipse.equinox.internal.p2.ui.dialogs;
import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter;
-import java.security.cert.X509Certificate;
-import java.util.ArrayList;
-import java.util.Iterator;
-import org.eclipse.equinox.internal.p2.ui.ProvUIMessages;
+import java.io.*;
+import java.security.cert.*;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
+import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import org.bouncycastle.bcpg.ArmoredOutputStream;
+import org.bouncycastle.openpgp.PGPPublicKey;
+import org.eclipse.core.runtime.*;
+import org.eclipse.equinox.internal.p2.ui.*;
import org.eclipse.equinox.internal.p2.ui.viewers.CertificateLabelProvider;
-import org.eclipse.equinox.internal.provisional.security.ui.X509CertificateViewDialog;
+import org.eclipse.equinox.internal.provisional.security.ui.X500PrincipalHelper;
+import org.eclipse.equinox.p2.metadata.IArtifactKey;
+import org.eclipse.equinox.p2.repository.spi.PGPPublicKeyService;
+import org.eclipse.jface.dialogs.*;
import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.layout.TableColumnLayout;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.util.Policy;
import org.eclipse.jface.viewers.*;
+import org.eclipse.jface.widgets.LabelFactory;
+import org.eclipse.jface.widgets.WidgetFactory;
+import org.eclipse.jface.window.Window;
+import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.dnd.*;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
+import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.SelectionDialog;
/**
- * A dialog that displays a certificate chain and asks the user if they
- * trust the certificate providers.
+ * A dialog that displays a certificate chain and asks the user if they trust
+ * the certificate providers. It also supports prompting about unsigned content.
*/
public class TrustCertificateDialog extends SelectionDialog {
+ private static final String EXPORT_FILTER_PATH = "exportFilterPath"; //$NON-NLS-1$
- private Object inputElement;
- private IStructuredContentProvider contentProvider;
- private ILabelProvider labelProvider;
+ private CheckboxTableViewer certifcateViewer;
- private final static int SIZING_SELECTION_WIDGET_HEIGHT = 250;
- private final static int SIZING_SELECTION_WIDGET_WIDTH = 300;
+ private TreeViewer certificateChainViewer;
- CheckboxTableViewer listViewer;
+ private CheckboxTableViewer artifactViewer;
- private TreeViewer certificateChainViewer;
private Button detailsButton;
- protected TreeNode parentElement;
- protected Object selectedCertificate;
- public TrustCertificateDialog(Shell parentShell, Object input, ILabelProvider labelProvider, ITreeContentProvider contentProvider) {
+ private Button exportButton;
+
+ private boolean rememberSelectedSigners = true;
+
+ private boolean trustAlways;
+
+ private final Map<TreeNode, List<IArtifactKey>> artifactMap = new LinkedHashMap<>();
+
+ public TrustCertificateDialog(Shell parentShell, Object input) {
super(parentShell);
- inputElement = input;
- this.contentProvider = contentProvider;
- this.labelProvider = labelProvider;
+
+ setShellStyle(SWT.DIALOG_TRIM | SWT.MODELESS | SWT.RESIZE | SWT.MAX | getDefaultOrientation());
+
+ if (input instanceof TreeNode[]) {
+ for (TreeNode node : (TreeNode[]) input) {
+ IArtifactKey[] associatedArtifacts = null;
+ if (node instanceof IAdaptable) {
+ associatedArtifacts = ((IAdaptable) node).getAdapter(IArtifactKey[].class);
+ }
+ artifactMap.put(node, associatedArtifacts == null ? List.of() : Arrays.asList(associatedArtifacts));
+ }
+ }
+
setTitle(ProvUIMessages.TrustCertificateDialog_Title);
- setMessage(ProvUIMessages.TrustCertificateDialog_Message);
- setShellStyle(SWT.DIALOG_TRIM | SWT.MODELESS | SWT.RESIZE | getDefaultOrientation());
+
+ boolean unsignedContent = artifactMap.keySet().stream().map(TreeNode::getValue).anyMatch(Objects::isNull);
+ boolean pgpContent = containsInstance(input, PGPPublicKey.class);
+ boolean certifcateContent = containsInstance(input, Certificate.class);
+
+ List<String> messages = new ArrayList<>();
+ if (certifcateContent || pgpContent) {
+ messages.add(ProvUIMessages.TrustCertificateDialog_Message);
+ }
+ if (unsignedContent) {
+ messages.add(ProvUIMessages.TrustCertificateDialog_MessageUnsigned);
+ }
+ if (certifcateContent || pgpContent) {
+ messages.add(ProvUIMessages.TrustCertificateDialog_MessageNameWarning);
+ }
+ if (pgpContent) {
+ messages.add(ProvUIMessages.TrustCertificateDialog_MessagePGP);
+ }
+ setMessage(String.join(" ", messages)); //$NON-NLS-1$
+
+ if (PlatformUI.isWorkbenchRunning()) {
+ PlatformUI.getWorkbench().getHelpSystem().setHelp(parentShell, IProvHelpContextIds.TRUST_DIALOG);
+ }
+ }
+
+ public boolean isRememberSelectedSigners() {
+ return rememberSelectedSigners;
+ }
+
+ public boolean isTrustAlways() {
+ return trustAlways;
+ }
+
+ @Override
+ protected Label createMessageArea(Composite composite) {
+ // Ensure that the message supports wrapping for a long text message.
+ GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
+ data.widthHint = convertWidthInCharsToPixels(120);
+ LabelFactory factory = WidgetFactory.label(SWT.WRAP).font(composite.getFont()).layoutData(data);
+ if (getMessage() != null) {
+ factory.text(getMessage());
+ }
+ return factory.create(composite);
}
@Override
protected Control createDialogArea(Composite parent) {
- Composite composite = createUpperDialogArea(parent);
- certificateChainViewer = new TreeViewer(composite, SWT.BORDER);
- GridLayout layout = new GridLayout();
- certificateChainViewer.getTree().setLayout(layout);
- GridData data = new GridData(GridData.FILL_BOTH);
- data.grabExcessHorizontalSpace = true;
- certificateChainViewer.getTree().setLayoutData(data);
- certificateChainViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
- certificateChainViewer.setContentProvider(new TreeNodeContentProvider());
- certificateChainViewer.setLabelProvider(new CertificateLabelProvider());
- certificateChainViewer.addSelectionChangedListener(getChainSelectionListener());
- if (inputElement instanceof Object[]) {
- ISelection selection = null;
- Object[] nodes = (Object[]) inputElement;
- if (nodes.length > 0) {
- selection = new StructuredSelection(nodes[0]);
- certificateChainViewer.setInput(new TreeNode[] {(TreeNode) nodes[0]});
- selectedCertificate = nodes[0];
- }
- listViewer.setSelection(selection);
- }
- listViewer.addDoubleClickListener(getDoubleClickListener());
- listViewer.addSelectionChangedListener(getParentSelectionListener());
- createButtons(composite);
- return composite;
+ Composite mainComposite = (Composite) super.createDialogArea(parent);
+ Dialog.applyDialogFont(mainComposite);
+ initializeDialogUnits(mainComposite);
+
+ createMessageArea(mainComposite);
+
+ SashForm sashForm = new SashForm(mainComposite, SWT.VERTICAL);
+ sashForm.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ createCertificateViewerArea(createSashFormArea(sashForm));
+
+ // Create this area only if we have keys or certificates.
+ boolean containsCertificates = containsInstance(artifactMap.keySet(), PGPPublicKey.class)
+ || containsInstance(artifactMap.keySet(), Certificate.class);
+ if (containsCertificates) {
+ createCertficateChainViewerArea(createSashFormArea(sashForm));
+ }
+
+ // Sort the set of all artifacts and create the lower area only if there are
+ // artifacts.
+ Comparator<Object> comparator = Policy.getComparator();
+ Set<IArtifactKey> artifacts = artifactMap.values().stream().flatMap(Collection::stream)
+ .collect(Collectors.toCollection(() -> new TreeSet<>((a1, a2) -> {
+ int result = comparator.compare(a1.getId(), a2.getId());
+ if (result == 0) {
+ result = a1.getVersion().compareTo(a2.getVersion());
+ if (result == 0) {
+ result = a1.getClassifier().compareTo(a2.getClassifier());
+ }
+ }
+ return result;
+ })));
+ if (!artifacts.isEmpty()) {
+ crreateArtifactViewerArea(createSashFormArea(sashForm), artifacts);
+ }
+
+ // Set weights based on the children's preferred size.
+ Control[] children = sashForm.getChildren();
+ int[] weights = new int[children.length];
+ for (int i = 0; i < children.length; ++i) {
+ weights[i] = children[i].computeSize(SWT.DEFAULT, SWT.DEFAULT, false).y;
+ }
+ sashForm.setWeights(weights);
+
+ if (!getInitialElementSelections().isEmpty()) {
+ checkInitialSelections();
+ }
+
+ if (!artifactMap.isEmpty()) {
+ certifcateViewer.setSelection(new StructuredSelection(artifactMap.keySet().iterator().next()));
+ }
+
+ return mainComposite;
}
@Override
protected void createButtonsForButtonBar(Composite parent) {
- createButton(parent, IDialogConstants.OK_ID, ProvUIMessages.TrustCertificateDialog_AcceptSelectedButtonLabel, true);
+ createButton(parent, IDialogConstants.OK_ID, ProvUIMessages.TrustCertificateDialog_AcceptSelectedButtonLabel,
+ true);
createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false);
- super.getOkButton().setEnabled(false);
+ updateOkButton();
}
private void createButtons(Composite composite) {
- // Details button to view certificate chain
- detailsButton = new Button(composite, SWT.NONE);
+ Composite buttonComposite = new Composite(composite, SWT.NONE);
+ buttonComposite.setLayout(new RowLayout());
+
+ detailsButton = new Button(buttonComposite, SWT.NONE);
detailsButton.setText(ProvUIMessages.TrustCertificateDialog_Details);
detailsButton.addSelectionListener(new SelectionListener() {
@Override
public void widgetDefaultSelected(SelectionEvent e) {
- if (selectedCertificate != null) {
- X509Certificate cert = (X509Certificate) ((TreeNode) selectedCertificate).getValue();
- X509CertificateViewDialog certificateDialog = new X509CertificateViewDialog(getShell(), cert);
- certificateDialog.open();
+ X509Certificate cert = getInstance(certificateChainViewer.getSelection(), X509Certificate.class);
+ if (cert != null) {
+ CertificateLabelProvider.openDialog(getShell(), cert);
+ }
+ }
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ widgetDefaultSelected(e);
+ }
+ });
+
+ exportButton = new Button(buttonComposite, SWT.NONE);
+ exportButton.setText(ProvUIMessages.TrustCertificateDialog_Export);
+ exportButton.addSelectionListener(new SelectionListener() {
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ ISelection selection = certificateChainViewer.getSelection();
+ X509Certificate cert = getInstance(selection, X509Certificate.class);
+ PGPPublicKey key = getInstance(selection, PGPPublicKey.class);
+ if (cert != null || key != null) {
+ FileDialog destination = new FileDialog(exportButton.getShell(), SWT.SAVE);
+ destination.setFilterPath(getFilterPath(EXPORT_FILTER_PATH));
+ destination.setText(ProvUIMessages.TrustCertificateDialog_Export);
+ if (cert != null) {
+ destination.setFilterExtensions(new String[] { "*.der" }); //$NON-NLS-1$
+ destination.setFileName(cert.getSerialNumber().toString() + ".der"); //$NON-NLS-1$
+ String path = destination.open();
+ setFilterPath(EXPORT_FILTER_PATH, destination.getFilterPath());
+ if (path == null) {
+ return;
+ }
+ File destinationFile = new File(path);
+ try (FileOutputStream output = new FileOutputStream(destinationFile)) {
+ output.write(cert.getEncoded());
+ } catch (IOException | CertificateEncodingException ex) {
+ ProvUIActivator.getDefault().getLog()
+ .log(new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, ex.getMessage(), ex));
+ }
+ } else {
+ destination.setFilterExtensions(new String[] { "*.asc" }); //$NON-NLS-1$
+ destination.setFileName(userFriendlyFingerPrint(key) + ".asc"); //$NON-NLS-1$
+ String path = destination.open();
+ setFilterPath(EXPORT_FILTER_PATH, destination.getFilterPath());
+ if (path == null) {
+ return;
+ }
+ File destinationFile = new File(path);
+ try (OutputStream output = new ArmoredOutputStream(new FileOutputStream(destinationFile))) {
+ key.encode(output);
+ } catch (IOException ex) {
+ ProvUIActivator.getDefault().getLog()
+ .log(new Status(IStatus.ERROR, ProvUIActivator.PLUGIN_ID, ex.getMessage(), ex));
+ }
+ }
}
}
@@ -120,31 +276,274 @@ public class TrustCertificateDialog extends SelectionDialog {
});
}
- private Composite createUpperDialogArea(Composite parent) {
- Composite composite = (Composite) super.createDialogArea(parent);
- initializeDialogUnits(composite);
- createMessageArea(composite);
+ private Composite createSashFormArea(SashForm sashForm) {
+ Composite composite = new Composite(sashForm, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+ layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+ composite.setLayout(layout);
+ return composite;
+ }
- listViewer = CheckboxTableViewer.newCheckList(composite, SWT.BORDER);
- GridData data = new GridData(GridData.FILL_BOTH);
- data.heightHint = SIZING_SELECTION_WIDGET_HEIGHT;
- data.widthHint = SIZING_SELECTION_WIDGET_WIDTH;
- listViewer.getTable().setLayoutData(data);
+ private void createCertificateViewerArea(Composite composite) {
- listViewer.setLabelProvider(labelProvider);
- listViewer.setContentProvider(contentProvider);
+ TableColumnLayout tableColumnLayout = new TableColumnLayout(true);
+ Composite tableComposite = WidgetFactory.composite(SWT.NONE)
+ .layoutData(new GridData(SWT.FILL, SWT.FILL, true, true)).layout(tableColumnLayout).create(composite);
+ Table table = WidgetFactory
+ .table(SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION | SWT.CHECK)
+ .headerVisible(true).linesVisible(true).font(composite.getFont()).create(tableComposite);
+ certifcateViewer = new CheckboxTableViewer(table);
+ certifcateViewer.setContentProvider(new TreeNodeContentProvider());
+
+ GridData data = new GridData(GridData.FILL_BOTH);
+ data.heightHint = convertHeightInCharsToPixels(Math.min(artifactMap.keySet().size() + 1, 6)) * 3 / 2;
+ data.widthHint = convertWidthInCharsToPixels(120);
+ tableComposite.setLayoutData(data);
+
+ // This column is packed later.
+ TableViewerColumn typeColumn = createColumn(certifcateViewer, ProvUIMessages.TrustCertificateDialog_ObjectType,
+ new PGPOrX509ColumnLabelProvider(key -> "PGP", cert -> "x509", //$NON-NLS-1$ //$NON-NLS-2$
+ ProvUIMessages.TrustCertificateDialog_Unsigned),
+ tableColumnLayout, 1);
+
+ createColumn(certifcateViewer, ProvUIMessages.TrustCertificateDialog_Id,
+ new PGPOrX509ColumnLabelProvider(TrustCertificateDialog::userFriendlyFingerPrint,
+ cert -> cert.getSerialNumber().toString(), ProvUIMessages.TrustCertificateDialog_NotApplicable),
+ tableColumnLayout, 10);
+
+ createColumn(certifcateViewer, ProvUIMessages.TrustCertificateDialog_Name,
+ new PGPOrX509ColumnLabelProvider(pgp -> {
+ java.util.List<String> users = new ArrayList<>();
+ pgp.getUserIDs().forEachRemaining(users::add);
+ return String.join(", ", users); //$NON-NLS-1$
+ }, x509 -> {
+ X500PrincipalHelper principalHelper = new X500PrincipalHelper(x509.getSubjectX500Principal());
+ return principalHelper.getCN() + "; " + principalHelper.getOU() + "; " //$NON-NLS-1$ //$NON-NLS-2$
+ + principalHelper.getO();
+ }, ProvUIMessages.TrustCertificateDialog_Unknown), tableColumnLayout, 15);
+
+ createColumn(certifcateViewer, ProvUIMessages.TrustCertificateDialog_dates,
+ new PGPOrX509ColumnLabelProvider(pgp -> {
+ if (pgp.getCreationTime().after(Date.from(Instant.now()))) {
+ return NLS.bind(ProvUIMessages.TrustCertificateDialog_NotYetValidStartDate,
+ pgp.getCreationTime());
+ }
+ long validSeconds = pgp.getValidSeconds();
+ if (validSeconds == 0) {
+ return ProvUIMessages.TrustCertificateDialog_valid;
+ }
+ Instant expires = pgp.getCreationTime().toInstant().plus(validSeconds, ChronoUnit.SECONDS);
+ return expires.isBefore(Instant.now())
+ ? NLS.bind(ProvUIMessages.TrustCertificateDialog_expiredSince, expires)
+ : NLS.bind(ProvUIMessages.TrustCertificateDialog_validExpires, expires);
+ }, x509 -> {
+ try {
+ x509.checkValidity();
+ return ProvUIMessages.TrustCertificateDialog_valid;
+ } catch (CertificateExpiredException expired) {
+ return ProvUIMessages.TrustCertificateDialog_expired;
+ } catch (CertificateNotYetValidException notYetValid) {
+ return ProvUIMessages.TrustCertificateDialog_notYetValid;
+ }
+ }, ProvUIMessages.TrustCertificateDialog_NotApplicable), tableColumnLayout, 10);
+
+ createMenu(certifcateViewer);
addSelectionButtons(composite);
- listViewer.setInput(inputElement);
+ certifcateViewer.addDoubleClickListener(e -> {
+ StructuredSelection selection = (StructuredSelection) e.getSelection();
+ X509Certificate cert = getInstance(selection, X509Certificate.class);
+ if (cert != null) {
+ // create and open dialog for certificate chain
+ CertificateLabelProvider.openDialog(getShell(), cert);
+ }
+ });
- if (!getInitialElementSelections().isEmpty()) {
- checkInitialSelections();
+ certifcateViewer.addSelectionChangedListener(e -> {
+ if (certificateChainViewer != null) {
+ TreeNode treeNode = getInstance(e.getSelection(), TreeNode.class);
+ if (treeNode != null) {
+ certificateChainViewer.setInput(new TreeNode[] { treeNode });
+ certificateChainViewer.setSelection(new StructuredSelection(treeNode));
+ } else {
+ certificateChainViewer.setInput(new TreeNode[] {});
+ }
+ }
+
+ updateOkButton();
+ });
+
+ certifcateViewer.setInput(artifactMap.keySet().toArray(TreeNode[]::new));
+
+ typeColumn.getColumn().pack();
+ }
+
+ private void createCertficateChainViewerArea(Composite composite) {
+ certificateChainViewer = new TreeViewer(composite, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
+ GridData data = new GridData(GridData.FILL_BOTH);
+ int treeSize = artifactMap.keySet().stream().map(TrustCertificateDialog::computeTreeSize)
+ .max(Integer::compareTo).orElse(0);
+ data.heightHint = convertHeightInCharsToPixels(Math.min(treeSize, 5));
+ data.widthHint = convertWidthInCharsToPixels(120);
+ certificateChainViewer.getTree().setLayoutData(data);
+
+ certificateChainViewer.setAutoExpandLevel(3);
+ certificateChainViewer.setContentProvider(new TreeNodeContentProvider());
+ certificateChainViewer.setLabelProvider(new CertificateLabelProvider() {
+ @Override
+ public String getText(Object element) {
+ if (element instanceof TreeNode) {
+ Object o = ((TreeNode) element).getValue();
+ if (o instanceof PGPPublicKey) {
+ PGPPublicKey key = (PGPPublicKey) o;
+ String userFriendlyFingerPrint = userFriendlyFingerPrint(key);
+ java.util.List<String> users = new ArrayList<>();
+ key.getUserIDs().forEachRemaining(users::add);
+ String userIDs = String.join(", ", users); //$NON-NLS-1$
+ if (!userIDs.isEmpty()) {
+ return userFriendlyFingerPrint + " [" + userIDs + "]"; //$NON-NLS-1$//$NON-NLS-2$
+ }
+ return userFriendlyFingerPrint;
+ } else if (o == null) {
+ return ProvUIMessages.TrustCertificateDialog_Unsigned;
+ }
+ }
+
+ return super.getText(element);
+ }
+ });
+
+ certificateChainViewer.addSelectionChangedListener(event -> {
+ ISelection selection = event.getSelection();
+ boolean containsCertificate = containsInstance(selection, X509Certificate.class);
+ detailsButton.setEnabled(containsCertificate);
+ exportButton.setEnabled(containsCertificate || containsInstance(selection, PGPPublicKey.class));
+ });
+
+ createMenu(certificateChainViewer);
+
+ createButtons(composite);
+ }
+
+ private void crreateArtifactViewerArea(Composite composite, Set<IArtifactKey> artifacts) {
+ TableColumnLayout tableColumnLayout = new TableColumnLayout(true);
+ Composite tableComposite = WidgetFactory.composite(SWT.NONE)
+ .layoutData(new GridData(SWT.FILL, SWT.FILL, true, true)).layout(tableColumnLayout).create(composite);
+ Table table = WidgetFactory.table(SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION)
+ .headerVisible(true).linesVisible(true).font(composite.getFont()).create(tableComposite);
+ artifactViewer = new CheckboxTableViewer(table);
+ artifactViewer.setContentProvider(ArrayContentProvider.getInstance());
+
+ GridData data = new GridData(GridData.FILL_BOTH);
+ data.heightHint = convertHeightInCharsToPixels(Math.min(artifacts.size() + 1, 10)) * 3 / 2;
+ data.widthHint = convertWidthInCharsToPixels(120);
+ tableComposite.setLayoutData(data);
+
+ Font font = table.getFont();
+ FontData[] fontDatas = font.getFontData();
+ for (FontData fontData : fontDatas) {
+ fontData.setStyle(fontData.getStyle() | SWT.BOLD);
}
+ Font boldFont = new Font(table.getDisplay(), fontDatas);
+ composite.addDisposeListener(e -> boldFont.dispose());
+
+ Function<IArtifactKey, Font> fontProvider = e -> {
+ for (Object object : certifcateViewer.getCheckedElements()) {
+ List<IArtifactKey> list = artifactMap.get(object);
+ if (list != null && list.contains(e)) {
+ return boldFont;
+ }
+ }
+ return null;
+ };
- Dialog.applyDialogFont(composite);
+ certifcateViewer.addCheckStateListener(e -> artifactViewer.refresh(true));
+
+ artifactViewer.addPostSelectionChangedListener(e -> {
+ if (table.isFocusControl()) {
+ List<?> selection = e.getStructuredSelection().toList();
+ List<TreeNode> newSelection = new ArrayList<>();
+ LOOP: for (Map.Entry<TreeNode, List<IArtifactKey>> entry : artifactMap.entrySet()) {
+ List<IArtifactKey> value = entry.getValue();
+ if (value != null) {
+ for (IArtifactKey key : value) {
+ if (selection.contains(key)) {
+ newSelection.add(entry.getKey());
+ continue LOOP;
+ }
+ }
+ }
+ }
- return composite;
+ certifcateViewer.setSelection(new StructuredSelection(newSelection), true);
+ }
+ });
+
+ certifcateViewer.addPostSelectionChangedListener(e -> {
+ if (!table.isFocusControl()) {
+ Set<IArtifactKey> associatedArtifacts = new LinkedHashSet<>();
+ for (Object object : e.getStructuredSelection()) {
+ List<IArtifactKey> list = artifactMap.get(object);
+ if (list != null) {
+ associatedArtifacts.addAll(list);
+ }
+ }
+
+ artifactViewer.setSelection(new StructuredSelection(associatedArtifacts.toArray()), true);
+
+ // Reorder the artifacts so that the selected ones are first.
+ LinkedHashSet<IArtifactKey> newInput = new LinkedHashSet<>(artifacts);
+ newInput.retainAll(associatedArtifacts);
+ newInput.addAll(artifacts);
+ artifactViewer.setInput(newInput);
+
+ artifactViewer.setSelection(new StructuredSelection(associatedArtifacts.toArray()), true);
+ }
+ });
+
+ TableViewerColumn classifierColumn = createColumn(artifactViewer,
+ ProvUIMessages.TrustCertificateDialog_Classifier,
+ new ArtifactLabelProvider(a -> a.getClassifier(), fontProvider), tableColumnLayout, 1);
+ createColumn(artifactViewer, ProvUIMessages.TrustCertificateDialog_ArtifactId,
+ new ArtifactLabelProvider(a -> a.getId(), fontProvider), tableColumnLayout, 10);
+ createColumn(artifactViewer, ProvUIMessages.TrustCertificateDialog_Version,
+ new ArtifactLabelProvider(a -> a.getVersion().toString(), fontProvider), tableColumnLayout, 10);
+
+ artifactViewer.setInput(artifacts);
+
+ classifierColumn.getColumn().pack();
+ }
+
+ private void createMenu(StructuredViewer viewer) {
+ Control control = viewer.getControl();
+ Menu menu = new Menu(control);
+ control.setMenu(menu);
+ MenuItem item = new MenuItem(menu, SWT.PUSH);
+ item.setText(ProvUIMessages.TrustCertificateDialog_CopyFingerprint);
+ item.addSelectionListener(widgetSelectedAdapter(e -> {
+ PGPPublicKey key = getInstance(viewer.getSelection(), PGPPublicKey.class);
+ if (key != null) {
+ Clipboard clipboard = new Clipboard(getShell().getDisplay());
+ clipboard.setContents(new Object[] { userFriendlyFingerPrint(key) },
+ new Transfer[] { TextTransfer.getInstance() });
+ clipboard.dispose();
+ }
+ }));
+ viewer.addSelectionChangedListener(
+ e -> item.setEnabled(containsInstance(e.getSelection(), PGPPublicKey.class)));
+ }
+
+ private TableViewerColumn createColumn(TableViewer tableViewer, String text, ColumnLabelProvider labelProvider,
+ TableColumnLayout tableColumnLayout, int columnWeight) {
+ TableViewerColumn column = new TableViewerColumn(tableViewer, SWT.NONE);
+ column.getColumn().setText(text);
+ column.setLabelProvider(labelProvider);
+ tableColumnLayout.setColumnData(column.getColumn(), new ColumnWeightData(columnWeight));
+ return column;
}
/**
@@ -154,98 +553,252 @@ public class TrustCertificateDialog extends SelectionDialog {
private void checkInitialSelections() {
Iterator<?> itemsToCheck = getInitialElementSelections().iterator();
while (itemsToCheck.hasNext()) {
- listViewer.setChecked(itemsToCheck.next(), true);
+ certifcateViewer.setChecked(itemsToCheck.next(), true);
+ if (artifactViewer != null) {
+ artifactViewer.refresh(true);
+ }
}
}
/**
* Add the selection and deselection buttons to the dialog.
+ *
* @param composite org.eclipse.swt.widgets.Composite
*/
private void addSelectionButtons(Composite composite) {
- Composite buttonComposite = new Composite(composite, SWT.NONE);
- GridLayout layout = new GridLayout();
- layout.numColumns = 0;
- layout.marginWidth = 0;
- layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
- buttonComposite.setLayout(layout);
- buttonComposite.setLayoutData(new GridData(SWT.END, SWT.TOP, true, false));
+ int horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+
+ Composite buttonArea = new Composite(composite, SWT.NONE);
+ GridLayout buttonAreaLayout = new GridLayout();
+ buttonAreaLayout.numColumns = 2;
+ buttonAreaLayout.marginWidth = 0;
+ buttonAreaLayout.horizontalSpacing = horizontalSpacing;
+ buttonArea.setLayout(buttonAreaLayout);
+ buttonArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
+
+ Composite leftButtonArea = new Composite(buttonArea, SWT.NONE);
+ GridLayout leftButtonAreaLayout = new GridLayout();
+ leftButtonAreaLayout.numColumns = 0;
+ leftButtonAreaLayout.marginWidth = 0;
+ leftButtonAreaLayout.horizontalSpacing = horizontalSpacing;
+ leftButtonArea.setLayout(leftButtonAreaLayout);
+ leftButtonArea.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false));
+
+ if (containsInstance(artifactMap.keySet(), PGPPublicKey.class)
+ || containsInstance(artifactMap.keySet(), Certificate.class)) {
+ Button rememberSelectionButton = createCheckButton(leftButtonArea,
+ ProvUIMessages.TrustCertificateDialog_RememberSigners);
+ rememberSelectionButton.setSelection(rememberSelectedSigners);
+ rememberSelectionButton.addSelectionListener(widgetSelectedAdapter(e -> {
+ rememberSelectedSigners = rememberSelectionButton.getSelection();
+ }));
+ }
- Button selectButton = createButton(buttonComposite, IDialogConstants.SELECT_ALL_ID, ProvUIMessages.TrustCertificateDialog_SelectAll, false);
+ Button trustAlwaysButton = createCheckButton(leftButtonArea, ProvUIMessages.TrustCertificateDialog_AlwaysTrust);
+ trustAlwaysButton.addSelectionListener(widgetSelectedAdapter(e -> {
+ if (trustAlwaysButton.getSelection()) {
+ // Prompt the user to ensure they really understand what they've chosen, the
+ // risk, and where the preference is stored if they wish to change it in the
+ // future. Also ensure that the default button is no so that they must
+ // explicitly click the yes button, not just hit enter.
+ MessageDialog messageDialog = new MessageDialog(getShell(),
+ ProvUIMessages.TrustCertificateDialog_AlwaysTrustConfirmationTitle, null,
+ ProvUIMessages.TrustCertificateDialog_AlwaysTrustConfirmationMessage, MessageDialog.QUESTION,
+ new String[] { ProvUIMessages.TrustCertificateDialog_AlwaysTrustYes,
+ ProvUIMessages.TrustCertificateDialog_AlwaysTrustNo },
+ 1) {
+ @Override
+ public Image getImage() {
+ return getWarningImage();
+ }
+ };
+ int result = messageDialog.open();
+ if (result != Window.OK) {
+ // Restore the checkbox state.
+ trustAlwaysButton.setSelection(false);
+ } else {
+ certifcateViewer.setAllChecked(true);
+ if (artifactViewer != null) {
+ artifactViewer.refresh(true);
+ }
+ updateOkButton();
+ }
+ }
+ trustAlways = trustAlwaysButton.getSelection();
+ }));
+
+ Composite rightButtonArea = new Composite(buttonArea, SWT.NONE);
+ GridLayout rightButtonAreaLayout = new GridLayout();
+ rightButtonAreaLayout.numColumns = 0;
+ rightButtonAreaLayout.marginWidth = 0;
+ rightButtonAreaLayout.horizontalSpacing = horizontalSpacing;
+ rightButtonArea.setLayout(rightButtonAreaLayout);
+ rightButtonArea.setLayoutData(new GridData(SWT.END, SWT.TOP, true, false));
+
+ Button selectButton = createButton(rightButtonArea, IDialogConstants.SELECT_ALL_ID,
+ ProvUIMessages.TrustCertificateDialog_SelectAll, false);
+ selectButton.addSelectionListener(widgetSelectedAdapter(e -> {
+ certifcateViewer.setAllChecked(true);
+ if (artifactViewer != null) {
+ artifactViewer.refresh(true);
+ }
+ updateOkButton();
+ }));
+
+ Button deselectButton = createButton(rightButtonArea, IDialogConstants.DESELECT_ALL_ID,
+ ProvUIMessages.TrustCertificateDialog_DeselectAll, false);
+ deselectButton.addSelectionListener(widgetSelectedAdapter(e -> {
+ certifcateViewer.setAllChecked(false);
+ if (artifactViewer != null) {
+ artifactViewer.refresh(true);
+ }
+ updateOkButton();
+ }));
+ }
- SelectionListener listener = widgetSelectedAdapter(e -> {
- listViewer.setAllChecked(true);
- getOkButton().setEnabled(true);
- });
- selectButton.addSelectionListener(listener);
+ protected Button createCheckButton(Composite parent, String label) {
+ ((GridLayout) parent.getLayout()).numColumns++;
+ Button button = WidgetFactory.button(SWT.CHECK).text(label).font(JFaceResources.getDialogFont()).create(parent);
+ setButtonLayoutData(button);
+ return button;
+ }
- Button deselectButton = createButton(buttonComposite, IDialogConstants.DESELECT_ALL_ID, ProvUIMessages.TrustCertificateDialog_DeselectAll, false);
+ private String getFilterPath(String key) {
+ IDialogSettings dialogSettings = DialogSettings
+ .getOrCreateSection(ProvUIActivator.getDefault().getDialogSettings(), getClass().getName());
+ String filterPath = dialogSettings.get(key);
+ if (filterPath == null) {
+ filterPath = System.getProperty("user.home"); //$NON-NLS-1$
+ }
+ return filterPath;
+ }
- listener = widgetSelectedAdapter(e -> {
- listViewer.setAllChecked(false);
- getOkButton().setEnabled(false);
- });
- deselectButton.addSelectionListener(listener);
+ private void setFilterPath(String key, String filterPath) {
+ if (filterPath != null) {
+ IDialogSettings dialogSettings = DialogSettings
+ .getOrCreateSection(ProvUIActivator.getDefault().getDialogSettings(), getClass().getName());
+ dialogSettings.put(key, filterPath);
+ }
}
- private ISelectionChangedListener getChainSelectionListener() {
- return event -> {
- ISelection selection = event.getSelection();
- if (selection instanceof StructuredSelection) {
- selectedCertificate = ((StructuredSelection) selection).getFirstElement();
+ private void updateOkButton() {
+ Button okButton = getOkButton();
+ if (okButton != null) {
+ certifcateViewer.getCheckedElements();
+ Object[] checkedElements = certifcateViewer.getCheckedElements();
+ Set<IArtifactKey> artifacts = artifactMap.values().stream().flatMap(Collection::stream)
+ .collect(Collectors.toSet());
+ if (artifacts.isEmpty()) {
+ okButton.setEnabled(checkedElements.length > 0);
+ } else {
+ for (Object checkElement : checkedElements) {
+ artifacts.removeAll(artifactMap.get(checkElement));
+ }
+ okButton.setEnabled(artifacts.isEmpty());
}
- };
+ }
}
- public TreeViewer getCertificateChainViewer() {
- return certificateChainViewer;
+ @Override
+ protected void okPressed() {
+ setResult(Arrays.asList(certifcateViewer.getCheckedElements()));
+ super.okPressed();
}
- private IDoubleClickListener getDoubleClickListener() {
- return event -> {
- StructuredSelection selection = (StructuredSelection) event.getSelection();
- Object selectedElement = selection.getFirstElement();
- if (selectedElement instanceof TreeNode) {
- TreeNode treeNode = (TreeNode) selectedElement;
- // create and open dialog for certificate chain
- X509CertificateViewDialog certificateViewDialog = new X509CertificateViewDialog(getShell(), (X509Certificate) treeNode.getValue());
- certificateViewDialog.open();
+ private static class PGPOrX509ColumnLabelProvider extends ColumnLabelProvider {
+ private Function<PGPPublicKey, String> pgpMap;
+ private Function<X509Certificate, String> x509map;
+ private String unsignedValue;
+
+ public PGPOrX509ColumnLabelProvider(Function<PGPPublicKey, String> pgpMap,
+ Function<X509Certificate, String> x509map, String unsignedValue) {
+ this.pgpMap = pgpMap;
+ this.x509map = x509map;
+ this.unsignedValue = unsignedValue;
+ }
+
+ @Override
+ public String getText(Object element) {
+ if (element instanceof TreeNode) {
+ element = ((TreeNode) element).getValue();
+ }
+ if (element instanceof PGPPublicKey) {
+ return pgpMap.apply((PGPPublicKey) element);
+ }
+ if (element instanceof X509Certificate) {
+ return x509map.apply((X509Certificate) element);
}
- };
- }
- private ISelectionChangedListener getParentSelectionListener() {
- return event -> {
- ISelection selection = event.getSelection();
- if (selection instanceof StructuredSelection) {
- TreeNode firstElement = (TreeNode) ((StructuredSelection) selection).getFirstElement();
- getCertificateChainViewer().setInput(new TreeNode[] {firstElement});
- getOkButton().setEnabled(listViewer.getChecked(firstElement));
- getCertificateChainViewer().refresh();
+ if (element == null) {
+ return unsignedValue;
}
- };
+ return super.getText(element);
+ }
}
- /**
- * The <code>ListSelectionDialog</code> implementation of this
- * <code>Dialog</code> method builds a list of the selected elements for later
- * retrieval by the client and closes this dialog.
- */
- @Override
- protected void okPressed() {
- // Get the input children.
- Object[] children = contentProvider.getElements(inputElement);
+ private static class ArtifactLabelProvider extends ColumnLabelProvider {
+ private Function<IArtifactKey, String> labelProvider;
+ private Function<IArtifactKey, Font> fontProvider;
- // Build a list of selected children.
+ public ArtifactLabelProvider(Function<IArtifactKey, String> labelProvider,
+ Function<IArtifactKey, Font> fontProvider) {
+ this.labelProvider = labelProvider;
+ this.fontProvider = fontProvider;
+ }
+
+ @Override
+ public String getText(Object element) {
+ return labelProvider.apply((IArtifactKey) element);
+ }
+
+ @Override
+ public Font getFont(Object element) {
+ return fontProvider.apply((IArtifactKey) element);
+ }
+ }
+
+ private static int computeTreeSize(TreeNode node) {
+ int count = 1;
+ TreeNode[] children = node.getChildren();
if (children != null) {
- ArrayList<Object> list = new ArrayList<>();
- for (Object element : children) {
- if (listViewer.getChecked(element)) {
- list.add(element);
+ for (TreeNode child : children) {
+ count += computeTreeSize(child);
+ }
+ }
+ return count;
+ }
+
+ private static <T> T getInstance(Object element, Class<T> type) {
+ if (type.isInstance(element)) {
+ return type.cast(element);
+ } else if (element instanceof Iterable) {
+ for (Object object : ((Iterable<?>) element)) {
+ T instance = getInstance(object, type);
+ if (instance != null) {
+ return instance;
+ }
+ }
+ } else if (element instanceof TreeNode) {
+ return getInstance(((TreeNode) element).getValue(), type);
+ } else if (element instanceof TreeNode[]) {
+ for (TreeNode child : (TreeNode[]) element) {
+ T instance = getInstance(child, type);
+ if (instance != null) {
+ return instance;
}
}
- setResult(list);
}
- super.okPressed();
+ return null;
+ }
+
+ private static boolean containsInstance(Object element, Class<?> type) {
+ return getInstance(element, type) != null;
+ }
+
+ private static String userFriendlyFingerPrint(PGPPublicKey key) {
+ if (key == null) {
+ return null;
+ }
+ return PGPPublicKeyService.toHexFingerprint(key);
}
}
diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/messages.properties b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/messages.properties
index ac698381d..1d574dc40 100644
--- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/messages.properties
+++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/messages.properties
@@ -12,6 +12,7 @@
# IBM Corporation - initial API and implementation
###############################################################################
+PGPPublicKeyViewDialog_Title=PGP Public Key Properties
ProfileModificationAction_InvalidSelections=Problem determining user request. Profile id: {0}, Selection count: {1}
ProfileModificationWizardPage_DetailsLabel=Details
ProfileSnapshots_Label=Installation History
@@ -257,6 +258,10 @@ RepositoryElement_NotFound=This repository is currently not available.
RepositoryTracker_DuplicateLocation=Duplicate location
MetadataRepositoryElement_RepositoryLoadError=Error loading repository {0}
IUViewQueryContext_NoCategorizedItemsDescription=You can uncheck the 'Group items by category' check box to see items without categories.
+KeySigningInfoFactory_FingerprintItem=Fingerprint=
+KeySigningInfoFactory_KeySignersSection=Key Signers:
+KeySigningInfoFactory_PGPSigningType=PGP Public Key
+KeySigningInfoFactory_UserIDItem=UserID=
QueriedElementWrapper_NoCategorizedItemsExplanation=There are no categorized items
QueriedElementWrapper_NoItemsExplanation=There are no items available
QueriedElementWrapper_SiteNotFound=Could not find {0}
@@ -276,9 +281,38 @@ RevertDialog_CancelButtonLabel=Cancel
RollbackProfileElement_CurrentInstallation=Current Installation
-TrustCertificateDialog_Details=Details
-TrustCertificateDialog_Title=Certificates
-TrustCertificateDialog_Message=Do you trust these certificates?
-TrustCertificateDialog_AcceptSelectedButtonLabel=&Accept selected
+TrustCertificateDialog_Details=\uD83D\uDD0D D&etails...
+TrustCertificateDialog_Export=\uD83D\uDCE5 E&xport...
+TrustCertificateDialog_Title=Trust
+TrustCertificateDialog_Message=Do you trust these signers?
+TrustCertificateDialog_MessageUnsigned=\u26A0\uFE0F\u00A0Do you trust unsigned content of unknown origin?
+TrustCertificateDialog_MessageNameWarning=\u26A0\uFE0F\u00A0The displayed originator names are not necessarily a reliable certification of origin.
+TrustCertificateDialog_MessagePGP=For PG keys, verification is typically achieved by querying the key\'s fingerprint against a trusted key server.
+TrustCertificateDialog_AcceptSelectedButtonLabel=&Trust Selected
+TrustCertificateDialog_AlwaysTrust=Always trust all content
+TrustCertificateDialog_AlwaysTrustConfirmationMessage=Are you certain you wish to accept all content, including unsigned content of unknown origin, with no further confirmation now and for all future operations?\n\n\
+Use the 'Select All' button to trust all content just for this operation.\n\n\
+This preference choice will be stored on the 'Install/Update > Trust' preference page.
+TrustCertificateDialog_AlwaysTrustConfirmationTitle=Always Trust Everything Confirmation
+TrustCertificateDialog_AlwaysTrustNo=No, Prompt Me Instead
+TrustCertificateDialog_AlwaysTrustYes=Yes, I Accept the Risk
+TrustCertificateDialog_ArtifactId=Id
TrustCertificateDialog_SelectAll=&Select All
TrustCertificateDialog_DeselectAll=&Deselect All
+TrustCertificateDialog_ObjectType=Type
+TrustCertificateDialog_Id=Id/Fingerprint
+TrustCertificateDialog_Name=Name
+TrustCertificateDialog_Classifier=Classifier
+TrustCertificateDialog_CopyFingerprint=Copy Fingerprint
+TrustCertificateDialog_dates=Validity Dates
+TrustCertificateDialog_NotApplicable=n/a
+TrustCertificateDialog_NotYetValidStartDate=\u274C Not yet valid, starts {0}
+TrustCertificateDialog_expiredSince=\u274C Expired since {0}
+TrustCertificateDialog_validExpires=\u2714\uFE0F Valid, expires {0}
+TrustCertificateDialog_valid=\u2714\uFE0F Valid
+TrustCertificateDialog_expired=\u274C Expired
+TrustCertificateDialog_notYetValid=\u274C Not yet valid
+TrustCertificateDialog_RememberSigners=Remember selected signers
+TrustCertificateDialog_Unknown=Unknown
+TrustCertificateDialog_Unsigned=Unsigned
+TrustCertificateDialog_Version=Version
diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/viewers/CertificateLabelProvider.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/viewers/CertificateLabelProvider.java
index 16246ed34..39cc991d8 100644
--- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/viewers/CertificateLabelProvider.java
+++ b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/viewers/CertificateLabelProvider.java
@@ -13,11 +13,12 @@
*******************************************************************************/
package org.eclipse.equinox.internal.p2.ui.viewers;
-import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import org.eclipse.equinox.internal.provisional.security.ui.X500PrincipalHelper;
+import org.eclipse.equinox.internal.provisional.security.ui.X509CertificateViewDialog;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Shell;
/**
* A label provider that displays X509 certificates.
@@ -31,13 +32,12 @@ public class CertificateLabelProvider implements ILabelProvider {
@Override
public String getText(Object element) {
- Certificate cert = null;
if (element instanceof TreeNode) {
- cert = (Certificate) ((TreeNode) element).getValue();
- }
- if (cert != null) {
- X500PrincipalHelper principalHelper = new X500PrincipalHelper(((X509Certificate) cert).getSubjectX500Principal());
- return principalHelper.getCN() + "; " + principalHelper.getOU() + "; " + principalHelper.getO(); //$NON-NLS-1$ //$NON-NLS-2$
+ Object o = ((TreeNode) element).getValue();
+ if (o instanceof X509Certificate) {
+ X509Certificate cert = (X509Certificate) o;
+ return getText(cert);
+ }
}
return ""; //$NON-NLS-1$
}
@@ -62,4 +62,23 @@ public class CertificateLabelProvider implements ILabelProvider {
// do nothing
}
+ /**
+ * Returns a string that can be used as readable label for a certificate. This
+ * hides the internal implementation classes needed to produce this label.
+ */
+ public static String getText(X509Certificate cert) {
+ X500PrincipalHelper principalHelper = new X500PrincipalHelper(cert.getSubjectX500Principal());
+ return principalHelper.getCN() + "; " + principalHelper.getOU() + "; " //$NON-NLS-1$ //$NON-NLS-2$
+ + principalHelper.getO();
+ }
+
+ /**
+ * Opens a dialog to present detailed information about a certificate. This
+ * hides the internal implementation classes needed open this dialog.
+ */
+ public static void openDialog(Shell shell, X509Certificate cert) {
+ // create and open dialog for certificate chain
+ X509CertificateViewDialog certificateViewDialog = new X509CertificateViewDialog(shell, cert);
+ certificateViewDialog.open();
+ }
}
diff --git a/bundles/org.eclipse.equinox.p2.updatechecker/.classpath b/bundles/org.eclipse.equinox.p2.updatechecker/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.updatechecker/.classpath
+++ b/bundles/org.eclipse.equinox.p2.updatechecker/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.updatechecker/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.updatechecker/.settings/org.eclipse.jdt.core.prefs
index 20e4f5fe2..3c15076cc 100644
--- a/bundles/org.eclipse.equinox.p2.updatechecker/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.updatechecker/.settings/org.eclipse.jdt.core.prefs
@@ -17,9 +17,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -127,8 +127,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.release=disabled
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -142,7 +142,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -263,7 +262,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -334,7 +332,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -479,7 +476,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.updatechecker/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.updatechecker/META-INF/MANIFEST.MF
index 3bbc7e3b1..42bc89ee1 100644
--- a/bundles/org.eclipse.equinox.p2.updatechecker/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.updatechecker/META-INF/MANIFEST.MF
@@ -2,14 +2,14 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.updatechecker;singleton:=true
-Bundle-Version: 1.2.300.qualifier
+Bundle-Version: 1.3.0.qualifier
Bundle-Vendor: %providerName
Bundle-Localization: plugin
Export-Package: org.eclipse.equinox.internal.p2.updatechecker;x-internal:=true,
org.eclipse.equinox.internal.provisional.p2.updatechecker;x-friends:="org.eclipse.equinox.p2.ui.sdk.scheduler"
Require-Bundle: org.eclipse.equinox.common;bundle-version="[3.3.0,4.0)"
Service-Component: OSGI-INF/updatechecker.xml
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Import-Package: org.eclipse.equinox.internal.p2.core.helpers,
org.eclipse.equinox.p2.core;version="[2.0.0,3.0.0)",
diff --git a/bundles/org.eclipse.equinox.p2.updatechecker/pom.xml b/bundles/org.eclipse.equinox.p2.updatechecker/pom.xml
index eb9f8aa09..49d08db7f 100644
--- a/bundles/org.eclipse.equinox.p2.updatechecker/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.updatechecker/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.updatechecker</artifactId>
- <version>1.2.300-SNAPSHOT</version>
+ <version>1.3.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.updatesite/.classpath b/bundles/org.eclipse.equinox.p2.updatesite/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.p2.updatesite/.classpath
+++ b/bundles/org.eclipse.equinox.p2.updatesite/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.p2.updatesite/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.p2.updatesite/.settings/org.eclipse.jdt.core.prefs
index bf073244e..d3f0b63c3 100644
--- a/bundles/org.eclipse.equinox.p2.updatesite/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.p2.updatesite/.settings/org.eclipse.jdt.core.prefs
@@ -17,9 +17,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -35,6 +35,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -92,6 +93,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -127,7 +129,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -141,7 +144,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -262,7 +264,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -333,7 +334,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -478,7 +478,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.p2.updatesite/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.p2.updatesite/META-INF/MANIFEST.MF
index 9186c37d6..c20fed2b9 100644
--- a/bundles/org.eclipse.equinox.p2.updatesite/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.p2.updatesite/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %pluginName
Bundle-SymbolicName: org.eclipse.equinox.p2.updatesite;singleton:=true
-Bundle-Version: 1.1.400.qualifier
+Bundle-Version: 1.2.200.qualifier
Bundle-Activator: org.eclipse.equinox.internal.p2.updatesite.Activator
Bundle-Vendor: %providerName
Bundle-Localization: plugin
@@ -12,7 +12,7 @@ Export-Package: org.eclipse.equinox.internal.p2.updatesite;x-friends:="org.eclip
Require-Bundle: org.eclipse.equinox.common;bundle-version="[3.7.0,4.0.0)",
org.eclipse.equinox.p2.metadata.repository;bundle-version="0.1.0",
org.eclipse.equinox.p2.artifact.repository;bundle-version="0.1.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Import-Package: javax.xml.parsers,
org.eclipse.equinox.app;version="1.1.0",
diff --git a/bundles/org.eclipse.equinox.p2.updatesite/build.properties b/bundles/org.eclipse.equinox.p2.updatesite/build.properties
index a62667f6e..5ca611c37 100644
--- a/bundles/org.eclipse.equinox.p2.updatesite/build.properties
+++ b/bundles/org.eclipse.equinox.p2.updatesite/build.properties
@@ -19,4 +19,3 @@ bin.includes = META-INF/,\
plugin.properties,\
about.html
src.includes = about.html
-javacWarnings..=+unusedAllocation,unusedImport,unusedLocal,unusedPrivate \ No newline at end of file
diff --git a/bundles/org.eclipse.equinox.p2.updatesite/pom.xml b/bundles/org.eclipse.equinox.p2.updatesite/pom.xml
index 9d2cb90bf..1f7c8c962 100644
--- a/bundles/org.eclipse.equinox.p2.updatesite/pom.xml
+++ b/bundles/org.eclipse.equinox.p2.updatesite/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.p2.updatesite</artifactId>
- <version>1.1.400-SNAPSHOT</version>
+ <version>1.2.200-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/DefaultSiteParser.java b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/DefaultSiteParser.java
index 4d299ce2c..f533dd7c5 100644
--- a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/DefaultSiteParser.java
+++ b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/DefaultSiteParser.java
@@ -27,8 +27,8 @@ import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
/**
- * Parses a site.xml file.
- * This class was initially copied from org.eclipse.update.core.model.DefaultSiteParser.
+ * Parses a site.xml file. This class was initially copied from
+ * org.eclipse.update.core.model.DefaultSiteParser.
*/
public class DefaultSiteParser extends DefaultHandler {
@@ -155,13 +155,14 @@ public class DefaultSiteParser extends DefaultHandler {
/**
* Handle character text
+ *
* @see DefaultHandler#characters(char[], int, int)
* @since 2.0
*/
@Override
public void characters(char[] ch, int start, int length) {
String text = new String(ch, start, length);
- //only push if description
+ // only push if description
int state = stateStack.peek().intValue();
if (state == STATE_DESCRIPTION_SITE || state == STATE_DESCRIPTION_CATEGORY_DEF)
objectStack.push(text);
@@ -170,6 +171,7 @@ public class DefaultSiteParser extends DefaultHandler {
/**
* Handle end of element tags
+ *
* @see DefaultHandler#endElement(String, String, String)
* @since 2.0
*/
@@ -181,108 +183,109 @@ public class DefaultSiteParser extends DefaultHandler {
int state = stateStack.peek().intValue();
switch (state) {
- case STATE_IGNORED_ELEMENT :
- case STATE_ARCHIVE :
- case STATE_CATEGORY :
- stateStack.pop();
- break;
-
- case STATE_INITIAL :
- internalError(Messages.DefaultSiteParser_ParsingStackBackToInitialState);
- break;
-
- case STATE_SITE :
- stateStack.pop();
- if (objectStack.peek() instanceof String) {
- text = (String) objectStack.pop();
- SiteModel site = (SiteModel) objectStack.peek();
- site.getDescription().setAnnotation(text);
- }
- //do not pop the object
- break;
-
- case STATE_FEATURE :
- stateStack.pop();
- objectStack.pop();
- break;
-
- case STATE_BUNDLE :
- stateStack.pop();
- objectStack.pop();
- break;
-
- case STATE_CATEGORY_DEF :
- stateStack.pop();
- if (objectStack.peek() instanceof String) {
- text = (String) objectStack.pop();
- SiteCategory category = (SiteCategory) objectStack.peek();
- category.setDescription(text);
+ case STATE_IGNORED_ELEMENT:
+ case STATE_ARCHIVE:
+ case STATE_CATEGORY:
+ stateStack.pop();
+ break;
+
+ case STATE_INITIAL:
+ internalError(Messages.DefaultSiteParser_ParsingStackBackToInitialState);
+ break;
+
+ case STATE_SITE:
+ stateStack.pop();
+ if (objectStack.peek() instanceof String) {
+ text = (String) objectStack.pop();
+ SiteModel site = (SiteModel) objectStack.peek();
+ site.getDescription().setAnnotation(text);
+ }
+ // do not pop the object
+ break;
+
+ case STATE_FEATURE:
+ stateStack.pop();
+ objectStack.pop();
+ break;
+
+ case STATE_BUNDLE:
+ stateStack.pop();
+ objectStack.pop();
+ break;
+
+ case STATE_CATEGORY_DEF:
+ stateStack.pop();
+ if (objectStack.peek() instanceof String) {
+ text = (String) objectStack.pop();
+ SiteCategory category = (SiteCategory) objectStack.peek();
+ category.setDescription(text);
+ }
+ objectStack.pop();
+ break;
+
+ case STATE_DESCRIPTION_SITE:
+ stateStack.pop();
+ text = ""; //$NON-NLS-1$
+ while (objectStack.peek() instanceof String) {
+ // add text, preserving at most one space between text fragments
+ String newText = (String) objectStack.pop();
+ if (trailingSpace(newText) && !leadingSpace(text)) {
+ text = " " + text; //$NON-NLS-1$
}
- objectStack.pop();
- break;
-
- case STATE_DESCRIPTION_SITE :
- stateStack.pop();
- text = ""; //$NON-NLS-1$
- while (objectStack.peek() instanceof String) {
- // add text, preserving at most one space between text fragments
- String newText = (String) objectStack.pop();
- if (trailingSpace(newText) && !leadingSpace(text)) {
- text = " " + text; //$NON-NLS-1$
- }
- text = newText.trim() + text;
- if (leadingSpace(newText) && !leadingSpace(text)) {
- text = " " + text; //$NON-NLS-1$
- }
+ text = newText.trim() + text;
+ if (leadingSpace(newText) && !leadingSpace(text)) {
+ text = " " + text; //$NON-NLS-1$
}
- text = text.trim();
-
- info = (URLEntry) objectStack.pop();
- if (text != null)
- info.setAnnotation(text);
-
- SiteModel siteModel = (SiteModel) objectStack.peek();
- // override description.
- // do not raise error as previous description may be default one
- // when parsing site tag
- if (DESCRIPTION_SITE_ALREADY_SEEN)
- debug(NLS.bind(Messages.DefaultSiteParser_ElementAlreadySet, (new String[] {getState(state)})));
- siteModel.setDescription(info);
- DESCRIPTION_SITE_ALREADY_SEEN = true;
- break;
-
- case STATE_DESCRIPTION_CATEGORY_DEF :
- stateStack.pop();
- text = ""; //$NON-NLS-1$
- while (objectStack.peek() instanceof String) {
- // add text, preserving at most one space between text fragments
- String newText = (String) objectStack.pop();
- if (trailingSpace(newText) && !leadingSpace(text)) {
- text = " " + text; //$NON-NLS-1$
- }
- text = newText.trim() + text;
- if (leadingSpace(newText) && !leadingSpace(text)) {
- text = " " + text; //$NON-NLS-1$
- }
+ }
+ text = text.trim();
+
+ info = (URLEntry) objectStack.pop();
+ if (text != null)
+ info.setAnnotation(text);
+
+ SiteModel siteModel = (SiteModel) objectStack.peek();
+ // override description.
+ // do not raise error as previous description may be default one
+ // when parsing site tag
+ if (DESCRIPTION_SITE_ALREADY_SEEN)
+ debug(NLS.bind(Messages.DefaultSiteParser_ElementAlreadySet, (new String[] { getState(state) })));
+ siteModel.setDescription(info);
+ DESCRIPTION_SITE_ALREADY_SEEN = true;
+ break;
+
+ case STATE_DESCRIPTION_CATEGORY_DEF:
+ stateStack.pop();
+ text = ""; //$NON-NLS-1$
+ while (objectStack.peek() instanceof String) {
+ // add text, preserving at most one space between text fragments
+ String newText = (String) objectStack.pop();
+ if (trailingSpace(newText) && !leadingSpace(text)) {
+ text = " " + text; //$NON-NLS-1$
}
- text = text.trim();
-
- info = (URLEntry) objectStack.pop();
- if (text != null)
- info.setAnnotation(text);
-
- SiteCategory category = (SiteCategory) objectStack.peek();
- if (category.getDescription() != null)
- internalError(NLS.bind(Messages.DefaultSiteParser_ElementAlreadySet, (new String[] {getState(state), category.getLabel()})));
- else {
- checkTranslated(info.getAnnotation());
- category.setDescription(info.getAnnotation());
+ text = newText.trim() + text;
+ if (leadingSpace(newText) && !leadingSpace(text)) {
+ text = " " + text; //$NON-NLS-1$
}
- break;
+ }
+ text = text.trim();
+
+ info = (URLEntry) objectStack.pop();
+ if (text != null)
+ info.setAnnotation(text);
+
+ SiteCategory category = (SiteCategory) objectStack.peek();
+ if (category.getDescription() != null)
+ internalError(NLS.bind(Messages.DefaultSiteParser_ElementAlreadySet,
+ (new String[] { getState(state), category.getLabel() })));
+ else {
+ checkTranslated(info.getAnnotation());
+ category.setDescription(info.getAnnotation());
+ }
+ break;
- default :
- internalError(NLS.bind(Messages.DefaultSiteParser_UnknownEndState, (new String[] {getState(state)})));
- break;
+ default:
+ internalError(NLS.bind(Messages.DefaultSiteParser_UnknownEndState, (new String[] { getState(state) })));
+ break;
}
if (Tracing.DEBUG_GENERATOR_PARSING)
@@ -290,8 +293,8 @@ public class DefaultSiteParser extends DefaultHandler {
}
/*
- * Handles an error state specified by the status. The collection of all logged status
- * objects can be accessed using <code>getStatus()</code>.
+ * Handles an error state specified by the status. The collection of all logged
+ * status objects can be accessed using <code>getStatus()</code>.
*
* @param error a status detailing the error condition
*/
@@ -308,6 +311,7 @@ public class DefaultSiteParser extends DefaultHandler {
/**
* Handle errors
+ *
* @see DefaultHandler#error(SAXParseException)
* @since 2.0
*/
@@ -318,6 +322,7 @@ public class DefaultSiteParser extends DefaultHandler {
/**
* Handle fatal errors
+ *
* @see DefaultHandler#fatalError(SAXParseException)
* @exception SAXException
* @since 2.0
@@ -334,38 +339,38 @@ public class DefaultSiteParser extends DefaultHandler {
private String getState(int state) {
switch (state) {
- case STATE_IGNORED_ELEMENT :
- return "Ignored"; //$NON-NLS-1$
+ case STATE_IGNORED_ELEMENT:
+ return "Ignored"; //$NON-NLS-1$
- case STATE_INITIAL :
- return "Initial"; //$NON-NLS-1$
+ case STATE_INITIAL:
+ return "Initial"; //$NON-NLS-1$
- case STATE_SITE :
- return "Site"; //$NON-NLS-1$
+ case STATE_SITE:
+ return "Site"; //$NON-NLS-1$
- case STATE_FEATURE :
- return "Feature"; //$NON-NLS-1$
+ case STATE_FEATURE:
+ return "Feature"; //$NON-NLS-1$
- case STATE_BUNDLE :
- return "Bundle"; //$NON-NLS-1$
+ case STATE_BUNDLE:
+ return "Bundle"; //$NON-NLS-1$
- case STATE_ARCHIVE :
- return "Archive"; //$NON-NLS-1$
+ case STATE_ARCHIVE:
+ return "Archive"; //$NON-NLS-1$
- case STATE_CATEGORY :
- return "Category"; //$NON-NLS-1$
+ case STATE_CATEGORY:
+ return "Category"; //$NON-NLS-1$
- case STATE_CATEGORY_DEF :
- return "Category Def"; //$NON-NLS-1$
+ case STATE_CATEGORY_DEF:
+ return "Category Def"; //$NON-NLS-1$
- case STATE_DESCRIPTION_CATEGORY_DEF :
- return "Description / Category Def"; //$NON-NLS-1$
+ case STATE_DESCRIPTION_CATEGORY_DEF:
+ return "Description / Category Def"; //$NON-NLS-1$
- case STATE_DESCRIPTION_SITE :
- return "Description / Site"; //$NON-NLS-1$
+ case STATE_DESCRIPTION_SITE:
+ return "Description / Site"; //$NON-NLS-1$
- default :
- return Messages.DefaultSiteParser_UnknownState;
+ default:
+ return Messages.DefaultSiteParser_UnknownState;
}
}
@@ -381,113 +386,117 @@ public class DefaultSiteParser extends DefaultHandler {
private void handleCategoryDefState(String elementName, Attributes attributes) {
switch (elementName) {
- case FEATURE:
- stateStack.push(Integer.valueOf(STATE_FEATURE));
- processFeature(attributes);
- break;
- case BUNDLE:
- stateStack.push(Integer.valueOf(STATE_BUNDLE));
- processBundle(attributes);
- break;
- case ARCHIVE:
- stateStack.push(Integer.valueOf(STATE_ARCHIVE));
- processArchive(attributes);
- break;
- case CATEGORY_DEF:
- stateStack.push(Integer.valueOf(STATE_CATEGORY_DEF));
- processCategoryDef(attributes);
- break;
- case DESCRIPTION:
- stateStack.push(Integer.valueOf(STATE_DESCRIPTION_CATEGORY_DEF));
- processInfo(attributes);
- break;
- default:
- internalErrorUnknownTag(NLS.bind(Messages.DefaultSiteParser_UnknownElement, (new String[] {elementName, getState(currentState)})));
- break;
+ case FEATURE:
+ stateStack.push(Integer.valueOf(STATE_FEATURE));
+ processFeature(attributes);
+ break;
+ case BUNDLE:
+ stateStack.push(Integer.valueOf(STATE_BUNDLE));
+ processBundle(attributes);
+ break;
+ case ARCHIVE:
+ stateStack.push(Integer.valueOf(STATE_ARCHIVE));
+ processArchive(attributes);
+ break;
+ case CATEGORY_DEF:
+ stateStack.push(Integer.valueOf(STATE_CATEGORY_DEF));
+ processCategoryDef(attributes);
+ break;
+ case DESCRIPTION:
+ stateStack.push(Integer.valueOf(STATE_DESCRIPTION_CATEGORY_DEF));
+ processInfo(attributes);
+ break;
+ default:
+ internalErrorUnknownTag(NLS.bind(Messages.DefaultSiteParser_UnknownElement,
+ (new String[] { elementName, getState(currentState) })));
+ break;
}
}
private void handleCategoryState(String elementName, Attributes attributes) {
switch (elementName) {
- case DESCRIPTION:
- stateStack.push(Integer.valueOf(STATE_DESCRIPTION_SITE));
- processInfo(attributes);
- break;
- case FEATURE:
- stateStack.push(Integer.valueOf(STATE_FEATURE));
- processFeature(attributes);
- break;
- case BUNDLE:
- stateStack.push(Integer.valueOf(STATE_BUNDLE));
- processBundle(attributes);
- break;
- case ARCHIVE:
- stateStack.push(Integer.valueOf(STATE_ARCHIVE));
- processArchive(attributes);
- break;
- case CATEGORY_DEF:
- stateStack.push(Integer.valueOf(STATE_CATEGORY_DEF));
- processCategoryDef(attributes);
- break;
- case CATEGORY:
- stateStack.push(Integer.valueOf(STATE_CATEGORY));
- processCategory(attributes);
- break;
- default:
- internalErrorUnknownTag(NLS.bind(Messages.DefaultSiteParser_UnknownElement, (new String[] {elementName, getState(currentState)})));
- break;
+ case DESCRIPTION:
+ stateStack.push(Integer.valueOf(STATE_DESCRIPTION_SITE));
+ processInfo(attributes);
+ break;
+ case FEATURE:
+ stateStack.push(Integer.valueOf(STATE_FEATURE));
+ processFeature(attributes);
+ break;
+ case BUNDLE:
+ stateStack.push(Integer.valueOf(STATE_BUNDLE));
+ processBundle(attributes);
+ break;
+ case ARCHIVE:
+ stateStack.push(Integer.valueOf(STATE_ARCHIVE));
+ processArchive(attributes);
+ break;
+ case CATEGORY_DEF:
+ stateStack.push(Integer.valueOf(STATE_CATEGORY_DEF));
+ processCategoryDef(attributes);
+ break;
+ case CATEGORY:
+ stateStack.push(Integer.valueOf(STATE_CATEGORY));
+ processCategory(attributes);
+ break;
+ default:
+ internalErrorUnknownTag(NLS.bind(Messages.DefaultSiteParser_UnknownElement,
+ (new String[] { elementName, getState(currentState) })));
+ break;
}
}
private void handleFeatureState(String elementName, Attributes attributes) {
switch (elementName) {
- case DESCRIPTION:
- stateStack.push(Integer.valueOf(STATE_DESCRIPTION_SITE));
- processInfo(attributes);
- break;
- case FEATURE:
- stateStack.push(Integer.valueOf(STATE_FEATURE));
- processFeature(attributes);
- break;
- case ARCHIVE:
- stateStack.push(Integer.valueOf(STATE_ARCHIVE));
- processArchive(attributes);
- break;
- case CATEGORY_DEF:
- stateStack.push(Integer.valueOf(STATE_CATEGORY_DEF));
- processCategoryDef(attributes);
- break;
- case CATEGORY:
- stateStack.push(Integer.valueOf(STATE_CATEGORY));
- processCategory(attributes);
- break;
- default:
- internalErrorUnknownTag(NLS.bind(Messages.DefaultSiteParser_UnknownElement, (new String[] {elementName, getState(currentState)})));
- break;
+ case DESCRIPTION:
+ stateStack.push(Integer.valueOf(STATE_DESCRIPTION_SITE));
+ processInfo(attributes);
+ break;
+ case FEATURE:
+ stateStack.push(Integer.valueOf(STATE_FEATURE));
+ processFeature(attributes);
+ break;
+ case ARCHIVE:
+ stateStack.push(Integer.valueOf(STATE_ARCHIVE));
+ processArchive(attributes);
+ break;
+ case CATEGORY_DEF:
+ stateStack.push(Integer.valueOf(STATE_CATEGORY_DEF));
+ processCategoryDef(attributes);
+ break;
+ case CATEGORY:
+ stateStack.push(Integer.valueOf(STATE_CATEGORY));
+ processCategory(attributes);
+ break;
+ default:
+ internalErrorUnknownTag(NLS.bind(Messages.DefaultSiteParser_UnknownElement,
+ (new String[] { elementName, getState(currentState) })));
+ break;
}
}
private void handleBundleState(String elementName, Attributes attributes) {
switch (elementName) {
- case DESCRIPTION:
- stateStack.push(Integer.valueOf(STATE_DESCRIPTION_SITE));
- processInfo(attributes);
- break;
- case ARCHIVE:
- stateStack.push(Integer.valueOf(STATE_ARCHIVE));
- processArchive(attributes);
- break;
- case CATEGORY_DEF:
- stateStack.push(Integer.valueOf(STATE_CATEGORY_DEF));
- processCategoryDef(attributes);
- break;
- case CATEGORY:
- stateStack.push(Integer.valueOf(STATE_CATEGORY));
- processCategory(attributes);
- break;
- default:
- internalErrorUnknownTag(NLS.bind(Messages.DefaultSiteParser_UnknownElement, (new String[] {elementName, getState(currentState)})));
- break;
+ case DESCRIPTION:
+ stateStack.push(Integer.valueOf(STATE_DESCRIPTION_SITE));
+ processInfo(attributes);
+ break;
+ case ARCHIVE:
+ stateStack.push(Integer.valueOf(STATE_ARCHIVE));
+ processArchive(attributes);
+ break;
+ case CATEGORY_DEF:
+ stateStack.push(Integer.valueOf(STATE_CATEGORY_DEF));
+ processCategoryDef(attributes);
+ break;
+ case CATEGORY:
+ stateStack.push(Integer.valueOf(STATE_CATEGORY));
+ processCategory(attributes);
+ break;
+ default:
+ internalErrorUnknownTag(NLS.bind(Messages.DefaultSiteParser_UnknownElement,
+ (new String[] { elementName, getState(currentState) })));
+ break;
}
}
@@ -496,7 +505,8 @@ public class DefaultSiteParser extends DefaultHandler {
stateStack.push(Integer.valueOf(STATE_SITE));
processSite(attributes);
} else {
- internalErrorUnknownTag(NLS.bind(Messages.DefaultSiteParser_UnknownElement, (new String[] {elementName, getState(currentState)})));
+ internalErrorUnknownTag(NLS.bind(Messages.DefaultSiteParser_UnknownElement,
+ (new String[] { elementName, getState(currentState) })));
// what we received was not a site.xml, no need to continue
throw new SAXException(Messages.DefaultSiteParser_InvalidXMLStream);
}
@@ -505,29 +515,30 @@ public class DefaultSiteParser extends DefaultHandler {
private void handleSiteState(String elementName, Attributes attributes) {
switch (elementName) {
- case DESCRIPTION:
- stateStack.push(Integer.valueOf(STATE_DESCRIPTION_SITE));
- processInfo(attributes);
- break;
- case FEATURE:
- stateStack.push(Integer.valueOf(STATE_FEATURE));
- processFeature(attributes);
- break;
- case BUNDLE:
- stateStack.push(Integer.valueOf(STATE_BUNDLE));
- processBundle(attributes);
- break;
- case ARCHIVE:
- stateStack.push(Integer.valueOf(STATE_ARCHIVE));
- processArchive(attributes);
- break;
- case CATEGORY_DEF:
- stateStack.push(Integer.valueOf(STATE_CATEGORY_DEF));
- processCategoryDef(attributes);
- break;
- default:
- internalErrorUnknownTag(NLS.bind(Messages.DefaultSiteParser_UnknownElement, (new String[] {elementName, getState(currentState)})));
- break;
+ case DESCRIPTION:
+ stateStack.push(Integer.valueOf(STATE_DESCRIPTION_SITE));
+ processInfo(attributes);
+ break;
+ case FEATURE:
+ stateStack.push(Integer.valueOf(STATE_FEATURE));
+ processFeature(attributes);
+ break;
+ case BUNDLE:
+ stateStack.push(Integer.valueOf(STATE_BUNDLE));
+ processBundle(attributes);
+ break;
+ case ARCHIVE:
+ stateStack.push(Integer.valueOf(STATE_ARCHIVE));
+ processArchive(attributes);
+ break;
+ case CATEGORY_DEF:
+ stateStack.push(Integer.valueOf(STATE_CATEGORY_DEF));
+ processCategoryDef(attributes);
+ break;
+ default:
+ internalErrorUnknownTag(NLS.bind(Messages.DefaultSiteParser_UnknownElement,
+ (new String[] { elementName, getState(currentState) })));
+ break;
}
}
@@ -566,14 +577,15 @@ public class DefaultSiteParser extends DefaultHandler {
String msg;
if (name.equals("")) //$NON-NLS-1$
name = siteLocation.toString();
- String[] values = new String[] {name, Integer.toString(ex.getLineNumber()), Integer.toString(ex.getColumnNumber()), ex.getMessage()};
+ String[] values = new String[] { name, Integer.toString(ex.getLineNumber()),
+ Integer.toString(ex.getColumnNumber()), ex.getMessage() };
msg = NLS.bind(Messages.DefaultSiteParser_ErrorlineColumnMessage, values);
error(new Status(IStatus.ERROR, PLUGIN_ID, msg, ex));
}
/**
- * Parses the specified input steam and constructs a site model.
- * The input stream is not closed as part of this operation.
+ * Parses the specified input steam and constructs a site model. The input
+ * stream is not closed as part of this operation.
*
* @param in input stream
* @return site model
@@ -597,24 +609,26 @@ public class DefaultSiteParser extends DefaultHandler {
while (iter.hasNext()) {
stack = stack + iter.next().toString() + "\r\n"; //$NON-NLS-1$
}
- throw new SAXException(NLS.bind(Messages.DefaultSiteParser_WrongParsingStack, (new String[] {stack})));
+ throw new SAXException(NLS.bind(Messages.DefaultSiteParser_WrongParsingStack, (new String[] { stack })));
}
- /*
+ /*
* process archive info
*/
private void processArchive(Attributes attributes) {
URLEntry archive = new URLEntry();
String id = attributes.getValue("path"); //$NON-NLS-1$
if (id == null || id.trim().equals("")) { //$NON-NLS-1$
- internalError(NLS.bind(Messages.DefaultSiteParser_Missing, (new String[] {"path", getState(currentState)}))); //$NON-NLS-1$
+ internalError(
+ NLS.bind(Messages.DefaultSiteParser_Missing, (new String[] { "path", getState(currentState) }))); //$NON-NLS-1$
}
archive.setAnnotation(id);
String url = attributes.getValue("url"); //$NON-NLS-1$
if (url == null || url.trim().equals("")) { //$NON-NLS-1$
- internalError(NLS.bind(Messages.DefaultSiteParser_Missing, (new String[] {"archive", getState(currentState)}))); //$NON-NLS-1$
+ internalError(
+ NLS.bind(Messages.DefaultSiteParser_Missing, (new String[] { "archive", getState(currentState) }))); //$NON-NLS-1$
} else {
archive.setURL(url);
@@ -626,8 +640,8 @@ public class DefaultSiteParser extends DefaultHandler {
}
- /*
- * process the Category info
+ /*
+ * process the Category info
*/
private void processCategory(Attributes attributes) {
String category = attributes.getValue("name"); //$NON-NLS-1$
@@ -644,7 +658,7 @@ public class DefaultSiteParser extends DefaultHandler {
debug("End processing Category: name:" + category); //$NON-NLS-1$
}
- /*
+ /*
* process category def info
*/
private void processCategoryDef(Attributes attributes) {
@@ -663,7 +677,7 @@ public class DefaultSiteParser extends DefaultHandler {
debug("End processing CategoryDef: name:" + name + " label:" + label); //$NON-NLS-1$ //$NON-NLS-2$
}
- /*
+ /*
* process feature info
*/
private void processFeature(Attributes attributes) {
@@ -682,10 +696,11 @@ public class DefaultSiteParser extends DefaultHandler {
// We need to have id and version, or the url, or both.
if (noURL) {
if (noId || noVersion)
- internalError(NLS.bind(Messages.DefaultSiteParser_Missing, (new String[] {"url", getState(currentState)}))); //$NON-NLS-1$
+ internalError(
+ NLS.bind(Messages.DefaultSiteParser_Missing, (new String[] { "url", getState(currentState) }))); //$NON-NLS-1$
else
// default url
- urlInfo = FEATURES + id + '_' + ver; //
+ urlInfo = FEATURES + id + '_' + ver; //
}
feature.setURLString(urlInfo);
@@ -695,7 +710,7 @@ public class DefaultSiteParser extends DefaultHandler {
// if one is null, and not the other
if (noId ^ noVersion) {
- String[] values = new String[] {id, ver, getState(currentState)};
+ String[] values = new String[] { id, ver, getState(currentState) };
log(NLS.bind(Messages.DefaultFeatureParser_IdOrVersionInvalid, values));
} else {
feature.setFeatureIdentifier(id);
@@ -727,7 +742,7 @@ public class DefaultSiteParser extends DefaultHandler {
String arch = attributes.getValue("arch"); //$NON-NLS-1$
feature.setArch(arch);
- //patch
+ // patch
String patch = attributes.getValue("patch"); //$NON-NLS-1$
feature.setPatch(patch);
@@ -742,7 +757,7 @@ public class DefaultSiteParser extends DefaultHandler {
}
- /*
+ /*
* process feature info
*/
private void processBundle(Attributes attributes) {
@@ -761,10 +776,11 @@ public class DefaultSiteParser extends DefaultHandler {
// We need to have id and version, or the url, or both.
if (noURL) {
if (noId || noVersion)
- internalError(NLS.bind(Messages.DefaultSiteParser_Missing, (new String[] {"url", getState(currentState)}))); //$NON-NLS-1$
+ internalError(
+ NLS.bind(Messages.DefaultSiteParser_Missing, (new String[] { "url", getState(currentState) }))); //$NON-NLS-1$
else
// default url
- urlInfo = PLUGINS + id + '_' + ver; //
+ urlInfo = PLUGINS + id + '_' + ver; //
}
bundle.setURLString(urlInfo);
@@ -774,7 +790,7 @@ public class DefaultSiteParser extends DefaultHandler {
// if one is null, and not the other
if (noId ^ noVersion) {
- String[] values = new String[] {id, ver, getState(currentState)};
+ String[] values = new String[] { id, ver, getState(currentState) };
log(NLS.bind(Messages.DefaultFeatureParser_IdOrVersionInvalid, values));
} else {
bundle.setBundleIdentifier(id);
@@ -806,7 +822,7 @@ public class DefaultSiteParser extends DefaultHandler {
String arch = attributes.getValue("arch"); //$NON-NLS-1$
bundle.setArch(arch);
- //patch
+ // patch
String patch = attributes.getValue("patch"); //$NON-NLS-1$
bundle.setPatch(patch);
@@ -821,7 +837,7 @@ public class DefaultSiteParser extends DefaultHandler {
}
- /*
+ /*
* process URL info with element text
*/
private void processInfo(Attributes attributes) {
@@ -835,9 +851,10 @@ public class DefaultSiteParser extends DefaultHandler {
objectStack.push(inf);
}
- /*
+ /*
* process site info
*/
+ @SuppressWarnings("removal")
private void processSite(Attributes attributes) {
// create site map
SiteModel site = new SiteModel();
@@ -853,7 +870,7 @@ public class DefaultSiteParser extends DefaultHandler {
}
// provide default description URL
- // If <description> is specified, for the site, it takes precedence
+ // If <description> is specified, for the site, it takes precedence
URLEntry description = new URLEntry();
description.setURL(DEFAULT_INFO_URL);
site.setDescription(description);
@@ -867,13 +884,13 @@ public class DefaultSiteParser extends DefaultHandler {
// get mirrors, if any
String mirrorsURL = attributes.getValue("mirrorsURL"); //$NON-NLS-1$
if (mirrorsURL != null && mirrorsURL.trim().length() > 0) {
- // URLEntry[] mirrors = getMirrors(mirrorsURL);
- // if (mirrors != null)
- // site.setMirrors(mirrors);
- // else
+ // URLEntry[] mirrors = getMirrors(mirrorsURL);
+ // if (mirrors != null)
+ // site.setMirrors(mirrors);
+ // else
- //Since we are parsing the site at p2 generation time and the
- //mirrors may change, there is no point doing the mirror expansion now
+ // Since we are parsing the site at p2 generation time and the
+ // mirrors may change, there is no point doing the mirror expansion now
site.setMirrorsURIString(mirrorsURL);
}
@@ -887,20 +904,24 @@ public class DefaultSiteParser extends DefaultHandler {
site.setDigestURIString(digestURL);
// TODO: Digest locales
- // if ((attributes.getValue("availableLocales") != null) && (!attributes.getValue("availableLocales").trim().equals(""))) { //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
- // StringTokenizer locals = new StringTokenizer(attributes.getValue("availableLocales"), ","); //$NON-NLS-1$//$NON-NLS-2$
- // String[] availableLocals = new String[locals.countTokens()];
- // int i = 0;
- // while (locals.hasMoreTokens()) {
- // availableLocals[i++] = locals.nextToken();
- // }
- // extendedSite.setAvailableLocals(availableLocals);
- // }
- // }
+ // if ((attributes.getValue("availableLocales") != null) &&
+ // (!attributes.getValue("availableLocales").trim().equals(""))) {
+ // //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
+ // StringTokenizer locals = new
+ // StringTokenizer(attributes.getValue("availableLocales"), ",");
+ // //$NON-NLS-1$//$NON-NLS-2$
+ // String[] availableLocals = new String[locals.countTokens()];
+ // int i = 0;
+ // while (locals.hasMoreTokens()) {
+ // availableLocals[i++] = locals.nextToken();
+ // }
+ // extendedSite.setAvailableLocals(availableLocals);
+ // }
+ // }
//
final String associateURL = attributes.getValue(ASSOCIATE_SITES_URL);
if (associateURL != null) {
- //resolve the URI relative to the site location
+ // resolve the URI relative to the site location
URI resolvedLocation = siteLocation.resolve(associateURL);
site.setAssociateSites(getAssociateSites(resolvedLocation.toString()));
}
@@ -914,6 +935,7 @@ public class DefaultSiteParser extends DefaultHandler {
/**
* Handle start of element tags
+ *
* @see DefaultHandler#startElement(String, String, String, Attributes)
* @since 2.0
*/
@@ -926,48 +948,50 @@ public class DefaultSiteParser extends DefaultHandler {
}
switch (currentState) {
- case STATE_IGNORED_ELEMENT :
- internalErrorUnknownTag(NLS.bind(Messages.DefaultSiteParser_UnknownElement, (new String[] {localName, getState(currentState)})));
- break;
- case STATE_INITIAL :
- handleInitialState(localName, attributes);
- break;
-
- case STATE_SITE :
- handleSiteState(localName, attributes);
- break;
-
- case STATE_FEATURE :
- handleFeatureState(localName, attributes);
- break;
-
- case STATE_BUNDLE :
- handleBundleState(localName, attributes);
- break;
-
- case STATE_ARCHIVE :
- handleSiteState(localName, attributes);
- break;
-
- case STATE_CATEGORY :
- handleCategoryState(localName, attributes);
- break;
-
- case STATE_CATEGORY_DEF :
- handleCategoryDefState(localName, attributes);
- break;
-
- case STATE_DESCRIPTION_SITE :
- handleSiteState(localName, attributes);
- break;
-
- case STATE_DESCRIPTION_CATEGORY_DEF :
- handleSiteState(localName, attributes);
- break;
-
- default :
- internalErrorUnknownTag(NLS.bind(Messages.DefaultSiteParser_UnknownStartState, (new String[] {getState(currentState)})));
- break;
+ case STATE_IGNORED_ELEMENT:
+ internalErrorUnknownTag(NLS.bind(Messages.DefaultSiteParser_UnknownElement,
+ (new String[] { localName, getState(currentState) })));
+ break;
+ case STATE_INITIAL:
+ handleInitialState(localName, attributes);
+ break;
+
+ case STATE_SITE:
+ handleSiteState(localName, attributes);
+ break;
+
+ case STATE_FEATURE:
+ handleFeatureState(localName, attributes);
+ break;
+
+ case STATE_BUNDLE:
+ handleBundleState(localName, attributes);
+ break;
+
+ case STATE_ARCHIVE:
+ handleSiteState(localName, attributes);
+ break;
+
+ case STATE_CATEGORY:
+ handleCategoryState(localName, attributes);
+ break;
+
+ case STATE_CATEGORY_DEF:
+ handleCategoryDefState(localName, attributes);
+ break;
+
+ case STATE_DESCRIPTION_SITE:
+ handleSiteState(localName, attributes);
+ break;
+
+ case STATE_DESCRIPTION_CATEGORY_DEF:
+ handleSiteState(localName, attributes);
+ break;
+
+ default:
+ internalErrorUnknownTag(
+ NLS.bind(Messages.DefaultSiteParser_UnknownStartState, (new String[] { getState(currentState) })));
+ break;
}
int newState = stateStack.peek().intValue();
if (newState != STATE_IGNORED_ELEMENT)
diff --git a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteBundle.java b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteBundle.java
index 944754e37..e783dd074 100644
--- a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteBundle.java
+++ b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteBundle.java
@@ -438,7 +438,7 @@ public class SiteBundle {
*/
@Override
public String toString() {
- StringBuffer buffer = new StringBuffer();
+ StringBuilder buffer = new StringBuilder();
buffer.append(getClass().toString() + " :"); //$NON-NLS-1$
buffer.append(" at "); //$NON-NLS-1$
if (url != null)
diff --git a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteModel.java b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteModel.java
index 03eb0405d..5e2b6f56f 100644
--- a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteModel.java
+++ b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteModel.java
@@ -62,8 +62,8 @@ public class SiteModel {
}
/**
- * Adds an archive reference model to site.
- * Throws a runtime exception if this object is marked read-only.
+ * Adds an archive reference model to site. Throws a runtime exception if this
+ * object is marked read-only.
*
* @param archiveReference archive reference model
* @since 2.0
@@ -157,11 +157,11 @@ public class SiteModel {
}
/**
- * Returns an array of plug-in and non-plug-in archive reference models
- * on this site
+ * Returns an array of plug-in and non-plug-in archive reference models on this
+ * site
*
* @return an array of archive reference models, or an empty array if there are
- * no archives known to this site.
+ * no archives known to this site.
* @since 2.0
*/
public URLEntry[] getArchives() {
@@ -189,6 +189,7 @@ public class SiteModel {
/**
* Returns the category with the given name.
+ *
* @return the category with the given name, or <code>null</code>
*/
public SiteCategory getCategory(String name) {
@@ -280,8 +281,8 @@ public class SiteModel {
}
/**
- * Gets the localizations for the site as a map from locale
- * to the set of translated properties for that locale.
+ * Gets the localizations for the site as a map from locale to the set of
+ * translated properties for that locale.
*
* @return a map from locale to property set
* @since 3.4
@@ -300,7 +301,7 @@ public class SiteModel {
try {
locationURI = new URI(locationURIString);
} catch (URISyntaxException e) {
- //ignore and return null
+ // ignore and return null
}
}
return locationURI;
@@ -333,7 +334,7 @@ public class SiteModel {
return mirrorsURIString;
}
- /**
+ /**
* Returns the site type.
*
* @return site type, or <code>null</code>.
@@ -343,6 +344,11 @@ public class SiteModel {
return type;
}
+ /**
+ * @noreference This method is not intended to be referenced by clients.
+ * @deprecated See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=572043">bug</a> for details.
+ */
+ @Deprecated(forRemoval = true, since = "1.2.0")
public boolean isPack200Supported() {
return supportsPack200;
}
@@ -358,8 +364,8 @@ public class SiteModel {
}
/**
- * Sets the localizations for the site as a map from locale
- * to the set of translated properties for that locale.
+ * Sets the localizations for the site as a map from locale to the set of
+ * translated properties for that locale.
*
* @param localizations as a map from locale to property set
* @since 3.4
@@ -395,9 +401,9 @@ public class SiteModel {
}
/**
- * Sets the mirrors url. Mirror sites will then be obtained from this mirror url later.
- * This method is complementary to setMirrorsiteEntryModels(), and only one of these
- * methods should be called.
+ * Sets the mirrors url. Mirror sites will then be obtained from this mirror url
+ * later. This method is complementary to setMirrorsiteEntryModels(), and only
+ * one of these methods should be called.
*
* @param mirrorsURI additional update site mirrors
* @since 3.1
@@ -406,13 +412,14 @@ public class SiteModel {
this.mirrorsURIString = mirrorsURI;
}
+ @Deprecated(forRemoval = true, since = "1.2.0")
public void setSupportsPack200(boolean value) {
this.supportsPack200 = value;
}
/**
- * Sets the site type.
- * Throws a runtime exception if this object is marked read-only.
+ * Sets the site type. Throws a runtime exception if this object is marked
+ * read-only.
*
* @param type site type
* @since 2.0
@@ -439,7 +446,7 @@ public class SiteModel {
}
/**
- * Sets the URI of the stats repository used to track downloads.
+ * Sets the URI of the stats repository used to track downloads.
*
* @param statsURI a String describing the stats URI
*/
diff --git a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteXMLAction.java b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteXMLAction.java
index 41829a01a..0f36feaba 100644
--- a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteXMLAction.java
+++ b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/SiteXMLAction.java
@@ -580,7 +580,7 @@ public class SiteXMLAction extends AbstractPublisherAction {
categories.add(this.defaultCategory);
// sort category so they are processed in reverse order of dependency
// (Nested categories go first)
- Comparator<SiteCategory> isNestedCategoryComparator = new Comparator<SiteCategory>() {
+ Comparator<SiteCategory> isNestedCategoryComparator = new Comparator<>() {
@Override
public int compare(SiteCategory category1, SiteCategory category2) {
Set<SiteCategory> childrenOfCategory1 = categoryToNestedCategories.get(category1);
diff --git a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/artifact/UpdateSiteArtifactRepositoryFactory.java b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/artifact/UpdateSiteArtifactRepositoryFactory.java
index 9e5eacb11..b364ab14f 100644
--- a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/artifact/UpdateSiteArtifactRepositoryFactory.java
+++ b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/artifact/UpdateSiteArtifactRepositoryFactory.java
@@ -114,6 +114,7 @@ public class UpdateSiteArtifactRepositoryFactory extends ArtifactRepositoryFacto
generateArtifactDescriptors(updateSite, repository, monitor);
}
+ @SuppressWarnings("removal")
private void generateArtifactDescriptors(UpdateSite updateSite, IArtifactRepository repository,
IProgressMonitor monitor) throws ProvisionException {
final String PACK_EXT = ".pack.gz"; //$NON-NLS-1$
@@ -123,7 +124,7 @@ public class UpdateSiteArtifactRepositoryFactory extends ArtifactRepositoryFacto
Feature[] features = updateSite.loadFeatures(monitor);
for (Feature feature : features) {
IArtifactKey featureKey = FeaturesAction.createFeatureArtifactKey(feature.getId(),
- feature.getVersion());
+ feature.getVersion());
SimpleArtifactDescriptor featureArtifactDescriptor = new SimpleArtifactDescriptor(featureKey);
URI featureURL = updateSite.getFeatureURI(feature.getId(), feature.getVersion());
featureArtifactDescriptor.setRepositoryProperty(PROP_ARTIFACT_REFERENCE, featureURL.toString());
@@ -133,12 +134,12 @@ public class UpdateSiteArtifactRepositoryFactory extends ArtifactRepositoryFacto
featureArtifactDescriptor = new SimpleArtifactDescriptor(featureKey);
featureURL = updateSite.getFeatureURI(feature.getId(), feature.getVersion());
featureArtifactDescriptor.setRepositoryProperty(PROP_ARTIFACT_REFERENCE,
- featureURL.toString() + PACK_EXT);
+ featureURL.toString() + PACK_EXT);
IProcessingStepDescriptor[] steps = new IProcessingStepDescriptor[] { new ProcessingStepDescriptor(
- "org.eclipse.equinox.p2.processing.Pack200Unpacker", null, true) }; //$NON-NLS-1$
+ "org.eclipse.equinox.p2.processing.Pack200Unpacker", null, true) }; //$NON-NLS-1$
featureArtifactDescriptor.setProcessingSteps(steps);
featureArtifactDescriptor.setProperty(IArtifactDescriptor.FORMAT,
- IArtifactDescriptor.FORMAT_PACKED);
+ IArtifactDescriptor.FORMAT_PACKED);
allSiteArtifacts.add(featureArtifactDescriptor);
}
FeatureEntry[] featureEntries = feature.getEntries();
@@ -156,13 +157,13 @@ public class UpdateSiteArtifactRepositoryFactory extends ArtifactRepositoryFacto
artifactDescriptor = new SimpleArtifactDescriptor(key);
pluginURL = updateSite.getPluginURI(entry);
artifactDescriptor.setRepositoryProperty(PROP_ARTIFACT_REFERENCE,
- pluginURL.toString() + PACK_EXT);
+ pluginURL.toString() + PACK_EXT);
IProcessingStepDescriptor[] steps = new IProcessingStepDescriptor[] {
- new ProcessingStepDescriptor("org.eclipse.equinox.p2.processing.Pack200Unpacker", //$NON-NLS-1$
- null, true) };
+ new ProcessingStepDescriptor("org.eclipse.equinox.p2.processing.Pack200Unpacker", //$NON-NLS-1$
+ null, true) };
artifactDescriptor.setProcessingSteps(steps);
artifactDescriptor.setProperty(IArtifactDescriptor.FORMAT,
- IArtifactDescriptor.FORMAT_PACKED);
+ IArtifactDescriptor.FORMAT_PACKED);
allSiteArtifacts.add(artifactDescriptor);
}
}
@@ -173,7 +174,7 @@ public class UpdateSiteArtifactRepositoryFactory extends ArtifactRepositoryFacto
BundleDescription[] bundles = updateSite.loadBundles(monitor);
for (BundleDescription bundle : bundles) {
IArtifactKey bundleKey = BundlesAction.createBundleArtifactKey(bundle.getSymbolicName(),
- bundle.getVersion().toString());
+ bundle.getVersion().toString());
SimpleArtifactDescriptor bundleArtifactDescriptor = new SimpleArtifactDescriptor(bundleKey);
URI bundleURI = updateSite.getBundleURI(bundle.getSymbolicName(), bundle.getVersion().toString());
bundleArtifactDescriptor.setRepositoryProperty(PROP_ARTIFACT_REFERENCE, bundleURI.toString());
@@ -184,9 +185,9 @@ public class UpdateSiteArtifactRepositoryFactory extends ArtifactRepositoryFacto
bundleArtifactDescriptor = new SimpleArtifactDescriptor(bundleKey);
bundleURI = updateSite.getBundleURI(bundle.getSymbolicName(), bundle.getVersion().toString());
bundleArtifactDescriptor.setRepositoryProperty(PROP_ARTIFACT_REFERENCE,
- bundleURI.toString() + PACK_EXT);
+ bundleURI.toString() + PACK_EXT);
IProcessingStepDescriptor[] steps = new IProcessingStepDescriptor[] { new ProcessingStepDescriptor(
- "org.eclipse.equinox.p2.processing.Pack200Unpacker", null, true) }; //$NON-NLS-1$
+ "org.eclipse.equinox.p2.processing.Pack200Unpacker", null, true) }; //$NON-NLS-1$
bundleArtifactDescriptor.setProcessingSteps(steps);
bundleArtifactDescriptor.setProperty(IArtifactDescriptor.FORMAT, IArtifactDescriptor.FORMAT_PACKED);
allSiteArtifacts.add(bundleArtifactDescriptor);
diff --git a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/metadata/UpdateSiteMetadataRepositoryFactory.java b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/metadata/UpdateSiteMetadataRepositoryFactory.java
index 815d8baa6..97f805994 100644
--- a/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/metadata/UpdateSiteMetadataRepositoryFactory.java
+++ b/bundles/org.eclipse.equinox.p2.updatesite/src/org/eclipse/equinox/internal/p2/updatesite/metadata/UpdateSiteMetadataRepositoryFactory.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2017 IBM Corporation and others.
+ * Copyright (c) 2008, 2020 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -13,6 +13,7 @@
* Ray Braithwood (ray@genuitec.com) - fix for bug 220605
* Code 9 - ongoing development
* Sonatype, Inc. - transport split
+ * Christoph Läubrich - Bug 481443 - CLassCastException While Downloading Repository that loads fine in RCP target
*******************************************************************************/
package org.eclipse.equinox.internal.p2.updatesite.metadata;
@@ -60,7 +61,11 @@ public class UpdateSiteMetadataRepositoryFactory extends MetadataRepositoryFacto
try {
initializeRepository(repository, location, monitor);
} catch (Exception e) {
- resetCache(repository);
+ try {
+ resetCache(repository);
+ } catch (RuntimeException rte) {
+ e.addSuppressed(rte);
+ }
if (e instanceof ProvisionException)
throw (ProvisionException) e;
if (e instanceof OperationCanceledException)
diff --git a/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/.classpath b/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/.classpath
+++ b/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/.settings/org.eclipse.jdt.core.prefs
index c75992293..0e7287cf7 100644
--- a/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/.settings/org.eclipse.jdt.core.prefs
@@ -9,9 +9,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nul
org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -27,6 +27,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -84,6 +85,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -120,7 +122,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -134,7 +137,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -255,7 +257,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -326,7 +327,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -471,7 +471,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=false
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/META-INF/MANIFEST.MF
index 1654bd444..ce94697f1 100644
--- a/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: %bundleName
Bundle-SymbolicName: org.eclipse.equinox.simpleconfigurator.manipulator;singleton:=true
-Bundle-Version: 2.1.500.qualifier
+Bundle-Version: 2.2.0.qualifier
Bundle-Localization: plugin
Bundle-ActivationPolicy: lazy
Import-Package: org.eclipse.equinox.frameworkadmin;version="[2.0.0,3.0.0)",
@@ -16,7 +16,7 @@ Import-Package: org.eclipse.equinox.frameworkadmin;version="[2.0.0,3.0.0)",
Bundle-Vendor: %providerName
Export-Package: org.eclipse.equinox.internal.simpleconfigurator.manipulator;x-friends:="org.eclipse.equinox.p2.touchpoint.eclipse",
org.eclipse.equinox.simpleconfigurator.manipulator;version="2.0.0"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Require-Bundle: org.eclipse.equinox.common;bundle-version="3.5.0"
Service-Component: OSGI-INF/configurator.xml
Automatic-Module-Name: org.eclipse.equinox.simpleconfigurator.manipulator
diff --git a/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/pom.xml b/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/pom.xml
index 5e8a9349a..43581bbeb 100644
--- a/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/pom.xml
+++ b/bundles/org.eclipse.equinox.simpleconfigurator.manipulator/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.simpleconfigurator.manipulator</artifactId>
- <version>2.1.500-SNAPSHOT</version>
+ <version>2.2.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>
diff --git a/bundles/org.eclipse.equinox.simpleconfigurator/.classpath b/bundles/org.eclipse.equinox.simpleconfigurator/.classpath
index eca7bdba8..e801ebfb4 100644
--- a/bundles/org.eclipse.equinox.simpleconfigurator/.classpath
+++ b/bundles/org.eclipse.equinox.simpleconfigurator/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/bundles/org.eclipse.equinox.simpleconfigurator/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.equinox.simpleconfigurator/.settings/org.eclipse.jdt.core.prefs
index c92cf7ace..f27603dba 100644
--- a/bundles/org.eclipse.equinox.simpleconfigurator/.settings/org.eclipse.jdt.core.prefs
+++ b/bundles/org.eclipse.equinox.simpleconfigurator/.settings/org.eclipse.jdt.core.prefs
@@ -10,9 +10,9 @@ org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.compliance=11
org.eclipse.jdt.core.compiler.debug.lineNumber=generate
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -28,6 +28,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
@@ -85,6 +86,7 @@ org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warn
org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
@@ -121,7 +123,8 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
@@ -135,7 +138,6 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_c
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
@@ -256,7 +258,6 @@ org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=do not insert
org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
@@ -327,7 +328,6 @@ org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
@@ -472,7 +472,6 @@ org.eclipse.jdt.core.formatter.use_on_off_tags=false
org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
diff --git a/bundles/org.eclipse.equinox.simpleconfigurator/META-INF/MANIFEST.MF b/bundles/org.eclipse.equinox.simpleconfigurator/META-INF/MANIFEST.MF
index 43f4fd479..de39e26b8 100644
--- a/bundles/org.eclipse.equinox.simpleconfigurator/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.equinox.simpleconfigurator/META-INF/MANIFEST.MF
@@ -1,7 +1,7 @@
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: org.eclipse.equinox.simpleconfigurator;singleton:=true
-Bundle-Version: 1.3.600.qualifier
+Bundle-Version: 1.4.0.qualifier
Bundle-Name: %bundleName
Bundle-Vendor: %providerName
Bundle-Localization: plugin
@@ -26,5 +26,5 @@ Export-Package: org.eclipse.equinox.internal.provisional.configurator;
org.eclipse.equinox.internal.simpleconfigurator;x-friends:="org.eclipse.equinox.simpleconfigurator.manipulator",
org.eclipse.equinox.internal.simpleconfigurator.console;x-internal:=true,
org.eclipse.equinox.internal.simpleconfigurator.utils;x-friends:="org.eclipse.equinox.simpleconfigurator.manipulator"
-Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-RequiredExecutionEnvironment: JavaSE-11
Automatic-Module-Name: org.eclipse.equinox.simpleconfigurator
diff --git a/bundles/org.eclipse.equinox.simpleconfigurator/pom.xml b/bundles/org.eclipse.equinox.simpleconfigurator/pom.xml
index eaca76624..5a9a88217 100644
--- a/bundles/org.eclipse.equinox.simpleconfigurator/pom.xml
+++ b/bundles/org.eclipse.equinox.simpleconfigurator/pom.xml
@@ -4,11 +4,11 @@
<parent>
<groupId>org.eclipse.equinox.p2</groupId>
<artifactId>rt.equinox.p2</artifactId>
- <version>4.18.0-SNAPSHOT</version>
+ <version>4.24.0-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<groupId>org.eclipse.equinox</groupId>
<artifactId>org.eclipse.equinox.simpleconfigurator</artifactId>
- <version>1.3.600-SNAPSHOT</version>
+ <version>1.4.0-SNAPSHOT</version>
<packaging>eclipse-plugin</packaging>
</project>

Back to the top