diff --git a/.mvn/maven-build-cache-config.xml b/.mvn/maven-build-cache-config.xml new file mode 100644 index 0000000000..63450837ce --- /dev/null +++ b/.mvn/maven-build-cache-config.xml @@ -0,0 +1,60 @@ + + + + true + XX + + 10 + + + + classes + generated-sources + generated-resources + generated-test-sources + maven-archiver + sonatype-clm + test-classes + maven-status + webpack-modules + + + + + + + + {*.lock} + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c..0000000000 Binary files a/.mvn/wrapper/maven-wrapper.jar and /dev/null differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index ffdc10e59f..fe378a151d 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1,2 +1,18 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.1/apache-maven-3.8.1-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.1 +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip diff --git a/buildsupport/commons/pom.xml b/buildsupport/commons/pom.xml index 5b6b1f0520..d1ac909ead 100644 --- a/buildsupport/commons/pom.xml +++ b/buildsupport/commons/pom.xml @@ -33,7 +33,7 @@ commons-io commons-io - 2.13.0 + 2.15.1 @@ -54,6 +54,12 @@ 3.13.0 + + org.apache.commons + commons-text + 1.11.0 + + org.apache.commons commons-csv @@ -105,7 +111,7 @@ org.apache.commons commons-compress - 1.24.0 + 1.26.1 diff --git a/components/nexus-base/src/main/java/org/sonatype/nexus/node/datastore/NodeHeartbeat.java b/components/nexus-base/src/main/java/org/sonatype/nexus/node/datastore/NodeHeartbeat.java deleted file mode 100644 index 59f18a06dc..0000000000 --- a/components/nexus-base/src/main/java/org/sonatype/nexus/node/datastore/NodeHeartbeat.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -package org.sonatype.nexus.node.datastore; - -import java.time.OffsetDateTime; -import java.util.Map; - -import org.sonatype.nexus.common.entity.ContinuationAware; - -/** - * Heartbeat of a node pinging the database indicating its presence. - * - * @since 3.37 - */ -public interface NodeHeartbeat - extends ContinuationAware -{ - /** - * The time of the last heartbeat - */ - OffsetDateTime heartbeatTime(); - - /** - * Host name derived for the local system - */ - String hostname(); - - /** - * The database record ID - */ - Integer id(); - - Map nodeInfo(); - - Map systemInfo(); - - /** - * The Heartbeat ID of the node, this is a non-persistent value that is distinct from the NodeAccess ID. Only useful to - * determine whether the heartbeat was created while an instance is running. - */ - String heartbeatId(); - - void setHeartbeatTime(final OffsetDateTime heartbeatTime); - - void setHostname(final String hostname); - - void setId(final Integer id); - - void setHeartbeatId(final String heartbeatId); - - void setNodeInfo(final Map nodeInfo); - - void setSystemInfo(final Map systemInfo); -} diff --git a/components/nexus-base/src/main/java/org/sonatype/nexus/node/datastore/NodeHeartbeatManager.java b/components/nexus-base/src/main/java/org/sonatype/nexus/node/datastore/NodeHeartbeatManager.java index 71fc1d0c55..88866a2a85 100644 --- a/components/nexus-base/src/main/java/org/sonatype/nexus/node/datastore/NodeHeartbeatManager.java +++ b/components/nexus-base/src/main/java/org/sonatype/nexus/node/datastore/NodeHeartbeatManager.java @@ -12,7 +12,6 @@ */ package org.sonatype.nexus.node.datastore; -import java.util.Collection; import java.util.Map; import java.util.stream.Stream; @@ -48,18 +47,8 @@ public interface NodeHeartbeatManager */ boolean isCurrentNodeClustered(); - /** - * Triggers a write of the latest heartbeat information - */ - void writeHeartbeat(); - /** * Collects and transforms system info from heartbeat table */ Map> getSystemInformationForNodes(); - - /** - * Collects nodeInfo from the heartbeat table - */ - Collection getActiveNodeHeartbeatData(); } diff --git a/components/nexus-blobstore-file/src/main/java/org/sonatype/nexus/blobstore/file/internal/FileBlobStoreDescriptor.java b/components/nexus-blobstore-file/src/main/java/org/sonatype/nexus/blobstore/file/internal/FileBlobStoreDescriptor.java index 0fd9009756..a02ddd1306 100644 --- a/components/nexus-blobstore-file/src/main/java/org/sonatype/nexus/blobstore/file/internal/FileBlobStoreDescriptor.java +++ b/components/nexus-blobstore-file/src/main/java/org/sonatype/nexus/blobstore/file/internal/FileBlobStoreDescriptor.java @@ -31,7 +31,6 @@ import org.sonatype.nexus.blobstore.file.FileBlobStore; import org.sonatype.nexus.blobstore.quota.BlobStoreQuotaService; import org.sonatype.nexus.common.app.ApplicationDirectories; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.FormField; import org.sonatype.nexus.formfields.StringTextFormField; import org.sonatype.nexus.rest.ValidationErrorsException; @@ -49,7 +48,6 @@ * * @since 3.6 */ -@AvailabilityVersion(from = "1.0") @Named(FileBlobStore.TYPE) public class FileBlobStoreDescriptor extends BlobStoreDescriptorSupport diff --git a/components/nexus-blobstore-file/src/main/java/org/sonatype/nexus/blobstore/file/upgrades/SoftDeletedBlobsMigrationStep_1_19.java b/components/nexus-blobstore-file/src/main/java/org/sonatype/nexus/blobstore/file/upgrades/SoftDeletedBlobsMigrationStep_1_19.java index 77539fcd99..87b6c84152 100644 --- a/components/nexus-blobstore-file/src/main/java/org/sonatype/nexus/blobstore/file/upgrades/SoftDeletedBlobsMigrationStep_1_19.java +++ b/components/nexus-blobstore-file/src/main/java/org/sonatype/nexus/blobstore/file/upgrades/SoftDeletedBlobsMigrationStep_1_19.java @@ -38,7 +38,7 @@ public class SoftDeletedBlobsMigrationStep_1_19 private static final String H2 = "" + "SELECT * " + - "FROM INFORMATION_SCHEMA.CONSTRAINTS " + + "FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS " + "WHERE TABLE_NAME = 'SOFT_DELETED_BLOBS' AND CONSTRAINT_NAME = 'PK_SOFT_DELETED_BLOBS_BLOB_ID'"; private static final String PSQL = "" + diff --git a/components/nexus-blobstore/pom.xml b/components/nexus-blobstore/pom.xml index 00e1fe2ec9..e80628b6d2 100644 --- a/components/nexus-blobstore/pom.xml +++ b/components/nexus-blobstore/pom.xml @@ -37,6 +37,7 @@ org.sonatype.nexus nexus-blobstore-api + org.sonatype.nexus nexus-thread diff --git a/components/nexus-blobstore/src/main/java/org/sonatype/nexus/blobstore/BlobStoreDescriptor.java b/components/nexus-blobstore/src/main/java/org/sonatype/nexus/blobstore/BlobStoreDescriptor.java index 817c58df1d..04c8400c43 100644 --- a/components/nexus-blobstore/src/main/java/org/sonatype/nexus/blobstore/BlobStoreDescriptor.java +++ b/components/nexus-blobstore/src/main/java/org/sonatype/nexus/blobstore/BlobStoreDescriptor.java @@ -22,7 +22,6 @@ /** * Describes a blob store. - * Note: Do not inject Map and instead opt to use BlobStoreDescriptorProvider * * @since 3.6 */ diff --git a/components/nexus-blobstore/src/main/java/org/sonatype/nexus/blobstore/BlobStoreDescriptorProvider.java b/components/nexus-blobstore/src/main/java/org/sonatype/nexus/blobstore/BlobStoreDescriptorProvider.java deleted file mode 100644 index 17322ac871..0000000000 --- a/components/nexus-blobstore/src/main/java/org/sonatype/nexus/blobstore/BlobStoreDescriptorProvider.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -package org.sonatype.nexus.blobstore; - -import java.util.Map; -import java.util.Map.Entry; -import java.util.stream.Collectors; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.sonatype.nexus.common.db.DatabaseCheck; - -@Named -@Singleton -public class BlobStoreDescriptorProvider -{ - private final Map blobStoreDescriptors; - - private final DatabaseCheck databaseCheck; - - @Inject - public BlobStoreDescriptorProvider( - final DatabaseCheck databaseCheck, - final Map blobStoreDescriptors) - { - this.databaseCheck = databaseCheck; - this.blobStoreDescriptors = blobStoreDescriptors; - } - - public Map get() { - return blobStoreDescriptors.entrySet().stream() - .filter(item -> databaseCheck.isAllowedByVersion(item.getValue().getClass())) - .collect(Collectors.toMap(Entry::getKey, Entry::getValue)); - } -} diff --git a/components/nexus-blobstore/src/main/java/org/sonatype/nexus/blobstore/group/internal/BlobStoreGroupDescriptor.java b/components/nexus-blobstore/src/main/java/org/sonatype/nexus/blobstore/group/internal/BlobStoreGroupDescriptor.java index a89d3b9a0a..c77b4b9595 100644 --- a/components/nexus-blobstore/src/main/java/org/sonatype/nexus/blobstore/group/internal/BlobStoreGroupDescriptor.java +++ b/components/nexus-blobstore/src/main/java/org/sonatype/nexus/blobstore/group/internal/BlobStoreGroupDescriptor.java @@ -33,7 +33,6 @@ import org.sonatype.nexus.blobstore.group.BlobStoreGroupService; import org.sonatype.nexus.blobstore.group.FillPolicy; import org.sonatype.nexus.blobstore.quota.BlobStoreQuotaService; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.ComboboxFormField; import org.sonatype.nexus.formfields.FormField; import org.sonatype.nexus.formfields.ItemselectFormField; @@ -58,7 +57,6 @@ * * @since 3.14 */ -@AvailabilityVersion(from = "1.0") @Named(BlobStoreGroup.TYPE) public class BlobStoreGroupDescriptor extends BlobStoreDescriptorSupport diff --git a/components/nexus-bootstrap/src/main/java/org/sonatype/nexus/bootstrap/osgi/NexusEditionPropertiesConfigurer.java b/components/nexus-bootstrap/src/main/java/org/sonatype/nexus/bootstrap/osgi/NexusEditionPropertiesConfigurer.java index 682fc71a1e..2f060f1449 100644 --- a/components/nexus-bootstrap/src/main/java/org/sonatype/nexus/bootstrap/osgi/NexusEditionPropertiesConfigurer.java +++ b/components/nexus-bootstrap/src/main/java/org/sonatype/nexus/bootstrap/osgi/NexusEditionPropertiesConfigurer.java @@ -76,11 +76,6 @@ private void readEnvironmentVariables(final Properties properties) { properties.setProperty(FIREWALL_QUARANTINE_FIX_ENABLED, Boolean.toString(parseBoolean(System.getenv("FIREWALL_QUARANTINE_FIX_ENABLED")))); } - - if (properties.getProperty(ZERO_DOWNTIME_BASELINE_FAIL) == null) { - properties.setProperty(ZERO_DOWNTIME_BASELINE_FAIL, - Optional.ofNullable(System.getenv("NEXUS_ZDU_BASELINE_FAIL")).orElse("false")); - } } private void selectDatastoreFeature(final Properties properties) { diff --git a/components/nexus-capability/src/main/java/org/sonatype/nexus/capability/CapabilityDescriptor.java b/components/nexus-capability/src/main/java/org/sonatype/nexus/capability/CapabilityDescriptor.java index 2765255383..6ad1c130ce 100644 --- a/components/nexus-capability/src/main/java/org/sonatype/nexus/capability/CapabilityDescriptor.java +++ b/components/nexus-capability/src/main/java/org/sonatype/nexus/capability/CapabilityDescriptor.java @@ -21,7 +21,6 @@ /** * Describes a capability (its type). - * Note: Do not inject List and instead opt to use DefaultCapabilityDescriptorProvider */ public interface CapabilityDescriptor { diff --git a/components/nexus-capability/src/main/java/org/sonatype/nexus/capability/DefaultCapabilityDescriptorProvider.java b/components/nexus-capability/src/main/java/org/sonatype/nexus/capability/DefaultCapabilityDescriptorProvider.java deleted file mode 100644 index 160d3b2fb8..0000000000 --- a/components/nexus-capability/src/main/java/org/sonatype/nexus/capability/DefaultCapabilityDescriptorProvider.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -package org.sonatype.nexus.capability; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.sonatype.nexus.common.db.DatabaseCheck; - -import static com.google.common.base.Preconditions.checkNotNull; - -@Named -@Singleton -public class DefaultCapabilityDescriptorProvider -{ - private final Map descriptors; - - private final DatabaseCheck databaseCheck; - - @Inject - public DefaultCapabilityDescriptorProvider(final Map descriptors, - final DatabaseCheck databaseCheck) { - this.descriptors = checkNotNull(descriptors); - this.databaseCheck = checkNotNull(databaseCheck); - } - - public List get() { - return descriptors.values().stream() - .filter(capabilityDescriptor -> databaseCheck.isAllowedByVersion(capabilityDescriptor.getClass())) - .collect(Collectors.toList()); - } -} diff --git a/components/nexus-cleanup-config/src/main/java/org/sonatype/nexus/cleanup/internal/task/CleanupTaskDescriptor.java b/components/nexus-cleanup-config/src/main/java/org/sonatype/nexus/cleanup/internal/task/CleanupTaskDescriptor.java index 224b21a5e4..f06cac1fcc 100644 --- a/components/nexus-cleanup-config/src/main/java/org/sonatype/nexus/cleanup/internal/task/CleanupTaskDescriptor.java +++ b/components/nexus-cleanup-config/src/main/java/org/sonatype/nexus/cleanup/internal/task/CleanupTaskDescriptor.java @@ -15,7 +15,6 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; /** @@ -23,7 +22,6 @@ * * @since 3.14 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class CleanupTaskDescriptor diff --git a/components/nexus-common/pom.xml b/components/nexus-common/pom.xml index 33fb13a223..e4f67bf335 100644 --- a/components/nexus-common/pom.xml +++ b/components/nexus-common/pom.xml @@ -182,6 +182,11 @@ commons-lang + + org.apache.commons + commons-text + + org.sonatype.nexus nexus-testsupport diff --git a/components/nexus-common/src/main/java/org/sonatype/nexus/common/app/FeatureFlags.java b/components/nexus-common/src/main/java/org/sonatype/nexus/common/app/FeatureFlags.java index 8611770b6d..0d22a97dd9 100644 --- a/components/nexus-common/src/main/java/org/sonatype/nexus/common/app/FeatureFlags.java +++ b/components/nexus-common/src/main/java/org/sonatype/nexus/common/app/FeatureFlags.java @@ -115,7 +115,7 @@ public interface FeatureFlags String CLEANUP_USE_SQL = "nexus.cleanup.useSQL"; String FORMAT_RETAIN_PATTERN = "nexus.cleanup.{format}Retain"; - + String DISABLE_NORMALIZE_VERSION_TASK = "nexus.cleanup.disableNormalizeVersionTask"; String FIREWALL_QUARANTINE_FIX_ENABLED = "nexus.firewall.quarantineFix.enabled"; @@ -154,6 +154,8 @@ public interface FeatureFlags */ String H2_DATABASE_EXPORT_SCRIPT_TASK_ENABLED = "nexus.database.export.script.task.h2.enabled"; + String H2_DATABASE_EXPORT_SCRIPT_TASK_ENABLED_NAMED = "${nexus.database.export.script.task.h2.enabled:-true}"; + /** * When true (default), the Secure attribute will be set on the NXSESSIONID Cookie when delivered over https. * In deployments with HTTP-only listeners, this setting will typically have no effect. @@ -166,12 +168,4 @@ public interface FeatureFlags String API_EXTENDED = "nexus.api.extended.enabled"; String ASSET_AUDITOR_ATTRIBUTE_CHANGES_ENABLED_NAMED = "${nexus.audit.attribute.changes.enabled:-true}"; - - String ZERO_DOWNTIME_MARKETING_MODAL_ENABLED = "zero.downtime.marketing.modal"; - - String ZERO_DOWNTIME_MARKETING_MODAL_ENABLED_NAMED = "${zero.downtime.marketing.modal:-false}"; - - /* For testing purposes only */ - String ZERO_DOWNTIME_BASELINE_FAIL = "nexus.zdu.baseline.fail"; - } diff --git a/components/nexus-common/src/main/java/org/sonatype/nexus/common/db/DatabaseCheck.java b/components/nexus-common/src/main/java/org/sonatype/nexus/common/db/DatabaseCheck.java deleted file mode 100644 index 2ffd7e4aad..0000000000 --- a/components/nexus-common/src/main/java/org/sonatype/nexus/common/db/DatabaseCheck.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -package org.sonatype.nexus.common.db; - -public interface DatabaseCheck -{ - public static final String POSTGRE_SQL = "PostgreSQL"; - - boolean isPostgresql(); - - /** - * To be used during startup to determine if minimum schema versions >= currently running schema - * @param annotatedClass class to check for @AvailabilityVersion(from = "1.0") - * @return true if the class is allowed to start based on current database schema - */ - boolean isAllowedByVersion(Class annotatedClass); -} diff --git a/components/nexus-common/src/main/java/org/sonatype/nexus/common/upgrade/AvailabilityVersion.java b/components/nexus-common/src/main/java/org/sonatype/nexus/common/upgrade/AvailabilityVersion.java deleted file mode 100644 index 148f24212e..0000000000 --- a/components/nexus-common/src/main/java/org/sonatype/nexus/common/upgrade/AvailabilityVersion.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -package org.sonatype.nexus.common.upgrade; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Marks a class as available from a specified database schema version onwards - * - */ -@Inherited -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface AvailabilityVersion -{ - String from(); -} diff --git a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/app/BaseUrlCapabilityDescriptor.java b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/app/BaseUrlCapabilityDescriptor.java index da99f77d9d..cd7d4ceaf6 100644 --- a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/app/BaseUrlCapabilityDescriptor.java +++ b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/app/BaseUrlCapabilityDescriptor.java @@ -25,7 +25,6 @@ import org.sonatype.nexus.capability.CapabilityType; import org.sonatype.nexus.capability.Tag; import org.sonatype.nexus.capability.Taggable; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.FormField; import org.sonatype.nexus.formfields.UrlFormField; @@ -39,7 +38,6 @@ * * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named(BaseUrlCapabilityDescriptor.TYPE_ID) @Singleton public class BaseUrlCapabilityDescriptor diff --git a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/backup/orient/DatabaseBackupTaskDescriptor.java b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/backup/orient/DatabaseBackupTaskDescriptor.java index ff9af176be..e654376693 100644 --- a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/backup/orient/DatabaseBackupTaskDescriptor.java +++ b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/backup/orient/DatabaseBackupTaskDescriptor.java @@ -19,7 +19,6 @@ import org.sonatype.goodies.i18n.I18N; import org.sonatype.goodies.i18n.MessageBundle; import org.sonatype.nexus.common.node.NodeAccess; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.StringTextFormField; import org.sonatype.nexus.scheduling.TaskConfiguration; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; @@ -31,7 +30,6 @@ * * @since 3.2 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class DatabaseBackupTaskDescriptor diff --git a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/capability/DefaultCapabilityDescriptorRegistry.java b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/capability/DefaultCapabilityDescriptorRegistry.java index 3f96d6e824..2ab45fb720 100644 --- a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/capability/DefaultCapabilityDescriptorRegistry.java +++ b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/capability/DefaultCapabilityDescriptorRegistry.java @@ -13,8 +13,10 @@ package org.sonatype.nexus.internal.capability; import java.util.Collection; +import java.util.List; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; + import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; @@ -22,7 +24,6 @@ import org.sonatype.nexus.capability.CapabilityDescriptor; import org.sonatype.nexus.capability.CapabilityDescriptorRegistry; import org.sonatype.nexus.capability.CapabilityType; -import org.sonatype.nexus.capability.DefaultCapabilityDescriptorProvider; import com.google.common.collect.Lists; @@ -33,13 +34,14 @@ class DefaultCapabilityDescriptorRegistry implements CapabilityDescriptorRegistry { - private final DefaultCapabilityDescriptorProvider defaultCapabilityDescriptorProvider; + + private final List descriptors; private final Set dynamicDescriptors; @Inject - DefaultCapabilityDescriptorRegistry(final DefaultCapabilityDescriptorProvider defaultCapabilityDescriptorProvider) { - this.defaultCapabilityDescriptorProvider = checkNotNull(defaultCapabilityDescriptorProvider); + DefaultCapabilityDescriptorRegistry(final List descriptors) { + this.descriptors = checkNotNull(descriptors); this.dynamicDescriptors = new CopyOnWriteArraySet(); } @@ -57,7 +59,7 @@ public CapabilityDescriptorRegistry unregister(final CapabilityDescriptor capabi @Override public CapabilityDescriptor get(final CapabilityType capabilityType) { - final CapabilityDescriptor descriptor = get(defaultCapabilityDescriptorProvider.get(), capabilityType); + final CapabilityDescriptor descriptor = get(descriptors, capabilityType); if (descriptor == null) { return get(dynamicDescriptors, capabilityType); } @@ -67,7 +69,7 @@ public CapabilityDescriptor get(final CapabilityType capabilityType) { @Override public CapabilityDescriptor[] getAll() { final Collection all = Lists.newArrayList(); - all.addAll(defaultCapabilityDescriptorProvider.get()); + all.addAll(descriptors); all.addAll(dynamicDescriptors); return all.toArray(new CapabilityDescriptor[all.size()]); @@ -83,4 +85,5 @@ private CapabilityDescriptor get(final Collection descript } return null; } + } diff --git a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/capability/node/IdentityCapabilityDescriptor.java b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/capability/node/IdentityCapabilityDescriptor.java index d1c38fa428..377dbfbf00 100644 --- a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/capability/node/IdentityCapabilityDescriptor.java +++ b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/capability/node/IdentityCapabilityDescriptor.java @@ -25,7 +25,6 @@ import org.sonatype.nexus.capability.CapabilityType; import org.sonatype.nexus.capability.Tag; import org.sonatype.nexus.capability.Taggable; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.FormField; import static org.sonatype.nexus.capability.CapabilityType.capabilityType; @@ -37,7 +36,6 @@ * * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named(IdentityCapabilityDescriptor.TYPE_ID) @Singleton public class IdentityCapabilityDescriptor diff --git a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/datastore/task/H2BackupTaskDescriptor.java b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/datastore/task/H2BackupTaskDescriptor.java index 33139d571a..0ea6269484 100644 --- a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/datastore/task/H2BackupTaskDescriptor.java +++ b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/datastore/task/H2BackupTaskDescriptor.java @@ -15,7 +15,6 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.StringTextFormField; import org.sonatype.nexus.scheduling.TaskDescriptor; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; @@ -27,7 +26,6 @@ * * @since 3.21 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class H2BackupTaskDescriptor diff --git a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/datastore/task/H2ExportDatabaseScriptTaskDescriptor.java b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/datastore/task/H2ExportDatabaseScriptTaskDescriptor.java index 13c6d450c2..10c60be0a5 100644 --- a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/datastore/task/H2ExportDatabaseScriptTaskDescriptor.java +++ b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/datastore/task/H2ExportDatabaseScriptTaskDescriptor.java @@ -17,24 +17,22 @@ import javax.inject.Singleton; import org.sonatype.nexus.common.app.FeatureFlag; -import org.sonatype.nexus.common.db.DatabaseCheck; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.StringTextFormField; +import org.sonatype.nexus.repository.db.DatabaseCheck; import org.sonatype.nexus.scheduling.TaskConfiguration; import org.sonatype.nexus.scheduling.TaskDescriptor; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; import static org.sonatype.nexus.common.app.FeatureFlags.DATASTORE_ENABLED_NAMED; -import static org.sonatype.nexus.common.app.FeatureFlags.H2_DATABASE_EXPORT_SCRIPT_TASK_ENABLED; +import static org.sonatype.nexus.common.app.FeatureFlags.H2_DATABASE_EXPORT_SCRIPT_TASK_ENABLED_NAMED; import static org.sonatype.nexus.formfields.FormField.OPTIONAL; /** * A {@link TaskDescriptor} for exporting the SQL database to a script */ -@AvailabilityVersion(from = "1.0") @Named @Singleton -@FeatureFlag(name = H2_DATABASE_EXPORT_SCRIPT_TASK_ENABLED) +@FeatureFlag(name = H2_DATABASE_EXPORT_SCRIPT_TASK_ENABLED_NAMED, enabledByDefault = true) public class H2ExportDatabaseScriptTaskDescriptor extends TaskDescriptorSupport { diff --git a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/scheduling/SchedulerCapabilityDescriptor.java b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/scheduling/SchedulerCapabilityDescriptor.java index 5051aa5e39..cae0b1ebaf 100644 --- a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/scheduling/SchedulerCapabilityDescriptor.java +++ b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/scheduling/SchedulerCapabilityDescriptor.java @@ -26,7 +26,6 @@ import org.sonatype.nexus.capability.CapabilityType; import org.sonatype.nexus.capability.Tag; import org.sonatype.nexus.capability.Taggable; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.FormField; import static org.sonatype.nexus.capability.CapabilityType.capabilityType; @@ -38,7 +37,6 @@ * * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named(SchedulerCapabilityDescriptor.TYPE_ID) @Singleton public class SchedulerCapabilityDescriptor diff --git a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/script/ScriptTaskDescriptor.java b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/script/ScriptTaskDescriptor.java index 705d49d61a..e0255056a0 100644 --- a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/script/ScriptTaskDescriptor.java +++ b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/script/ScriptTaskDescriptor.java @@ -19,7 +19,6 @@ import org.sonatype.goodies.i18n.I18N; import org.sonatype.goodies.i18n.MessageBundle; import org.sonatype.nexus.common.node.NodeAccess; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.FormField; import org.sonatype.nexus.formfields.StringTextFormField; import org.sonatype.nexus.formfields.TextAreaFormField; @@ -30,7 +29,6 @@ * * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class ScriptTaskDescriptor diff --git a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/ApiKeyDAO.java b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/ApiKeyDAO.java index d1d39716d0..3dd4660b26 100644 --- a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/ApiKeyDAO.java +++ b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/ApiKeyDAO.java @@ -105,22 +105,4 @@ public interface ApiKeyDAO * @param expiration the date of expiration */ void deleteApiKeyByExpirationDate(@Param("expiration") OffsetDateTime expiration); - - /** - * Updates an existing {@link ApiKey} - */ - void update(ApiKeyData toUpdate); - - /** - * Browse all API Keys in the specified domain (paginated) - * - * @param domain the domain, e.g. npm keys, nuget keys - * @param skip the amount of records to skip/offset - * @param limit the amount of records to limit the query to - */ - Collection browsePaginated( - @Param("domain") String domain, - @Param("skip") int skip, - @Param("limit") int limit); - } diff --git a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/ApiKeyData.java b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/ApiKeyData.java index 5617489fcf..04324598f8 100644 --- a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/ApiKeyData.java +++ b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/ApiKeyData.java @@ -18,8 +18,6 @@ import org.apache.shiro.subject.PrincipalCollection; -import static com.google.common.base.Preconditions.checkNotNull; - /** * {@link ApiKey} data. * @@ -36,21 +34,10 @@ public class ApiKeyData private OffsetDateTime created; - ApiKeyData() { } - - ApiKeyData(String domain, PrincipalCollection principals, ApiKeyToken token, OffsetDateTime created) { - this.domain = checkNotNull(domain); - this.principals = checkNotNull(principals); - this.token = checkNotNull(token); - this.created = created; - } - - @Override public void setDomain(final String domain) { this.domain = domain; } - @Override public void setPrincipals(final PrincipalCollection principals) { this.principals = principals; } @@ -59,7 +46,6 @@ public void setToken(final ApiKeyToken token) { this.token = token; } - @Override public void setApiKey(final char[] chars) { this.token = new ApiKeyToken(chars); } @@ -69,6 +55,10 @@ public String getDomain() { return domain; } + public String getPrimaryPrincipal() { + return String.valueOf(principals.getPrimaryPrincipal()); + } + @Override public PrincipalCollection getPrincipals() { return principals; @@ -88,7 +78,6 @@ public OffsetDateTime getCreated() { return created; } - @Override public void setCreated(final OffsetDateTime created) { this.created = created; } diff --git a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/ApiKeyStoreImpl.java b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/ApiKeyStoreImpl.java index ce3fc3abfb..f7e85c9b29 100644 --- a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/ApiKeyStoreImpl.java +++ b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/ApiKeyStoreImpl.java @@ -78,15 +78,6 @@ public ApiKeyStoreImpl( this.defaultApiKeyFactory = checkNotNull(defaultApiKeyFactory); } - public ApiKey newApiKey( - final String domain, - final PrincipalCollection principals, - char[] apiKey, - OffsetDateTime created) - { - return new ApiKeyData(domain, principals, new ApiKeyToken(apiKey), created); - } - @Override public char[] createApiKey(final String domain, final PrincipalCollection principals) { final char[] apiKey = makeApiKey(domain, principals); @@ -227,22 +218,6 @@ public void deleteApiKeys(final OffsetDateTime expiration) { dao().deleteApiKeyByExpirationDate(expiration); } - @Transactional - @Override - public void updateApiKey(final ApiKey from, final ApiKey to) { - ApiKeyData fromApiKey = (ApiKeyData) from; - fromApiKey.setApiKey(to.getApiKey()); - fromApiKey.setPrincipals(to.getPrincipals()); - fromApiKey.setCreated(to.getCreated()); - dao().update(fromApiKey); - } - - @Transactional - @Override - public Collection browsePaginated(final String domain, final int page, final int pageSize) { - return dao().browsePaginated(domain, (page - 1) * pageSize, pageSize); - } - /* * Finds ApiKey records for the provided username, and ensures the realm is the same */ diff --git a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/ApiKeyToken.java b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/ApiKeyToken.java index c61f00fd81..98eeac0031 100644 --- a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/ApiKeyToken.java +++ b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/ApiKeyToken.java @@ -14,7 +14,6 @@ import java.nio.CharBuffer; -import org.sonatype.nexus.security.authc.apikey.ApiKey; import org.sonatype.nexus.datastore.mybatis.handlers.PasswordCharacterArrayTypeHandler; /** diff --git a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/PurgeApiKeysTaskDescriptor.java b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/PurgeApiKeysTaskDescriptor.java index cb3c0c2c6a..10ad349685 100644 --- a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/PurgeApiKeysTaskDescriptor.java +++ b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/PurgeApiKeysTaskDescriptor.java @@ -15,7 +15,6 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; /** @@ -23,7 +22,6 @@ * * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class PurgeApiKeysTaskDescriptor diff --git a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/orient/OrientApiKey.java b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/orient/OrientApiKey.java index f54773d388..76aa615051 100644 --- a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/orient/OrientApiKey.java +++ b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/orient/OrientApiKey.java @@ -20,8 +20,6 @@ import org.apache.shiro.subject.PrincipalCollection; -import static com.google.common.base.Preconditions.checkNotNull; - /** * An Orient-stored object representing the association between a {@link PrincipalCollection} and a Api Key (char[]). * @@ -39,31 +37,18 @@ public class OrientApiKey private OffsetDateTime created; - OrientApiKey() { } - - OrientApiKey( - final String domain, - final PrincipalCollection principals, - final char[] apiKey, - final OffsetDateTime created) - { - this.domain = checkNotNull(domain); - this.principals = checkNotNull(principals); - this.apiKey = checkNotNull(apiKey); - this.created = created; + OrientApiKey() { + // package-private constructor } - @Override public void setDomain(final String domain) { this.domain = domain; } - @Override public void setPrincipals(final PrincipalCollection principals) { this.principals = principals; } - @Override public void setApiKey(final char[] apiKey) { this.apiKey = Arrays.copyOf(apiKey, apiKey.length); } @@ -88,7 +73,6 @@ public OffsetDateTime getCreated() { return created; } - @Override public void setCreated(final OffsetDateTime created) { this.created = created; } diff --git a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/orient/OrientApiKeyEntityAdapter.java b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/orient/OrientApiKeyEntityAdapter.java index 8899259376..5b30346776 100644 --- a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/orient/OrientApiKeyEntityAdapter.java +++ b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/orient/OrientApiKeyEntityAdapter.java @@ -25,6 +25,7 @@ import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; + import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Named; @@ -92,12 +93,6 @@ public class OrientApiKeyEntityAdapter private static final String DOMAIN_QUERY_STRING = format( "SELECT FROM %s WHERE %s = :domain ORDER BY %s", DB_CLASS, P_DOMAIN, P_CREATED); - private static final String DOMAIN_PAGINATED_QUERY_STRING = format( - "SELECT FROM %s WHERE %s = :domain ORDER BY %s SKIP :skip LIMIT :limit", - DB_CLASS, - P_DOMAIN, - P_CREATED); - private static final String PRINCIPAL_QUERY_STRING = format( "SELECT FROM %s WHERE %s = :primary_principal ORDER BY %s", DB_CLASS, P_PRIMARY_PRINCIPAL, P_CREATED); @@ -242,20 +237,6 @@ public Iterable browseByDomain(final ODatabaseDocumentTx db, final return query(db, DOMAIN_QUERY_STRING, params); } - /** - * Browse all keys in the specified domain (paginated) - */ - public Iterable browseByDomainPaginated( - final ODatabaseDocumentTx db, - final String domain, - final int skip, - final int limit) - { - Map params = ImmutableMap.of(P_DOMAIN, domain, "skip", skip, "limit", limit); - - return query(db, DOMAIN_PAGINATED_QUERY_STRING, params); - } - public int countByDomainI(final ODatabaseDocumentTx db, final String domain) { Map params = ImmutableMap.of(P_DOMAIN, domain); diff --git a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/orient/OrientApiKeyStore.java b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/orient/OrientApiKeyStore.java index e90355e24e..73a04987f8 100644 --- a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/orient/OrientApiKeyStore.java +++ b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/security/apikey/orient/OrientApiKeyStore.java @@ -103,15 +103,6 @@ protected void doStart() throws Exception { } } - public ApiKey newApiKey( - final String domain, - final PrincipalCollection principals, - char[] apiKey, - OffsetDateTime created) - { - return new OrientApiKey(domain, principals, apiKey, created); - } - @Override @Guarded(by = STARTED) public char[] createApiKey(final String domain, final PrincipalCollection principals) { @@ -300,24 +291,6 @@ public void deleteApiKeys(final OffsetDateTime expiration) { }); } - @Override - public void updateApiKey(final ApiKey from, final ApiKey to) { - OrientApiKey fromApiKey = (OrientApiKey) from; - fromApiKey.setApiKey(to.getApiKey()); - fromApiKey.setPrincipals(to.getPrincipals()); - fromApiKey.setCreated(to.getCreated()); - inTx(databaseInstance).run(db -> entityAdapter.editEntity(db, fromApiKey)); - } - - @Override - public Collection browsePaginated(final String domain, final int page, final int pageSize) { - Iterable keys = inTx(databaseInstance) - .retryOn(ONeedRetryException.class, ORecordNotFoundException.class) - .call(db -> entityAdapter.browseByDomainPaginated(db, domain, (page - 1) * pageSize, pageSize)); - - return convert(keys); - } - private static Collection convert(final Iterable keys) { return StreamSupport.stream(keys.spliterator(), false) .map(ApiKey.class::cast) @@ -328,4 +301,4 @@ private boolean principalsEqual(final PrincipalCollection a, final PrincipalColl return Objects.equals(a.getPrimaryPrincipal(), b.getPrimaryPrincipal()) && Objects.equals(a.getRealmNames(), b.getRealmNames()); } -} \ No newline at end of file +} diff --git a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/upgrade/NexusBaselineMigrationStep_2_0.java b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/upgrade/NexusBaselineMigrationStep_2_0.java deleted file mode 100644 index d769786f9a..0000000000 --- a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/upgrade/NexusBaselineMigrationStep_2_0.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -package org.sonatype.nexus.internal.upgrade; - -import java.sql.Connection; -import java.util.Optional; -import javax.inject.Inject; -import javax.inject.Named; - -import org.sonatype.goodies.common.ComponentSupport; -import org.sonatype.nexus.upgrade.datastore.DatabaseMigrationStep; - -/** - * No-op baseline version for Zero Downtime Upgrades - */ -@Named -public class NexusBaselineMigrationStep_2_0 - extends ComponentSupport - implements DatabaseMigrationStep -{ - private static final String FAIL_MIGRATION_FLAG = "nexus.zdu.baseline.fail"; - - private final boolean shouldFail; - - @Inject - public NexusBaselineMigrationStep_2_0(@Named("${" + FAIL_MIGRATION_FLAG + ":-false}") final boolean shouldFail) { - this.shouldFail = shouldFail; - } - - @Override - public Optional version() { - return Optional.of("2.0"); - } - - @Override - public void migrate(final Connection connection) throws Exception { - if (shouldFail) { - if (log.isDebugEnabled()) { - log.debug("simulating migration failure due to feature flag '{}'", FAIL_MIGRATION_FLAG); - } - - throw new IllegalStateException("Unable to migrate"); - } - } -} diff --git a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/webhooks/GlobalWebhookCapability.groovy b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/webhooks/GlobalWebhookCapability.groovy index 60e50d58bc..83f44b326b 100644 --- a/components/nexus-core/src/main/java/org/sonatype/nexus/internal/webhooks/GlobalWebhookCapability.groovy +++ b/components/nexus-core/src/main/java/org/sonatype/nexus/internal/webhooks/GlobalWebhookCapability.groovy @@ -27,7 +27,6 @@ import org.sonatype.nexus.capability.CapabilityType import org.sonatype.nexus.capability.Condition import org.sonatype.nexus.capability.Tag import org.sonatype.nexus.capability.Taggable -import org.sonatype.nexus.common.upgrade.AvailabilityVersion import org.sonatype.nexus.formfields.FormField import org.sonatype.nexus.formfields.ItemselectFormField import org.sonatype.nexus.formfields.PasswordFormField @@ -173,7 +172,6 @@ class GlobalWebhookCapability // Descriptor // - @AvailabilityVersion(from = "1.0") @Named(GlobalWebhookCapability.TYPE_ID) @Singleton static public class Descriptor diff --git a/components/nexus-core/src/main/resources/org/sonatype/nexus/internal/security/apikey/ApiKeyDAO.xml b/components/nexus-core/src/main/resources/org/sonatype/nexus/internal/security/apikey/ApiKeyDAO.xml index a457fd3999..895b6c41dc 100644 --- a/components/nexus-core/src/main/resources/org/sonatype/nexus/internal/security/apikey/ApiKeyDAO.xml +++ b/components/nexus-core/src/main/resources/org/sonatype/nexus/internal/security/apikey/ApiKeyDAO.xml @@ -124,40 +124,4 @@ WHERE created < #{expiration}; - - INSERT INTO api_key (primary_principal - , domain - , token - , principals - , created) - VALUES (#{primaryPrincipal, typeHandler=EncryptedStringTypeHandler} - , #{domain} - , #{token} - , #{principals} - , #{created}) - ON CONFLICT (domain, token) - DO UPDATE SET - token = #{token} - , principals = #{principals} - , created = #{created}; - - - - MERGE INTO api_key KEY (primary_principal, domain, token) - VALUES (#{primaryPrincipal, typeHandler=EncryptedStringTypeHandler} - , #{domain} - , #{token} - , #{principals} - , #{created}); - - - - diff --git a/components/nexus-quartz/src/test/java/org/sonatype/nexus/quartz/SleeperCancelableTaskDescriptor.java b/components/nexus-quartz/src/test/java/org/sonatype/nexus/quartz/SleeperCancelableTaskDescriptor.java index 74d282c7fa..ef13f09b8b 100644 --- a/components/nexus-quartz/src/test/java/org/sonatype/nexus/quartz/SleeperCancelableTaskDescriptor.java +++ b/components/nexus-quartz/src/test/java/org/sonatype/nexus/quartz/SleeperCancelableTaskDescriptor.java @@ -15,13 +15,11 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; /** * Descriptor for {@link SleeperCancelableTask}. */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class SleeperCancelableTaskDescriptor diff --git a/components/nexus-quartz/src/test/java/org/sonatype/nexus/quartz/SleeperTaskDescriptor.java b/components/nexus-quartz/src/test/java/org/sonatype/nexus/quartz/SleeperTaskDescriptor.java index 12a81f31c0..78323a62a0 100644 --- a/components/nexus-quartz/src/test/java/org/sonatype/nexus/quartz/SleeperTaskDescriptor.java +++ b/components/nexus-quartz/src/test/java/org/sonatype/nexus/quartz/SleeperTaskDescriptor.java @@ -15,13 +15,11 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; /** * Descriptor for {@link SleeperTask}. */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class SleeperTaskDescriptor diff --git a/components/nexus-quartz/src/test/java/org/sonatype/nexus/quartz/TaskSchedulerHelper.java b/components/nexus-quartz/src/test/java/org/sonatype/nexus/quartz/TaskSchedulerHelper.java index 52f45a923c..69ab7effc1 100644 --- a/components/nexus-quartz/src/test/java/org/sonatype/nexus/quartz/TaskSchedulerHelper.java +++ b/components/nexus-quartz/src/test/java/org/sonatype/nexus/quartz/TaskSchedulerHelper.java @@ -22,7 +22,6 @@ import org.sonatype.goodies.testsupport.TestUtil; import org.sonatype.nexus.common.app.ApplicationDirectories; import org.sonatype.nexus.common.app.BaseUrlManager; -import org.sonatype.nexus.common.db.DatabaseCheck; import org.sonatype.nexus.common.event.EventManager; import org.sonatype.nexus.common.log.LastShutdownTimeService; import org.sonatype.nexus.common.node.NodeAccess; @@ -95,8 +94,6 @@ public class TaskSchedulerHelper private DatabaseStatusDelayedExecutor statusDelayedExecutor; - private DatabaseCheck databaseCheck; - public TaskSchedulerHelper(final DatabaseInstance databaseInstance) { this.databaseInstance = checkNotNull(databaseInstance); } @@ -108,7 +105,6 @@ public void init(@Nullable final Integer poolSize, @Nullable final JobFactory fa nodeAccess = mock(NodeAccess.class); lastShutdownTimeService = mock(LastShutdownTimeService.class); statusDelayedExecutor = mock(DatabaseStatusDelayedExecutor.class); - databaseCheck = mock(DatabaseCheck.class); Module module = binder -> { Properties properties = new Properties(); @@ -153,9 +149,6 @@ public void init(@Nullable final Integer poolSize, @Nullable final JobFactory fa // filtering by feature flag is not supported here yet binder.bind(JobStore.class).to(JobStoreImpl.class); - - when(databaseCheck.isAllowedByVersion(any())).thenReturn(true); - binder.bind(DatabaseCheck.class).toInstance(databaseCheck); }; this.injector = Guice.createInjector(new WireModule( diff --git a/components/nexus-rapture/src/main/java/org/sonatype/nexus/rapture/internal/branding/BrandingCapabilityDescriptor.java b/components/nexus-rapture/src/main/java/org/sonatype/nexus/rapture/internal/branding/BrandingCapabilityDescriptor.java index a323006922..b68ceb4eb6 100644 --- a/components/nexus-rapture/src/main/java/org/sonatype/nexus/rapture/internal/branding/BrandingCapabilityDescriptor.java +++ b/components/nexus-rapture/src/main/java/org/sonatype/nexus/rapture/internal/branding/BrandingCapabilityDescriptor.java @@ -25,7 +25,6 @@ import org.sonatype.nexus.capability.CapabilityType; import org.sonatype.nexus.capability.Tag; import org.sonatype.nexus.capability.Taggable; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.CheckboxFormField; import org.sonatype.nexus.formfields.FormField; import org.sonatype.nexus.formfields.TextAreaFormField; @@ -37,7 +36,6 @@ * * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named(BrandingCapabilityDescriptor.TYPE_ID) @Singleton public class BrandingCapabilityDescriptor diff --git a/components/nexus-rapture/src/main/java/org/sonatype/nexus/rapture/internal/settings/SettingsCapabilityDescriptor.java b/components/nexus-rapture/src/main/java/org/sonatype/nexus/rapture/internal/settings/SettingsCapabilityDescriptor.java index fafeb105a5..2f2cf2a75a 100644 --- a/components/nexus-rapture/src/main/java/org/sonatype/nexus/rapture/internal/settings/SettingsCapabilityDescriptor.java +++ b/components/nexus-rapture/src/main/java/org/sonatype/nexus/rapture/internal/settings/SettingsCapabilityDescriptor.java @@ -25,7 +25,6 @@ import org.sonatype.nexus.capability.CapabilityType; import org.sonatype.nexus.capability.Tag; import org.sonatype.nexus.capability.Taggable; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.CheckboxFormField; import org.sonatype.nexus.formfields.FormField; import org.sonatype.nexus.formfields.NumberTextFormField; @@ -39,7 +38,6 @@ * * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named(SettingsCapabilityDescriptor.TYPE_ID) @Singleton public class SettingsCapabilityDescriptor diff --git a/components/nexus-rapture/src/main/resources/static/rapture/NX/app/Application.js b/components/nexus-rapture/src/main/resources/static/rapture/NX/app/Application.js index 17f4d4d2b0..565b2ddc6f 100644 --- a/components/nexus-rapture/src/main/resources/static/rapture/NX/app/Application.js +++ b/components/nexus-rapture/src/main/resources/static/rapture/NX/app/Application.js @@ -130,9 +130,7 @@ Ext.define('NX.app.Application', { 'Icon', 'KeyNav', 'Permissions', - 'AnalyticsOptOut', - 'UpgradeAlert', - 'UpgradeModal' + 'AnalyticsOptOut' ], /** diff --git a/components/nexus-rapture/src/main/resources/static/rapture/NX/controller/SecondaryReactViewController.js b/components/nexus-rapture/src/main/resources/static/rapture/NX/controller/SecondaryReactViewController.js deleted file mode 100644 index f3694ccd96..0000000000 --- a/components/nexus-rapture/src/main/resources/static/rapture/NX/controller/SecondaryReactViewController.js +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Open Source Version is distributed with Sencha Ext JS pursuant to a FLOSS Exception agreed upon - * between Sonatype, Inc. and Sencha Inc. Sencha Ext JS is licensed under GPL v3 and cannot be redistributed as part of a - * closed source work. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -/*global Ext, NX*/ - -/** - * Secondary Security Settings controller. - * - */ -Ext.define('NX.controller.SecondaryReactViewController', { - extend: 'NX.app.Controller', - - views: [ - 'SecondaryContainer' - ], - - refs: [ - { - ref: 'secondaryContainer', - selector: 'nx-secondary-container' - } - ], - - listen: { - controller: { - '#Refresh': { - refresh: 'refresh' - }, - '#Menu': { - refresh: 'refresh' - }, - '#State': { - changed: function() { - this.refresh(); - } - }, - '#Permissions': { - changed: function() { - this.refresh(); - } - } - } - }, - - refresh: function() { - if (this.getSecondaryContainer()) { - this.getSecondaryContainer().refresh(); - } - } -}); diff --git a/components/nexus-rapture/src/main/resources/static/rapture/NX/controller/UpgradeAlert.js b/components/nexus-rapture/src/main/resources/static/rapture/NX/controller/UpgradeAlert.js deleted file mode 100644 index 95a1614088..0000000000 --- a/components/nexus-rapture/src/main/resources/static/rapture/NX/controller/UpgradeAlert.js +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Open Source Version is distributed with Sencha Ext JS pursuant to a FLOSS Exception agreed upon - * between Sonatype, Inc. and Sencha Inc. Sencha Ext JS is licensed under GPL v3 and cannot be redistributed as part of a - * closed source work. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -/*global Ext*/ - -/** - * Upgrade Alert. - * - */ -Ext.define('NX.controller.UpgradeAlert', { - extend: 'NX.app.Controller', - requires: [ - 'NX.State' - ], - - refs: [ - { ref: 'alert', selector: 'nx-component-upgrade-alert' }, - ], - - /** - * @override - */ - init: function () { - const me = this; - - me.listen({ - component: { - 'nx-component-upgrade-alert': { - beforerender: me.onUpdate - } - }, - controller: { - '#State': { - userchanged: me.onUpdate, - changed: me.onUpdate - }, - '#Permissions': { - changed: me.onUpdate - } - }, - }); - - me.callParent(); - }, - - /** - * @private - */ - onUpdate: function (user) { - const upgradeAlert = this.getAlert(); - - if (!user) { - upgradeAlert.hide(); - } - else if (upgradeAlert) { - upgradeAlert.show(); - upgradeAlert.updateLayout(); - } - }, -}); diff --git a/components/nexus-rapture/src/main/resources/static/rapture/NX/controller/UpgradeModal.js b/components/nexus-rapture/src/main/resources/static/rapture/NX/controller/UpgradeModal.js deleted file mode 100644 index d6beec7e94..0000000000 --- a/components/nexus-rapture/src/main/resources/static/rapture/NX/controller/UpgradeModal.js +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Open Source Version is distributed with Sencha Ext JS pursuant to a FLOSS Exception agreed upon - * between Sonatype, Inc. and Sencha Inc. Sencha Ext JS is licensed under GPL v3 and cannot be redistributed as part of a - * closed source work. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -/*global Ext*/ - -/** - * Upgrade Modal. - * - */ -Ext.define('NX.controller.UpgradeModal', { - extend: 'NX.app.Controller', - requires: [ - 'NX.State' - ], - - refs: [ - { ref: 'modal', selector: 'nx-component-upgrade-modal' }, - ], - - /** - * @override - */ - init: function () { - const me = this; - - me.listen({ - component: { - 'nx-component-upgrade-modal': { - afterrender: me.onUpdate - } - }, - controller: { - '#State': { - userchanged: me.onUpdate - }, - '#Permissions': { - changed: me.onUpdate - } - }, - }); - - me.callParent(); - }, - - /** - * @private - */ - onUpdate: function (user) { - const upgradeModal = this.getModal(); - if (!user) { - upgradeModal.hide(); - } else if (upgradeModal) { - upgradeModal.show(); - } - } -}); diff --git a/components/nexus-rapture/src/main/resources/static/rapture/NX/view/Main.js b/components/nexus-rapture/src/main/resources/static/rapture/NX/view/Main.js index 367d200beb..22dfec35d4 100644 --- a/components/nexus-rapture/src/main/resources/static/rapture/NX/view/Main.js +++ b/components/nexus-rapture/src/main/resources/static/rapture/NX/view/Main.js @@ -29,9 +29,7 @@ Ext.define('NX.view.Main', { 'NX.Icons', 'NX.view.header.QuickSearch', 'Ext.button.Button', - 'NX.view.footer.AnalyticsOptOut', - 'NX.view.UpgradeAlert', - 'NX.view.UpgradeModal' + 'NX.view.footer.AnalyticsOptOut' ], layout: 'border', @@ -72,12 +70,6 @@ Ext.define('NX.view.Main', { border: true }, - { - xtype: 'nx-component-upgrade-modal', - region: 'south', - hidden: true - }, - { xtype: 'nx-coreui-react-footer-container', reactView: window.ReactComponents.UsageMetricsAlert, @@ -95,12 +87,6 @@ Ext.define('NX.view.Main', { hidden: true }, - { - xtype: 'nx-component-upgrade-alert', - region: 'south', - hidden: true - }, - { xtype: 'nx-dev-panel', region: 'south', diff --git a/components/nexus-rapture/src/main/resources/static/rapture/NX/view/SecondaryContainer.js b/components/nexus-rapture/src/main/resources/static/rapture/NX/view/SecondaryContainer.js deleted file mode 100644 index 27b6fda7ec..0000000000 --- a/components/nexus-rapture/src/main/resources/static/rapture/NX/view/SecondaryContainer.js +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Open Source Version is distributed with Sencha Ext JS pursuant to a FLOSS Exception agreed upon - * between Sonatype, Inc. and Sencha Inc. Sencha Ext JS is licensed under GPL v3 and cannot be redistributed as part of a - * closed source work. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -/*global Ext, NX, REACT_COMPONENTS, react, ReactDOM */ - -/** - * React Secondary Container - * - */ -Ext.define('NX.view.SecondaryContainer', { - extend: 'Ext.Component', - alias: 'widget.nx-secondary-container', - - reactView: undefined, - - reactViewProps: null, - - scrollable: true, - - cls: 'nxrm-secondary-container', - - listeners: { - afterrender: 'initReactView', - beforedestroy: 'destroyReactView' - }, - - initReactView: function() { - const reactElement = react.createElement(this.reactView, this.reactViewProps, null); - ReactDOM.render(reactElement, this.getEl().dom); - }, - - destroyReactView: function() { - if (this.reactView) { - ReactDOM.unmountComponentAtNode(this.getEl().dom); - } - }, - - refresh: function() { - this.destroyReactView(); - this.initReactView(); - } -}); diff --git a/components/nexus-rapture/src/main/resources/static/rapture/NX/view/UpgradeAlert.js b/components/nexus-rapture/src/main/resources/static/rapture/NX/view/UpgradeAlert.js deleted file mode 100644 index a74d58c981..0000000000 --- a/components/nexus-rapture/src/main/resources/static/rapture/NX/view/UpgradeAlert.js +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Open Source Version is distributed with Sencha Ext JS pursuant to a FLOSS Exception agreed upon - * between Sonatype, Inc. and Sencha Inc. Sencha Ext JS is licensed under GPL v3 and cannot be redistributed as part of a - * closed source work. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -/*global Ext*/ - -/** - * Upgrade Alert. - * - */ -Ext.define('NX.view.UpgradeAlert', { - extend: 'Ext.container.Container', - alias: 'widget.nx-component-upgrade-alert', - requires: [ - 'NX.view.SecondaryContainer' - ], - - layout: 'fit', - - /** - * @override - */ - initComponent: function() { - const me = this; - - me.items = [ - { - xtype: 'nx-secondary-container', - reactView: window.ReactComponents.UpgradeAlert, - reactViewProps: { - onClose: function() { - me.hide(); - } - } - } - ]; - me.show(); - me.callParent(); - }, -}); diff --git a/components/nexus-rapture/src/main/resources/static/rapture/NX/view/UpgradeModal.js b/components/nexus-rapture/src/main/resources/static/rapture/NX/view/UpgradeModal.js deleted file mode 100644 index d6b8afb56c..0000000000 --- a/components/nexus-rapture/src/main/resources/static/rapture/NX/view/UpgradeModal.js +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Open Source Version is distributed with Sencha Ext JS pursuant to a FLOSS Exception agreed upon - * between Sonatype, Inc. and Sencha Inc. Sencha Ext JS is licensed under GPL v3 and cannot be redistributed as part of a - * closed source work. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -/*global Ext*/ - -/** - * Upgrade Modal. - * - */ -Ext.define('NX.view.UpgradeModal', { - extend: 'Ext.container.Container', - alias: 'widget.nx-component-upgrade-modal', - requires: [ - 'NX.view.SecondaryContainer' - ], - - /** - * @override - */ - initComponent: function() { - const me = this; - - me.items = [ - { - xtype: 'nx-secondary-container', - reactView: window.ReactComponents.UpgradeModal, - } - ]; - me.show(); - me.callParent(); - }, -}); diff --git a/components/nexus-rapture/src/main/resources/static/rapture/resources/images/sonatype-repository-logo.svg b/components/nexus-rapture/src/main/resources/static/rapture/resources/images/sonatype-repository-logo.svg deleted file mode 100644 index 3834e0a71b..0000000000 --- a/components/nexus-rapture/src/main/resources/static/rapture/resources/images/sonatype-repository-logo.svg +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/components/nexus-repository-config/src/main/java/org/sonatype/nexus/repository/RecipeSupport.java b/components/nexus-repository-config/src/main/java/org/sonatype/nexus/repository/RecipeSupport.java index 88d517f60c..9da0600af3 100644 --- a/components/nexus-repository-config/src/main/java/org/sonatype/nexus/repository/RecipeSupport.java +++ b/components/nexus-repository-config/src/main/java/org/sonatype/nexus/repository/RecipeSupport.java @@ -15,7 +15,6 @@ import javax.inject.Inject; import org.sonatype.goodies.common.ComponentSupport; -import org.sonatype.nexus.common.db.DatabaseCheck; import org.sonatype.nexus.repository.recipe.RouterBuilder; import static com.google.common.base.Preconditions.checkNotNull; @@ -37,8 +36,6 @@ public abstract class RecipeSupport private HighAvailabilitySupportChecker highAvailabilitySupportChecker; - private DatabaseCheck databaseCheck; - protected RecipeSupport(final Type type, final Format format) { this.type = checkNotNull(type); this.format = checkNotNull(format); @@ -72,11 +69,6 @@ public void setBrowseUnsupportedHandler(final BrowseUnsupportedHandler browseUns this.browseUnsupportedHandler = checkNotNull(browseUnsupportedHandler); } - @Inject - public void setDatabaseCheck(final DatabaseCheck databaseCheck) { - this.databaseCheck = databaseCheck; - } - /** * Adds route to redirect access directly with a browser to a handler with links to the repo's components and * assets. @@ -87,9 +79,6 @@ protected void addBrowseUnsupportedRoute(RouterBuilder builder) { @Override public boolean isFeatureEnabled() { - if (databaseCheck != null && !databaseCheck.isAllowedByVersion(getClass())) { - return false; - } if (highAvailabilitySupportChecker != null) { return highAvailabilitySupportChecker.isSupported(getFormat().getValue()); } diff --git a/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/blobstore/metrics/migration/FileBlobStoreMetricsMigrationTaskDescriptor.java b/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/blobstore/metrics/migration/FileBlobStoreMetricsMigrationTaskDescriptor.java index 761bd9b6f3..130a3e3794 100644 --- a/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/blobstore/metrics/migration/FileBlobStoreMetricsMigrationTaskDescriptor.java +++ b/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/blobstore/metrics/migration/FileBlobStoreMetricsMigrationTaskDescriptor.java @@ -16,13 +16,11 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; /** * {@link FileBlobStoreMetricsMigrationTask} descriptor. */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class FileBlobStoreMetricsMigrationTaskDescriptor diff --git a/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/store/RepositoryNameIdMappingCache.java b/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/store/RepositoryNameIdMappingCache.java index 8c9c7374a1..56b7e446d3 100644 --- a/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/store/RepositoryNameIdMappingCache.java +++ b/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/store/RepositoryNameIdMappingCache.java @@ -25,10 +25,10 @@ import org.sonatype.goodies.common.ComponentSupport; import org.sonatype.nexus.common.app.FeatureFlag; -import org.sonatype.nexus.common.db.DatabaseCheck; import org.sonatype.nexus.common.event.EventAware; import org.sonatype.nexus.repository.Format; import org.sonatype.nexus.repository.Repository; +import org.sonatype.nexus.repository.db.DatabaseCheck; import org.sonatype.nexus.repository.manager.RepositoryCreatedEvent; import org.sonatype.nexus.repository.manager.RepositoryDeletedEvent; diff --git a/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/store/internal/AssetBlobCleanupTaskDescriptor.java b/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/store/internal/AssetBlobCleanupTaskDescriptor.java index 66bc5a96db..20ddf7a688 100644 --- a/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/store/internal/AssetBlobCleanupTaskDescriptor.java +++ b/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/store/internal/AssetBlobCleanupTaskDescriptor.java @@ -15,13 +15,11 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; /** * @since 3.24 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class AssetBlobCleanupTaskDescriptor diff --git a/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/store/internal/migration/AssetBlobRefMigrationTaskDescriptor.java b/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/store/internal/migration/AssetBlobRefMigrationTaskDescriptor.java index 7b58360af8..42ce07c5f9 100644 --- a/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/store/internal/migration/AssetBlobRefMigrationTaskDescriptor.java +++ b/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/store/internal/migration/AssetBlobRefMigrationTaskDescriptor.java @@ -15,13 +15,11 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; /** * {@link AssetBlobRefMigrationTask} descriptor. */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class AssetBlobRefMigrationTaskDescriptor diff --git a/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/tasks/normalize/NormalizeComponentVersionTaskDescriptor.java b/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/tasks/normalize/NormalizeComponentVersionTaskDescriptor.java index 03a55f13b9..e373ce4cba 100644 --- a/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/tasks/normalize/NormalizeComponentVersionTaskDescriptor.java +++ b/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/tasks/normalize/NormalizeComponentVersionTaskDescriptor.java @@ -16,7 +16,6 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.RepositoryCombobox; import org.sonatype.nexus.repository.RepositoryTaskSupport; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; @@ -24,7 +23,6 @@ /** * Descriptor for {@link NormalizeComponentVersionTask} which populates the normalized_version column on the {format}_component tables */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class NormalizeComponentVersionTaskDescriptor diff --git a/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/upgrades/ComponentNormalizedVersionMigrationStep.java b/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/upgrades/ComponentNormalizedVersionMigrationStep.java index fa34af39df..6d86bcdcb5 100644 --- a/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/upgrades/ComponentNormalizedVersionMigrationStep.java +++ b/components/nexus-repository-content/src/main/java/org/sonatype/nexus/repository/content/upgrades/ComponentNormalizedVersionMigrationStep.java @@ -15,9 +15,8 @@ import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; +import java.time.Instant; import java.util.List; -import java.util.Objects; - import javax.inject.Inject; import javax.inject.Named; @@ -74,11 +73,30 @@ public ComponentNormalizedVersionMigrationStep( @Override public Integer getChecksum() { - return Objects.hash(formats.stream() - .map(Format::getValue) - // Ordered so the hash is consistent - .sorted() - .toArray()); + if (HasFormatsNormalized()) { + return 1; + } + + return (int) Instant.now().getEpochSecond(); + } + + /** + * Validates if nexus has all it's format tables normalized (valid normalized_version) + * + * @return a {@link Boolean} indicating if all formats are normalized + */ + private boolean HasFormatsNormalized() { + return formats + .stream() + .map(this::isFormatNormalized) + .reduce(true, (a, b) -> a && b); + } + + private boolean isFormatNormalized(final Format format) { + return globalKeyValueStore + .getKey(String.format(NormalizeComponentVersionTask.KEY_FORMAT, format.getValue())) + .map(NexusKeyValue::getAsBoolean) + .orElse(false); } @Override @@ -95,9 +113,7 @@ private void scheduleTask() { private void alterFormats(final Connection connection) throws SQLException { try (Statement alterStmt = connection.createStatement()) { for (Format format : formats) { - if (!isFormatNormalized(format)) { - alter(connection, alterStmt, format); - } + alter(connection, alterStmt, format); } } } @@ -126,14 +142,7 @@ private void alter(final Connection connection, final Statement alterStatement, } } - private boolean isFormatNormalized(final Format format) { - return globalKeyValueStore - .getKey(String.format(NormalizeComponentVersionTask.KEY_FORMAT, format.getValue())) - .map(NexusKeyValue::getAsBoolean) - .orElse(false); - } - - private static String replace(final String query, final String format) { + private String replace(String query, String format) { return query.replaceAll("\\{format\\}", format); } } diff --git a/components/nexus-repository-content/src/test/java/org/sonatype/nexus/repository/content/store/RepositoryNameIdMappingCacheTest.java b/components/nexus-repository-content/src/test/java/org/sonatype/nexus/repository/content/store/RepositoryNameIdMappingCacheTest.java index 870a7fe91f..66ea6e6b87 100644 --- a/components/nexus-repository-content/src/test/java/org/sonatype/nexus/repository/content/store/RepositoryNameIdMappingCacheTest.java +++ b/components/nexus-repository-content/src/test/java/org/sonatype/nexus/repository/content/store/RepositoryNameIdMappingCacheTest.java @@ -19,18 +19,20 @@ import java.util.Optional; import org.sonatype.goodies.testsupport.TestSupport; -import org.sonatype.nexus.common.db.DatabaseCheck; import org.sonatype.nexus.repository.Format; import org.sonatype.nexus.repository.Repository; +import org.sonatype.nexus.repository.db.DatabaseCheck; import org.sonatype.nexus.repository.manager.RepositoryCreatedEvent; import org.sonatype.nexus.repository.manager.RepositoryDeletedEvent; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.MatcherAssert.assertThat; + import org.junit.Before; import org.junit.Test; import org.mockito.Mock; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.hasEntry; import static org.mockito.ArgumentMatchers.any; diff --git a/components/nexus-repository-content/src/test/java/org/sonatype/nexus/repository/content/upgrades/ComponentNormalizedVersionMigrationStepTest.java b/components/nexus-repository-content/src/test/java/org/sonatype/nexus/repository/content/upgrades/ComponentNormalizedVersionMigrationStepTest.java index c4b86aed35..332ce4ebcb 100644 --- a/components/nexus-repository-content/src/test/java/org/sonatype/nexus/repository/content/upgrades/ComponentNormalizedVersionMigrationStepTest.java +++ b/components/nexus-repository-content/src/test/java/org/sonatype/nexus/repository/content/upgrades/ComponentNormalizedVersionMigrationStepTest.java @@ -16,12 +16,17 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Arrays; +import java.util.Optional; +import java.util.concurrent.TimeUnit; import org.sonatype.goodies.testsupport.TestSupport; import org.sonatype.nexus.datastore.api.DataSession; import org.sonatype.nexus.repository.Format; import org.sonatype.nexus.repository.content.kv.global.GlobalKeyValueStore; +import org.sonatype.nexus.repository.content.kv.global.NexusKeyValue; +import org.sonatype.nexus.repository.content.kv.global.ValueType; import org.sonatype.nexus.repository.content.store.ComponentDAO; +import org.sonatype.nexus.repository.content.tasks.normalize.NormalizeComponentVersionTask; import org.sonatype.nexus.repository.content.tasks.normalize.NormalizeComponentVersionTaskDescriptor; import org.sonatype.nexus.scheduling.PostStartupTaskScheduler; import org.sonatype.nexus.scheduling.TaskScheduler; @@ -34,15 +39,16 @@ import org.mockito.Mock; import static java.lang.String.format; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.sonatype.nexus.datastore.api.DataStoreManager.DEFAULT_DATASTORE_NAME; +import static org.testcontainers.shaded.org.awaitility.Awaitility.await; public class ComponentNormalizedVersionMigrationStepTest extends TestSupport @@ -64,23 +70,20 @@ public class ComponentNormalizedVersionMigrationStepTest @Mock private TaskScheduler scheduler; - @Mock - private Format maven2; - - @Mock - private Format nuget; - private DataSession session; private ComponentNormalizedVersionMigrationStep migrationStep; @Before public void setUp() { - when(maven2.getValue()).thenReturn("maven2"); - when(nuget.getValue()).thenReturn("nuget"); + Format first = mock(Format.class); + Format second = mock(Format.class); + + when(first.getValue()).thenReturn("maven2"); + when(second.getValue()).thenReturn("nuget"); migrationStep = - new ComponentNormalizedVersionMigrationStep(Arrays.asList(nuget, maven2), globalKeyValueStore, scheduler, + new ComponentNormalizedVersionMigrationStep(Arrays.asList(first, second), globalKeyValueStore, scheduler, postStartupTaskScheduler); session = sessionRule.openSession(DEFAULT_DATASTORE_NAME); @@ -91,28 +94,40 @@ public void cleanup() { session.close(); } - /* - * Verifies that the order of formats doesn't affect the generated checksum - */ @Test - public void testChecksum_order() { - ComponentNormalizedVersionMigrationStep migrationStep2 = - new ComponentNormalizedVersionMigrationStep(Arrays.asList(maven2, nuget), globalKeyValueStore, scheduler, - postStartupTaskScheduler); - - assertThat(migrationStep.getChecksum(), is(migrationStep2.getChecksum())); + public void testChecksumChangesIfFormatsAreNotNormalized() { + NexusKeyValue kv1 = + new NexusKeyValue(format(NormalizeComponentVersionTask.KEY_FORMAT, "maven2"), ValueType.BOOLEAN, true); + NexusKeyValue kv2 = + new NexusKeyValue(format(NormalizeComponentVersionTask.KEY_FORMAT, "nuget"), ValueType.BOOLEAN, false); + + when(globalKeyValueStore.getKey(kv1.key())).thenReturn(Optional.of(kv1)); + when(globalKeyValueStore.getKey(kv2.key())).thenReturn(Optional.of(kv2)); + + int checksum1 = migrationStep.getChecksum(); + + await().atMost(5, TimeUnit.SECONDS) + .untilAsserted(() -> { + int checksum2 = migrationStep.getChecksum(); + assertNotEquals(checksum1, checksum2); + }); } - /* - * Verifies that a different list of formats results in a different checksum - */ @Test - public void testChecksum_different() { - ComponentNormalizedVersionMigrationStep migrationStep2 = - new ComponentNormalizedVersionMigrationStep(Arrays.asList(nuget), globalKeyValueStore, scheduler, - postStartupTaskScheduler); + public void testChecksumMaintainsIfFormatsAreNormalized() { + NexusKeyValue kv1 = + new NexusKeyValue(format(NormalizeComponentVersionTask.KEY_FORMAT, "maven2"), ValueType.BOOLEAN, true); + NexusKeyValue kv2 = + new NexusKeyValue(format(NormalizeComponentVersionTask.KEY_FORMAT, "nuget"), ValueType.BOOLEAN, true); + + when(globalKeyValueStore.getKey(kv1.key())).thenReturn(Optional.of(kv1)); + when(globalKeyValueStore.getKey(kv2.key())).thenReturn(Optional.of(kv2)); + + int checksum1 = migrationStep.getChecksum(); + int checksum2 = migrationStep.getChecksum(); - assertThat(migrationStep.getChecksum(), not(migrationStep2.getChecksum())); + assertEquals(1, checksum1); + assertEquals(checksum1, checksum2); } @Test diff --git a/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/browse/node/RebuildBrowseNodesTaskDescriptor.java b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/browse/node/RebuildBrowseNodesTaskDescriptor.java index a8a7363745..c3ee0b9b70 100644 --- a/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/browse/node/RebuildBrowseNodesTaskDescriptor.java +++ b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/browse/node/RebuildBrowseNodesTaskDescriptor.java @@ -18,7 +18,6 @@ import org.sonatype.nexus.common.app.FeatureFlags; import org.sonatype.nexus.common.node.NodeAccess; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.ItemselectFormField; import org.sonatype.nexus.repository.types.GroupType; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; @@ -28,7 +27,6 @@ * * @since 3.6 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class RebuildBrowseNodesTaskDescriptor diff --git a/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/capability/StorageSettingsCapabilityDescriptor.java b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/capability/StorageSettingsCapabilityDescriptor.java index a621efadd7..70689fc2d1 100644 --- a/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/capability/StorageSettingsCapabilityDescriptor.java +++ b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/capability/StorageSettingsCapabilityDescriptor.java @@ -25,7 +25,6 @@ import org.sonatype.nexus.capability.CapabilityType; import org.sonatype.nexus.capability.Tag; import org.sonatype.nexus.capability.Taggable; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.FormField; import org.sonatype.nexus.formfields.NumberTextFormField; @@ -41,7 +40,6 @@ * * @since 3.16 */ -@AvailabilityVersion(from = "1.0") @Named(StorageSettingsCapabilityDescriptor.TYPE_ID) @Singleton public class StorageSettingsCapabilityDescriptor diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/user/Welcome/MarketingUpgradeModal.scss b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/db/DatabaseCheck.java similarity index 78% rename from plugins/nexus-coreui-plugin/src/frontend/src/components/pages/user/Welcome/MarketingUpgradeModal.scss rename to components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/db/DatabaseCheck.java index 9f55f39502..a34618f4d5 100644 --- a/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/user/Welcome/MarketingUpgradeModal.scss +++ b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/db/DatabaseCheck.java @@ -1,4 +1,4 @@ -/** +/* * Sonatype Nexus (TM) Open Source Version * Copyright (c) 2008-present Sonatype, Inc. * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. @@ -10,20 +10,11 @@ * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the * Eclipse Foundation. All other trademarks are the property of their respective owners. */ +package org.sonatype.nexus.repository.db; -.modal-logo { - padding: var(--nx-spacing-6x) 0px var(--nx-spacing-8x); - width: 398px; - display: block; - margin: auto; -} - -.nx-modal-header { - .nx-h2 { - display: inline; - } +public interface DatabaseCheck +{ + public static final String POSTGRE_SQL = "PostgreSQL"; - .nx-btn { - float: right; - } + boolean isPostgresql(); } diff --git a/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/db/datastore/DatabaseCheckImpl.java b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/db/datastore/DatabaseCheckImpl.java index 9038192f6f..d3b6f34016 100644 --- a/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/db/datastore/DatabaseCheckImpl.java +++ b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/db/datastore/DatabaseCheckImpl.java @@ -13,31 +13,19 @@ package org.sonatype.nexus.repository.db.datastore; import java.sql.Connection; -import java.util.Optional; import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; -import javax.sql.DataSource; +import org.sonatype.nexus.repository.db.DatabaseCheck; import org.sonatype.nexus.common.app.FeatureFlag; -import org.sonatype.nexus.common.app.FeatureFlags; import org.sonatype.nexus.common.app.ManagedLifecycle; -import org.sonatype.nexus.common.db.DatabaseCheck; -import org.sonatype.nexus.common.event.EventAware; import org.sonatype.nexus.common.stateguard.Guarded; import org.sonatype.nexus.common.stateguard.StateGuardLifecycleSupport; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; -import org.sonatype.nexus.datastore.api.DataStoreManager; -import org.sonatype.nexus.upgrade.datastore.events.UpgradeEventSupport; +import org.sonatype.nexus.datastore.api.DataSessionSupplier; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.eventbus.Subscribe; -import org.flywaydb.core.Flyway; -import org.flywaydb.core.api.MigrationInfo; -import org.flywaydb.core.api.MigrationVersion; - -import static com.google.common.base.Preconditions.checkNotNull; +import static java.util.Objects.requireNonNull; import static org.sonatype.nexus.common.app.FeatureFlags.DATASTORE_ENABLED; import static org.sonatype.nexus.common.app.ManagedLifecycle.Phase.STORAGE; import static org.sonatype.nexus.common.stateguard.StateGuardLifecycleSupport.State.STARTED; @@ -49,34 +37,21 @@ @ManagedLifecycle(phase = STORAGE) public class DatabaseCheckImpl extends StateGuardLifecycleSupport - implements DatabaseCheck, EventAware + implements DatabaseCheck { - private final DataStoreManager dataStoreManager; - - private final boolean datastoreClustered; - - private DataSource dataSource; - - private MigrationVersion currentSchemaVersion; + private final DataSessionSupplier sessionSupplier; private boolean postgresql = false; @Inject - public DatabaseCheckImpl( - final DataStoreManager dataStoreManager, - @Named(FeatureFlags.DATASTORE_CLUSTERED_ENABLED_NAMED) final boolean datastoreClustered) + public DatabaseCheckImpl(final DataSessionSupplier sessionSupplier) { - this.dataStoreManager = checkNotNull(dataStoreManager); - this.datastoreClustered = datastoreClustered; + this.sessionSupplier = requireNonNull(sessionSupplier); } @Override protected void doStart() throws Exception { - dataSource = dataStoreManager.get(DEFAULT_DATASTORE_NAME) - .orElseThrow(() -> new IllegalStateException("Missing DataStore named: " + DEFAULT_DATASTORE_NAME)) - .getDataSource(); - - try (Connection con = dataSource.getConnection()) { + try (Connection con = sessionSupplier.openConnection(DEFAULT_DATASTORE_NAME)) { postgresql = POSTGRE_SQL.equalsIgnoreCase(con.getMetaData().getDatabaseProductName()); } } @@ -86,61 +61,4 @@ protected void doStart() throws Exception { public boolean isPostgresql() { return postgresql; } - - @Override - public boolean isAllowedByVersion(final Class annotatedClass) { - if (!datastoreClustered) { - return true; - } - - AvailabilityVersion availabilityVersion = annotatedClass.getAnnotation(AvailabilityVersion.class); - if (availabilityVersion != null && isAllowed(availabilityVersion.from())) { - return true; - } - if (availabilityVersion == null) { - log.error("Missing database version specified for {}", annotatedClass); - } - - log.debug("The database schema version is lower than the minimum required to enable {}", annotatedClass); - return false; - } - - @Subscribe - public void on(final UpgradeEventSupport event) { - Optional schemaVersion = event.getSchemaVersion() - .map(MigrationVersion::fromVersion); - if (schemaVersion.isPresent()) { - currentSchemaVersion = schemaVersion.get(); - } - } - - private boolean isAllowed(final String requiredVersion) { - if (currentSchemaVersion == null) { - currentSchemaVersion = getMigrationVersion(dataSource); - if (currentSchemaVersion == null) { - return true; - } - } - - return currentSchemaVersion.isAtLeast(requiredVersion); - } - - @VisibleForTesting - MigrationVersion getMigrationVersion(final DataSource dataSource) { - if (dataSource == null) { - log.warn("datasource has not been initialised"); - return null; - } - - Flyway flyway = Flyway.configure() - .dataSource(dataSource).load(); - - MigrationInfo current = flyway.info().current(); - if (current != null) { - return current.getVersion(); - } - - log.error("Could not determine database schema version"); - return null; - } } diff --git a/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/db/orient/OrientDatabaseCheck.java b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/db/orient/OrientDatabaseCheck.java index 883c3a7670..fc66b7d091 100644 --- a/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/db/orient/OrientDatabaseCheck.java +++ b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/db/orient/OrientDatabaseCheck.java @@ -17,7 +17,7 @@ import javax.inject.Singleton; import org.sonatype.nexus.common.app.FeatureFlag; -import org.sonatype.nexus.common.db.DatabaseCheck; +import org.sonatype.nexus.repository.db.DatabaseCheck; import static org.sonatype.nexus.common.app.FeatureFlags.ORIENT_ENABLED; @@ -32,9 +32,4 @@ public class OrientDatabaseCheck public boolean isPostgresql() { return false; } - - @Override - public boolean isAllowedByVersion(final Class annotatedClass) { - return true; - } } diff --git a/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/internal/search/index/task/SearchUpdateTaskDescriptor.java b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/internal/search/index/task/SearchUpdateTaskDescriptor.java index 479e2ee96e..d0b61a68d2 100644 --- a/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/internal/search/index/task/SearchUpdateTaskDescriptor.java +++ b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/internal/search/index/task/SearchUpdateTaskDescriptor.java @@ -18,7 +18,6 @@ import org.sonatype.goodies.i18n.I18N; import org.sonatype.goodies.i18n.MessageBundle; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; /** @@ -26,7 +25,6 @@ * * @since 3.37 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class SearchUpdateTaskDescriptor diff --git a/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/purge/PurgeUnusedTaskDescriptor.java b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/purge/PurgeUnusedTaskDescriptor.java index b6322f737a..96ddc9bd26 100644 --- a/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/purge/PurgeUnusedTaskDescriptor.java +++ b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/purge/PurgeUnusedTaskDescriptor.java @@ -15,7 +15,6 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.FormField; import org.sonatype.nexus.formfields.NumberTextFormField; import org.sonatype.nexus.formfields.RepositoryCombobox; @@ -29,7 +28,6 @@ * * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class PurgeUnusedTaskDescriptor diff --git a/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/rest/api/SimpleApiRepositoryAdapter.java b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/rest/api/SimpleApiRepositoryAdapter.java index d7f07b93f4..267d860930 100644 --- a/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/rest/api/SimpleApiRepositoryAdapter.java +++ b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/rest/api/SimpleApiRepositoryAdapter.java @@ -23,7 +23,7 @@ import org.sonatype.nexus.repository.Repository; import org.sonatype.nexus.repository.config.Configuration; import org.sonatype.nexus.repository.config.ConfigurationConstants; -import org.sonatype.nexus.common.db.DatabaseCheck; +import org.sonatype.nexus.repository.db.DatabaseCheck; import org.sonatype.nexus.repository.rest.api.model.AbstractApiRepository; import org.sonatype.nexus.repository.rest.api.model.CleanupPolicyAttributes; import org.sonatype.nexus.repository.rest.api.model.ComponentAttributes; diff --git a/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/search/index/RebuildIndexTaskDescriptor.java b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/search/index/RebuildIndexTaskDescriptor.java index 199b2f1b64..1bd93277fa 100644 --- a/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/search/index/RebuildIndexTaskDescriptor.java +++ b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/search/index/RebuildIndexTaskDescriptor.java @@ -17,7 +17,6 @@ import javax.inject.Singleton; import org.sonatype.nexus.common.node.NodeAccess; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.RepositoryCombobox; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; @@ -26,7 +25,6 @@ * * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named(RebuildIndexTaskDescriptor.TYPE_ID) @Singleton public class RebuildIndexTaskDescriptor diff --git a/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/webhooks/RepositoryWebhookCapability.groovy b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/webhooks/RepositoryWebhookCapability.groovy index 4110168388..5e52a67004 100644 --- a/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/webhooks/RepositoryWebhookCapability.groovy +++ b/components/nexus-repository-services/src/main/java/org/sonatype/nexus/repository/webhooks/RepositoryWebhookCapability.groovy @@ -27,7 +27,6 @@ import org.sonatype.nexus.capability.CapabilityType import org.sonatype.nexus.capability.Condition import org.sonatype.nexus.capability.Tag import org.sonatype.nexus.capability.Taggable -import org.sonatype.nexus.common.upgrade.AvailabilityVersion import org.sonatype.nexus.formfields.FormField import org.sonatype.nexus.formfields.ItemselectFormField import org.sonatype.nexus.formfields.PasswordFormField @@ -200,7 +199,6 @@ class RepositoryWebhookCapability // Descriptor // - @AvailabilityVersion(from = "1.0") @Named(RepositoryWebhookCapability.TYPE_ID) @Singleton static public class Descriptor diff --git a/components/nexus-repository-services/src/test/java/org/sonatype/nexus/repository/db/datastore/DatabaseCheckImplTest.java b/components/nexus-repository-services/src/test/java/org/sonatype/nexus/repository/db/datastore/DatabaseCheckImplTest.java deleted file mode 100644 index c1ed40844f..0000000000 --- a/components/nexus-repository-services/src/test/java/org/sonatype/nexus/repository/db/datastore/DatabaseCheckImplTest.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -package org.sonatype.nexus.repository.db.datastore; - -import java.util.Optional; -import javax.sql.DataSource; - -import org.sonatype.goodies.testsupport.TestSupport; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; -import org.sonatype.nexus.datastore.api.DataStore; -import org.sonatype.nexus.datastore.api.DataStoreManager; - -import org.flywaydb.core.api.MigrationVersion; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - -public class DatabaseCheckImplTest - extends TestSupport -{ - private DatabaseCheckImpl underTest; - - @Mock - private DataStoreManager dataStoreManager; - - private WithAnnotation withAnnotation; - - private WithoutAnnotation withoutAnnotation; - - private WithFromAnnotation withFromAnnotation; - - private WithLatestFromAnnotation withLatestFromAnnotation; - - @Mock - private Optional> optionalDataStore; - - @Mock - private DataStore dataStore; - - @Before - public void setup() { - when(dataStoreManager.get(any())).thenReturn(optionalDataStore); - when(optionalDataStore.orElseThrow(any())).thenReturn(dataStore); - - withAnnotation = new WithAnnotation(); - withoutAnnotation = new WithoutAnnotation(); - withFromAnnotation = new WithFromAnnotation(); - withLatestFromAnnotation = new WithLatestFromAnnotation(); - } - - @Test - public void testNoneClusteredModeAllAreAlwaysEnabled() { - underTest = new DatabaseCheckImplForTest(dataStoreManager, false); - - assertTrue(underTest.isAllowedByVersion(withAnnotation.getClass())); - assertTrue(underTest.isAllowedByVersion(withoutAnnotation.getClass())); - assertTrue(underTest.isAllowedByVersion(withFromAnnotation.getClass())); - assertTrue(underTest.isAllowedByVersion(withLatestFromAnnotation.getClass())); - } - - @Test - public void testClusteredModeIsDeterminedByVersion() { - underTest = new DatabaseCheckImplForTest(dataStoreManager, true); - - assertTrue(underTest.isAllowedByVersion(withAnnotation.getClass())); - assertFalse(underTest.isAllowedByVersion(withoutAnnotation.getClass())); - assertTrue(underTest.isAllowedByVersion(withFromAnnotation.getClass())); - assertFalse(underTest.isAllowedByVersion(withLatestFromAnnotation.getClass())); - } - - private static class DatabaseCheckImplForTest extends DatabaseCheckImpl { - public DatabaseCheckImplForTest( - final DataStoreManager dataStoreManager, - final boolean datastoreClustered) - { - super(dataStoreManager, datastoreClustered); - } - - @Override - MigrationVersion getMigrationVersion(final DataSource dataSource) { - return MigrationVersion.fromVersion("1.4"); - } - } - - private static class WithoutAnnotation {} - - @AvailabilityVersion(from = "1.0") - private static class WithAnnotation {} - - @AvailabilityVersion(from = "1.3") - private static class WithFromAnnotation {} - - @AvailabilityVersion(from = "1.6") - private static class WithLatestFromAnnotation {} - -} \ No newline at end of file diff --git a/components/nexus-repository-services/src/test/java/org/sonatype/nexus/repository/rest/api/SimpleApiRepositoryAdapterTest.java b/components/nexus-repository-services/src/test/java/org/sonatype/nexus/repository/rest/api/SimpleApiRepositoryAdapterTest.java index 57bcb79df5..d16378d02c 100644 --- a/components/nexus-repository-services/src/test/java/org/sonatype/nexus/repository/rest/api/SimpleApiRepositoryAdapterTest.java +++ b/components/nexus-repository-services/src/test/java/org/sonatype/nexus/repository/rest/api/SimpleApiRepositoryAdapterTest.java @@ -31,7 +31,7 @@ import org.sonatype.nexus.repository.Type; import org.sonatype.nexus.repository.config.Configuration; import org.sonatype.nexus.repository.config.ConfigurationConstants; -import org.sonatype.nexus.common.db.DatabaseCheck; +import org.sonatype.nexus.repository.db.DatabaseCheck; import org.sonatype.nexus.repository.manager.internal.RepositoryImpl; import org.sonatype.nexus.repository.rest.api.model.AbstractApiRepository; import org.sonatype.nexus.repository.rest.api.model.CleanupPolicyAttributes; diff --git a/components/nexus-repository/src/main/java/org/sonatype/nexus/repository/storage/RebuildAssetUploadMetadataTaskDescriptor.java b/components/nexus-repository/src/main/java/org/sonatype/nexus/repository/storage/RebuildAssetUploadMetadataTaskDescriptor.java index e0ea3b84c7..c93d19eb42 100644 --- a/components/nexus-repository/src/main/java/org/sonatype/nexus/repository/storage/RebuildAssetUploadMetadataTaskDescriptor.java +++ b/components/nexus-repository/src/main/java/org/sonatype/nexus/repository/storage/RebuildAssetUploadMetadataTaskDescriptor.java @@ -17,7 +17,6 @@ import javax.inject.Singleton; import org.sonatype.nexus.common.node.NodeAccess; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; /** @@ -25,7 +24,6 @@ * * @since 3.6 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class RebuildAssetUploadMetadataTaskDescriptor diff --git a/components/nexus-repository/src/main/java/org/sonatype/nexus/repository/storage/internal/StorageFacetCleanupTaskDescriptor.java b/components/nexus-repository/src/main/java/org/sonatype/nexus/repository/storage/internal/StorageFacetCleanupTaskDescriptor.java index d22101cc6b..97360d957c 100644 --- a/components/nexus-repository/src/main/java/org/sonatype/nexus/repository/storage/internal/StorageFacetCleanupTaskDescriptor.java +++ b/components/nexus-repository/src/main/java/org/sonatype/nexus/repository/storage/internal/StorageFacetCleanupTaskDescriptor.java @@ -16,13 +16,11 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; /** * @since 3.2.1 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class StorageFacetCleanupTaskDescriptor diff --git a/components/nexus-rest/src/main/java/org/sonatype/nexus/rest/APIConstants.java b/components/nexus-rest/src/main/java/org/sonatype/nexus/rest/APIConstants.java index 175d712657..eba5994913 100644 --- a/components/nexus-rest/src/main/java/org/sonatype/nexus/rest/APIConstants.java +++ b/components/nexus-rest/src/main/java/org/sonatype/nexus/rest/APIConstants.java @@ -31,11 +31,4 @@ private APIConstants() { public static final String BETA_API_PREFIX = "/beta"; public static final String INTERNAL_API_PREFIX = "/internal"; - - /** - * Mime type for versionless REST API URLs which indicates that the Content-Type is V1 from the endpoint. - * - * @see Swagger 2.0 Mime Types - */ - public static final String APPLICATION_NEXUS_V1 = "application/vnd.sonatype.nexus.v1+json"; } diff --git a/components/nexus-scheduling/src/main/java/org/sonatype/nexus/scheduling/internal/PostStartupTaskSchedulerImpl.java b/components/nexus-scheduling/src/main/java/org/sonatype/nexus/scheduling/internal/PostStartupTaskSchedulerImpl.java index 0aa7f369da..04cc431fc3 100644 --- a/components/nexus-scheduling/src/main/java/org/sonatype/nexus/scheduling/internal/PostStartupTaskSchedulerImpl.java +++ b/components/nexus-scheduling/src/main/java/org/sonatype/nexus/scheduling/internal/PostStartupTaskSchedulerImpl.java @@ -47,12 +47,7 @@ public PostStartupTaskSchedulerImpl(final TaskScheduler scheduler) { @Override public void schedule(final TaskConfiguration configuration) { - if (this.isStarted()) { - scheduleTask(configuration); - } - else { - configurations.add(configuration); - } + configurations.add(configuration); } @Override diff --git a/components/nexus-scheduling/src/main/java/org/sonatype/nexus/scheduling/internal/TaskFactoryImpl.java b/components/nexus-scheduling/src/main/java/org/sonatype/nexus/scheduling/internal/TaskFactoryImpl.java index c94f6bd435..258fa5794d 100644 --- a/components/nexus-scheduling/src/main/java/org/sonatype/nexus/scheduling/internal/TaskFactoryImpl.java +++ b/components/nexus-scheduling/src/main/java/org/sonatype/nexus/scheduling/internal/TaskFactoryImpl.java @@ -18,13 +18,13 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; + import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; import org.sonatype.goodies.common.ComponentSupport; -import org.sonatype.nexus.common.db.DatabaseCheck; import org.sonatype.nexus.scheduling.Task; import org.sonatype.nexus.scheduling.TaskConfiguration; import org.sonatype.nexus.scheduling.TaskDescriptor; @@ -43,9 +43,9 @@ /** * Default {@link TaskFactory} implementation. - *

+ * * Resolves {@link TaskDescriptor} components via {@link BeanLocator} singleton components. - *

+ * * Resolves {@link Task} components via {@link BeanLocator} lookup by {@link TaskDescriptor#getType()}. * * @since 3.0 @@ -58,20 +58,14 @@ public class TaskFactoryImpl { private final BeanLocator beanLocator; - private final DatabaseCheck databaseCheck; - /** * Map of descriptor-id to descriptor instance. */ private final Map taskDefinitions = Maps.newConcurrentMap(); @Inject - public TaskFactoryImpl( - final BeanLocator beanLocator, - final DatabaseCheck databaseCheck) - { + public TaskFactoryImpl(final BeanLocator beanLocator) { this.beanLocator = checkNotNull(beanLocator); - this.databaseCheck = checkNotNull(databaseCheck); // watch for TaskDescriptor components beanLocator.watch(Key.get(TaskDescriptor.class, Named.class), new TaskDescriptorMediator(), this); @@ -86,9 +80,8 @@ private static class TaskDefinition private final BeanEntry beanEntry; - private TaskDefinition( - final TaskDescriptor descriptor, - final BeanEntry beanEntry) + private TaskDefinition(final TaskDescriptor descriptor, + final BeanEntry beanEntry) { this.descriptor = checkNotNull(descriptor); this.beanEntry = checkNotNull(beanEntry); @@ -138,7 +131,6 @@ void addDescriptor(final TaskDescriptor descriptor) { entry.getImplementationClass().getName()); return; } - log.debug("Adding task type-id: {} -> {}", typeId, entry.getImplementationClass().getName()); TaskDefinition prevTaskDefinition = taskDefinitions.put(typeId, new TaskDefinition(descriptor, entry)); if (prevTaskDefinition != null) { @@ -160,9 +152,9 @@ void removeDescriptor(final String typeId) { } /** - * Creates a new instance of Task having provided type-id, by using {@link BeanEntry#getProvider()}, hence new - * instance is created every time (tasks are enforced to not be singletons, see - * {@link #addDescriptor(TaskDescriptor)}. + * Creates a new instance of Task having provided type-id, by using {@link BeanEntry#getProvider()}, hence + * new instance is created every time (tasks are enforced to not be singletons, see {@link + * #addDescriptor(TaskDescriptor)}. */ @VisibleForTesting Task newInstance(final String typeId) { @@ -176,10 +168,7 @@ Task newInstance(final String typeId) { @Override public List getDescriptors() { return Collections.unmodifiableList( - taskDefinitions.values().stream() - .map(d -> d.descriptor) - .filter(d -> databaseCheck.isAllowedByVersion(d.getClass())) - .collect(Collectors.toList()) + taskDefinitions.values().stream().map(d -> d.descriptor).collect(Collectors.toList()) ); } @@ -188,10 +177,6 @@ public List getDescriptors() { public TaskDescriptor findDescriptor(final String typeId) { TaskDefinition taskDefinition = taskDefinitions.get(typeId); if (taskDefinition != null) { - if (!databaseCheck.isAllowedByVersion(taskDefinition.descriptor.getClass())) { - return null; - } - return taskDefinition.descriptor; } return null; diff --git a/components/nexus-scheduling/src/test/java/org/sonatype/nexus/scheduling/internal/TaskFactoryImplTest.groovy b/components/nexus-scheduling/src/test/java/org/sonatype/nexus/scheduling/internal/TaskFactoryImplTest.groovy index 16283a4d64..a2fe7c4091 100644 --- a/components/nexus-scheduling/src/test/java/org/sonatype/nexus/scheduling/internal/TaskFactoryImplTest.groovy +++ b/components/nexus-scheduling/src/test/java/org/sonatype/nexus/scheduling/internal/TaskFactoryImplTest.groovy @@ -15,7 +15,6 @@ package org.sonatype.nexus.scheduling.internal import java.lang.annotation.Annotation import org.sonatype.goodies.testsupport.TestSupport -import org.sonatype.nexus.common.db.DatabaseCheck import org.sonatype.nexus.scheduling.TaskConfiguration import org.sonatype.nexus.scheduling.TaskInfo @@ -44,9 +43,6 @@ class TaskFactoryImplTest @Mock private TaskInfo taskInfo - @Mock - private DatabaseCheck databaseCheck - private TaskFactoryImpl underTest @Before @@ -55,8 +51,7 @@ class TaskFactoryImplTest when(simpleTaskBeanEntry.getImplementationClass()).thenReturn(SimpleTask) when(simpleTaskBeanEntry.getProvider()).thenReturn(Providers.of(new SimpleTask())) when(beanLocator.locate(any(Key))).thenReturn(Collections.singletonList(simpleTaskBeanEntry)) - when(databaseCheck.isAllowedByVersion(any())).thenReturn(true) - underTest = new TaskFactoryImpl(beanLocator, databaseCheck) + underTest = new TaskFactoryImpl(beanLocator) } @Test diff --git a/components/nexus-security/src/main/java/org/sonatype/nexus/security/authc/apikey/ApiKey.java b/components/nexus-security/src/main/java/org/sonatype/nexus/security/authc/apikey/ApiKey.java index 4fe0906474..744dcd7ecc 100644 --- a/components/nexus-security/src/main/java/org/sonatype/nexus/security/authc/apikey/ApiKey.java +++ b/components/nexus-security/src/main/java/org/sonatype/nexus/security/authc/apikey/ApiKey.java @@ -28,19 +28,4 @@ public interface ApiKey PrincipalCollection getPrincipals(); OffsetDateTime getCreated(); - - default String getPrimaryPrincipal() { - if (getPrincipals() == null) { - return null; - } - return getPrincipals().getPrimaryPrincipal().toString(); - } - - void setApiKey(char[] apiKey); - - void setDomain(String domain); - - void setPrincipals(PrincipalCollection principals); - - void setCreated(OffsetDateTime created); } diff --git a/components/nexus-security/src/main/java/org/sonatype/nexus/security/authc/apikey/ApiKeyStore.java b/components/nexus-security/src/main/java/org/sonatype/nexus/security/authc/apikey/ApiKeyStore.java index 53ab475c52..b80e3b1224 100644 --- a/components/nexus-security/src/main/java/org/sonatype/nexus/security/authc/apikey/ApiKeyStore.java +++ b/components/nexus-security/src/main/java/org/sonatype/nexus/security/authc/apikey/ApiKeyStore.java @@ -72,11 +72,6 @@ default void persistApiKey(final String domain, final PrincipalCollection princi */ Collection browseByCreatedDate(String domain, OffsetDateTime date); - /** - * Browse tokens in the domain (paginated) - */ - Collection browsePaginated(String domain, int page, int pageSize); - /** * Count all the keys for the provided domain */ @@ -113,21 +108,4 @@ default void persistApiKey(final String domain, final PrincipalCollection princi * Remove all expired API-Keys */ void deleteApiKeys(OffsetDateTime expiration); - - /** - * Updates an existing API-key. - */ - void updateApiKey(ApiKey from, ApiKey to); - - /** - * Creates a new {@link ApiKey} instance (default) - */ - default ApiKey newApiKey(String domain, PrincipalCollection principals, char[] apiKey) { - return newApiKey(domain, principals, apiKey, OffsetDateTime.now()); - } - - /** - * Creates a new {@link ApiKey} instance - */ - ApiKey newApiKey(String domain, PrincipalCollection principals, char[] apiKey, OffsetDateTime created); } diff --git a/components/nexus-security/src/main/java/org/sonatype/nexus/security/internal/UserManagerImpl.java b/components/nexus-security/src/main/java/org/sonatype/nexus/security/internal/UserManagerImpl.java index 9332c51337..ab339ced83 100644 --- a/components/nexus-security/src/main/java/org/sonatype/nexus/security/internal/UserManagerImpl.java +++ b/components/nexus-security/src/main/java/org/sonatype/nexus/security/internal/UserManagerImpl.java @@ -306,11 +306,6 @@ public Set searchUsers(final UserSearchCriteria criteria) { return users; } - @Override - public boolean isRealmConfigured() { - throw new UnsupportedOperationException("Not supported yet."); - } - private SecuritySystem getSecuritySystem() { return this.securitySystem; } diff --git a/components/nexus-security/src/main/java/org/sonatype/nexus/security/user/ConfiguredUsersUserManager.java b/components/nexus-security/src/main/java/org/sonatype/nexus/security/user/ConfiguredUsersUserManager.java index d00a6e7941..c3ef057393 100644 --- a/components/nexus-security/src/main/java/org/sonatype/nexus/security/user/ConfiguredUsersUserManager.java +++ b/components/nexus-security/src/main/java/org/sonatype/nexus/security/user/ConfiguredUsersUserManager.java @@ -156,9 +156,4 @@ protected boolean matchesCriteria(final String userId, public String getAuthenticationRealmName() { return null; } - - @Override - public boolean isRealmConfigured() { - throw new UnsupportedOperationException("Not supported yet."); - } } diff --git a/components/nexus-security/src/main/java/org/sonatype/nexus/security/user/UserManager.java b/components/nexus-security/src/main/java/org/sonatype/nexus/security/user/UserManager.java index 6a30f99788..64265c0d16 100644 --- a/components/nexus-security/src/main/java/org/sonatype/nexus/security/user/UserManager.java +++ b/components/nexus-security/src/main/java/org/sonatype/nexus/security/user/UserManager.java @@ -83,9 +83,4 @@ public interface UserManager * Update a users password. */ void changePassword(String userId, String newPassword) throws UserNotFoundException; - - /** - * Returns true if associated realm is configured, false otherwise. - */ - boolean isRealmConfigured(); } diff --git a/components/nexus-security/src/test/java/org/sonatype/nexus/security/user/MockUserManager.java b/components/nexus-security/src/test/java/org/sonatype/nexus/security/user/MockUserManager.java index a325611a92..709790a804 100644 --- a/components/nexus-security/src/test/java/org/sonatype/nexus/security/user/MockUserManager.java +++ b/components/nexus-security/src/test/java/org/sonatype/nexus/security/user/MockUserManager.java @@ -82,9 +82,4 @@ public User getUser(String userId) throws UserNotFoundException { public User getUser(final String userId, final Set roleIds) throws UserNotFoundException { return getUser(userId); } - - @Override - public boolean isRealmConfigured() { - throw new UnsupportedOperationException("Not supported yet."); - } } diff --git a/components/nexus-security/src/test/java/org/sonatype/nexus/security/user/MockUserManagerSupport.java b/components/nexus-security/src/test/java/org/sonatype/nexus/security/user/MockUserManagerSupport.java index 1533bffa11..2b0be9650d 100644 --- a/components/nexus-security/src/test/java/org/sonatype/nexus/security/user/MockUserManagerSupport.java +++ b/components/nexus-security/src/test/java/org/sonatype/nexus/security/user/MockUserManagerSupport.java @@ -89,9 +89,4 @@ protected Set getUsers() { public void changePassword(String userId, String newPassword) throws UserNotFoundException { // empty } - - @Override - public boolean isRealmConfigured() { - throw new UnsupportedOperationException("Not supported yet."); - } } diff --git a/components/nexus-ui-plugin/src/frontend/src/interface/ExtJS.js b/components/nexus-ui-plugin/src/frontend/src/interface/ExtJS.js index 2bc596ebc1..6686201f66 100644 --- a/components/nexus-ui-plugin/src/frontend/src/interface/ExtJS.js +++ b/components/nexus-ui-plugin/src/frontend/src/interface/ExtJS.js @@ -232,34 +232,4 @@ export default class { return value; } - - /** - * A hook that automatically re-evaluates whenever any state is changed - * @param getValue - A function to get the value from the state subsystem - * @returns {unknown} - */ - static usePermission(getValue, dependencies) { - const [value, setValue] = useState(getValue()); - - useEffect(() => { - function handleChange() { - const newValue = getValue(); - if (value !== newValue) { - setValue(newValue); - } - } - - const permissionsController = Ext.getApplication().getController('Permissions'); - permissionsController.on('changed', handleChange); - - const stateController = Ext.getApplication().getController('State'); - stateController.on('userchanged', handleChange); - return () => { - permissionsController.un('changed', handleChange); - stateController.un('userchanged', handleChange); - } - }, [value, ...(dependencies ?? [])]); - - return value; - } } diff --git a/components/nexus-upgrade/pom.xml b/components/nexus-upgrade/pom.xml index 191fe4b135..2739ae18ae 100644 --- a/components/nexus-upgrade/pom.xml +++ b/components/nexus-upgrade/pom.xml @@ -33,11 +33,6 @@ nexus-common - - org.sonatype.nexus - nexus-audit - - org.sonatype.nexus nexus-transaction diff --git a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/UpgradeException.java b/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/UpgradeException.java deleted file mode 100644 index 2cd9db32e9..0000000000 --- a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/UpgradeException.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -package org.sonatype.nexus.upgrade.datastore; - -/** - * An exception which occurs during a database migration - */ -public class UpgradeException - extends Exception -{ - private static final long serialVersionUID = 1L; - - public UpgradeException(final String message, final Throwable cause) { - super(message, cause); - } - - public UpgradeException(final String message) { - super(message); - } -} diff --git a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/UpgradeManager.java b/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/UpgradeManager.java deleted file mode 100644 index dbd7ee2a7f..0000000000 --- a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/UpgradeManager.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -package org.sonatype.nexus.upgrade.datastore; - -import java.util.Collection; -import java.util.Collections; -import java.util.Optional; - -import javax.annotation.Nullable; - -import org.flywaydb.core.api.MigrationVersion; - -/** - * Manages database upgrades for SQL - */ -public interface UpgradeManager -{ - /** - * Trigger database migration as the system user. - * - * @throws UpgradeException when a failure occurs - */ - default void migrate() throws UpgradeException { - migrate(null, Collections.emptyList()); - } - - /** - * Trigger database migration with a specified user. - * - * @param user the user who requested database migration occur - * @throws UpgradeException when a failure occurs - */ - void migrate(@Nullable String user, final Collection nodeIds) throws UpgradeException; - - /** - * Validates that the current database schema version is supported by the running Nexus. - * - * @throws UpgradeException when the current schema version is not acceptable - */ - void checkSchemaVersionIsAcceptable() throws UpgradeException; - - /** - * @return {@code true} when there are pending migrations, {@code false} otherwise. For single node instances this - * should always be false after startup. - */ - boolean requiresMigration(); - - /** - * Get the current database schema version - */ - Optional getCurrentVersion(); - - /** - * Get the latest available schema version known - */ - Optional getMaxMigrationVersion(); - - void checkBaseline(final String target); -} diff --git a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/events/UpgradeCompletedEvent.java b/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/events/UpgradeCompletedEvent.java deleted file mode 100644 index 763964467a..0000000000 --- a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/events/UpgradeCompletedEvent.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -package org.sonatype.nexus.upgrade.datastore.events; - -import java.util.Collection; - -import javax.annotation.Nullable; - -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * An event fired when a database migration has completed. - */ -public class UpgradeCompletedEvent - extends UpgradeEventSupport -{ - private Collection nodeIds; - - protected UpgradeCompletedEvent() { - // deserialization - } - - public UpgradeCompletedEvent(@Nullable final String user, final String schemaVersion, final Collection nodeIds, final String... migrations) { - super(user, schemaVersion, migrations); - this.nodeIds = checkNotNull(nodeIds); - } - - /** - * Return the nodes who participated in the quorum - */ - public Collection getNodeIds() { - return nodeIds; - } - - public void setNodeIds(final Collection nodeIds) { - this.nodeIds = nodeIds; - } -} diff --git a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/events/UpgradeEventSupport.java b/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/events/UpgradeEventSupport.java deleted file mode 100644 index ca13ca9480..0000000000 --- a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/events/UpgradeEventSupport.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -package org.sonatype.nexus.upgrade.datastore.events; - -import java.util.Optional; - -import javax.annotation.Nullable; - -import org.sonatype.nexus.common.event.EventWithSource; - -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * Support class for the database migration events - */ -public abstract class UpgradeEventSupport - extends EventWithSource -{ - private String user; - - private String schemaVersion; - - private String[] migrations; - - protected UpgradeEventSupport() { - // deserialization - } - - protected UpgradeEventSupport(@Nullable final String user, @Nullable final String schemaVersion, final String[] migrations) { - this.user = user; - this.schemaVersion = schemaVersion; - this.migrations = checkNotNull(migrations); - } - - /** - * @return the migrations associated with the event - */ - public String[] getMigrations() { - return migrations; - } - - /** - * @return the database schema version at the event time, may be null if this is the first system start - */ - public Optional getSchemaVersion() { - return Optional.ofNullable(schemaVersion); - } - - /** - * @return the userId of the person who triggered it, or empty if this was triggered automatically - */ - public Optional getUser() { - return Optional.ofNullable(user); - } - - public void setMigrations(final String[] migrations) { - this.migrations = migrations; - } - - public void setSchemaVersion(final String schemaVersion) { - this.schemaVersion = schemaVersion; - } - - public void setUser(final String user) { - this.user = user; - } -} diff --git a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/events/UpgradeFailedEvent.java b/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/events/UpgradeFailedEvent.java deleted file mode 100644 index c572001efb..0000000000 --- a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/events/UpgradeFailedEvent.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -package org.sonatype.nexus.upgrade.datastore.events; - -import javax.annotation.Nullable; - -/** - * An event fired when a database migration fails. - */ -public class UpgradeFailedEvent - extends UpgradeEventSupport -{ - private String errorMessage; - - protected UpgradeFailedEvent() { - // deserialization - } - - public UpgradeFailedEvent(@Nullable final String user, final String schemaVersion, final String errorMessage, final String... migrations) { - super(user, schemaVersion, migrations); - this.errorMessage = errorMessage; - } - - /** - * @return the error message associated with the failure - */ - public String getErrorMessage() { - return errorMessage; - } - - public void setErrorMessage(final String errorMessage) { - this.errorMessage = errorMessage; - } -} diff --git a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/events/UpgradeStartedEvent.java b/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/events/UpgradeStartedEvent.java deleted file mode 100644 index d1244ef0c2..0000000000 --- a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/events/UpgradeStartedEvent.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -package org.sonatype.nexus.upgrade.datastore.events; - -import javax.annotation.Nullable; - -/** - * An event which is fired when a database migration is starting - */ -public class UpgradeStartedEvent - extends UpgradeEventSupport -{ - protected UpgradeStartedEvent() { - // deserialization - } - - public UpgradeStartedEvent(@Nullable final String user, final String schemaVersion, final String... migrations) { - super(user, schemaVersion, migrations); - } -} diff --git a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/internal/PostStartupUpgradeAuditor.java b/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/internal/PostStartupUpgradeAuditor.java deleted file mode 100644 index 7add804e93..0000000000 --- a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/internal/PostStartupUpgradeAuditor.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -package org.sonatype.nexus.upgrade.datastore.internal; - -import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.sonatype.nexus.common.app.ManagedLifecycle; -import org.sonatype.nexus.common.event.EventManager; -import org.sonatype.nexus.common.stateguard.StateGuardLifecycleSupport; -import org.sonatype.nexus.upgrade.datastore.events.UpgradeEventSupport; - -import static com.google.common.base.Preconditions.checkNotNull; -import static org.sonatype.nexus.common.app.ManagedLifecycle.Phase.TASKS; - -/** - * Stores auditable db upgrade events until after startup when auditing is enabled - */ -@Named -@Singleton -@ManagedLifecycle(phase = TASKS) -public class PostStartupUpgradeAuditor - extends StateGuardLifecycleSupport -{ - private final Queue events = new ConcurrentLinkedQueue<>(); - - private final EventManager eventManager; - - @Inject - public PostStartupUpgradeAuditor(final EventManager eventManager) { - this.eventManager = checkNotNull(eventManager); - } - - @Override - protected void doStart() { - events.forEach(eventManager::post); - events.clear(); - } - - public void post(final UpgradeEventSupport event) { - if (!isStarted()) { - events.add(event); - } - else { - // The service has started which means that the auditor should work if enabled. - eventManager.post(event); - } - } -} diff --git a/components/nexus-upgrade/src/test/java/org/sonatype/nexus/upgrade/datastore/internal/TestBaselineMigrationStep.java b/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/internal/UpgradeManager.java similarity index 62% rename from components/nexus-upgrade/src/test/java/org/sonatype/nexus/upgrade/datastore/internal/TestBaselineMigrationStep.java rename to components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/internal/UpgradeManager.java index 61063bd9c1..8649c7a3b7 100644 --- a/components/nexus-upgrade/src/test/java/org/sonatype/nexus/upgrade/datastore/internal/TestBaselineMigrationStep.java +++ b/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/internal/UpgradeManager.java @@ -12,23 +12,30 @@ */ package org.sonatype.nexus.upgrade.datastore.internal; -import java.sql.Connection; -import java.util.Optional; +import java.util.List; -import org.sonatype.goodies.common.ComponentSupport; +import javax.inject.Inject; +import javax.inject.Named; +import javax.inject.Singleton; + +import org.sonatype.nexus.datastore.api.DataStoreManager; import org.sonatype.nexus.upgrade.datastore.DatabaseMigrationStep; -public class TestBaselineMigrationStep - extends ComponentSupport - implements DatabaseMigrationStep +/** + * Upgrade manager for the Content database + * + * @since 3.29 + */ +@Named +@Singleton +public class UpgradeManager + extends UpgradeManagerSupport { - @Override - public Optional version() { - return Optional.of("1.8"); - } - - @Override - public void migrate(final Connection connection) throws Exception { - //nothing to do here + @Inject + public UpgradeManager( + final DataStoreManager dataStoreManager, + final List migrations) + { + super(dataStoreManager, DataStoreManager.DEFAULT_DATASTORE_NAME, migrations); } } diff --git a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/internal/UpgradeManagerImpl.java b/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/internal/UpgradeManagerImpl.java deleted file mode 100644 index e1bb857725..0000000000 --- a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/internal/UpgradeManagerImpl.java +++ /dev/null @@ -1,273 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -package org.sonatype.nexus.upgrade.datastore.internal; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; -import java.util.List; -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; - -import javax.annotation.Nullable; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; -import javax.sql.DataSource; - -import org.sonatype.goodies.common.ComponentSupport; -import org.sonatype.nexus.datastore.api.DataStoreManager; -import org.sonatype.nexus.upgrade.datastore.DatabaseMigrationStep; -import org.sonatype.nexus.upgrade.datastore.UpgradeException; -import org.sonatype.nexus.upgrade.datastore.UpgradeManager; -import org.sonatype.nexus.upgrade.datastore.events.UpgradeCompletedEvent; -import org.sonatype.nexus.upgrade.datastore.events.UpgradeFailedEvent; -import org.sonatype.nexus.upgrade.datastore.events.UpgradeStartedEvent; - -import com.google.common.annotations.VisibleForTesting; -import org.flywaydb.core.Flyway; -import org.flywaydb.core.api.FlywayException; -import org.flywaydb.core.api.MigrationInfo; -import org.flywaydb.core.api.MigrationInfoService; -import org.flywaydb.core.api.MigrationState; -import org.flywaydb.core.api.MigrationVersion; -import org.flywaydb.core.api.callback.Callback; -import org.flywaydb.core.api.migration.JavaMigration; -import org.flywaydb.core.api.output.MigrateResult; - -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * Support class for upgrade managers. - * - * @since 3.29 - */ -@Named -@Singleton -public class UpgradeManagerImpl - extends ComponentSupport - implements UpgradeManager -{ - private final List migrations; - - private final PostStartupUpgradeAuditor auditor; - - private final DataSource dataSource; - - @Inject - public UpgradeManagerImpl( - final DataStoreManager dataStoreManager, - final PostStartupUpgradeAuditor auditor, - final List migrations) - { - this.dataSource = checkNotNull(dataStoreManager).get(DataStoreManager.DEFAULT_DATASTORE_NAME) - .orElseThrow(() -> new IllegalStateException("Missing DataStore named: " + DataStoreManager.DEFAULT_DATASTORE_NAME)).getDataSource(); - this.migrations = checkVersionedMigrations(migrations); - this.auditor = checkNotNull(auditor); - } - - @Override - public void migrate(@Nullable final String user, final Collection nodeIds) throws UpgradeException { - Flyway flyway = createFlyway(); - - // Compute current state - MigrationInfoService info = flyway.info(); - - // Ensure we're not an old version of Nexus - checkSchemaVersionIsAcceptable(info); - - if (info.pending().length == 0) { - log.debug("No pending migrations, skipping"); - return; - } - - emitStarted(user, info); - - MigrateResult result; - try { - result = flyway.migrate(); - } - catch (FlywayException e) { - emitFailed(user, flyway, e.getMessage()); - throw new UpgradeException(e.getMessage(), e); - } - - emitCompleted(user, nodeIds, result); - - int repeatableMigrations = migrations.size() - ((Long) migrations.stream() - .map(DatabaseMigrationStep::version) - .filter(Optional::isPresent) - .count()) - .intValue(); - - if (result.migrationsExecuted > repeatableMigrations) { - result.migrations.forEach(m -> log.info("{} migrated to v{} in {}ms", m.description, m.version, m.executionTime)); - result.warnings.forEach(log::warn); - log.info("Completed migration from v{} to v{}", result.initialSchemaVersion, result.targetSchemaVersion); - } - else if (log.isDebugEnabled()) { - log.debug("No migrations occurred migration of {} from {} to {}", result.schemaName, result.initialSchemaVersion, - result.targetSchemaVersion); - } - } - - @Override - public boolean requiresMigration() { - return createFlyway().info().pending().length > 0; - } - - @Override - public Optional getCurrentVersion() { - return Optional.ofNullable(createFlyway().info().current()) - .map(MigrationInfo::getVersion); - } - - @Override - public void checkBaseline(final String target) { - Optional version = getCurrentVersion(); - Optional baseline = getBaseline(MigrationVersion.fromVersion(target)); - - if (version.isPresent() && baseline.isPresent() && !version.get().isAtLeast(baseline.get())) { - log.error("expected schema to be on baseline version (at least '{}') , shutting down", baseline.get()); - System.exit(1); - } - } - - /** - * Finds the baseline version required to be able to execute the target version i.e: - *

- * IF Target is 2.0 and - *
- * Previous versions are : [1.1 , 1.2 , 1.3 , 1.4 , 1.5] - * This method will return 1.5 , which is the minimum version allowed to start using 2.0 - *

- * - * @param target the version to execute - * @return a String {@link Optional} indicating the baseline version if found - */ - @VisibleForTesting - Optional getBaseline(MigrationVersion target) { - return migrations.stream() - .map(NexusJavaMigration::new) - .map(NexusJavaMigration::getVersion) - .filter(Objects::nonNull) - .filter(version -> version.getMajor().compareTo(target.getMajor()) < 0) - .sorted(Comparator.reverseOrder()) - .map(MigrationVersion::getVersion) - .findFirst(); - } - - @Override - public Optional getMaxMigrationVersion() { - return Arrays.stream(getMigrations()) - .map(JavaMigration::getVersion) - .filter(Objects::nonNull) - .max(MigrationVersion::compareTo); - } - - @Override - public void checkSchemaVersionIsAcceptable() throws UpgradeException { - checkSchemaVersionIsAcceptable(createFlyway().info()); - } - - /** - * If migrations with 'future' state exist in db -- newer db schema detected - * - * @param flyway migration engine - * @return true if datastore can be used with current nxrm distribution, false otherwise - * @throws UpgradeException if the current schema does not match nexus. - */ - private void checkSchemaVersionIsAcceptable(final MigrationInfoService info) throws UpgradeException { - List missingMigrations = Arrays.stream(info.applied()) - .filter(migrationInfo -> migrationInfo.getState() == MigrationState.FUTURE_SUCCESS) - .map(MigrationInfo::getDescription) - .collect(Collectors.toList()); - - if (!missingMigrations.isEmpty()) { - log.error("Missing migrations: {}", missingMigrations); - } - - if (!missingMigrations.isEmpty()) { - log.error("Missing migrations: {}", missingMigrations); - throw new UpgradeException("The database appears to be from a later version of Nexus Repository"); - } - } - - private void emitStarted(@Nullable final String user, final MigrationInfoService info) { - auditor.post(new UpgradeStartedEvent(user, info.getInfoResult().schemaVersion, Arrays.stream(info.pending()) - .map(MigrationInfo::getDescription) - .toArray(String[]::new))); - } - - private void emitFailed(@Nullable final String user, final Flyway flyway, final String errorMessage) { - // We invoke flyway.info() here to get the current state rather than pre-migration state. - auditor.post(new UpgradeFailedEvent(user, flyway.info().getInfoResult().schemaVersion, errorMessage)); - } - - private void emitCompleted(@Nullable final String user, final Collection nodeIds, final MigrateResult result) { - if (result.migrationsExecuted > 0) { - auditor.post(new UpgradeCompletedEvent(user, result.targetSchemaVersion, nodeIds, result.migrations.stream() - .map(m -> m.description) - .toArray(String[]::new))); - } - } - - /* - * Versioned migrations must be part of public source code and not feature flagged. - */ - private List checkVersionedMigrations(final List migrations) { - checkNotNull(migrations); - - List failures = migrations.stream() - .filter(migration -> migration.version().isPresent()) - .map(Object::getClass) - .map(Class::getName) - .filter(className -> !className.startsWith("org.sonatype")) - .collect(Collectors.toList()); - - if (!failures.isEmpty()) { - throw new IllegalArgumentException( - "The following migration steps are invalid: " + failures.stream().collect(Collectors.joining(", "))); - } - - return migrations; - } - - /* - * Creates a Flyway instances with the known migrations for use within the UpgradeManager - */ - private Flyway createFlyway() { - JavaMigration[] flywayMigrations = getMigrations(); - - if (log.isDebugEnabled()) { - migrations.forEach(m -> log.debug("Found migration: {} version:{}", m.getClass(), m.version())); - } - - return Flyway.configure() - .dataSource(dataSource) - .javaMigrations(flywayMigrations) - .callbacks(log.isTraceEnabled() ? new Callback[]{new TraceLoggingCallback()} : new Callback[0]) - .cleanDisabled(true) // don't empty the database - .group(false) // don't group all migrations into a single transaction - .ignoreMigrationPatterns("*:missing") // Removed plugins (e.g. Pro) - .baselineOnMigrate(true) // create flyway tables the first time migration is run - .locations(new String[0]) // disable scanning for scripts - .outOfOrder(true) - .load(); - } - - private JavaMigration[] getMigrations() { - return migrations.stream().map(NexusJavaMigration::new).toArray(JavaMigration[]::new); - } -} diff --git a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/internal/UpgradeManagerSupport.java b/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/internal/UpgradeManagerSupport.java new file mode 100644 index 0000000000..af5d293e08 --- /dev/null +++ b/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/internal/UpgradeManagerSupport.java @@ -0,0 +1,136 @@ +/* + * Sonatype Nexus (TM) Open Source Version + * Copyright (c) 2008-present Sonatype, Inc. + * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. + * + * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, + * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. + * + * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks + * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the + * Eclipse Foundation. All other trademarks are the property of their respective owners. + */ +package org.sonatype.nexus.upgrade.datastore.internal; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import javax.sql.DataSource; + +import org.sonatype.goodies.common.ComponentSupport; +import org.sonatype.nexus.datastore.api.DataStoreManager; +import org.sonatype.nexus.upgrade.datastore.DatabaseMigrationStep; + +import org.flywaydb.core.Flyway; +import org.flywaydb.core.api.MigrationInfo; +import org.flywaydb.core.api.MigrationState; +import org.flywaydb.core.api.callback.Callback; +import org.flywaydb.core.api.migration.JavaMigration; +import org.flywaydb.core.api.output.MigrateResult; + +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; + +/** + * Support class for upgrade managers. + * + * @since 3.29 + */ +abstract class UpgradeManagerSupport + extends ComponentSupport +{ + private final List migrations; + + private final DataSource dataSource; + + protected UpgradeManagerSupport( + final DataStoreManager dataStoreManager, + final String dataStoreName, + final List migrations) + { + this.dataSource = dataStoreManager.get(dataStoreName) + .orElseThrow(() -> new IllegalStateException("Missing DataStore named: " + dataStoreName)).getDataSource(); + this.migrations = checkVersionedMigrations(migrations); + } + + void migrate() { + JavaMigration[] flywayMigrations = migrations.stream().map(NexusJavaMigration::new).toArray(JavaMigration[]::new); + + if (log.isDebugEnabled()) { + migrations.forEach(m -> log.debug("Found migration: {} version:{}", m.getClass(), m.version())); + } + + Flyway flyway = Flyway.configure() + .dataSource(dataSource) + .javaMigrations(flywayMigrations) + .callbacks(log.isTraceEnabled() ? new Callback[]{new TraceLoggingCallback()} : new Callback[0]) + .cleanDisabled(true) // don't empty the database + .group(false) // don't group all migrations into a single transaction + .ignoreMigrationPatterns("*:missing") // Removed plugins (e.g. Pro) + .baselineOnMigrate(true) // create flyway tables the first time migration is run + .locations(new String[0]) // disable scanning for scripts + .outOfOrder(true) + .load(); + + MigrateResult result = flyway.migrate(); + + checkState(datastoreVersionIsAcceptable(flyway), + "The database appears to be from a later version of Nexus Repository"); + + int repeatableMigrations = migrations.size() - migrations.stream() + .map(E::version) + .filter(Optional::isPresent) + .collect(Collectors.counting()) + .intValue(); + + if (result.migrationsExecuted > repeatableMigrations) { + result.migrations.forEach(m -> log.info("{} migrated to v{} in {}ms", m.description, m.version, m.executionTime)); + result.warnings.forEach(log::warn); + log.info("Completed migration from v{} to v{}", result.initialSchemaVersion, result.targetSchemaVersion); + } + else if (log.isDebugEnabled()) { + log.debug("No migrations occurred migration of {} from {} to {}", result.schemaName, result.initialSchemaVersion, + result.targetSchemaVersion); + } + } + + /** + * If migrations with 'future' state exist in db -- newer db schema detected + * @param flyway migration engine + * @return true if datastore can be used with current nxrm distribution, false otherwise + */ + boolean datastoreVersionIsAcceptable(final Flyway flyway) { + List missingMigrations = Arrays.stream(flyway.info().applied()) + .filter(migrationInfo -> migrationInfo.getState() == MigrationState.FUTURE_SUCCESS) + .map(MigrationInfo::getDescription) + .collect(Collectors.toList()); + + if (!missingMigrations.isEmpty()) { + log.error("Missing migrations: {}", missingMigrations); + } + return missingMigrations.isEmpty(); + } + + /* + * Versioned migrations must be part of public source code and not feature flagged. + */ + private List checkVersionedMigrations(final List migrations) { + checkNotNull(migrations); + + List failures = migrations.stream() + .filter(migration -> migration.version().isPresent()) + .map(E::getClass) + .map(Class::getName) + .filter(className -> !className.startsWith("org.sonatype")) + .collect(Collectors.toList()); + + if (!failures.isEmpty()) { + throw new IllegalArgumentException( + "The following migration steps are invalid: " + failures.stream().collect(Collectors.joining(", "))); + } + + return migrations; + } +} diff --git a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/internal/UpgradeServiceImpl.java b/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/internal/UpgradeServiceImpl.java index 855e2a2127..ac4372402b 100644 --- a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/internal/UpgradeServiceImpl.java +++ b/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/internal/UpgradeServiceImpl.java @@ -16,12 +16,9 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.app.FeatureFlag; -import org.sonatype.nexus.common.app.FeatureFlags; import org.sonatype.nexus.common.app.ManagedLifecycle; import org.sonatype.nexus.common.stateguard.StateGuardLifecycleSupport; import org.sonatype.nexus.upgrade.UpgradeService; -import org.sonatype.nexus.upgrade.datastore.UpgradeManager; import static com.google.common.base.Preconditions.checkNotNull; import static org.sonatype.nexus.common.app.ManagedLifecycle.Phase.UPGRADE; @@ -32,7 +29,6 @@ * @since 3.29 */ @Named -@FeatureFlag(name = FeatureFlags.DATASTORE_CLUSTERED_ENABLED, inverse = true, enabledByDefault = true) @ManagedLifecycle(phase = UPGRADE) @Singleton public class UpgradeServiceImpl diff --git a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/internal/audit/UpgradeAuditor.java b/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/internal/audit/UpgradeAuditor.java deleted file mode 100644 index b70d086148..0000000000 --- a/components/nexus-upgrade/src/main/java/org/sonatype/nexus/upgrade/datastore/internal/audit/UpgradeAuditor.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -package org.sonatype.nexus.upgrade.datastore.internal.audit; - -import java.util.Map; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.sonatype.nexus.audit.AuditData; -import org.sonatype.nexus.audit.AuditorSupport; -import org.sonatype.nexus.common.app.ApplicationVersion; -import org.sonatype.nexus.common.event.EventAware; -import org.sonatype.nexus.common.event.EventHelper; -import org.sonatype.nexus.upgrade.datastore.events.UpgradeCompletedEvent; -import org.sonatype.nexus.upgrade.datastore.events.UpgradeEventSupport; -import org.sonatype.nexus.upgrade.datastore.events.UpgradeFailedEvent; -import org.sonatype.nexus.upgrade.datastore.events.UpgradeStartedEvent; - -import com.google.common.eventbus.Subscribe; - -import static com.google.common.base.Preconditions.checkNotNull; - -/** - * Captures events for audit logging database migrations. - */ -@Named -@Singleton -public class UpgradeAuditor - extends AuditorSupport - implements EventAware, EventAware.Asynchronous -{ - public static final String DOMAIN = "database-migration"; - - static final String COMPLETED = "completed"; - - static final String FAILED = "failed"; - - static final String STARTED = "started"; - - static final String MIGRATIONS = "migrations"; - - static final String NODE_IDS = "nodeIds"; - - static final String MESSAGE = "message"; - - static final String SCHEMA_VERSION = "schemaVersion"; - - static final String NEXUS_VERSION = "nexusVersion"; - - private final String nexusVersion; - - @Inject - public UpgradeAuditor(final ApplicationVersion applicationVersion) { - nexusVersion = checkNotNull(applicationVersion).getVersion(); - - registerType(UpgradeCompletedEvent.class, COMPLETED); - registerType(UpgradeFailedEvent.class, FAILED); - registerType(UpgradeStartedEvent.class, STARTED); - } - - /* - * Not concurrent as we want the events to be handled in order - */ - @Subscribe - public void on(final UpgradeEventSupport event) { - if (isRecording() && !EventHelper.isReplicating()) { - AuditData data = new AuditData(); - data.setDomain(DOMAIN); - data.setType(type(event.getClass())); - data.setContext(SYSTEM_CONTEXT); - data.setInitiator(event.getUser().orElse(SYSTEM_CONTEXT)); - - Map attributes = data.getAttributes(); - attributes.put(NEXUS_VERSION, nexusVersion); - event.getSchemaVersion() - .ifPresent(schemaVersion -> attributes.put(SCHEMA_VERSION, schemaVersion)); - - if (event instanceof UpgradeFailedEvent) { - attributes.put(MESSAGE, ((UpgradeFailedEvent) event).getErrorMessage()); - } - else { - attributes.put(MIGRATIONS, event.getMigrations()); - } - - if (event instanceof UpgradeCompletedEvent) { - attributes.put(NODE_IDS, ((UpgradeCompletedEvent) event).getNodeIds()); - } - - record(data); - } - } -} diff --git a/components/nexus-upgrade/src/test/java/org/sonatype/nexus/upgrade/datastore/events/UpgradeEventTest.java b/components/nexus-upgrade/src/test/java/org/sonatype/nexus/upgrade/datastore/events/UpgradeEventTest.java deleted file mode 100644 index bdb0c9503a..0000000000 --- a/components/nexus-upgrade/src/test/java/org/sonatype/nexus/upgrade/datastore/events/UpgradeEventTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -package org.sonatype.nexus.upgrade.datastore.events; - -import java.util.List; -import java.util.Optional; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import org.junit.Test; -import org.testcontainers.shaded.com.google.common.collect.ImmutableList; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - -/** - * Test Serialization/Deserialization {@link UpgradeEventSupport} sub-classes. - */ -public class UpgradeEventTest -{ - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().registerModule(new Jdk8Module()); - - @Test - public void testUpgradeStartedEvent_Deserialization() throws JsonProcessingException { - UpgradeStartedEvent upgradeStartedEvent = new UpgradeStartedEvent("admin", "1.0", "1.1", "1.2", "1.3"); - String event = OBJECT_MAPPER.writeValueAsString(upgradeStartedEvent); - UpgradeStartedEvent result = OBJECT_MAPPER.readValue(event, UpgradeStartedEvent.class); - assertThat(result.getUser(), is(Optional.of("admin"))); - assertThat(result.getSchemaVersion(), is(Optional.of("1.0"))); - assertThat(result.getMigrations(), is(new String[]{"1.1", "1.2", "1.3"})); - } - - @Test - public void testUpgradeCompletedEvent_Deserialization() throws JsonProcessingException { - List nodeIds = ImmutableList.of("node_1", "node_2"); - UpgradeCompletedEvent upgradeStartedEvent = new UpgradeCompletedEvent("admin", "1.0", nodeIds, "1.1", "1.2", "1.3"); - String event = OBJECT_MAPPER.writeValueAsString(upgradeStartedEvent); - UpgradeCompletedEvent result = OBJECT_MAPPER.readValue(event, UpgradeCompletedEvent.class); - assertThat(result.getUser(), is(Optional.of("admin"))); - assertThat(result.getNodeIds(), is(nodeIds)); - assertThat(result.getSchemaVersion(), is(Optional.of("1.0"))); - assertThat(result.getMigrations(), is(new String[]{"1.1", "1.2", "1.3"})); - } - - @Test - public void testUpgradeFailedEvent_Deserialization() throws JsonProcessingException { - UpgradeFailedEvent upgradeStartedEvent = new UpgradeFailedEvent("admin", "1.0", "Error", "1.1", "1.2", "1.3"); - String event = OBJECT_MAPPER.writeValueAsString(upgradeStartedEvent); - UpgradeFailedEvent result = OBJECT_MAPPER.readValue(event, UpgradeFailedEvent.class); - assertThat(result.getUser(), is(Optional.of("admin"))); - assertThat(result.getSchemaVersion(), is(Optional.of("1.0"))); - assertThat(result.getErrorMessage(), is("Error")); - assertThat(result.getMigrations(), is(new String[]{"1.1", "1.2", "1.3"})); - } -} diff --git a/components/nexus-upgrade/src/test/java/org/sonatype/nexus/upgrade/datastore/internal/UpgradeManagerImplTest.java b/components/nexus-upgrade/src/test/java/org/sonatype/nexus/upgrade/datastore/internal/UpgradeManagerTest.java similarity index 60% rename from components/nexus-upgrade/src/test/java/org/sonatype/nexus/upgrade/datastore/internal/UpgradeManagerImplTest.java rename to components/nexus-upgrade/src/test/java/org/sonatype/nexus/upgrade/datastore/internal/UpgradeManagerTest.java index 7edd4c24f5..d83bad29b6 100644 --- a/components/nexus-upgrade/src/test/java/org/sonatype/nexus/upgrade/datastore/internal/UpgradeManagerImplTest.java +++ b/components/nexus-upgrade/src/test/java/org/sonatype/nexus/upgrade/datastore/internal/UpgradeManagerTest.java @@ -23,12 +23,7 @@ import org.sonatype.nexus.datastore.api.DataStore; import org.sonatype.nexus.datastore.api.DataStoreManager; import org.sonatype.nexus.testdb.DataSessionRule; -import org.sonatype.nexus.upgrade.datastore.DatabaseMigrationStep; -import org.sonatype.nexus.upgrade.datastore.UpgradeException; -import org.sonatype.nexus.upgrade.datastore.events.UpgradeCompletedEvent; -import org.sonatype.nexus.upgrade.datastore.events.UpgradeStartedEvent; -import org.flywaydb.core.api.MigrationVersion; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -39,15 +34,10 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.verifyNoInteractions; -import static org.mockito.Mockito.verifyNoMoreInteractions; -import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; import static org.sonatype.nexus.datastore.api.DataStoreManager.DEFAULT_DATASTORE_NAME; -public class UpgradeManagerImplTest +public class UpgradeManagerTest extends TestSupport { @Rule @@ -56,19 +46,16 @@ public class UpgradeManagerImplTest @Mock DataStoreManager dataStoreManager; - @Mock - private PostStartupUpgradeAuditor auditor; - TestMigrationStep migrationStep = new TestMigrationStep(); @Before - public void setUp() { + public void setUp() throws Exception { when(dataStoreManager.get(DEFAULT_DATASTORE_NAME)).thenReturn(getDataStore()); } @Test public void testNoUpgrades() throws Exception { - UpgradeManagerImpl upgradeManager = new UpgradeManagerImpl(dataStoreManager, auditor, emptyList()); + UpgradeManager upgradeManager = new UpgradeManager(dataStoreManager, emptyList()); upgradeManager.migrate(); @@ -86,14 +73,11 @@ public void testNoUpgrades() throws Exception { } } } - - // No changes should fire no events - verifyNoInteractions(auditor); } @Test public void testExampleUpgrade() throws Exception { - UpgradeManagerImpl upgradeManager = new UpgradeManagerImpl(dataStoreManager, auditor, singletonList(migrationStep)); + UpgradeManager upgradeManager = new UpgradeManager(dataStoreManager, singletonList(migrationStep)); upgradeManager.migrate(); @@ -120,34 +104,28 @@ public void testExampleUpgrade() throws Exception { } } } - - // Migrations should trigger events - verify(auditor).post(any(UpgradeStartedEvent.class)); - verify(auditor).post(any(UpgradeCompletedEvent.class)); - verifyNoMoreInteractions(auditor); } - @Test(expected = UpgradeException.class) - public void testWithDatastoreFromFuture() throws UpgradeException { + @Test(expected = IllegalStateException.class) + public void testWithDatastoreFromFuture() { FutureMigrationStep futureMigrationStep = new FutureMigrationStep(); - UpgradeManagerImpl upgradeManagerWithFutureMigration = new UpgradeManagerImpl(dataStoreManager, auditor, + UpgradeManager upgradeManagerWithFutureMigration = new UpgradeManager(dataStoreManager, Arrays.asList(migrationStep, futureMigrationStep)); upgradeManagerWithFutureMigration.migrate(); - UpgradeManagerImpl upgradeManagerWithoutFuture = new UpgradeManagerImpl(dataStoreManager, auditor, singletonList(migrationStep)); + UpgradeManager upgradeManagerWithoutFuture = new UpgradeManager(dataStoreManager, singletonList(migrationStep)); upgradeManagerWithoutFuture.migrate(); } @Test - public void testUpgradeSkippedStep() throws SQLException, UpgradeException { + public void testUpgradeSkippedStep() throws SQLException { FutureMigrationStep futureMigrationStep = new FutureMigrationStep(); - UpgradeManagerImpl - upgradeManager = new UpgradeManagerImpl(dataStoreManager, auditor, Arrays.asList(migrationStep, futureMigrationStep)); + UpgradeManager upgradeManager = new UpgradeManager(dataStoreManager, Arrays.asList(migrationStep, futureMigrationStep)); upgradeManager.migrate(); SkippedMigrationStep skippedMigrationStep = new SkippedMigrationStep(); - UpgradeManagerImpl upgradeManagerWithSkipped = new UpgradeManagerImpl(dataStoreManager, auditor, Arrays.asList(migrationStep, futureMigrationStep, skippedMigrationStep)); + UpgradeManager upgradeManagerWithSkipped = new UpgradeManager(dataStoreManager, Arrays.asList(migrationStep, futureMigrationStep, skippedMigrationStep)); upgradeManagerWithSkipped.migrate(); try (Connection conn = getConnection()) { @@ -162,30 +140,6 @@ public void testUpgradeSkippedStep() throws SQLException, UpgradeException { } } - @Test - public void testMaxMigrations() { - FutureMigrationStep futureMigrationStep = new FutureMigrationStep(); - - UpgradeManagerImpl upgradeManagerWithFutureMigration = new UpgradeManagerImpl(dataStoreManager, auditor, - Arrays.asList(new NullVersionMigration(), migrationStep, futureMigrationStep)); - - assertThat(upgradeManagerWithFutureMigration.getMaxMigrationVersion().get().getVersion(), equalTo("4.5.6")); - } - - @Test - public void testGetBaselineWorksAsExpected() { - TestBaselineMigrationStep baselineMigrationStep = new TestBaselineMigrationStep(); - FutureMigrationStep futureMigrationStep = new FutureMigrationStep(); - - UpgradeManagerImpl upgradeManager = new UpgradeManagerImpl(dataStoreManager, auditor, - Arrays.asList(migrationStep, baselineMigrationStep, futureMigrationStep)); - - Optional baseline = upgradeManager.getBaseline(MigrationVersion.fromVersion("2.0")); - - assertTrue(baseline.isPresent()); - assertThat(baseline.get(), equalTo(baselineMigrationStep.version().get())); - } - private Optional> getDataStore() { return dataSessionRule.getDataStore(DEFAULT_DATASTORE_NAME); } @@ -196,19 +150,4 @@ private Connection getConnection() throws SQLException { .getDataSource() .getConnection(); } - - /** - * Some MigrationSteps do not have a version - */ - private static class NullVersionMigration - implements DatabaseMigrationStep - { - @Override - public Optional version() { - return Optional.empty(); - } - - @Override - public void migrate(final Connection connection) throws Exception { } - } } diff --git a/components/nexus-upgrade/src/test/java/org/sonatype/nexus/upgrade/datastore/internal/audit/UpgradeAuditorTest.java b/components/nexus-upgrade/src/test/java/org/sonatype/nexus/upgrade/datastore/internal/audit/UpgradeAuditorTest.java deleted file mode 100644 index 52cbaa03db..0000000000 --- a/components/nexus-upgrade/src/test/java/org/sonatype/nexus/upgrade/datastore/internal/audit/UpgradeAuditorTest.java +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -package org.sonatype.nexus.upgrade.datastore.internal.audit; - -import java.util.Collection; -import java.util.Collections; -import java.util.Map; - -import org.sonatype.goodies.testsupport.TestSupport; -import org.sonatype.nexus.audit.AuditData; -import org.sonatype.nexus.audit.AuditRecorder; -import org.sonatype.nexus.common.app.ApplicationVersion; -import org.sonatype.nexus.upgrade.datastore.events.UpgradeCompletedEvent; -import org.sonatype.nexus.upgrade.datastore.events.UpgradeFailedEvent; -import org.sonatype.nexus.upgrade.datastore.events.UpgradeStartedEvent; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.Mock; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import static org.sonatype.nexus.upgrade.datastore.internal.audit.UpgradeAuditor.COMPLETED; -import static org.sonatype.nexus.upgrade.datastore.internal.audit.UpgradeAuditor.DOMAIN; -import static org.sonatype.nexus.upgrade.datastore.internal.audit.UpgradeAuditor.FAILED; -import static org.sonatype.nexus.upgrade.datastore.internal.audit.UpgradeAuditor.MESSAGE; -import static org.sonatype.nexus.upgrade.datastore.internal.audit.UpgradeAuditor.MIGRATIONS; -import static org.sonatype.nexus.upgrade.datastore.internal.audit.UpgradeAuditor.NEXUS_VERSION; -import static org.sonatype.nexus.upgrade.datastore.internal.audit.UpgradeAuditor.NODE_IDS; -import static org.sonatype.nexus.upgrade.datastore.internal.audit.UpgradeAuditor.SCHEMA_VERSION; -import static org.sonatype.nexus.upgrade.datastore.internal.audit.UpgradeAuditor.STARTED; - -public class UpgradeAuditorTest - extends TestSupport -{ - private static final String V3_99 = "3.99"; - - private static final String ERROR_MSG = "Something unfortunate occurred"; - - private static final String FOO_1_38 = "Foo_1.38"; - - private static final String V1_38 = "1.38"; - - private static final String V1_37 = "1.37"; - - private static final String USER = "timmy"; - - @Mock - private AuditRecorder recorder; - - @Mock - private ApplicationVersion applicationVersion; - - @Captor - private ArgumentCaptor auditDataCaptor; - - private UpgradeAuditor underTest; - - @Before - public void setup() { - when(applicationVersion.getVersion()).thenReturn(V3_99); - underTest = new UpgradeAuditor(applicationVersion); - underTest.setAuditRecorder(() -> recorder); - - when(recorder.isEnabled()).thenReturn(true); - } - - @Test - public void testOn_UpgradeCompletedEvent() { - Collection nodeIds = Collections.singletonList("my-node-id"); - underTest.on(new UpgradeCompletedEvent(USER, V1_38, nodeIds, FOO_1_38)); - - verify(recorder).record(auditDataCaptor.capture()); - - AuditData recorded = auditDataCaptor.getValue(); - assertAuditDataWithNodes(recorded, COMPLETED, USER, V1_38, V3_99, FOO_1_38, nodeIds); - } - - @Test - public void testOn_UpgradeFailedEvent() { - underTest.on(new UpgradeFailedEvent(USER, V1_38, ERROR_MSG)); - - verify(recorder).record(auditDataCaptor.capture()); - - AuditData recorded = auditDataCaptor.getValue(); - assertAuditDataWithError(recorded, FAILED, USER, V1_38, V3_99, ERROR_MSG); - } - - @Test - public void testOn_UpgradeStartedEvent() { - underTest.on(new UpgradeStartedEvent(USER, V1_37, FOO_1_38)); - - verify(recorder).record(auditDataCaptor.capture()); - - AuditData recorded = auditDataCaptor.getValue(); - assertAuditDataWithMigration(recorded, STARTED, USER, V1_37, V3_99, FOO_1_38); - } - - /* - * The schema version can be null when migration during the first Nexus start - */ - @Test - public void testOn_UpgradeStartedEvent_nullSchema() { - underTest.on(new UpgradeStartedEvent(USER, null, FOO_1_38)); - - verify(recorder).record(auditDataCaptor.capture()); - - AuditData recorded = auditDataCaptor.getValue(); - assertAuditDataWithMigration(recorded, STARTED, USER, null, V3_99, FOO_1_38); - } - - /* - * The user can be null when an upgrade occurs during startup - */ - @Test - public void testOn_nullUser() { - underTest.on(new UpgradeStartedEvent(null, V1_37, FOO_1_38)); - - verify(recorder).record(auditDataCaptor.capture()); - - AuditData recorded = auditDataCaptor.getValue(); - assertAuditDataWithMigration(recorded, STARTED, "system", V1_37, V3_99, FOO_1_38); - } - - private static void assertAuditData( - final AuditData actual, - final String type, - final String user, - final String schemaVersion, - final String nexusVersion) - { - assertThat(actual.getContext(), is("system")); - assertThat(actual.getDomain(), is(DOMAIN)); - assertThat(actual.getInitiator(), is(user)); - assertThat(actual.getType(), is(type)); - - Map actualAttributes = actual.getAttributes(); - assertThat(actualAttributes.get(SCHEMA_VERSION), is(schemaVersion)); - assertThat(actualAttributes.get(NEXUS_VERSION), is(nexusVersion)); - } - - private static void assertAuditDataWithMigration( - final AuditData actual, - final String type, - final String user, - final String schemaVersion, - final String nexusVersion, - final String migrations) - { - assertAuditData(actual, type, user, schemaVersion, nexusVersion); - assertThat(((String[]) (actual.getAttributes().get(MIGRATIONS)))[0], is(migrations)); - } - - private static void assertAuditDataWithNodes( - final AuditData actual, - final String type, - final String user, - final String schemaVersion, - final String nexusVersion, - final String migrations, - final Collection nodeIds) - { - assertAuditDataWithMigration(actual, type, user, schemaVersion, nexusVersion, migrations); - assertThat(actual.getAttributes().get(NODE_IDS), is(nodeIds)); - } - - private static void assertAuditDataWithError( - final AuditData actual, - final String type, - final String user, - final String schemaVersion, - final String nexusVersion, - final String error) - { - assertAuditData(actual, type, user, schemaVersion, nexusVersion); - assertThat(actual.getAttributes().get(MESSAGE), is(error)); - } -} diff --git a/mvnw b/mvnw index 41c0f0c23d..ac8e247e1c 100755 --- a/mvnw +++ b/mvnw @@ -19,292 +19,232 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Maven Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir +# Apache Maven Wrapper startup batch script, version 3.3.1 # # Optional ENV vars # ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output # ---------------------------------------------------------------------------- -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac -fi +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 fi fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" +} - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" done + printf %x\\n $h +} - saveddir=`pwd` +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } - M2_HOME=`dirname "$PRG"`/.. +die() { + printf %s\\n "$1" >&2 + exit 1 +} - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl="${value-}" ;; + distributionSha256Sum) distributionSha256Sum="${value-}" ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_HOME="$HOME/.m2/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" fi -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" -fi +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" fi -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi +mkdir -p -- "${MAVEN_HOME%/*}" -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" fi -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; fi -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` - fi - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f - fi - - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" +clean || : +exec_maven "$@" diff --git a/mvnw.cmd b/mvnw.cmd index 86115719e5..7b0c0943b2 100644 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -1,3 +1,4 @@ +<# : batch portion @REM ---------------------------------------------------------------------------- @REM Licensed to the Apache Software Foundation (ASF) under one @REM or more contributor license agreements. See the NOTICE file @@ -18,165 +19,128 @@ @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- -@REM Maven Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir +@REM Apache Maven Wrapper startup batch script, version 3.3.1 @REM @REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output @REM ---------------------------------------------------------------------------- -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - -FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) ) -@REM End of extension - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/nxrm.groovy b/nxrm.groovy index 2a5f0092cc..8ebba5da05 100644 --- a/nxrm.groovy +++ b/nxrm.groovy @@ -44,6 +44,9 @@ import org.rauschig.jarchivelib.ArchiveFormat import org.rauschig.jarchivelib.ArchiverFactory import com.google.common.base.Stopwatch import java.nio.charset.StandardCharsets +import java.nio.file.Files +import java.nio.file.Path +import groovy.xml.XmlNodePrinter import static com.aestasit.infrastructure.ssh.DefaultSsh.* import static java.time.ZoneId.systemDefault @@ -59,9 +62,10 @@ TARGET_DIR = "target" LOCK_FILE = "$TARGET_DIR/sonatype-work/nexus3/lock" SONATYPE_WORK = "$TARGET_DIR/sonatype-work" SONATYPE_WORK_BACKUP = System.getProperty("java.io.tmpdir") + "/nxrm-sonatype-work" -TAKARI_SMART_BUILD_VERSION = "0.5.0" -TAKARI_LOCAL_REPO_VERSION = "0.11.2" +TAKARI_SMART_BUILD_VERSION = "0.6.6" +TAKARI_LOCAL_REPO_VERSION = "0.11.3" TAKARI_FILE_MANAGER_VERSION = "0.8.3" +MAVEN_BUILD_CACHE_VERSION = "1.2.0" env = System.getenv() changedProjects = [] as Set @@ -70,7 +74,7 @@ cliOptions = null positionalOptions = null buildLog = new File("build.log") -// test projects - generated with command: for i in `find -name pom.xml`; do cd `dirname $i`; xmllint --xpath "//*[local-name()='project']/*[local-name()='artifactId']/text()" pom.xml; cd -; done +// test projects - generated with command: for i in `find -name pom.xml`; do cd `dirname $i`; xmllint --xpath "//*[local-name()='project']/*[local-name()='artifactId']/text()" pom.xml; cd -; done testProjects = [':functional-testsuite', ':nexus-analytics-testsupport', ':nexus-contributedhandler-testsupport', ':nexus-docker-testsupport-internal', ':nexus-ldap-testsupport', ':nexus-migration-testsupport', ':nexus-repository-testsupport-internal', ':nexus-saml-testsupport', ':nexus-stress-testsuite', ':nexus-testlm-edition', ':nexus-testsuite-data', ':nexus-upgrade-testsupport', ':nexuspro-fabric-testsuite', ':nexuspro-migration-testsuite', ':nexuspro-modern-testsuite', ':nexuspro-performance-testsuite', ':nexuspro-sql-fabric-testsuite', ':nexuspro-testsuite', ':nxrm-pro-image', ':pax-exam-spock', ':selenide-functional-tests' ] /** @@ -87,6 +91,7 @@ testProjects = [':functional-testsuite', ':nexus-analytics-testsupport', ':nexus elastic=false takari=false deploy=true + caching=false //backup=false //restore=false //tests="custom Maven test arguments here" @@ -106,6 +111,7 @@ configDefaults = [ orient : true, // Orient access (binary/Studio) is enabled by default elastic : false, // Elastic is disabled by default takari : false, // Takari is disabled by default + caching : false, // Maven build caching disabled by default deploy : true, // Deployment is performed by default backup : false, // Backup sonatype-work disabled by default restore : false, // Restore backup of sonatype-work disabled by default @@ -609,49 +615,65 @@ def processSourceArgs() { } def processBuilder() { + def mvnDir = Paths.get('.mvn/') + def extensionsPath = mvnDir.resolve('extensions.xml') + + if (Files.notExists(mvnDir)) { + Files.createDirectories(mvnDir) + } + + if (Files.notExists(extensionsPath)) { + Files.createFile(extensionsPath).write """ +""" + } + + def extensionsXml = new XmlParser(false, false).parse(extensionsPath.toFile()) + if (rcConfig.takari) { rcConfig.builder = "--builder smart -T 1C" - File file = new File('.mvn/extensions.xml') - if (file.exists() && file.text.contains("takari-smart-builder")) { - debug("Takari enabled and detected in .mvn/extensions.xml") - } - else { - error("Takari enabled but not detected in .mvn/extensions.xml") - warn("Installing Takari now") - if (file.exists()) { - error(".mvn/extensions.xml already exists. Unable to install Takari") - rcConfig.builder = "" + if (!extensionsXml.'**'.artifactId*.children()*.first()*.trim().contains('takari-smart-builder')) { + error('Takari enabled but not detected in .mvn/extensions.xml') + warn('Installing Takari now') + + extensionsXml.children() << new NodeBuilder().extension { + groupId('io.takari.maven') + artifactId('takari-smart-builder') + version(TAKARI_SMART_BUILD_VERSION) + } << new NodeBuilder().extension { + groupId('io.takari.aether') + artifactId('takari-local-repository') + version(TAKARI_LOCAL_REPO_VERSION) + } << new NodeBuilder().extension { + groupId('io.takari') + artifactId('takari-filemanager') + version(TAKARI_FILE_MANAGER_VERSION) } - else { - file.write """ - - io.takari.maven - takari-smart-builder - ${TAKARI_SMART_BUILD_VERSION} - - - io.takari.aether - takari-local-repository - ${TAKARI_LOCAL_REPO_VERSION} - - - io.takari - takari-filemanager - ${TAKARI_FILE_MANAGER_VERSION} - -""" - info("Takari enabled!") - } - sleep(3000) + + new XmlNodePrinter(new PrintWriter(Files.newBufferedWriter(extensionsPath))).print(extensionsXml) } } else if (cliOptions['single-threaded']) { rcConfig.builder = '' } + + if (rcConfig.caching) { + if (!extensionsXml.'**'.artifactId*.children()*.first()*.trim().contains('maven-build-cache-extension')) { + error('Maven Build Cache Extension enabled but not detected in .mvn/extensions.xml') + warn('Installing Maven Build Cache Extension now') + + extensionsXml.children() << new NodeBuilder().extension { + groupId('org.apache.maven.extensions') + artifactId('maven-build-cache-extension') + version(MAVEN_BUILD_CACHE_VERSION) + } + + new XmlNodePrinter(new PrintWriter(Files.newBufferedWriter(extensionsPath))).print(extensionsXml) + } + } } def processMavenCommand() { diff --git a/plugins/nexus-audit-plugin/src/main/java/org/sonatype/nexus/audit/internal/AuditCapability.java b/plugins/nexus-audit-plugin/src/main/java/org/sonatype/nexus/audit/internal/AuditCapability.java index 30a1fedc99..adba3c1598 100644 --- a/plugins/nexus-audit-plugin/src/main/java/org/sonatype/nexus/audit/internal/AuditCapability.java +++ b/plugins/nexus-audit-plugin/src/main/java/org/sonatype/nexus/audit/internal/AuditCapability.java @@ -31,7 +31,6 @@ import org.sonatype.nexus.capability.Condition; import org.sonatype.nexus.capability.Tag; import org.sonatype.nexus.capability.Taggable; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.FormField; import static com.google.common.base.Preconditions.checkNotNull; @@ -113,7 +112,6 @@ public Configuration(final Map properties) { } } - @AvailabilityVersion(from = "1.0") @Named(AuditCapability.TYPE_ID) @Singleton public static class Descriptor diff --git a/plugins/nexus-blobstore-s3/src/main/java/org/sonatype/nexus/blobstore/s3/internal/S3BlobStoreDescriptor.java b/plugins/nexus-blobstore-s3/src/main/java/org/sonatype/nexus/blobstore/s3/internal/S3BlobStoreDescriptor.java index 5c9395fb22..566d85ea56 100644 --- a/plugins/nexus-blobstore-s3/src/main/java/org/sonatype/nexus/blobstore/s3/internal/S3BlobStoreDescriptor.java +++ b/plugins/nexus-blobstore-s3/src/main/java/org/sonatype/nexus/blobstore/s3/internal/S3BlobStoreDescriptor.java @@ -39,7 +39,6 @@ import org.sonatype.nexus.blobstore.s3.internal.encryption.S3ManagedEncrypter; import org.sonatype.nexus.blobstore.s3.internal.ui.S3Component; import org.sonatype.nexus.blobstore.s3.internal.ui.S3RegionXO; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.FormField; import com.amazonaws.services.s3.model.Region; @@ -61,7 +60,6 @@ * * @since 3.6.1 */ -@AvailabilityVersion(from = "1.0") @Named(S3BlobStoreDescriptor.TYPE) public class S3BlobStoreDescriptor extends BlobStoreDescriptorSupport diff --git a/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/compact/internal/CompactBlobStoreTaskDescriptor.java b/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/compact/internal/CompactBlobStoreTaskDescriptor.java index 0a7a65c714..b9f7a38d99 100644 --- a/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/compact/internal/CompactBlobStoreTaskDescriptor.java +++ b/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/compact/internal/CompactBlobStoreTaskDescriptor.java @@ -16,7 +16,6 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.ComboboxFormField; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; @@ -27,7 +26,6 @@ * * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class CompactBlobStoreTaskDescriptor diff --git a/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/deletetemp/DeleteBlobstoreTempFilesTaskDescriptor.java b/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/deletetemp/DeleteBlobstoreTempFilesTaskDescriptor.java index dab31a08d3..b661d7cbab 100644 --- a/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/deletetemp/DeleteBlobstoreTempFilesTaskDescriptor.java +++ b/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/deletetemp/DeleteBlobstoreTempFilesTaskDescriptor.java @@ -16,7 +16,6 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.ComboboxFormField; import org.sonatype.nexus.formfields.NumberTextFormField; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; @@ -24,7 +23,6 @@ import static org.sonatype.nexus.formfields.FormField.MANDATORY; import static org.sonatype.nexus.formfields.FormField.OPTIONAL; -@AvailabilityVersion(from = "1.0") @Named @Singleton public class DeleteBlobstoreTempFilesTaskDescriptor diff --git a/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/metrics/reconcile/RecalculateBlobStoreSizeTask.java b/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/metrics/reconcile/RecalculateBlobStoreSizeTask.java index 416487eaa7..4c2bfdc16d 100644 --- a/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/metrics/reconcile/RecalculateBlobStoreSizeTask.java +++ b/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/metrics/reconcile/RecalculateBlobStoreSizeTask.java @@ -14,7 +14,6 @@ import java.util.Objects; import java.util.concurrent.atomic.AtomicLong; - import javax.inject.Inject; import javax.inject.Named; @@ -24,7 +23,6 @@ import org.sonatype.nexus.blobstore.api.metrics.BlobStoreMetricsService; import org.sonatype.nexus.blobstore.common.BlobStoreTaskSupport; import org.sonatype.nexus.blobstore.group.BlobStoreGroup; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.logging.task.ProgressLogIntervalHelper; import org.sonatype.nexus.logging.task.TaskLogging; import org.sonatype.nexus.scheduling.Cancelable; @@ -34,7 +32,6 @@ import static org.sonatype.nexus.logging.task.TaskLogType.TASK_LOG_ONLY; -@AvailabilityVersion(from = "1.0") @Named @TaskLogging(TASK_LOG_ONLY) public class RecalculateBlobStoreSizeTask diff --git a/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/metrics/reconcile/RecalculateBlobStoreSizeTaskDescriptor.java b/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/metrics/reconcile/RecalculateBlobStoreSizeTaskDescriptor.java index 8189bc8c65..2310ee57ca 100644 --- a/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/metrics/reconcile/RecalculateBlobStoreSizeTaskDescriptor.java +++ b/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/metrics/reconcile/RecalculateBlobStoreSizeTaskDescriptor.java @@ -16,7 +16,6 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.ComboboxFormField; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; @@ -26,7 +25,6 @@ /** * Task descriptor for {@link RecalculateBlobStoreSizeTask} */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class RecalculateBlobStoreSizeTaskDescriptor diff --git a/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/restore/datastore/RestoreMetadataTaskDescriptor.java b/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/restore/datastore/RestoreMetadataTaskDescriptor.java index 8953c972c3..313d2c5a8d 100644 --- a/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/restore/datastore/RestoreMetadataTaskDescriptor.java +++ b/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/restore/datastore/RestoreMetadataTaskDescriptor.java @@ -16,12 +16,10 @@ import javax.inject.Singleton; import org.sonatype.nexus.blobstore.restore.BaseRestoreMetadataTaskDescriptor; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; /** * @since 3.4 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class RestoreMetadataTaskDescriptor diff --git a/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/restore/orient/OrientRestoreMetadataTaskDescriptor.java b/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/restore/orient/OrientRestoreMetadataTaskDescriptor.java index cfcc624554..176bee7966 100644 --- a/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/restore/orient/OrientRestoreMetadataTaskDescriptor.java +++ b/plugins/nexus-blobstore-tasks/src/main/java/org/sonatype/nexus/blobstore/restore/orient/OrientRestoreMetadataTaskDescriptor.java @@ -16,12 +16,10 @@ import javax.inject.Singleton; import org.sonatype.nexus.blobstore.restore.BaseRestoreMetadataTaskDescriptor; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; /** * @since 3.4 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class OrientRestoreMetadataTaskDescriptor diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeAlert.jsx b/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeAlert.jsx deleted file mode 100644 index bd4552d4fd..0000000000 --- a/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeAlert.jsx +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ - -import React, {useState} from 'react'; -import PropTypes from "prop-types"; -import axios from 'axios'; - -import {NxButton, NxButtonBar, NxErrorAlert, NxInfoAlert, NxSuccessAlert, NxLoadingSpinner} from '@sonatype/react-shared-components'; -import {ExtJS} from '@sonatype/nexus-ui-plugin'; - -import UIStrings from '../../constants/UIStrings'; -import {UpgradeAlertFunctions} from './UpgradeAlertHelper'; - -import './UpgradeAlert.scss'; -import UpgradeTriggerModal from './UpgradeTriggerModal'; - -const {UPGRADE_ALERT: { PENDING, PROGRESS, ERROR, COMPLETE}} = UIStrings; - -export default function UpgradeAlert({onClose}) { - const hasUser = ExtJS.useState(UpgradeAlertFunctions.hasUser); - const state = ExtJS.useState(UpgradeAlertFunctions.currentState); - const message = ExtJS.useState(UpgradeAlertFunctions.message); - const hasPermission = ExtJS.usePermission(UpgradeAlertFunctions.checkPermissions); - const [showModal, setShowModal] = useState(false); - - function dismissAlert() { - onClose(); - axios.delete('/service/rest/clustered/upgrade-database-schema') - } - - return <> - {state === 'needsUpgrade' && hasUser && hasPermission && - - -
-
{PENDING.LABEL} 
-
{PENDING.TEXT}
-
- setShowModal(true)}> - {PENDING.FINALIZE_BUTTON} - -
-
- } - {state === 'needsUpgrade' && hasUser && hasPermission && - - } - - {state === 'versionMismatch' && hasUser && hasPermission && - - {ERROR.LABEL} (1) - {ERROR.TEXT_MISMATCH} {ERROR.CONTACT_SUPPORT} - - } - {state === 'nexusUpgradeInProgress' && hasUser && hasPermission && - - {PROGRESS.LABEL} - - } - {state === 'nexusUpgradeError' && hasUser && hasPermission && - - {ERROR.LABEL} [{message}] {ERROR.TEXT} {ERROR.CONTACT_SUPPORT} - - } - {state === 'nexusUpgradeComplete' && hasUser && hasPermission && - - -
-
{COMPLETE.LABEL}
-
{COMPLETE.TEXT}
-
- - {COMPLETE.DISMISS} - -
-
- } - -} - -UpgradeAlert.propTypes = { - onClose: PropTypes.func -} diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeAlert.scss b/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeAlert.scss deleted file mode 100644 index 8e5d88b3a9..0000000000 --- a/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeAlert.scss +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ - -.nx-upgrade-alert { - margin: 0; - width: 100%; - max-width: 100%; -} - -.upgrade-in-progress-alert { - text-align: center; -} - -.upgrade-alert-btn-bar { - width: 100%; - justify-content: space-between; -} - -.alert-text { - display: inline-flex; -} diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeAlert.test.jsx b/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeAlert.test.jsx deleted file mode 100644 index 6541bda515..0000000000 --- a/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeAlert.test.jsx +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -import React from 'react'; -import {render, screen} from '@testing-library/react'; -import {when} from 'jest-when'; -import {ExtJS} from '@sonatype/nexus-ui-plugin'; - -import UIStrings from '../../constants/UIStrings'; -import UpgradeAlert from './UpgradeAlert'; -import {UpgradeAlertFunctions} from './UpgradeAlertHelper'; - -const {UPGRADE_ALERT: {PENDING, PROGRESS, ERROR, COMPLETE}} = UIStrings; - -jest.mock('axios', () => ({ - ...jest.requireActual('axios'), - get: jest.fn() -})); - -jest.mock('@sonatype/nexus-ui-plugin', () => ({ - ...jest.requireActual('@sonatype/nexus-ui-plugin'), - ExtJS: { - state: jest.fn().mockReturnValue({ - getValue: jest.fn(), - }), - useState: jest.fn(), - usePermission: jest.fn(), - }, -})); - -const selectors = { - getAlert: () => screen.getByRole('alert'), - getCompleteUpgradeButton: () => screen.getByRole('button', {name: 'Finalize Upgrade'}), - getCloseButton: () => screen.getByRole('button', {name: 'Dismiss'}) -}; - -describe('Upgrade Alert', () => { - async function renderView(currentState, message, onClose = null) { - when(ExtJS.state().getValue) - .calledWith('dbUpgrade') - .mockReturnValue({currentState: currentState, message: message}); - - when(ExtJS.useState) - .calledWith(UpgradeAlertFunctions.hasUser) - .mockReturnValue('true'); - - when(ExtJS.useState) - .calledWith(UpgradeAlertFunctions.currentState) - .mockReturnValue(currentState); - - when(ExtJS.useState) - .calledWith(UpgradeAlertFunctions.message) - .mockReturnValue(message); - - when(ExtJS.usePermission) - .calledWith(UpgradeAlertFunctions.checkPermissions) - .mockReturnValue(true); - - return render(); - }; - - it('renders the upgrade alert for pending upgrade', async () => { - const {getCompleteUpgradeButton} = selectors; - const {container} = await renderView('needsUpgrade'); - - const alert = container.querySelector('.nx-alert'); - const alertMessage = PENDING.LABEL + ' ' + PENDING.TEXT; - - expect(alert).toBeInTheDocument(); - expect(alert).toHaveTextContent(alertMessage); - expect(getCompleteUpgradeButton()).toBeInTheDocument(); - }); - - it('renders the upgrade alert for node version mismatch', async () => { - const {getAlert} = selectors; - await renderView('versionMismatch'); - - const alertMessage = ERROR.LABEL + ' (1) ' + ERROR.TEXT_MISMATCH; - - expect(getAlert()).toBeInTheDocument(); - expect(getAlert()).toHaveTextContent(alertMessage); - }); - - it('renders the upgrade alert for upgrade in progress', async () => { - const {container} = await renderView('nexusUpgradeInProgress'); - const alert = container.querySelector('.nx-alert'); - const alertMessage = PROGRESS.LABEL; - - expect(alert).toBeInTheDocument(); - expect(alert).toHaveTextContent(alertMessage); - }); - - it('renders the upgrade alert for upgrade error', async () => { - const {getAlert} = selectors; - await renderView('nexusUpgradeError', "Failed, retry"); - - const alertMessage = ERROR.LABEL + ' [Failed, retry] ' + ERROR.TEXT; - - expect(getAlert()).toBeInTheDocument(); - expect(getAlert()).toHaveTextContent(alertMessage); - }); - - it('renders the upgrade alert for completed upgrade', async () => { - const {getCloseButton} = selectors; - const onClose = jest.fn(); - - const {container} = await renderView('nexusUpgradeComplete', onClose); - - const alert = container.querySelector('.nx-alert'); - const alertMessage = COMPLETE.LABEL + ' ' + COMPLETE.TEXT; - - expect(alert).toBeInTheDocument(); - expect(alert).toHaveTextContent(alertMessage); - expect(getCloseButton()).toBeInTheDocument(); - }); -}); diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeAlertHelper.js b/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeAlertHelper.js deleted file mode 100644 index 8e4921ee4a..0000000000 --- a/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeAlertHelper.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Open Source Version is distributed with Sencha Ext JS pursuant to a FLOSS Exception agreed upon - * between Sonatype, Inc. and Sencha Inc. Sencha Ext JS is licensed under GPL v3 and cannot be redistributed as part of a - * closed source work. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ - -import {ExtJS} from '@sonatype/nexus-ui-plugin'; - -const DB_UPGRADE_DEFAULT = {currentState: null, message: null}; - -export const UpgradeAlertFunctions = { - currentState: () => ExtJS.state().getValue('dbUpgrade', DB_UPGRADE_DEFAULT).currentState, - message: () => ExtJS.state().getValue('dbUpgrade', DB_UPGRADE_DEFAULT).message, - hasUser: () => !Ext.isEmpty(NX.State.getUser()), - checkPermissions: () => ExtJS.checkPermission('nexus:*') -} diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeTriggerMachine.js b/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeTriggerMachine.js deleted file mode 100644 index 426fc413ea..0000000000 --- a/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeTriggerMachine.js +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Open Source Version is distributed with Sencha Ext JS pursuant to a FLOSS Exception agreed upon - * between Sonatype, Inc. and Sencha Inc. Sencha Ext JS is licensed under GPL v3 and cannot be redistributed as part of a - * closed source work. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ - -import {ExtJS} from "@sonatype/nexus-ui-plugin"; -import axios from "axios"; -import {createMachine} from "xstate"; - -const UpgradeTriggerMachine = createMachine({ - id: 'UpgradeTriggerMachine', - initial: 'loaded', - states: { - loaded: { - on: { - SAVE_MODAL: { - target: 'triggerUpdate' - } - } - }, - triggerUpdate: { - invoke: { - src: 'triggerUpdate', - onDone: { - target: 'loaded', - actions: 'closeModal' - }, - } - } - }, - }, - { - actions: { - closeModal: () => ExtJS.state().setValue('dbUpgrade', {currentState: 'nexusUpgradeInProgress'}) - }, - services: { - triggerUpdate: () => axios.post('/service/rest/clustered/upgrade-database-schema') - } - }); - -export default UpgradeTriggerMachine; diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeTriggerModal.jsx b/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeTriggerModal.jsx deleted file mode 100644 index 573e4d40ee..0000000000 --- a/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeTriggerModal.jsx +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ - -import React from 'react'; -import {NxModal, NxH2, NxButton, NxButtonBar, NxFooter, NxFieldset, NxCheckbox, useToggle} from '@sonatype/react-shared-components'; -import {useMachine} from '@xstate/react'; - -import UIStrings from '../../constants/UIStrings'; -import UpgradeTriggerMachine from './UpgradeTriggerMachine'; -import './UpgradeTriggerModal.scss'; - -const {TRIGGER_MODAL: { TITLE, DESCRIPTION, CHECKBOX_LABEL, CANCEL, CONTINUE}} = UIStrings; - -export default function UpgradeTriggerModal({showModal, setShowModal}) { - const [state, send] = useMachine(UpgradeTriggerMachine, {devTools: true}); - const [isChecked, onCheck] = useToggle(false); - - function saveModal() { - send('SAVE_MODAL'); - setShowModal(false); - } - - return <> - {showModal && - setShowModal(false)} aria-labelledby="zero-downtime-trigger-upgrade-modal"> -
- {TITLE} -
-
- {DESCRIPTION} -
-
- - - {CHECKBOX_LABEL} - - -
- - - setShowModal(false)}>{CANCEL} - saveModal()}>{CONTINUE} - - -
- } - -} diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeTriggerModal.scss b/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeTriggerModal.scss deleted file mode 100644 index 99dcf99dd8..0000000000 --- a/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeTriggerModal.scss +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ - -.zdt-trigger-description{ - margin-top: var(--nx-spacing-6x); -} - -.upgrade-trigger-checkbox { - .nx-checkbox__content { - white-space: normal; - } - - .nx-checkbox__box { - margin-bottom: var(--nx-spacing-12x); - } -} - -.trigger-upgrade-fieldset { - margin: var(--nx-spacing-4x) 0px; - - .nx-legend__text { - margin-top: var(--nx-spacing-4x); - margin-bottom: var(--nx-spacing-2x); - } -} diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeTriggerModal.test.jsx b/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeTriggerModal.test.jsx deleted file mode 100644 index 2878958993..0000000000 --- a/plugins/nexus-coreui-plugin/src/frontend/src/components/UpgradeAlert/UpgradeTriggerModal.test.jsx +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -import React from 'react'; -import {render} from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; -import axios from 'axios'; -import UpgradeTriggerModal from './UpgradeTriggerModal'; - -jest.mock('axios', () => ({ - post: jest.fn() -})); - -describe('UpgradeTriggerModal', () => { - it('renders the modal when showModal is true with the text', () => { - const {getByText} = render(); - - expect(getByText('Proceed with upgrade?')).toBeInTheDocument(); - expect(getByText('We highly recommend backing up your data before proceeding.')).toBeInTheDocument(); - }); - - it('calls setShowModal with false when the cancel button is clicked', () => { - const setShowModal = jest.fn(); - const {getByText} = render(); - - userEvent.click(getByText('Cancel')); - - expect(setShowModal).toHaveBeenCalledWith(false); - expect(axios.post).toHaveBeenCalledTimes(0); - }); - - it('calls put request when the save button is clicked', () => { - const setShowModal = jest.fn(); - const {getByText, getByRole} = render(); - - expect(getByText('Continue')).toBeDisabled(); - - userEvent.click(getByRole('checkbox')); - userEvent.click(getByText('Continue')); - - expect(getByText('Continue')).not.toBeDisabled(); - expect(setShowModal).toHaveBeenCalledWith(false); - expect(axios.post).toHaveBeenCalledTimes(1); - expect(axios.post).toHaveBeenCalledWith('/service/rest/clustered/upgrade-database-schema'); - }); -}); diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/admin/MetricHealth/MetricHealthList.jsx b/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/admin/MetricHealth/MetricHealthList.jsx index 94c91c4546..eead601c2b 100644 --- a/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/admin/MetricHealth/MetricHealthList.jsx +++ b/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/admin/MetricHealth/MetricHealthList.jsx @@ -38,8 +38,6 @@ import UIStrings from '../../../../constants/UIStrings'; import MetricHealthListMachine from './MetricHealthListMachine'; -import UpgradeAlert from './UpgradeAlert'; - const {METRIC_HEALTH} = UIStrings; export default function MetricHealthList({onEdit}) { @@ -68,7 +66,6 @@ export default function MetricHealthList({onEdit}) { - diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/admin/MetricHealth/MetricHealthList.test.jsx b/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/admin/MetricHealth/MetricHealthList.test.jsx index fcd3c3b9eb..dfda82924d 100644 --- a/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/admin/MetricHealth/MetricHealthList.test.jsx +++ b/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/admin/MetricHealth/MetricHealthList.test.jsx @@ -20,7 +20,7 @@ import userEvent from '@testing-library/user-event'; import {values, pick, ascend, descend, sort, prop} from 'ramda'; import axios from 'axios'; import TestUtils from '@sonatype/nexus-ui-plugin/src/frontend/src/interface/TestUtils'; -import {APIConstants, ExtJS} from '@sonatype/nexus-ui-plugin'; +import {APIConstants} from '@sonatype/nexus-ui-plugin'; import MetricHealthList from './MetricHealthList'; import {nodes} from './MetricHealth.testdata'; import {convert} from './MetricHealthListMachine'; @@ -59,9 +59,6 @@ describe('MetricHealthList', () => { }; const renderView = async () => { - jest.spyOn(ExtJS, 'useState').mockReturnValue({}); - jest.spyOn(ExtJS, 'usePermission').mockReturnValue({}); - const result = render(); await waitForElementToBeRemoved(TestUtils.selectors.queryLoadingMask()); return result; diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/admin/MetricHealth/UpgradeAlert.jsx b/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/admin/MetricHealth/UpgradeAlert.jsx deleted file mode 100644 index 410417d3d8..0000000000 --- a/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/admin/MetricHealth/UpgradeAlert.jsx +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -import React, {useState} from 'react'; - -import {NxButton, NxButtonBar, NxInfoAlert, useToggle, NxWarningAlert} from '@sonatype/react-shared-components'; -import {ExtJS} from '@sonatype/nexus-ui-plugin'; -import {UpgradeAlertFunctions} from '../../../UpgradeAlert/UpgradeAlertHelper'; -import UIStrings from '../../../../constants/UIStrings'; -import UpgradeTriggerModal from '../../../UpgradeAlert/UpgradeTriggerModal'; -const {UPGRADE_ALERT: {PENDING, WARN}} = UIStrings; - -export default function UpgradeAlert() { - - const hasUser = ExtJS.useState(UpgradeAlertFunctions.hasUser); - const state = ExtJS.useState(UpgradeAlertFunctions.currentState); - const hasPermission = ExtJS.usePermission(UpgradeAlertFunctions.checkPermissions); - const [isOpen, dismiss] = useToggle(true); - const [showModal, setShowModal] = useState(false); - - return ( - <> - {state === 'needsUpgrade' && hasUser && hasPermission && - - {PENDING.STATUS_LABEL}  - {PENDING.TEXT} - - setShowModal(true)}> - {PENDING.FINALIZE_BUTTON} - - - - } - {state === 'needsUpgrade' && hasUser && hasPermission && - - } - - {state === 'versionMismatch' && hasUser && hasPermission && isOpen && - - {WARN.LABEL}  - {WARN.TEXT} - - } - {state === 'nexusNeedsUpgrade1Year' && hasUser && hasPermission && - - {PENDING.OLDER_LABEL}  - {PENDING.YEAR_OLD_TEXT} - - } - {state === 'nexusNeeds18MonthsUpgrade' && hasUser && hasPermission && - - {PENDING.OLDER_LABEL}  - {PENDING.TEXT_18_MONTHS} - - } - - ) -} diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/admin/MetricHealth/UpgradeAlert.test.jsx b/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/admin/MetricHealth/UpgradeAlert.test.jsx deleted file mode 100644 index ef86bcf880..0000000000 --- a/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/admin/MetricHealth/UpgradeAlert.test.jsx +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -import React from 'react'; -import {render, screen} from '@testing-library/react'; -import {when} from 'jest-when'; -import {ExtJS} from '@sonatype/nexus-ui-plugin'; - -import UIStrings from '../../../../constants/UIStrings'; -import UpgradeAlert from './UpgradeAlert'; -import {UpgradeAlertFunctions} from '../../../UpgradeAlert/UpgradeAlertHelper'; -const {UPGRADE_ALERT: {PENDING, WARN}} = UIStrings; - -jest.mock('axios', () => ({ - ...jest.requireActual('axios'), - get: jest.fn() -})); - -jest.mock('@sonatype/nexus-ui-plugin', () => ({ - ...jest.requireActual('@sonatype/nexus-ui-plugin'), - ExtJS: { - state: jest.fn().mockReturnValue({ - getValue: jest.fn(), - }), - useState: jest.fn(), - usePermission: jest.fn(), - }, -})); - -describe('Upgrade Alert', () => { - async function renderView(currentState, onClose = null) { - when(ExtJS.state().getValue) - .calledWith('dbUpgrade') - .mockReturnValue({currentState: currentState}); - - when(ExtJS.useState) - .calledWith(UpgradeAlertFunctions.hasUser) - .mockReturnValue('true'); - - when(ExtJS.useState) - .calledWith(UpgradeAlertFunctions.currentState) - .mockReturnValue(currentState); - - when(ExtJS.usePermission) - .calledWith(UpgradeAlertFunctions.checkPermissions) - .mockReturnValue(true); - - return render(); - }; - - it('renders the status upgrade alert for pending upgrade', async () => { - const {container} = await renderView('needsUpgrade'); - const alert = container.querySelector('.nx-alert'); - const alertMessage = PENDING.STATUS_LABEL + ' ' + PENDING.TEXT; - - expect(alert).toBeInTheDocument(); - expect(alert).toHaveTextContent(alertMessage); - expect(screen.getByRole('button', {name: 'Finalize Upgrade'})).toBeInTheDocument(); - }); - - it('renders the status upgrade alert for node version mismatch', async () => { - const onClose = jest.fn(); - - const {container} = await renderView('versionMismatch', onClose); - const alert = container.querySelector('.nx-alert'); - const alertMessage = WARN.LABEL + ' ' + WARN.TEXT; - - expect(alert).toBeInTheDocument(); - expect(alert).toHaveTextContent(alertMessage); - expect(screen.getByRole('button', {name: 'Close'})).toBeInTheDocument(); - }); - - - it('renders the status upgrade alert for older than 1 year', async () => { - const {container} = await renderView('nexusNeedsUpgrade1Year'); - - const alert = container.querySelector('.nx-alert'); - const alertMessage = PENDING.OLDER_LABEL + ' You are currently running a Sonatype Nexus Repository version that is ' + - 'in extended maintenance. See our Sunsetting information for details about our product development lifecycle. ' + - 'Also see our release notes to learn more about the newest Nexus Repository version available for your instance.'; - - expect(alert).toBeInTheDocument(); - expect(alert).toHaveTextContent(alertMessage); - }); - - it('renders the status upgrade alert for older than 18 months', async () => { - const {container} = await renderView('nexusNeeds18MonthsUpgrade'); - - const alert = container.querySelector('.nx-alert'); - const alertMessage = PENDING.OLDER_LABEL + ' You are currently running a sunsetted Sonatype Nexus Repository version. ' + - 'See our Sunsetting information for details about our product development lifecycle. Also see our release notes to ' + - 'learn more about the newest Nexus Repository version available for your instance.'; - - expect(alert).toBeInTheDocument(); - expect(alert).toHaveTextContent(alertMessage); - }); -}); diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/user/Welcome/UpgradeModal.jsx b/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/user/Welcome/UpgradeModal.jsx deleted file mode 100644 index fcc45b76ac..0000000000 --- a/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/user/Welcome/UpgradeModal.jsx +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -import React, {useEffect} from 'react'; - -import {ExtJS} from '@sonatype/nexus-ui-plugin'; -import {useMachine} from '@xstate/react'; -import UIStrings from '../../../../constants/UIStrings'; -import {NxModal, NxButton, NxButtonBar, NxFooter, NxH2, NxH3, NxCloseButton} from '@sonatype/react-shared-components'; - -import UpgradeModalMachine from './UpgradeModalMachine'; -import './MarketingUpgradeModal.scss' - -const {UPGRADE_MODAL: {HEADER, ABOUT, BENEFITS}} = UIStrings; - -export default function UpgradeModal() { - const [state, send] = useMachine(UpgradeModalMachine, { - devTools: true - }); - - const zeroDowntimeMarketingModalClosed = ExtJS.useState(() => ExtJS.state().getValue('zeroDowntimeMarketingModalClosed')); - const onboarding = !ExtJS.useState(() => ExtJS.state().getValue('onboarding.required')); - const showModalFlag = ExtJS.state().getValue('zero.downtime.marketing.modal'); - const isHA = ExtJS.state().getValue('nexus.datastore.clustered.enabled'); - const hasUser = ExtJS.useUser() ?? false; - const hasPermissions = ExtJS.usePermission(() => ExtJS.checkPermission('nexus:*'), [hasUser]) - const modalCloseHandler = () => send({ type: 'CLOSE_AND_SAVE' }); - - useEffect(() => { - if (showModalFlag && onboarding && isHA && hasPermissions && hasUser && zeroDowntimeMarketingModalClosed === false) { - send({ type: 'OPEN_MODAL' }); - } else { - send({ type: 'CLOSE_MODAL' }); - } - }, [zeroDowntimeMarketingModalClosed, hasPermissions, onboarding]); - - return <> - {state.matches('open') && -
- {HEADER.TITLE} - -
-
- Sonatype Nexus Repository logo - {ABOUT.TITLE} -

{ABOUT.DESCRIPTION}

- {BENEFITS.TITLE} -
    -
  • {BENEFITS.LIST.ITEM1}
  • -
  • {BENEFITS.LIST.ITEM2}
  • -
  • {BENEFITS.LIST.ITEM3}
  • -
-

{BENEFITS.NOTES}

-
- - - Dismiss - - -
} - -} diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/user/Welcome/UpgradeModal.test.jsx b/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/user/Welcome/UpgradeModal.test.jsx deleted file mode 100644 index efeff4db9e..0000000000 --- a/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/user/Welcome/UpgradeModal.test.jsx +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -import React from 'react'; -import {render, screen} from '@testing-library/react'; -import {when} from 'jest-when'; -import userEvent from '@testing-library/user-event'; -import {ExtJS} from '@sonatype/nexus-ui-plugin'; -import UpgradeModal from './UpgradeModal'; -import UIStrings from '../../../../constants/UIStrings'; - -const {UPGRADE_MODAL: {HEADER, ABOUT, BENEFITS}} = UIStrings; - -jest.mock('@sonatype/nexus-ui-plugin', () => ({ - ...jest.requireActual('@sonatype/nexus-ui-plugin'), - ExtJS: { - state: jest.fn().mockReturnValue({ - getValue: jest.fn(), - }), - useState: jest.fn(), - usePermission: jest.fn(), - useUser: jest.fn(), - }, -})); - -describe('UpgradeModal', () => { - - beforeEach(() => { - jest.spyOn(ExtJS, 'useState').mockReturnValue(false); - jest.spyOn(ExtJS, 'usePermission').mockReturnValue(true); - jest.spyOn(ExtJS, 'useUser').mockImplementation(() => 'admin'); - - when(ExtJS.state().getValue) - .calledWith('zero.downtime.marketing.modal') - .mockReturnValue(true); - - when(ExtJS.state().getValue) - .calledWith('nexus.datastore.clustered.enabled') - .mockReturnValue(true); - }); - - it('renders the modal when required values are set', () => { - render(); - const getCloseButton = screen.getByRole('button', {name: 'Dismiss'}); - const modal = screen.getByRole('dialog'); - - expect(modal).toHaveTextContent(HEADER.TITLE); - expect(modal).toHaveTextContent(ABOUT.TITLE + ABOUT.DESCRIPTION); - expect(modal).toHaveTextContent(BENEFITS.TITLE); - expect(modal).toHaveTextContent(BENEFITS.LIST.ITEM1 + BENEFITS.LIST.ITEM2 + BENEFITS.LIST.ITEM3); - expect(getCloseButton).toBeInTheDocument(); - - userEvent.click(getCloseButton); - - expect(modal).not.toBeInTheDocument(); - }); - - it('closes when clicking the X button in the header', () => { - render(); - const getCloseButton = screen.getByRole('button', {name: 'Close'}); - const modal = screen.getByRole('dialog'); - - expect(modal).toBeInTheDocument(); - expect(getCloseButton).toBeInTheDocument(); - - userEvent.click(getCloseButton); - - expect(modal).not.toBeInTheDocument(); - }); -}); diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/user/Welcome/UpgradeModalMachine.js b/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/user/Welcome/UpgradeModalMachine.js deleted file mode 100644 index 61b63cbf66..0000000000 --- a/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/user/Welcome/UpgradeModalMachine.js +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Open Source Version is distributed with Sencha Ext JS pursuant to a FLOSS Exception agreed upon - * between Sonatype, Inc. and Sencha Inc. Sencha Ext JS is licensed under GPL v3 and cannot be redistributed as part of a - * closed source work. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -import {Machine} from 'xstate'; -import Axios from 'axios'; -import {ExtJS} from "@sonatype/nexus-ui-plugin"; - -export default Machine( - { - id: 'UpgradeModalMachine', - initial: 'closed', - states: { - closed: { - on: { - OPEN_MODAL: { - target: 'open' - } - } - }, - open: { - on: { - CLOSE_AND_SAVE: { - target: 'saving' - }, - CLOSE_MODAL: { - target: 'closed', - } - }, - }, - saving: { - invoke: { - src: 'saveData', - onDone: { - target: 'closed', - actions: ['closeModal'] - } - } - } - }, - }, - { - actions: { - closeModal: () => ExtJS.state().setValue('zeroDowntimeMarketingModalClosed', true), - }, - services: { - saveData: () => Axios.put('/service/rest/internal/ui/upgradeModalOpened', {"zeroDowntimeMarketingModalClosed": true}) - } - }); diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/user/Welcome/Welcome.test.jsx b/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/user/Welcome/Welcome.test.jsx index c9b69cebec..904236618e 100644 --- a/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/user/Welcome/Welcome.test.jsx +++ b/plugins/nexus-coreui-plugin/src/frontend/src/components/pages/user/Welcome/Welcome.test.jsx @@ -74,8 +74,6 @@ describe('Welcome', function() { jest.spyOn(ExtJS, 'useUser').mockImplementation(() => user); jest.spyOn(ExtJS, 'state').mockReturnValue({ getUser: () => user, getValue: jest.fn()}); jest.spyOn(ExtJS, 'isProEdition').mockReturnValue({}); - jest.spyOn(ExtJS, 'useState').mockReturnValue({}); - jest.spyOn(ExtJS, 'usePermission').mockReturnValue({}); jest.spyOn(Object.getPrototypeOf(localStorage), 'getItem').mockImplementation(() => null); jest.spyOn(Object.getPrototypeOf(localStorage), 'setItem'); diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/constants/UIStrings.jsx b/plugins/nexus-coreui-plugin/src/frontend/src/constants/UIStrings.jsx index ff56cf777b..c41c3dfeeb 100644 --- a/plugins/nexus-coreui-plugin/src/frontend/src/constants/UIStrings.jsx +++ b/plugins/nexus-coreui-plugin/src/frontend/src/constants/UIStrings.jsx @@ -53,9 +53,6 @@ import TagsStrings from './pages/browse/tags/TagsStrings'; import UploadStrings from './pages/browse/upload/UploadStrings'; import NodesStrings from './pages/admin/system/NodesStrings'; import BrowseStrings from './pages/browse/browse/BrowseStrings'; -import UpgradeAlertStrings from './UpgradeAlertStrings'; -import UpgradeTriggerModalStrings from './UpgradeTriggerModalStrings'; -import ZDUMarketingModalStrings from './ZDUMarketingModalStrings'; export default { ...UIStrings, @@ -115,9 +112,6 @@ export default { ...AccountStrings, ...NuGetApiKeyStrings, ...UserTokenStrings, - ...UpgradeAlertStrings, - ...UpgradeTriggerModalStrings, - ...ZDUMarketingModalStrings, // other FORMAT_PLACEHOLDER: 'Format', diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/constants/UpgradeAlertStrings.jsx b/plugins/nexus-coreui-plugin/src/frontend/src/constants/UpgradeAlertStrings.jsx deleted file mode 100644 index 4cd2386f0d..0000000000 --- a/plugins/nexus-coreui-plugin/src/frontend/src/constants/UpgradeAlertStrings.jsx +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -import React from 'react'; -import {NxTextLink} from '@sonatype/react-shared-components'; - -export default { - UPGRADE_ALERT: { - PENDING: { - LABEL: 'Upgrade Pending.', - FINALIZE_BUTTON: 'Finalize Upgrade', - STATUS_LABEL: 'Complete Nexus Repository version upgrade.', - TEXT: 'New features and functionality will not be available until the upgrade process is complete.', - OLDER_LABEL: 'Nexus Repository versioning is out of date.', - YEAR_OLD_TEXT: <>You are currently running a Sonatype Nexus Repository version that is in extended maintenance. - See our - Sunsetting information for details about our product - development lifecycle. Also see our - release notes to learn more about the newest Nexus Repository version available for your instance., - TEXT_18_MONTHS: <>You are currently running a sunsetted Sonatype Nexus Repository version. - See our - Sunsetting information for details about our product development - lifecycle. Also see our - release notes to learn more about the newest Nexus Repository version available for your instance. - }, - - PROGRESS: { - LABEL: 'Upgrade in progress' - }, - - WARN: { - LABEL: 'Mixed Mode detected.', - TEXT: 'Nexus Repository detected that 1 or more node(s) are running different Nexus Repository versions. ' + - 'If you are in the process of upgrading your nodes, you can ignore this alert. Otherwise, ensure all nodes are on the same version as soon as possible.' - }, - - ERROR: { - LABEL: 'Upgrade Failed.', - TEXT: 'error occurred while trying update the nodes in your cluster.', - TEXT_MISMATCH: 'or more node(s) in your cluster is not running the same version of Nexus Repository.', - CONTACT_SUPPORT: <> - Contact support for assistance. - }, - - COMPLETE: { - LABEL: 'Upgrade Complete.', - TEXT: 'Any new functionality included in your upgrade is now available for all nodes in your cluster.', - DISMISS: 'Dismiss' - }, - } -}; diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/constants/UpgradeTriggerModalStrings.jsx b/plugins/nexus-coreui-plugin/src/frontend/src/constants/UpgradeTriggerModalStrings.jsx deleted file mode 100644 index dc1435d7ae..0000000000 --- a/plugins/nexus-coreui-plugin/src/frontend/src/constants/UpgradeTriggerModalStrings.jsx +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -import React from 'react'; - -export default { - TRIGGER_MODAL: { - TITLE: 'Proceed with upgrade?', - DESCRIPTION: <>After beginning the upgrade process, you will not be able to create new Nexus Repository instances or nodes - until the process is complete. We highly recommend backing up your data before proceeding., - CHECKBOX_LABEL: 'Checking this box acknowledges that you have backed up your instance, or are aware of the risk of ' + - 'proceeding without backing up your nodes.', - CANCEL: 'Cancel', - CONTINUE: 'Continue' - } -}; diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/constants/ZDUMarketingModalStrings.jsx b/plugins/nexus-coreui-plugin/src/frontend/src/constants/ZDUMarketingModalStrings.jsx deleted file mode 100644 index 1b5a8aae54..0000000000 --- a/plugins/nexus-coreui-plugin/src/frontend/src/constants/ZDUMarketingModalStrings.jsx +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Sonatype Nexus (TM) Open Source Version - * Copyright (c) 2008-present Sonatype, Inc. - * All rights reserved. Includes the third-party code listed at http://links.sonatype.com/products/nexus/oss/attributions. - * - * This program and the accompanying materials are made available under the terms of the Eclipse Public License Version 1.0, - * which accompanies this distribution and is available at http://www.eclipse.org/legal/epl-v10.html. - * - * Sonatype Nexus (TM) Professional Version is available from Sonatype, Inc. "Sonatype" and "Sonatype Nexus" are trademarks - * of Sonatype, Inc. Apache Maven is a trademark of the Apache Software Foundation. M2eclipse is a trademark of the - * Eclipse Foundation. All other trademarks are the property of their respective owners. - */ -import React from 'react'; -import {NxTextLink} from '@sonatype/react-shared-components'; - -export default { - UPGRADE_MODAL: { - HEADER: { - TITLE: 'New In Nexus Repository 3.69.0', - }, - ABOUT: { - TITLE: 'Upgrade Without Downtime', - DESCRIPTION: 'Upgrade all of your Sonatype Nexus Repository Pro instances in your highly available multi-node ' + - 'cluster without interrupting service availability' - }, - BENEFITS: { - TITLE: 'Benefits:', - NOTES: <>See the Nexus Repository 3.69.0 Release notes for full details., - LIST: { - ITEM1: 'Fast access to bug fixes and new features when you upgrade to the newest Nexus Repository version', - ITEM2: 'No downtime means your team can keep working while an upgrade takes place', - ITEM3: 'Monitor upgrade process right from the user interface' - } - } - } -}; diff --git a/plugins/nexus-coreui-plugin/src/frontend/src/index.js b/plugins/nexus-coreui-plugin/src/frontend/src/index.js index 7ee6c97d6b..9527d94c81 100644 --- a/plugins/nexus-coreui-plugin/src/frontend/src/index.js +++ b/plugins/nexus-coreui-plugin/src/frontend/src/index.js @@ -62,16 +62,12 @@ import Tags from './components/pages/browse/Tags/Tags'; import Upload from './components/pages/browse/Upload/Upload'; import Nodes from "./components/pages/admin/Nodes/NodeList"; import Browse from './components/pages/browse/Browse/Browse'; -import UpgradeAlert from './components/UpgradeAlert/UpgradeAlert'; import UsageMetricsAlert from './components/pages/user/Welcome/UsageMetricsAlert'; -import UpgradeModal from './components/pages/user/Welcome/UpgradeModal'; window.ReactComponents = { ...window.ReactComponents, AnalyzeApplication, - UpgradeAlert, - UsageMetricsAlert, - UpgradeModal + UsageMetricsAlert }; window.BlobStoreTypes = { @@ -609,7 +605,7 @@ window.plugins.push({ bundle: 'org.sonatype.nexus.plugins.nexus-coreui-plugin', featureFlags: [{ key: 'nexus.react.upload', - defaultValue: false + defaultValue: true }], permissions: [Permissions.COMPONENT.CREATE], }, diff --git a/plugins/nexus-coreui-plugin/src/main/java/org/sonatype/nexus/coreui/BlobStoreComponent.groovy b/plugins/nexus-coreui-plugin/src/main/java/org/sonatype/nexus/coreui/BlobStoreComponent.groovy index 34fb86d286..8ed288313e 100644 --- a/plugins/nexus-coreui-plugin/src/main/java/org/sonatype/nexus/coreui/BlobStoreComponent.groovy +++ b/plugins/nexus-coreui-plugin/src/main/java/org/sonatype/nexus/coreui/BlobStoreComponent.groovy @@ -22,7 +22,7 @@ import javax.validation.constraints.NotEmpty import javax.validation.constraints.NotNull import javax.validation.groups.Default -import org.sonatype.nexus.blobstore.BlobStoreDescriptorProvider +import org.sonatype.nexus.blobstore.BlobStoreDescriptor import org.sonatype.nexus.blobstore.api.BlobStore import org.sonatype.nexus.blobstore.api.BlobStoreConfiguration import org.sonatype.nexus.blobstore.api.BlobStoreException @@ -75,7 +75,7 @@ class BlobStoreComponent BlobStoreConfigurationStore store; @Inject - BlobStoreDescriptorProvider blobStoreDescriptorProvider; + Map blobStoreDescriptors @Inject Map quotaFactories @@ -183,7 +183,7 @@ class BlobStoreComponent @ExceptionMetered @RequiresPermissions('nexus:blobstores:read') List readTypes() { - List readTypes = blobStoreDescriptorProvider.get().collect { key, descriptor -> + List readTypes = blobStoreDescriptors.collect { key, descriptor -> new BlobStoreTypeXO( id: key, name: descriptor.name, diff --git a/plugins/nexus-coreui-plugin/src/main/java/org/sonatype/nexus/coreui/internal/DatastoreStateContributor.java b/plugins/nexus-coreui-plugin/src/main/java/org/sonatype/nexus/coreui/internal/DatastoreStateContributor.java index 728f024174..dd5a0f2c9d 100644 --- a/plugins/nexus-coreui-plugin/src/main/java/org/sonatype/nexus/coreui/internal/DatastoreStateContributor.java +++ b/plugins/nexus-coreui-plugin/src/main/java/org/sonatype/nexus/coreui/internal/DatastoreStateContributor.java @@ -19,7 +19,7 @@ import javax.inject.Singleton; import org.sonatype.nexus.rapture.StateContributor; -import org.sonatype.nexus.common.db.DatabaseCheck; +import org.sonatype.nexus.repository.db.DatabaseCheck; import com.google.common.collect.ImmutableMap; diff --git a/plugins/nexus-coreui-plugin/src/main/java/org/sonatype/nexus/coreui/internal/blobstore/BlobStoreUIResource.java b/plugins/nexus-coreui-plugin/src/main/java/org/sonatype/nexus/coreui/internal/blobstore/BlobStoreUIResource.java index b2ecd16316..618c675c7f 100644 --- a/plugins/nexus-coreui-plugin/src/main/java/org/sonatype/nexus/coreui/internal/blobstore/BlobStoreUIResource.java +++ b/plugins/nexus-coreui-plugin/src/main/java/org/sonatype/nexus/coreui/internal/blobstore/BlobStoreUIResource.java @@ -24,7 +24,7 @@ import javax.ws.rs.PathParam; import org.sonatype.goodies.common.ComponentSupport; -import org.sonatype.nexus.blobstore.BlobStoreDescriptorProvider; +import org.sonatype.nexus.blobstore.BlobStoreDescriptor; import org.sonatype.nexus.blobstore.api.BlobStore; import org.sonatype.nexus.blobstore.api.BlobStoreManager; import org.sonatype.nexus.blobstore.api.BlobStoreMetrics; @@ -57,7 +57,7 @@ public class BlobStoreUIResource private final BlobStoreConfigurationStore store; - private final BlobStoreDescriptorProvider blobStoreDescriptorProvider; + private final Map blobStoreDescriptors; private final List blobStoreQuotaTypes; @@ -67,13 +67,13 @@ public class BlobStoreUIResource public BlobStoreUIResource( final BlobStoreManager blobStoreManager, final BlobStoreConfigurationStore store, - final BlobStoreDescriptorProvider blobStoreDescriptorProvider, + final Map blobStoreDescriptors, final Map quotaFactories, final RepositoryManager repositoryManager) { this.blobStoreManager = checkNotNull(blobStoreManager); this.store = checkNotNull(store); - this.blobStoreDescriptorProvider = checkNotNull(blobStoreDescriptorProvider); + this.blobStoreDescriptors = checkNotNull(blobStoreDescriptors); this.blobStoreQuotaTypes = quotaFactories.entrySet().stream() .map(BlobStoreQuotaTypesUIResponse::new).collect(toList()); this.repositoryManager = checkNotNull(repositoryManager); @@ -86,7 +86,7 @@ public List listBlobStores() { return store.list().stream() .map(configuration -> { - final String typeId = blobStoreDescriptorProvider.get().get(configuration.getType()).getId(); + final String typeId = blobStoreDescriptors.get(configuration.getType()).getId(); BlobStoreMetrics metrics = Optional.ofNullable(blobStoreManager.get(configuration.getName())) .map(BlobStoreUIResource::getBlobStoreMetrics) .orElse(null); @@ -113,7 +113,7 @@ private static BlobStoreMetrics getBlobStoreMetrics(final BlobStore bs) { @GET @Path("/types") public List listBlobStoreTypes() { - return blobStoreDescriptorProvider.get().entrySet().stream().filter(entry -> entry.getValue().isEnabled()) + return blobStoreDescriptors.entrySet().stream().filter(entry -> entry.getValue().isEnabled()) .map(BlobStoreTypesUIResponse::new).collect(toList()); } diff --git a/plugins/nexus-coreui-plugin/src/main/java/org/sonatype/nexus/coreui/internal/upload/UploadStateContributor.java b/plugins/nexus-coreui-plugin/src/main/java/org/sonatype/nexus/coreui/internal/upload/UploadStateContributor.java index 6ca77ee9c2..7988813899 100644 --- a/plugins/nexus-coreui-plugin/src/main/java/org/sonatype/nexus/coreui/internal/upload/UploadStateContributor.java +++ b/plugins/nexus-coreui-plugin/src/main/java/org/sonatype/nexus/coreui/internal/upload/UploadStateContributor.java @@ -32,7 +32,7 @@ public class UploadStateContributor private final Map state; @Inject - public UploadStateContributor(@Named("${nexus.react.upload:-false}") final boolean featureFlag) { + public UploadStateContributor(@Named("${nexus.react.upload:-true}") final boolean featureFlag) { state = ImmutableMap.of("nexus.react.upload", featureFlag); } diff --git a/plugins/nexus-coreui-plugin/src/main/resources/static/rapture/NX/coreui/view/component/AnalyzeApplicationWindow.js b/plugins/nexus-coreui-plugin/src/main/resources/static/rapture/NX/coreui/view/component/AnalyzeApplicationWindow.js index 2549af356d..9b98da7c29 100644 --- a/plugins/nexus-coreui-plugin/src/main/resources/static/rapture/NX/coreui/view/component/AnalyzeApplicationWindow.js +++ b/plugins/nexus-coreui-plugin/src/main/resources/static/rapture/NX/coreui/view/component/AnalyzeApplicationWindow.js @@ -37,7 +37,7 @@ Ext.define('NX.coreui.view.component.AnalyzeApplicationWindow', { * @override */ hide: function() { - const modalWindow = this.child('nx-secondary-container'); + const modalWindow = this.child('nx-coreui-react-main-container'); this.remove(modalWindow); return this.callParent(arguments); }, @@ -48,7 +48,7 @@ Ext.define('NX.coreui.view.component.AnalyzeApplicationWindow', { show: function () { const me = this; this.add({ - xtype: 'nx-secondary-container', + xtype: 'nx-coreui-react-main-container', reactView: window.ReactComponents.AnalyzeApplication, reactViewProps: { componentModel: me.component, diff --git a/plugins/nexus-coreui-plugin/src/test/java/org/sonatype/nexus/coreui/BlobStoreComponentTest.groovy b/plugins/nexus-coreui-plugin/src/test/java/org/sonatype/nexus/coreui/BlobStoreComponentTest.groovy index cb471ee04f..5d25954e11 100644 --- a/plugins/nexus-coreui-plugin/src/test/java/org/sonatype/nexus/coreui/BlobStoreComponentTest.groovy +++ b/plugins/nexus-coreui-plugin/src/test/java/org/sonatype/nexus/coreui/BlobStoreComponentTest.groovy @@ -13,7 +13,6 @@ package org.sonatype.nexus.coreui import org.sonatype.nexus.blobstore.BlobStoreDescriptor -import org.sonatype.nexus.blobstore.BlobStoreDescriptorProvider import org.sonatype.nexus.blobstore.MockBlobStoreConfiguration import org.sonatype.nexus.blobstore.api.BlobStore import org.sonatype.nexus.blobstore.api.BlobStoreConfiguration @@ -48,19 +47,15 @@ class BlobStoreComponentTest BlobStoreTaskService blobStoreTaskService = Mock() - BlobStoreDescriptorProvider blobStoreDescriptorProvider = Mock() - @Subject BlobStoreComponent blobStoreComponent = new BlobStoreComponent(blobStoreManager: blobStoreManager, applicationDirectories: applicationDirectories, repositoryManager: repositoryManager, - blobStoreGroupService: { blobStoreGroupService }, blobStoreTaskService: blobStoreTaskService, - blobStoreDescriptorProvider: blobStoreDescriptorProvider) + blobStoreGroupService: { blobStoreGroupService }, blobStoreTaskService: blobStoreTaskService) def 'Read types returns descriptor data'() { given: 'A blobstore descriptor' - def blobStoreDescriptors = + blobStoreComponent.blobStoreDescriptors = [MyType: [getName: { -> 'MyType' }, getFormFields: { -> []}] as BlobStoreDescriptor] - _ * blobStoreDescriptorProvider.get() >> blobStoreDescriptors when: 'Reading blobstore types' def types = blobStoreComponent.readTypes() diff --git a/plugins/nexus-coreui-plugin/src/test/java/org/sonatype/nexus/coreui/internal/DatastoreStateContributorTest.java b/plugins/nexus-coreui-plugin/src/test/java/org/sonatype/nexus/coreui/internal/DatastoreStateContributorTest.java index 3bd49063ea..4e65654ab3 100644 --- a/plugins/nexus-coreui-plugin/src/test/java/org/sonatype/nexus/coreui/internal/DatastoreStateContributorTest.java +++ b/plugins/nexus-coreui-plugin/src/test/java/org/sonatype/nexus/coreui/internal/DatastoreStateContributorTest.java @@ -13,7 +13,7 @@ package org.sonatype.nexus.coreui.internal; import org.sonatype.goodies.testsupport.TestSupport; -import org.sonatype.nexus.common.db.DatabaseCheck; +import org.sonatype.nexus.repository.db.DatabaseCheck; import org.junit.Test; diff --git a/plugins/nexus-coreui-plugin/src/test/java/org/sonatype/nexus/coreui/internal/blobstore/BlobStoreUIResourceTest.java b/plugins/nexus-coreui-plugin/src/test/java/org/sonatype/nexus/coreui/internal/blobstore/BlobStoreUIResourceTest.java index 31e23bba22..c2f3586a19 100644 --- a/plugins/nexus-coreui-plugin/src/test/java/org/sonatype/nexus/coreui/internal/blobstore/BlobStoreUIResourceTest.java +++ b/plugins/nexus-coreui-plugin/src/test/java/org/sonatype/nexus/coreui/internal/blobstore/BlobStoreUIResourceTest.java @@ -20,7 +20,6 @@ import org.sonatype.goodies.testsupport.TestSupport; import org.sonatype.nexus.blobstore.BlobStoreDescriptor; -import org.sonatype.nexus.blobstore.BlobStoreDescriptorProvider; import org.sonatype.nexus.blobstore.MockBlobStoreConfiguration; import org.sonatype.nexus.blobstore.api.BlobStore; import org.sonatype.nexus.blobstore.api.BlobStoreConfiguration; @@ -60,9 +59,6 @@ public class BlobStoreUIResourceTest @Mock private RepositoryManager repositoryManager; - @Mock - private BlobStoreDescriptorProvider blobStoreDescriptorProvider; - private Map blobStoreDescriptors = new HashMap<>(); private List configurations = new ArrayList<>(); @@ -75,11 +71,10 @@ public void setup() { addDescriptor(S3_TYPE, S3_TYPE_ID); addDescriptor(BlobStoreGroup.TYPE, BlobStoreGroup.CONFIG_KEY); - when(blobStoreDescriptorProvider.get()).thenReturn(blobStoreDescriptors); when(blobStoreConfigurationStore.list()).thenReturn(configurations); underTest = new BlobStoreUIResource( - blobStoreManager, blobStoreConfigurationStore, blobStoreDescriptorProvider, ImmutableMap.of(), repositoryManager); + blobStoreManager, blobStoreConfigurationStore, blobStoreDescriptors, ImmutableMap.of(), repositoryManager); } @Test diff --git a/plugins/nexus-default-role-plugin/src/main/java/org/sonatype/nexus/plugins/defaultrole/internal/DefaultRoleCapabilityDescriptor.java b/plugins/nexus-default-role-plugin/src/main/java/org/sonatype/nexus/plugins/defaultrole/internal/DefaultRoleCapabilityDescriptor.java index 56e33a1bb0..7694c62bb1 100644 --- a/plugins/nexus-default-role-plugin/src/main/java/org/sonatype/nexus/plugins/defaultrole/internal/DefaultRoleCapabilityDescriptor.java +++ b/plugins/nexus-default-role-plugin/src/main/java/org/sonatype/nexus/plugins/defaultrole/internal/DefaultRoleCapabilityDescriptor.java @@ -21,7 +21,6 @@ import org.sonatype.goodies.i18n.MessageBundle; import org.sonatype.nexus.capability.CapabilityDescriptorSupport; import org.sonatype.nexus.capability.CapabilityType; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.ComboboxFormField; import org.sonatype.nexus.formfields.FormField; @@ -34,7 +33,6 @@ * * @since 3.22 */ -@AvailabilityVersion(from = "1.0") @Named(DefaultRoleCapabilityDescriptor.TYPE_ID) @Singleton public class DefaultRoleCapabilityDescriptor diff --git a/plugins/nexus-onboarding-plugin/src/main/java/org/sonatype/nexus/onboarding/capability/OnboardingCapabilityDescriptor.java b/plugins/nexus-onboarding-plugin/src/main/java/org/sonatype/nexus/onboarding/capability/OnboardingCapabilityDescriptor.java index 65a4719a81..b4875f8de6 100644 --- a/plugins/nexus-onboarding-plugin/src/main/java/org/sonatype/nexus/onboarding/capability/OnboardingCapabilityDescriptor.java +++ b/plugins/nexus-onboarding-plugin/src/main/java/org/sonatype/nexus/onboarding/capability/OnboardingCapabilityDescriptor.java @@ -25,13 +25,10 @@ import org.sonatype.nexus.capability.CapabilityType; import org.sonatype.nexus.capability.Tag; import org.sonatype.nexus.capability.Taggable; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.FormField; import static java.util.Collections.singletonList; - -@AvailabilityVersion(from = "1.0") @Named(OnboardingCapability.TYPE_ID) @Singleton public class OnboardingCapabilityDescriptor diff --git a/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/datastore/internal/hosted/AptHostedRecipe.java b/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/datastore/internal/hosted/AptHostedRecipe.java index cc3676e95e..09004fef04 100644 --- a/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/datastore/internal/hosted/AptHostedRecipe.java +++ b/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/datastore/internal/hosted/AptHostedRecipe.java @@ -17,7 +17,6 @@ import javax.inject.Provider; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.repository.Format; import org.sonatype.nexus.repository.RecipeSupport; import org.sonatype.nexus.repository.Repository; @@ -53,7 +52,6 @@ * * @since 3.31 */ -@AvailabilityVersion(from = "1.0") @Named(AptHostedRecipe.NAME) @Singleton public class AptHostedRecipe diff --git a/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/datastore/internal/proxy/AptProxyRecipe.java b/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/datastore/internal/proxy/AptProxyRecipe.java index 7e60688feb..b52e52a059 100644 --- a/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/datastore/internal/proxy/AptProxyRecipe.java +++ b/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/datastore/internal/proxy/AptProxyRecipe.java @@ -17,7 +17,6 @@ import javax.inject.Provider; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.repository.Format; import org.sonatype.nexus.repository.RecipeSupport; import org.sonatype.nexus.repository.Repository; @@ -57,7 +56,6 @@ * * @since 3.31 */ -@AvailabilityVersion(from = "1.0") @Named(AptProxyRecipe.NAME) @Singleton public class AptProxyRecipe diff --git a/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/datastore/internal/task/RebuildAptMetadataTaskDescriptor.java b/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/datastore/internal/task/RebuildAptMetadataTaskDescriptor.java index c0f1c11d3a..6b546d0f6c 100644 --- a/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/datastore/internal/task/RebuildAptMetadataTaskDescriptor.java +++ b/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/datastore/internal/task/RebuildAptMetadataTaskDescriptor.java @@ -15,7 +15,6 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.CheckboxFormField; import org.sonatype.nexus.formfields.RepositoryCombobox; import org.sonatype.nexus.repository.apt.AptFormat; @@ -24,7 +23,6 @@ import static org.sonatype.nexus.formfields.FormField.OPTIONAL; -@AvailabilityVersion(from = "1.0") @Named @Singleton public class RebuildAptMetadataTaskDescriptor diff --git a/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/orient/internal/hosted/OrientAptHostedRecipe.java b/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/orient/internal/hosted/OrientAptHostedRecipe.java index 7a582be972..41f16057b8 100644 --- a/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/orient/internal/hosted/OrientAptHostedRecipe.java +++ b/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/orient/internal/hosted/OrientAptHostedRecipe.java @@ -17,7 +17,6 @@ import javax.inject.Provider; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.repository.Format; import org.sonatype.nexus.repository.Repository; import org.sonatype.nexus.repository.Type; @@ -55,7 +54,6 @@ /** * @since 3.17 */ -@AvailabilityVersion(from = "1.0") @Named(OrientAptHostedRecipe.NAME) @Singleton public class OrientAptHostedRecipe diff --git a/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/orient/internal/proxy/OrientAptProxyRecipe.java b/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/orient/internal/proxy/OrientAptProxyRecipe.java index 48cef9acf8..f1c2b9f826 100644 --- a/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/orient/internal/proxy/OrientAptProxyRecipe.java +++ b/plugins/nexus-repository-apt/src/main/java/org/sonatype/nexus/repository/apt/orient/internal/proxy/OrientAptProxyRecipe.java @@ -17,7 +17,6 @@ import javax.inject.Provider; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.repository.Format; import org.sonatype.nexus.repository.Repository; import org.sonatype.nexus.repository.Type; @@ -59,7 +58,6 @@ /** * @since 3.17 */ -@AvailabilityVersion(from = "1.0") @Named(OrientAptProxyRecipe.NAME) @Singleton public class OrientAptProxyRecipe diff --git a/plugins/nexus-repository-httpbridge/src/main/java/org/sonatype/nexus/repository/httpbridge/legacy/LegacyUrlCapabilityDescriptor.java b/plugins/nexus-repository-httpbridge/src/main/java/org/sonatype/nexus/repository/httpbridge/legacy/LegacyUrlCapabilityDescriptor.java index 903f687782..71ac617a47 100644 --- a/plugins/nexus-repository-httpbridge/src/main/java/org/sonatype/nexus/repository/httpbridge/legacy/LegacyUrlCapabilityDescriptor.java +++ b/plugins/nexus-repository-httpbridge/src/main/java/org/sonatype/nexus/repository/httpbridge/legacy/LegacyUrlCapabilityDescriptor.java @@ -24,7 +24,6 @@ import org.sonatype.nexus.capability.CapabilityType; import org.sonatype.nexus.capability.Tag; import org.sonatype.nexus.capability.Taggable; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.FormField; import static org.sonatype.nexus.capability.Tag.categoryTag; @@ -35,7 +34,6 @@ * * @since 3.7 */ -@AvailabilityVersion(from = "1.0") @Named(LegacyUrlCapabilityDescriptor.TYPE_ID) @Singleton public class LegacyUrlCapabilityDescriptor diff --git a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/content/maven/internal/recipe/MavenGroupRecipe.groovy b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/content/maven/internal/recipe/MavenGroupRecipe.groovy index 792d4580b2..f4e4a06275 100644 --- a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/content/maven/internal/recipe/MavenGroupRecipe.groovy +++ b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/content/maven/internal/recipe/MavenGroupRecipe.groovy @@ -18,7 +18,6 @@ import javax.inject.Named import javax.inject.Provider import javax.inject.Singleton -import org.sonatype.nexus.common.upgrade.AvailabilityVersion import org.sonatype.nexus.content.maven.internal.index.MavenContentGroupIndexFacet import org.sonatype.nexus.repository.Format import org.sonatype.nexus.repository.Repository @@ -40,7 +39,6 @@ import static org.sonatype.nexus.repository.http.HttpHandlers.notFound /** * @since 3.25 */ -@AvailabilityVersion(from = "1.0") @Named(Maven2GroupRecipe.NAME) @Singleton class MavenGroupRecipe diff --git a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/content/maven/internal/recipe/MavenHostedRecipe.groovy b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/content/maven/internal/recipe/MavenHostedRecipe.groovy index 57d9f8ec57..5fb1d65767 100644 --- a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/content/maven/internal/recipe/MavenHostedRecipe.groovy +++ b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/content/maven/internal/recipe/MavenHostedRecipe.groovy @@ -18,7 +18,6 @@ import javax.inject.Named import javax.inject.Provider import javax.inject.Singleton -import org.sonatype.nexus.common.upgrade.AvailabilityVersion import org.sonatype.nexus.content.maven.internal.index.MavenContentHostedIndexFacet import org.sonatype.nexus.repository.Format import org.sonatype.nexus.repository.Repository @@ -37,7 +36,6 @@ import static org.sonatype.nexus.repository.http.HttpHandlers.notFound /** * @since 3.25 */ -@AvailabilityVersion(from = "1.0") @Named(Maven2HostedRecipe.NAME) @Singleton class MavenHostedRecipe diff --git a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/content/maven/internal/recipe/MavenProxyRecipe.java b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/content/maven/internal/recipe/MavenProxyRecipe.java index 04bd9ad6a5..84a39ee8ca 100644 --- a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/content/maven/internal/recipe/MavenProxyRecipe.java +++ b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/content/maven/internal/recipe/MavenProxyRecipe.java @@ -18,7 +18,6 @@ import javax.inject.Provider; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.content.maven.internal.index.MavenContentProxyIndexFacet; import org.sonatype.nexus.repository.Format; import org.sonatype.nexus.repository.Repository; @@ -43,7 +42,6 @@ /** * @since 3.26 */ -@AvailabilityVersion(from = "1.0") @Named(Maven2ProxyRecipe.NAME) @Singleton public class MavenProxyRecipe diff --git a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/internal/orient/OrientMaven2GroupRecipe.groovy b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/internal/orient/OrientMaven2GroupRecipe.groovy index f5aee6e554..890a027856 100644 --- a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/internal/orient/OrientMaven2GroupRecipe.groovy +++ b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/internal/orient/OrientMaven2GroupRecipe.groovy @@ -19,7 +19,6 @@ import javax.inject.Named import javax.inject.Provider import javax.inject.Singleton -import org.sonatype.nexus.common.upgrade.AvailabilityVersion import org.sonatype.nexus.repository.Format import org.sonatype.nexus.repository.Repository import org.sonatype.nexus.repository.Type @@ -44,7 +43,6 @@ import static org.sonatype.nexus.repository.http.HttpHandlers.notFound * * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named(Maven2GroupRecipe.NAME) @Priority(Integer.MAX_VALUE) @Singleton diff --git a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/internal/orient/OrientMaven2HostedRecipe.groovy b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/internal/orient/OrientMaven2HostedRecipe.groovy index 4382d26965..5c8d342aaf 100644 --- a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/internal/orient/OrientMaven2HostedRecipe.groovy +++ b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/internal/orient/OrientMaven2HostedRecipe.groovy @@ -19,7 +19,6 @@ import javax.inject.Named import javax.inject.Provider import javax.inject.Singleton -import org.sonatype.nexus.common.upgrade.AvailabilityVersion import org.sonatype.nexus.repository.Format import org.sonatype.nexus.repository.Repository import org.sonatype.nexus.repository.Type @@ -46,7 +45,6 @@ import static org.sonatype.nexus.repository.http.HttpHandlers.notFound * * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named(Maven2HostedRecipe.NAME) @Priority(Integer.MAX_VALUE) @Singleton diff --git a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/internal/orient/OrientMaven2ProxyRecipe.groovy b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/internal/orient/OrientMaven2ProxyRecipe.groovy index f3de463e93..4f857b8504 100644 --- a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/internal/orient/OrientMaven2ProxyRecipe.groovy +++ b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/internal/orient/OrientMaven2ProxyRecipe.groovy @@ -19,7 +19,6 @@ import javax.inject.Named import javax.inject.Provider import javax.inject.Singleton -import org.sonatype.nexus.common.upgrade.AvailabilityVersion import org.sonatype.nexus.repository.Format import org.sonatype.nexus.repository.Repository import org.sonatype.nexus.repository.Type @@ -49,7 +48,6 @@ import static org.sonatype.nexus.repository.http.HttpHandlers.notFound * * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named(Maven2ProxyRecipe.NAME) @Priority(Integer.MAX_VALUE) @Singleton diff --git a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/PublishMavenIndexTaskDescriptor.java b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/PublishMavenIndexTaskDescriptor.java index 6897fcb94e..6534d46efc 100644 --- a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/PublishMavenIndexTaskDescriptor.java +++ b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/PublishMavenIndexTaskDescriptor.java @@ -15,7 +15,6 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.RepositoryCombobox; import org.sonatype.nexus.repository.maven.internal.Maven2Format; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; @@ -25,7 +24,6 @@ * * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class PublishMavenIndexTaskDescriptor diff --git a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/PurgeMavenUnusedSnapshotsTaskDescriptor.java b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/PurgeMavenUnusedSnapshotsTaskDescriptor.java index 0aebaa381c..8c713ffc45 100644 --- a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/PurgeMavenUnusedSnapshotsTaskDescriptor.java +++ b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/PurgeMavenUnusedSnapshotsTaskDescriptor.java @@ -15,7 +15,6 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.FormField; import org.sonatype.nexus.formfields.NumberTextFormField; import org.sonatype.nexus.formfields.RepositoryCombobox; @@ -31,7 +30,6 @@ * * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class PurgeMavenUnusedSnapshotsTaskDescriptor diff --git a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/RebuildMaven2MetadataTaskDescriptor.java b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/RebuildMaven2MetadataTaskDescriptor.java index efabbdf3b3..934b93aa35 100644 --- a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/RebuildMaven2MetadataTaskDescriptor.java +++ b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/RebuildMaven2MetadataTaskDescriptor.java @@ -15,7 +15,6 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.CheckboxFormField; import org.sonatype.nexus.formfields.RepositoryCombobox; import org.sonatype.nexus.formfields.StringTextFormField; @@ -30,7 +29,6 @@ * * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class RebuildMaven2MetadataTaskDescriptor diff --git a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/RemoveSnapshotsTaskDescriptor.java b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/RemoveSnapshotsTaskDescriptor.java index 796b7927cf..76f0647c82 100644 --- a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/RemoveSnapshotsTaskDescriptor.java +++ b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/RemoveSnapshotsTaskDescriptor.java @@ -15,7 +15,6 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.CheckboxFormField; import org.sonatype.nexus.formfields.NumberTextFormField; import org.sonatype.nexus.formfields.RepositoryCombobox; @@ -27,7 +26,6 @@ * Configuration definition for {@link RemoveSnapshotsTask} * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class RemoveSnapshotsTaskDescriptor diff --git a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/UnpublishMavenIndexTaskDescriptor.java b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/UnpublishMavenIndexTaskDescriptor.java index b3b3c69529..9b6a9e6d3c 100644 --- a/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/UnpublishMavenIndexTaskDescriptor.java +++ b/plugins/nexus-repository-maven/src/main/java/org/sonatype/nexus/repository/maven/tasks/UnpublishMavenIndexTaskDescriptor.java @@ -15,7 +15,6 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.formfields.RepositoryCombobox; import org.sonatype.nexus.repository.maven.internal.Maven2Format; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; @@ -25,7 +24,6 @@ * * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class UnpublishMavenIndexTaskDescriptor diff --git a/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/content/raw/internal/recipe/RawGroupRecipe.groovy b/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/content/raw/internal/recipe/RawGroupRecipe.groovy index d088ab9d9a..405b5deac7 100644 --- a/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/content/raw/internal/recipe/RawGroupRecipe.groovy +++ b/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/content/raw/internal/recipe/RawGroupRecipe.groovy @@ -18,7 +18,6 @@ import javax.inject.Named import javax.inject.Provider import javax.inject.Singleton -import org.sonatype.nexus.common.upgrade.AvailabilityVersion import org.sonatype.nexus.repository.Format import org.sonatype.nexus.repository.Repository import org.sonatype.nexus.repository.Type @@ -38,7 +37,6 @@ import org.sonatype.nexus.repository.view.matchers.token.TokenMatcher * * @since 3.24 */ -@AvailabilityVersion(from = "1.0") @Named(RawGroupRecipe.NAME) @Singleton class RawGroupRecipe diff --git a/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/content/raw/internal/recipe/RawHostedRecipe.groovy b/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/content/raw/internal/recipe/RawHostedRecipe.groovy index 2635097cb7..c8b73814ea 100644 --- a/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/content/raw/internal/recipe/RawHostedRecipe.groovy +++ b/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/content/raw/internal/recipe/RawHostedRecipe.groovy @@ -17,7 +17,6 @@ import javax.inject.Inject import javax.inject.Named import javax.inject.Singleton -import org.sonatype.nexus.common.upgrade.AvailabilityVersion import org.sonatype.nexus.repository.Format import org.sonatype.nexus.repository.Repository import org.sonatype.nexus.repository.Type @@ -40,7 +39,6 @@ import static org.sonatype.nexus.repository.view.matchers.logic.LogicMatchers.an * * @since 3.24 */ -@AvailabilityVersion(from = "1.0") @Named(RawHostedRecipe.NAME) @Singleton class RawHostedRecipe diff --git a/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/content/raw/internal/recipe/RawProxyRecipe.groovy b/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/content/raw/internal/recipe/RawProxyRecipe.groovy index fc94dff8f6..3c88971cbb 100644 --- a/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/content/raw/internal/recipe/RawProxyRecipe.groovy +++ b/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/content/raw/internal/recipe/RawProxyRecipe.groovy @@ -19,7 +19,6 @@ import javax.inject.Named import javax.inject.Provider import javax.inject.Singleton -import org.sonatype.nexus.common.upgrade.AvailabilityVersion import org.sonatype.nexus.repository.Format import org.sonatype.nexus.repository.Repository import org.sonatype.nexus.repository.Type @@ -51,7 +50,6 @@ import static org.sonatype.nexus.repository.view.matchers.logic.LogicMatchers.an * * @since 3.24 */ -@AvailabilityVersion(from = "1.0") @Named(RawProxyRecipe.NAME) @Priority(Integer.MAX_VALUE) @Singleton diff --git a/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/orient/raw/internal/RawGroupRecipe.groovy b/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/orient/raw/internal/RawGroupRecipe.groovy index 26c5287c62..ef5aea389f 100644 --- a/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/orient/raw/internal/RawGroupRecipe.groovy +++ b/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/orient/raw/internal/RawGroupRecipe.groovy @@ -19,7 +19,6 @@ import javax.inject.Named import javax.inject.Provider import javax.inject.Singleton -import org.sonatype.nexus.common.upgrade.AvailabilityVersion import org.sonatype.nexus.repository.Format import org.sonatype.nexus.repository.RecipeSupport import org.sonatype.nexus.repository.Repository @@ -48,7 +47,6 @@ import org.sonatype.nexus.repository.view.matchers.token.TokenMatcher * * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named(RawGroupRecipe.NAME) @Priority(Integer.MAX_VALUE) @Singleton diff --git a/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/orient/raw/internal/RawHostedRecipe.groovy b/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/orient/raw/internal/RawHostedRecipe.groovy index 5dd40f7ac1..1a07cb83ed 100644 --- a/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/orient/raw/internal/RawHostedRecipe.groovy +++ b/plugins/nexus-repository-raw/src/main/java/org/sonatype/nexus/orient/raw/internal/RawHostedRecipe.groovy @@ -19,7 +19,6 @@ import javax.inject.Named import javax.inject.Provider import javax.inject.Singleton -import org.sonatype.nexus.common.upgrade.AvailabilityVersion import org.sonatype.nexus.repository.Format import org.sonatype.nexus.repository.RecipeSupport import org.sonatype.nexus.repository.Repository @@ -59,7 +58,6 @@ import static org.sonatype.nexus.repository.view.matchers.logic.LogicMatchers.an * * @since 3.0 */ -@AvailabilityVersion(from = "1.0") @Named(RawHostedRecipe.NAME) @Priority(Integer.MAX_VALUE) @Singleton diff --git a/plugins/nexus-task-log-cleanup/src/main/java/org/sonatype/nexus/tasklog/TaskLogCleanupTaskDescriptor.java b/plugins/nexus-task-log-cleanup/src/main/java/org/sonatype/nexus/tasklog/TaskLogCleanupTaskDescriptor.java index e9b83e1e22..4f18ab2a2d 100644 --- a/plugins/nexus-task-log-cleanup/src/main/java/org/sonatype/nexus/tasklog/TaskLogCleanupTaskDescriptor.java +++ b/plugins/nexus-task-log-cleanup/src/main/java/org/sonatype/nexus/tasklog/TaskLogCleanupTaskDescriptor.java @@ -16,13 +16,11 @@ import javax.inject.Named; import javax.inject.Singleton; -import org.sonatype.nexus.common.upgrade.AvailabilityVersion; import org.sonatype.nexus.scheduling.TaskDescriptorSupport; /** * @since 3.5 */ -@AvailabilityVersion(from = "1.0") @Named @Singleton public class TaskLogCleanupTaskDescriptor diff --git a/revision.txt b/revision.txt index 20703d4e0d..0cf7a55a2d 100644 --- a/revision.txt +++ b/revision.txt @@ -1 +1 @@ -b=main,r=df981a24afa262d2641d11c9f3714d9dfe8feaa1,t=2024-05-24-1839-15178 \ No newline at end of file +b=main,r=3418179532e172f1b1a7136357eb107935d8d4f3,t=2024-05-31-1243-23302 \ No newline at end of file diff --git a/testsuite/nexus-repository-testsupport/src/main/java/org/sonatype/nexus/testsuite/testsupport/fixtures/SecurityRule.java b/testsuite/nexus-repository-testsupport/src/main/java/org/sonatype/nexus/testsuite/testsupport/fixtures/SecurityRule.java index 04118265b1..41613ae51c 100644 --- a/testsuite/nexus-repository-testsupport/src/main/java/org/sonatype/nexus/testsuite/testsupport/fixtures/SecurityRule.java +++ b/testsuite/nexus-repository-testsupport/src/main/java/org/sonatype/nexus/testsuite/testsupport/fixtures/SecurityRule.java @@ -168,6 +168,22 @@ public Role getRole(final String roleId) { return null; } + public User addRole(final String userId, final String... roleIds) + throws UserNotFoundException, NoSuchUserManagerException + { + User user = getUser(userId); + if (user == null) { + throw new UserNotFoundException(userId); + } + Set roles = Arrays.stream(roleIds) + .map(it -> getRole(it)) + .map(it -> new RoleIdentifier(it.getSource(), it.getRoleId())) + .collect(Collectors.toSet()); + user.setRoles(roles); + securitySystemProvider.get().updateUser(user); + return user; + } + public User getUser(final String userId) { try { return securitySystemProvider.get().getUser(userId, DEFAULT_SOURCE); diff --git a/testsuite/nexus-repository-testsupport/src/main/java/org/sonatype/nexus/testsuite/testsupport/system/CleanupTestSystem.java b/testsuite/nexus-repository-testsupport/src/main/java/org/sonatype/nexus/testsuite/testsupport/system/CleanupTestSystem.java index cc8b3731fb..3f2d41573a 100644 --- a/testsuite/nexus-repository-testsupport/src/main/java/org/sonatype/nexus/testsuite/testsupport/system/CleanupTestSystem.java +++ b/testsuite/nexus-repository-testsupport/src/main/java/org/sonatype/nexus/testsuite/testsupport/system/CleanupTestSystem.java @@ -17,7 +17,7 @@ import java.util.Map; import java.util.Objects; import java.util.Set; - +import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Named; import javax.inject.Singleton; @@ -43,6 +43,11 @@ public CleanupTestSystem(final CleanupPolicyStorage cleanupPolicyStorage, final this.cleanupPolicyStorage = checkNotNull(cleanupPolicyStorage); } + @Nullable + public CleanupPolicy get(final String name) { + return cleanupPolicyStorage.get(name); + } + public CleanupPolicy createCleanupPolicy(final String name, final String notes) { return createCleanupPolicy(name, "ALL_FORMATS", notes, Collections.emptyMap()); } diff --git a/testsuite/nexus-repository-testsupport/src/main/java/org/sonatype/nexus/testsuite/testsupport/system/RestTestHelper.java b/testsuite/nexus-repository-testsupport/src/main/java/org/sonatype/nexus/testsuite/testsupport/system/RestTestHelper.java index 288a559198..3ed516eadb 100644 --- a/testsuite/nexus-repository-testsupport/src/main/java/org/sonatype/nexus/testsuite/testsupport/system/RestTestHelper.java +++ b/testsuite/nexus-repository-testsupport/src/main/java/org/sonatype/nexus/testsuite/testsupport/system/RestTestHelper.java @@ -639,7 +639,7 @@ protected boolean matchesSafely(final Response response, final Description misma if (actualStatus != statusCode) { String message = ""; try { - message = response.hasEntity() ? response.readEntity(String.class) : null; + message = IOUtils.toString((InputStream) response.getEntity(), Charset.defaultCharset()); } catch (Exception e) { log.info("Failed to extract message body from response {}", response, e);