diff --git a/common/build.gradle b/common/build.gradle index cbd4f3372d77..a81e12fa9e2d 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -40,7 +40,7 @@ dependencies { implementation group: 'net.sf.json-lib', name: 'json-lib', version: '2.4', classifier: 'jdk15' api group: 'net.jcip', name: 'jcip-annotations', version: '1.0' api group: 'com.github.spotbugs', name: 'spotbugs-annotations', version: '4.4.2' - api group: 'org.reflections', name: 'reflections', version: '0.9.11' + api group: 'org.reflections', name: 'reflections', version: reflectionsVersion implementation group: 'com.github.ben-manes.caffeine', name: 'caffeine', version: caffeineVersion implementation group: 'org.glassfish.jersey.core', name: 'jersey-client', version: jerseyCoreVersion diff --git a/common/src/main/java/com/sequenceiq/cloudbreak/common/anonymizer/AnonymizerUtil.java b/common/src/main/java/com/sequenceiq/cloudbreak/common/anonymizer/AnonymizerUtil.java index c0647e243878..e7d036d17da2 100644 --- a/common/src/main/java/com/sequenceiq/cloudbreak/common/anonymizer/AnonymizerUtil.java +++ b/common/src/main/java/com/sequenceiq/cloudbreak/common/anonymizer/AnonymizerUtil.java @@ -38,6 +38,10 @@ public class AnonymizerUtil { private AnonymizerUtil() { } + public static String anonymize(Object object) { + return object == null ? null : anonymize(object.toString()); + } + public static String anonymize(String content) { String ret = content; if (ret != null) { diff --git a/common/src/main/java/com/sequenceiq/cloudbreak/util/DatabaseUtil.java b/common/src/main/java/com/sequenceiq/cloudbreak/util/DatabaseUtil.java index 2722873b8659..fb8ed37f2595 100644 --- a/common/src/main/java/com/sequenceiq/cloudbreak/util/DatabaseUtil.java +++ b/common/src/main/java/com/sequenceiq/cloudbreak/util/DatabaseUtil.java @@ -3,13 +3,17 @@ import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; +import java.util.function.Supplier; +import org.hibernate.Hibernate; import org.postgresql.Driver; import org.springframework.jdbc.datasource.SimpleDriverDataSource; public class DatabaseUtil { public static final String DEFAULT_SCHEMA_NAME = "public"; + public static final String UNINITIALIZED_TO_STRING = ""; + private DatabaseUtil() { } @@ -24,4 +28,22 @@ public static void createSchemaIfNeeded(String dbType, String dbAddress, String } } } + + public static boolean isLazyLoadInitialized(Object o) { + return Hibernate.isInitialized(o); + } + + public static String lazyLoadSafeToString(Object o) { + return lazyLoadSafeToString(o, () -> o); + } + + public static String lazyLoadSafeToString(Object o, Supplier toStringSupplier) { + if (o == null) { + return null; + } else if (isLazyLoadInitialized(o)) { + return String.valueOf(toStringSupplier.get()); + } else { + return UNINITIALIZED_TO_STRING; + } + } } diff --git a/common/src/test/java/com/sequenceiq/cloudbreak/util/DatabaseUtilTest.java b/common/src/test/java/com/sequenceiq/cloudbreak/util/DatabaseUtilTest.java new file mode 100644 index 000000000000..358ea50ecaec --- /dev/null +++ b/common/src/test/java/com/sequenceiq/cloudbreak/util/DatabaseUtilTest.java @@ -0,0 +1,106 @@ +package com.sequenceiq.cloudbreak.util; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.hibernate.proxy.HibernateProxy; +import org.hibernate.proxy.LazyInitializer; +import org.junit.jupiter.api.Test; + +class DatabaseUtilTest { + + private static final String INITIALIZED_TO_STRING = "initialized"; + + private static final String SUPPLIED_TO_STRING = "supplied toString()"; + + private static final String NOT_PROXY_OBJECT = "not proxy object"; + + @Test + void isLazyLoadInitializedFalseWhenProxyIsUninitialized() { + Object proxyObject = createProxyObject(false); + + boolean result = DatabaseUtil.isLazyLoadInitialized(proxyObject); + + assertThat(result).isFalse(); + } + + @Test + void isLazyLoadInitializedTrueWhenProxyIsInitialized() { + Object proxyObject = createProxyObject(true); + + boolean result = DatabaseUtil.isLazyLoadInitialized(proxyObject); + + assertThat(result).isTrue(); + } + + @Test + void isLazyLoadInitializedTrueWhenObjectIsNotProxy() { + boolean result = DatabaseUtil.isLazyLoadInitialized(NOT_PROXY_OBJECT); + + assertThat(result).isTrue(); + } + + @Test + void lazyLoadSafeToStringWhenProxyIsUninitialized() { + Object proxyObject = createProxyObject(false); + + String result = DatabaseUtil.lazyLoadSafeToString(proxyObject); + + assertThat(result).isEqualTo(DatabaseUtil.UNINITIALIZED_TO_STRING); + } + + @Test + void lazyLoadSafeToStringWhenProxyIsInitialized() { + Object proxyObject = createProxyObject(true); + + String result = DatabaseUtil.lazyLoadSafeToString(proxyObject); + + assertThat(result).isEqualTo(INITIALIZED_TO_STRING); + } + + @Test + void lazyLoadSafeToStringWhenObjectIsNotProxy() { + String result = DatabaseUtil.lazyLoadSafeToString(NOT_PROXY_OBJECT); + + assertThat(result).isEqualTo((Object) NOT_PROXY_OBJECT); + } + + @Test + void lazyLoadSafeToStringWithSupplierWhenProxyIsUninitialized() { + Object proxyObject = createProxyObject(false); + + String result = DatabaseUtil.lazyLoadSafeToString(proxyObject, () -> SUPPLIED_TO_STRING); + + assertThat(result).isEqualTo(DatabaseUtil.UNINITIALIZED_TO_STRING); + } + + @Test + void lazyLoadSafeToStringWithSupplierWhenProxyIsInitialized() { + Object proxyObject = createProxyObject(true); + + String result = DatabaseUtil.lazyLoadSafeToString(proxyObject, () -> SUPPLIED_TO_STRING); + + assertThat(result).isEqualTo(SUPPLIED_TO_STRING); + } + + @Test + void lazyLoadSafeToStringWithSupplierWhenObjectIsNotProxy() { + String result = DatabaseUtil.lazyLoadSafeToString(NOT_PROXY_OBJECT, () -> SUPPLIED_TO_STRING); + + assertThat(result).isEqualTo(SUPPLIED_TO_STRING); + } + + /** + * @param initialized the expected return value of {@link org.hibernate.Hibernate#isInitialized(Object)} when called on the result {@link Object} + */ + private Object createProxyObject(boolean initialized) { + LazyInitializer lazyInitializer = mock(LazyInitializer.class); + when(lazyInitializer.isUninitialized()).thenReturn(!initialized); + HibernateProxy hibernateProxy = mock(HibernateProxy.class); + when(hibernateProxy.getHibernateLazyInitializer()).thenReturn(lazyInitializer); + when(hibernateProxy.toString()).thenReturn(INITIALIZED_TO_STRING); + return hibernateProxy; + } + +} diff --git a/core-model/build.gradle b/core-model/build.gradle index 9d7bdffddbac..66e42a8e9f9e 100644 --- a/core-model/build.gradle +++ b/core-model/build.gradle @@ -25,7 +25,7 @@ dependencies { implementation group: 'net.jcip', name: 'jcip-annotations', version: '1.0' implementation group: 'com.github.spotbugs', name: 'spotbugs-annotations', version: '4.4.2' testImplementation group: 'org.hamcrest', name: 'hamcrest', version: hamcrestVersion - testImplementation group: 'org.reflections', name: 'reflections', version: '0.9.11' + testImplementation group: 'org.reflections', name: 'reflections', version: reflectionsVersion testImplementation group: 'org.assertj', name: 'assertj-core', version: assertjVersion testImplementation project(path: ':common', configuration: 'tests') } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Container.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Container.java index 0f1d995ba18f..9c069d83deaa 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Container.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Container.java @@ -76,4 +76,14 @@ public void setCluster(Cluster cluster) { this.cluster = cluster; } + @Override + public String toString() { + return "Container{" + + "id=" + id + + ", containerId='" + containerId + '\'' + + ", name='" + name + '\'' + + ", image='" + image + '\'' + + ", host='" + host + '\'' + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/FailurePolicy.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/FailurePolicy.java index ed96acc5315d..d6a82d24d71d 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/FailurePolicy.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/FailurePolicy.java @@ -46,4 +46,13 @@ public AdjustmentType getAdjustmentType() { public void setAdjustmentType(AdjustmentType adjustmentType) { this.adjustmentType = adjustmentType; } + + @Override + public String toString() { + return "FailurePolicy{" + + "id=" + id + + ", threshold=" + threshold + + ", adjustmentType=" + adjustmentType + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/FileSystem.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/FileSystem.java index 7758b22e1359..33e4e78e79b4 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/FileSystem.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/FileSystem.java @@ -122,4 +122,14 @@ public void setCloudStorage(CloudStorage cloudStorage) { this.cloudStorage = new Json(cloudStorage); } } + + @Override + public String toString() { + return "FileSystem{" + + "id=" + id + + ", name='" + name + '\'' + + ", type=" + type + + ", description='" + description + '\'' + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Network.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Network.java index 7b4b38d3429e..2a5de1c48b7f 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Network.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Network.java @@ -188,4 +188,23 @@ public void unsetRelationsToEntitiesToBeDeleted() { public void setDeletionTimestamp(Long deletionTimestamp) { this.deletionTimestamp = deletionTimestamp; } + + @Override + public String toString() { + return "Network{" + + "id=" + id + + ", name='" + name + '\'' + + ", subnetCIDR='" + subnetCIDR + '\'' + + ", description='" + description + '\'' + + ", status=" + status + + ", cloudPlatform='" + cloudPlatform + '\'' + + ", attributes=" + attributes + + ", outboundInternetTraffic=" + outboundInternetTraffic + + ", networkCidrs='" + networkCidrs + '\'' + + ", topology=" + topology + + ", workspace=" + workspace + + ", archived=" + archived + + ", deletionTimestamp=" + deletionTimestamp + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Orchestrator.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Orchestrator.java index 08b774a4d21a..e2538ddd1a41 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Orchestrator.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Orchestrator.java @@ -58,4 +58,13 @@ public Json getAttributes() { public void setAttributes(Json attributes) { this.attributes = attributes; } + + @Override + public String toString() { + return "Orchestrator{" + + "id=" + id + + ", apiEndpoint='" + apiEndpoint + '\'' + + ", type='" + type + '\'' + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/RDSConfig.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/RDSConfig.java index 7c102d12aa0b..f5c714c3eeb1 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/RDSConfig.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/RDSConfig.java @@ -269,4 +269,18 @@ public Long getDeletionTimestamp() { public boolean isArchived() { return archived; } + + @Override + public String toString() { + return "RDSConfig{" + + "id=" + id + + ", name='" + name + '\'' + + ", creationDate=" + creationDate + + ", stackVersion='" + stackVersion + '\'' + + ", status=" + status + + ", type='" + type + '\'' + + ", archived=" + archived + + ", deletionTimestamp=" + deletionTimestamp + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Resource.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Resource.java index 69721bbcbeb4..dfea0e7a20ab 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Resource.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Resource.java @@ -163,4 +163,17 @@ public String getAvailabilityZone() { public void setAvailabilityZone(String availabilityZone) { this.availabilityZone = availabilityZone; } + + @Override + public String toString() { + return "Resource{" + + "id=" + id + + ", resourceType=" + resourceType + + ", resourceStatus=" + resourceStatus + + ", resourceName='" + resourceName + '\'' + + ", resourceReference='" + resourceReference + '\'' + + ", instanceId='" + instanceId + '\'' + + ", availabilityZone='" + availabilityZone + '\'' + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/SaltSecurityConfig.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/SaltSecurityConfig.java index 3b926e9c8531..3013f5785172 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/SaltSecurityConfig.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/SaltSecurityConfig.java @@ -134,4 +134,11 @@ public String getSaltSignPublicKey() { public String getSaltSignPrivateKey() { return saltSignPrivateKey.getRaw(); } + + @Override + public String toString() { + return "SaltSecurityConfig{" + + "id=" + id + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/SecurityConfig.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/SecurityConfig.java index 82cf2adc6a28..b11f23b3a73b 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/SecurityConfig.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/SecurityConfig.java @@ -16,6 +16,7 @@ import com.sequenceiq.cloudbreak.service.secret.SecretValue; import com.sequenceiq.cloudbreak.service.secret.domain.Secret; import com.sequenceiq.cloudbreak.service.secret.domain.SecretToString; +import com.sequenceiq.cloudbreak.util.DatabaseUtil; import com.sequenceiq.cloudbreak.workspace.model.Workspace; import com.sequenceiq.cloudbreak.workspace.model.WorkspaceAwareResource; @@ -144,4 +145,19 @@ public String getUserFacingKey() { public void setUserFacingKey(String userFacingKey) { this.userFacingKey = new Secret(userFacingKey); } + + @Override + public String toString() { + return "SecurityConfig{" + + "id=" + id + + ", clientKey=" + clientKey + + ", clientCert=" + clientCert + + ", stack=" + DatabaseUtil.lazyLoadSafeToString(stack, () -> stack.getResourceCrn()) + + ", saltSecurityConfig=" + saltSecurityConfig + + ", usePrivateIpToTls=" + usePrivateIpToTls + + ", workspace=" + workspace + + ", userFacingCert=" + userFacingCert + + ", userFacingKey=" + userFacingKey + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/SecurityGroup.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/SecurityGroup.java index cce754ba34cf..886258f15864 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/SecurityGroup.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/SecurityGroup.java @@ -119,4 +119,15 @@ public String getCloudPlatform() { public void setCloudPlatform(String cloudPlatform) { this.cloudPlatform = cloudPlatform; } + + @Override + public String toString() { + return "SecurityGroup{" + + "id=" + id + + ", name='" + name + '\'' + + ", description='" + description + '\'' + + ", status=" + status + + ", cloudPlatform='" + cloudPlatform + '\'' + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/ShowTerminatedClustersPreferences.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/ShowTerminatedClustersPreferences.java index bfc7e1a0fa11..a2d3c33f0683 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/ShowTerminatedClustersPreferences.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/ShowTerminatedClustersPreferences.java @@ -52,4 +52,13 @@ public Boolean isActive() { public Duration getTimeout() { return timeout != null ? timeout : Duration.ZERO; } + + @Override + public String toString() { + return "ShowTerminatedClustersPreferences{" + + "id=" + id + + ", active=" + active + + ", timeout=" + timeout + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/StackAuthentication.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/StackAuthentication.java index 497b8ca0b2c9..24373329b844 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/StackAuthentication.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/StackAuthentication.java @@ -57,4 +57,14 @@ public String getLoginUserName() { public void setLoginUserName(String loginUserName) { this.loginUserName = loginUserName; } + + @Override + public String toString() { + return "StackAuthentication{" + + "id=" + id + + ", publicKey='" + publicKey + '\'' + + ", publicKeyId='" + publicKeyId + '\'' + + ", loginUserName='" + loginUserName + '\'' + + '}'; + } } \ No newline at end of file diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/StructuredEventEntity.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/StructuredEventEntity.java index 3530eea64e59..0c00d6484cd2 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/StructuredEventEntity.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/StructuredEventEntity.java @@ -133,4 +133,17 @@ public String getResourceCrn() { public void setResourceCrn(String resourceCrn) { this.resourceCrn = resourceCrn; } + + @Override + public String toString() { + return "StructuredEventEntity{" + + "id=" + id + + ", eventType=" + eventType + + ", resourceType='" + resourceType + '\'' + + ", resourceId=" + resourceId + + ", resourceCrn='" + resourceCrn + '\'' + + ", timestamp=" + timestamp + + ", structuredEventJson=" + structuredEventJson + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Template.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Template.java index 6cd41581c04a..40f3f6353aed 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Template.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Template.java @@ -198,4 +198,20 @@ public Integer getInstanceStorageCount() { public void setInstanceStorageCount(Integer instanceStorageCount) { this.instanceStorageCount = instanceStorageCount; } + + @Override + public String toString() { + return "Template{" + + "id=" + id + + ", name='" + name + '\'' + + ", description='" + description + '\'' + + ", instanceType='" + instanceType + '\'' + + ", rootVolumeSize=" + rootVolumeSize + + ", deleted=" + deleted + + ", status=" + status + + ", cloudPlatform='" + cloudPlatform + '\'' + + ", topology=" + topology + + ", instanceStorageCount=" + instanceStorageCount + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Topology.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Topology.java index c26123efcb77..42c740d87f27 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Topology.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/Topology.java @@ -124,4 +124,16 @@ public void unsetRelationsToEntitiesToBeDeleted() { public Long getDeletionTimestamp() { return deletionTimestamp; } + + @Override + public String toString() { + return "Topology{" + + "id=" + id + + ", name='" + name + '\'' + + ", description='" + description + '\'' + + ", cloudPlatform='" + cloudPlatform + '\'' + + ", deleted=" + deleted + + ", deletionTimestamp=" + deletionTimestamp + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/UserProfile.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/UserProfile.java index cf3577dd4d26..0febf3e81088 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/UserProfile.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/UserProfile.java @@ -100,4 +100,15 @@ public void setShowTerminatedClustersPreferences(ShowTerminatedClustersPreferenc public Tenant getTenant() { return user.getTenant(); } + + @Override + public String toString() { + return "UserProfile{" + + "id=" + id + + ", imageCatalog=" + imageCatalog + + ", userName='" + userName + '\'' + + ", user=" + user + + ", showTerminatedClustersPreferences=" + showTerminatedClustersPreferences + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/VolumeTemplate.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/VolumeTemplate.java index 4b969d1a246f..178512333b75 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/VolumeTemplate.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/VolumeTemplate.java @@ -94,4 +94,14 @@ public String getName() { public void setWorkspace(Workspace workspace) { template.setWorkspace(workspace); } + + @Override + public String toString() { + return "VolumeTemplate{" + + "id=" + id + + ", volumeCount=" + volumeCount + + ", volumeSize=" + volumeSize + + ", volumeType='" + volumeType + '\'' + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/Component.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/Component.java index 18cf9468f031..ec958325ab2a 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/Component.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/Component.java @@ -102,7 +102,7 @@ public String toString() { + "id=" + id + ", componentType=" + componentType + ", name='" + name + '\'' - + ", attributes=" + anonymize(attributes.toString()) + + ", attributes=" + anonymize(attributes) + '}'; } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/Stack.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/Stack.java index 5ea7be821eb6..b4dbae0fef33 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/Stack.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/Stack.java @@ -72,6 +72,7 @@ import com.sequenceiq.cloudbreak.domain.stack.instance.InstanceMetaData; import com.sequenceiq.cloudbreak.domain.stack.loadbalancer.LoadBalancer; import com.sequenceiq.cloudbreak.domain.stack.loadbalancer.TargetGroup; +import com.sequenceiq.cloudbreak.util.DatabaseUtil; import com.sequenceiq.cloudbreak.workspace.model.User; import com.sequenceiq.cloudbreak.workspace.model.Workspace; import com.sequenceiq.cloudbreak.workspace.model.WorkspaceAwareResource; @@ -948,10 +949,11 @@ public String toString() { ", cloudPlatform='" + cloudPlatform + '\'' + ", cluster=" + cluster + ", stackStatus=" + stackStatus + + ", resources=" + DatabaseUtil.lazyLoadSafeToString(resources) + ", onFailureActionAction=" + onFailureActionAction + ", failurePolicy=" + failurePolicy + - ", securityConfig=" + securityConfig + - ", instanceGroups=" + instanceGroups.stream().map(InstanceGroup::getGroupName).collect(Collectors.toSet()) + + ", securityConfig=" + DatabaseUtil.lazyLoadSafeToString(securityConfig) + + ", instanceGroups=" + DatabaseUtil.lazyLoadSafeToString(instanceGroups, this::instanceGroupsToString) + ", version=" + version + ", network=" + network + ", stackAuthentication=" + stackAuthentication + @@ -974,6 +976,10 @@ public String toString() { '}'; } + private String instanceGroupsToString() { + return instanceGroups.stream().map(InstanceGroup::getGroupName).collect(Collectors.toSet()).toString(); + } + @Override public Set getAllNodesForOrchestration() { return instanceGroups.stream() diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/ClusterTemplate.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/ClusterTemplate.java index 3761d0cb2bf2..82b4961f8032 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/ClusterTemplate.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/ClusterTemplate.java @@ -198,4 +198,21 @@ public String getClouderaRuntimeVersion() { public void setClouderaRuntimeVersion(String clouderaRuntimeVersion) { this.clouderaRuntimeVersion = clouderaRuntimeVersion; } + + @Override + public String toString() { + return "ClusterTemplate{" + + "id=" + id + + ", name='" + name + '\'' + + ", description='" + description + '\'' + + ", status=" + status + + ", cloudPlatform='" + cloudPlatform + '\'' + + ", datalakeRequired=" + datalakeRequired + + ", featureState=" + featureState + + ", type=" + type + + ", resourceCrn='" + resourceCrn + '\'' + + ", clouderaRuntimeVersion='" + clouderaRuntimeVersion + '\'' + + ", created=" + created + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/IdBroker.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/IdBroker.java index e2ac81e7d122..1934fc08f083 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/IdBroker.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/IdBroker.java @@ -118,4 +118,10 @@ public void setSignCert(String signCert) { this.signCert = signCert; } + @Override + public String toString() { + return "IdBroker{" + + "id=" + id + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/gateway/Gateway.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/gateway/Gateway.java index 98ccd6eab7af..aeb35e2519c2 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/gateway/Gateway.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/gateway/Gateway.java @@ -214,4 +214,14 @@ public Integer getGatewayPort() { public void setGatewayPort(Integer gatewayPort) { this.gatewayPort = gatewayPort; } + + @Override + public String toString() { + return "Gateway{" + + "id=" + id + + ", gatewayType=" + gatewayType + + ", path='" + path + '\'' + + ", gatewayPort=" + gatewayPort + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/gateway/GatewayTopology.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/gateway/GatewayTopology.java index 21750862bba2..c63813ac00b6 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/gateway/GatewayTopology.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/gateway/GatewayTopology.java @@ -73,4 +73,12 @@ public Json getExposedServices() { public void setExposedServices(Json exposedServices) { this.exposedServices = exposedServices; } + + @Override + public String toString() { + return "GatewayTopology{" + + "id=" + id + + ", topologyName='" + topologyName + '\'' + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/host/HostGroup.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/host/HostGroup.java index 5d88859b2e8b..e682dd35952a 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/host/HostGroup.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/cluster/host/HostGroup.java @@ -122,4 +122,12 @@ public void setGeneratedRecipes(Set generatedRecipes) { this.generatedRecipes = generatedRecipes; } + @Override + public String toString() { + return "HostGroup{" + + "id=" + id + + ", name='" + name + '\'' + + ", recoveryMode=" + recoveryMode + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/instance/ArchivedInstanceMetaData.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/instance/ArchivedInstanceMetaData.java index 6ec55ada56b0..ddd60b20db6c 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/instance/ArchivedInstanceMetaData.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/instance/ArchivedInstanceMetaData.java @@ -16,6 +16,7 @@ import com.sequenceiq.cloudbreak.domain.ProvisionEntity; import com.sequenceiq.cloudbreak.domain.converter.InstanceLifeCycleConverter; import com.sequenceiq.cloudbreak.domain.converter.InstanceMetadataTypeConverter; +import com.sequenceiq.cloudbreak.util.DatabaseUtil; @Entity public class ArchivedInstanceMetaData implements ProvisionEntity { @@ -295,7 +296,7 @@ public String toString() { ", instanceStatus=" + instanceStatus + ", instanceMetadataType=" + instanceMetadataType + ", localityIndicator='" + localityIndicator + '\'' + - ", instanceGroup=" + instanceGroup + + ", instanceGroup=" + DatabaseUtil.lazyLoadSafeToString(instanceGroup) + ", startDate=" + startDate + ", terminationDate=" + terminationDate + ", subnetId='" + subnetId + '\'' + diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/instance/InstanceGroup.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/instance/InstanceGroup.java index a42a77bc0193..639bcc2f3c63 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/instance/InstanceGroup.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/instance/InstanceGroup.java @@ -36,6 +36,7 @@ import com.sequenceiq.cloudbreak.domain.stack.Stack; import com.sequenceiq.cloudbreak.domain.stack.instance.network.InstanceGroupNetwork; import com.sequenceiq.cloudbreak.domain.stack.loadbalancer.TargetGroup; +import com.sequenceiq.cloudbreak.util.DatabaseUtil; import com.sequenceiq.common.api.type.InstanceGroupType; import com.sequenceiq.common.api.type.ScalabilityOption; import com.sequenceiq.common.model.CloudIdentityType; @@ -310,7 +311,7 @@ public String toString() { "id=" + id + ", groupName='" + groupName + '\'' + ", instanceGroupType=" + instanceGroupType + - ", stack=" + stack.getName() + + ", stack=" + DatabaseUtil.lazyLoadSafeToString(stack, () -> stack.getName()) + '}'; } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/instance/network/InstanceGroupNetwork.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/instance/network/InstanceGroupNetwork.java index ba4d7d7960a0..5a4a144dd944 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/instance/network/InstanceGroupNetwork.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/instance/network/InstanceGroupNetwork.java @@ -55,4 +55,12 @@ public void setAttributes(Json attributes) { public String getCloudPlatform() { return cloudPlatform; } + + @Override + public String toString() { + return "InstanceGroupNetwork{" + + "id=" + id + + ", cloudPlatform='" + cloudPlatform + '\'' + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/loadbalancer/TargetGroup.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/loadbalancer/TargetGroup.java index 80ecc6b2cf48..2358830bb151 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/loadbalancer/TargetGroup.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/stack/loadbalancer/TargetGroup.java @@ -103,4 +103,12 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(type); } + + @Override + public String toString() { + return "TargetGroup{" + + "id=" + id + + ", type=" + type + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/BlueprintView.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/BlueprintView.java index 96f9b6e18fa6..46e1b402f51c 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/BlueprintView.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/BlueprintView.java @@ -99,4 +99,18 @@ public BlueprintUpgradeOption getBlueprintUpgradeOption() { public void setBlueprintUpgradeOption(BlueprintUpgradeOption blueprintUpgradeOption) { this.blueprintUpgradeOption = blueprintUpgradeOption; } + + @Override + public String toString() { + return "BlueprintView{" + + "stackType='" + stackType + '\'' + + ", stackVersion='" + stackVersion + '\'' + + ", hostGroupCount=" + hostGroupCount + + ", status=" + status + + ", resourceCrn='" + resourceCrn + '\'' + + ", tags=" + tags + + ", created=" + created + + ", blueprintUpgradeOption=" + blueprintUpgradeOption + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterApiView.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterApiView.java index fe7069bf351e..ed8a7a6f53d6 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterApiView.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterApiView.java @@ -11,11 +11,11 @@ import javax.persistence.OneToOne; import javax.persistence.Table; -import com.sequenceiq.common.api.type.CertExpirationState; import com.sequenceiq.cloudbreak.api.endpoint.v4.common.Status; - import com.sequenceiq.cloudbreak.converter.CertExpirationStateConverter; import com.sequenceiq.cloudbreak.domain.converter.StatusConverter; +import com.sequenceiq.common.api.type.CertExpirationState; + import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; @Entity @@ -96,4 +96,14 @@ public CertExpirationState getCertExpirationState() { public void setCertExpirationState(CertExpirationState certExpirationState) { this.certExpirationState = certExpirationState; } + + @Override + public String toString() { + return "ClusterApiView{" + + ", clusterManagerIp='" + clusterManagerIp + '\'' + + ", status=" + status + + ", environmentCrn='" + environmentCrn + '\'' + + ", certExpirationState=" + certExpirationState + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterComponentView.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterComponentView.java index 143bfc8beee5..93dc0330ca83 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterComponentView.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterComponentView.java @@ -69,4 +69,14 @@ public Long getClusterId() { public void setClusterId(Long clusterId) { this.clusterId = clusterId; } + + @Override + public String toString() { + return "ClusterComponentView{" + + "id=" + id + + ", componentType=" + componentType + + ", name='" + name + '\'' + + ", clusterId=" + clusterId + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterTemplateClusterApiView.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterTemplateClusterApiView.java index eb45622de092..29c7a16a797a 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterTemplateClusterApiView.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterTemplateClusterApiView.java @@ -43,4 +43,12 @@ public BlueprintView getBlueprint() { public void setBlueprint(BlueprintView blueprint) { this.blueprint = blueprint; } + + @Override + public String toString() { + return "ClusterTemplateClusterApiView{" + + ", blueprint=" + blueprint + + ", environmentCrn='" + environmentCrn + '\'' + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterTemplateInstanceGroupView.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterTemplateInstanceGroupView.java index 0a13e22458bb..5ab6a774a5d3 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterTemplateInstanceGroupView.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterTemplateInstanceGroupView.java @@ -32,4 +32,12 @@ public String getGroupName() { return groupName; } + @Override + public String toString() { + return "ClusterTemplateInstanceGroupView{" + + "id=" + id + + ", groupName='" + groupName + '\'' + + ", initialNodeCount=" + initialNodeCount + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterTemplateStackApiView.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterTemplateStackApiView.java index 6720fefa0a2e..926f49289102 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterTemplateStackApiView.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterTemplateStackApiView.java @@ -85,4 +85,14 @@ public StackType getType() { public void setType(StackType type) { this.type = type; } + + @Override + public String toString() { + return "ClusterTemplateStackApiView{" + + "cloudPlatform='" + cloudPlatform + '\'' + + ", type=" + type + + ", environmentCrn='" + environmentCrn + '\'' + + ", resourceCrn='" + resourceCrn + '\'' + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterTemplateView.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterTemplateView.java index aaa3a529a773..bec3c8762798 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterTemplateView.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterTemplateView.java @@ -122,4 +122,18 @@ public String getClouderaRuntimeVersion() { public void setClouderaRuntimeVersion(String clouderaRuntimeVersion) { this.clouderaRuntimeVersion = clouderaRuntimeVersion; } + + @Override + public String toString() { + return "ClusterTemplateView{" + + "status=" + status + + ", cloudPlatform='" + cloudPlatform + '\'' + + ", resourceCrn='" + resourceCrn + '\'' + + ", datalakeRequired=" + datalakeRequired + + ", type=" + type + + ", featureState=" + featureState + + ", created=" + created + + ", clouderaRuntimeVersion='" + clouderaRuntimeVersion + '\'' + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterView.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterView.java index dd80debb7974..ef8864bc58d2 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterView.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/ClusterView.java @@ -39,4 +39,11 @@ public Status getStatus() { return status; } + @Override + public String toString() { + return "ClusterView{" + + "clusterManagerIp='" + clusterManagerIp + '\'' + + ", status=" + status + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/HostGroupView.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/HostGroupView.java index 9b0be5a32e63..02dcb9571070 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/HostGroupView.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/HostGroupView.java @@ -55,4 +55,12 @@ public InstanceGroupView getInstanceGroup() { public void setInstanceGroup(InstanceGroupView instanceGroup) { this.instanceGroup = instanceGroup; } + + @Override + public String toString() { + return "HostGroupView{" + + "id=" + id + + ", name='" + name + '\'' + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/InstanceGroupView.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/InstanceGroupView.java index f9c36985a83e..89e21c683b7a 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/InstanceGroupView.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/InstanceGroupView.java @@ -54,4 +54,12 @@ public InstanceGroupType getInstanceGroupType() { return instanceGroupType; } + @Override + public String toString() { + return "InstanceGroupView{" + + "id=" + id + + ", groupName='" + groupName + '\'' + + ", instanceGroupType=" + instanceGroupType + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/InstanceMetaDataView.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/InstanceMetaDataView.java index 79592ff19466..50b36d2f7b82 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/InstanceMetaDataView.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/InstanceMetaDataView.java @@ -58,4 +58,14 @@ public String getInstanceName() { public String getStatusReason() { return statusReason; } + + @Override + public String toString() { + return "InstanceMetaDataView{" + + "id=" + id + + ", instanceStatus=" + instanceStatus + + ", instanceName='" + instanceName + '\'' + + ", statusReason='" + statusReason + '\'' + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/OrchestratorView.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/OrchestratorView.java index 200cd98cd5d7..92f90202f82e 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/OrchestratorView.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/OrchestratorView.java @@ -24,4 +24,11 @@ public String getType() { return type; } + @Override + public String toString() { + return "OrchestratorView{" + + "id=" + id + + ", type='" + type + '\'' + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/RecipeView.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/RecipeView.java index 7bb39cfad893..83e55409f16f 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/RecipeView.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/RecipeView.java @@ -4,10 +4,10 @@ import javax.persistence.Entity; import javax.persistence.Table; -import com.sequenceiq.cloudbreak.domain.converter.RecipeV4TypeConverter; import org.hibernate.annotations.Where; import com.sequenceiq.cloudbreak.api.endpoint.v4.recipes.requests.RecipeV4Type; +import com.sequenceiq.cloudbreak.domain.converter.RecipeV4TypeConverter; @Entity @Where(clause = "archived = false") @@ -46,4 +46,14 @@ public Long getCreated() { public void setCreated(Long created) { this.created = created; } + + @Override + public String toString() { + return "RecipeView{" + + "recipeType=" + recipeType + + ", resourceCrn='" + resourceCrn + '\'' + + ", archived=" + archived + + ", created=" + created + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/StackApiView.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/StackApiView.java index 85bd26be6285..f45c1a1ba281 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/StackApiView.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/StackApiView.java @@ -191,4 +191,22 @@ public String getStackVersion() { public void setStackVersion(String stackVersion) { this.stackVersion = stackVersion; } + + @Override + public String toString() { + return "StackApiView{" + + ", cloudPlatform='" + cloudPlatform + '\'' + + ", platformVariant='" + platformVariant + '\'' + + ", stackStatus=" + stackStatus + + ", created=" + created + + ", terminated=" + terminated + + ", datalakeCrn='" + datalakeCrn + '\'' + + ", type=" + type + + ", environmentCrn='" + environmentCrn + '\'' + + ", resourceCrn='" + resourceCrn + '\'' + + ", stackVersion='" + stackVersion + '\'' + + ", nodeCount=" + nodeCount + + ", tunnel=" + tunnel + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/StackStatusView.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/StackStatusView.java index 540f4e6d07e4..971c7048b95f 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/StackStatusView.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/StackStatusView.java @@ -33,4 +33,12 @@ public void setId(Long id) { public void setStatus(Status status) { this.status = status; } + + @Override + public String toString() { + return "StackStatusView{" + + "id=" + id + + ", status=" + status + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/StackView.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/StackView.java index 3a5cda16d804..1c9a719cef48 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/StackView.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/StackView.java @@ -172,4 +172,20 @@ public void setType(StackType type) { public String getEnvironmentCrn() { return environmentCrn; } + + @Override + public String toString() { + return "StackView{" + + ", cloudPlatform='" + cloudPlatform + '\'' + + ", platformVariant='" + platformVariant + '\'' + + ", stackStatus=" + stackStatus + + ", gatewayPort=" + gatewayPort + + ", created=" + created + + ", terminated=" + terminated + + ", resourceCrn='" + resourceCrn + '\'' + + ", tunnel=" + tunnel + + ", type=" + type + + ", environmentCrn='" + environmentCrn + '\'' + + '}'; + } } diff --git a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/UserView.java b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/UserView.java index 90fdef2c4537..f7eaecf30ed7 100644 --- a/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/UserView.java +++ b/core-model/src/main/java/com/sequenceiq/cloudbreak/domain/view/UserView.java @@ -58,4 +58,14 @@ public String getUserCrn() { public void setUserCrn(String userCrn) { this.userCrn = userCrn; } + + @Override + public String toString() { + return "UserView{" + + "id=" + id + + ", userName='" + userName + '\'' + + ", userId='" + userId + '\'' + + ", userCrn='" + userCrn + '\'' + + '}'; + } } diff --git a/core/src/test/java/com/sequenceiq/cloudbreak/DomainToStringTest.java b/core/src/test/java/com/sequenceiq/cloudbreak/DomainToStringTest.java new file mode 100644 index 000000000000..5b500757e51d --- /dev/null +++ b/core/src/test/java/com/sequenceiq/cloudbreak/DomainToStringTest.java @@ -0,0 +1,94 @@ +package com.sequenceiq.cloudbreak; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.mockito.Mockito.withSettings; + +import java.lang.reflect.Field; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.OneToOne; + +import org.hibernate.proxy.HibernateProxy; +import org.hibernate.proxy.LazyInitializer; +import org.junit.jupiter.api.Test; +import org.reflections.Reflections; +import org.reflections.scanners.Scanners; +import org.springframework.util.ReflectionUtils; + +class DomainToStringTest { + + @Test + void testDomainToString() { + Reflections reflections = new Reflections("com.sequenceiq", Scanners.TypesAnnotated); + + Set> missingToStringClasses = new HashSet<>(); + Set lazyLoadedFieldsWithoutLazyLoadSafeToString = new HashSet<>(); + + reflections.getTypesAnnotatedWith(Entity.class).forEach(entity -> { + try { + Object newInstance = entity.getDeclaredConstructor().newInstance(); + if (newInstance.toString().startsWith(entity.getName() + "@")) { + missingToStringClasses.add(entity); + } else { + Set lazyLoadedFields = Stream.of(entity.getDeclaredFields()) + .filter(this::isLazyLoaded) + .collect(Collectors.toSet()); + if (!lazyLoadedFields.isEmpty()) { + lazyLoadedFields.forEach(field -> { + ReflectionUtils.makeAccessible(field); + ReflectionUtils.setField(field, newInstance, createProxyObject(field.getType(), field)); + }); + try { + newInstance.toString(); + } catch (UninitializedToString e) { + lazyLoadedFieldsWithoutLazyLoadSafeToString.add(e.getField()); + } + } + } + } catch (Exception e) { + throw new RuntimeException("Failed to verify tOString() of entity " + entity.getName(), e); + } + }); + + assertThat(missingToStringClasses) + .as("All domain classes have toString() implementation").isEmpty(); + assertThat(lazyLoadedFieldsWithoutLazyLoadSafeToString) + .as("All lazy loaded fields are safely handled in toString()").isEmpty(); + } + + private boolean isLazyLoaded(Field field) { + return (field.isAnnotationPresent(OneToMany.class) && FetchType.LAZY.equals(field.getAnnotation(OneToMany.class).fetch())) + || (field.isAnnotationPresent(OneToOne.class) && FetchType.LAZY.equals(field.getAnnotation(OneToOne.class).fetch())) + || (field.isAnnotationPresent(ManyToOne.class) && FetchType.LAZY.equals(field.getAnnotation(ManyToOne.class).fetch())); + } + + private T createProxyObject(Class type, Field field) { + LazyInitializer lazyInitializer = mock(LazyInitializer.class); + when(lazyInitializer.isUninitialized()).thenReturn(true); + T hibernateProxy = mock(type, withSettings().extraInterfaces(HibernateProxy.class)); + when(((HibernateProxy) hibernateProxy).getHibernateLazyInitializer()).thenReturn(lazyInitializer); + when(hibernateProxy.toString()).thenThrow(new UninitializedToString(field)); + return hibernateProxy; + } + + static class UninitializedToString extends RuntimeException { + private final Field field; + + UninitializedToString(Field field) { + this.field = field; + } + + public Field getField() { + return field; + } + } +} diff --git a/core/src/test/java/com/sequenceiq/cloudbreak/InjectTest.java b/core/src/test/java/com/sequenceiq/cloudbreak/InjectTest.java index 31bbca0a2461..80dda3a1fe0b 100644 --- a/core/src/test/java/com/sequenceiq/cloudbreak/InjectTest.java +++ b/core/src/test/java/com/sequenceiq/cloudbreak/InjectTest.java @@ -1,21 +1,23 @@ package com.sequenceiq.cloudbreak; -import org.junit.Assert; -import org.junit.Test; -import org.reflections.Reflections; -import org.reflections.scanners.FieldAnnotationsScanner; -import org.reflections.scanners.MemberUsageScanner; -import org.reflections.scanners.SubTypesScanner; -import org.reflections.scanners.TypeAnnotationsScanner; +import static java.lang.System.lineSeparator; -import javax.inject.Inject; import java.lang.reflect.Member; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; -import static java.lang.System.lineSeparator; +import javax.inject.Inject; + +import org.junit.Assert; +import org.junit.Test; +import org.reflections.Reflections; +import org.reflections.scanners.FieldAnnotationsScanner; +import org.reflections.scanners.MemberUsageScanner; +import org.reflections.scanners.SubTypesScanner; +import org.reflections.scanners.TypeAnnotationsScanner; public class InjectTest { @@ -30,7 +32,7 @@ public void testIfThereAreUnusedInjections() { Map> unusedFields = new HashMap<>(); reflections.getFieldsAnnotatedWith(Inject.class).forEach(field -> { try { - Set usages = reflections.getFieldUsage(field); + Collection usages = reflections.getMemberUsage(field); if (usages.isEmpty()) { String className = field.getDeclaringClass().getName(); unusedFields.computeIfAbsent(className, key -> new HashSet<>()).add(field.toString()); diff --git a/custom-configurations/src/main/java/com/sequenceiq/cloudbreak/domain/CustomConfigurations.java b/custom-configurations/src/main/java/com/sequenceiq/cloudbreak/domain/CustomConfigurations.java index 1b3daef748c9..104389b6e0e1 100644 --- a/custom-configurations/src/main/java/com/sequenceiq/cloudbreak/domain/CustomConfigurations.java +++ b/custom-configurations/src/main/java/com/sequenceiq/cloudbreak/domain/CustomConfigurations.java @@ -15,6 +15,7 @@ import javax.persistence.UniqueConstraint; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.sequenceiq.cloudbreak.util.DatabaseUtil; @Entity @Table( @@ -132,7 +133,7 @@ public String toString() { return "CustomConfigs{" + "name='" + name + '\'' + ", crn='" + crn + '\'' + - ", configurations='" + configurations + '\'' + + ", configurations='" + DatabaseUtil.lazyLoadSafeToString(configurations) + '\'' + ", runtimeVersion='" + runtimeVersion + '\'' + ", created=" + created + '}'; diff --git a/flow/src/main/java/com/sequenceiq/flow/domain/FlowChainLog.java b/flow/src/main/java/com/sequenceiq/flow/domain/FlowChainLog.java index 77191d12f3ae..2d7296bb0f2a 100644 --- a/flow/src/main/java/com/sequenceiq/flow/domain/FlowChainLog.java +++ b/flow/src/main/java/com/sequenceiq/flow/domain/FlowChainLog.java @@ -109,4 +109,18 @@ public String getTriggerEvent() { public void setTriggerEvent(String triggerEvent) { this.triggerEvent = triggerEvent; } + + @Override + public String toString() { + return "FlowChainLog{" + + "id=" + id + + ", created=" + created + + ", flowChainType='" + flowChainType + '\'' + + ", flowChainId='" + flowChainId + '\'' + + ", parentFlowChainId='" + parentFlowChainId + '\'' + + ", chain='" + chain + '\'' + + ", flowTriggerUserCrn='" + flowTriggerUserCrn + '\'' + + ", triggerEvent='" + triggerEvent + '\'' + + '}'; + } } diff --git a/flow/src/main/java/com/sequenceiq/flow/domain/FlowOperationStats.java b/flow/src/main/java/com/sequenceiq/flow/domain/FlowOperationStats.java index 23ef827a86ee..a2527136e5ef 100644 --- a/flow/src/main/java/com/sequenceiq/flow/domain/FlowOperationStats.java +++ b/flow/src/main/java/com/sequenceiq/flow/domain/FlowOperationStats.java @@ -64,4 +64,14 @@ public String getDurationHistory() { public void setDurationHistory(String durationHistory) { this.durationHistory = durationHistory; } + + @Override + public String toString() { + return "FlowOperationStats{" + + "id=" + id + + ", operationType=" + operationType + + ", cloudPlatform='" + cloudPlatform + '\'' + + ", durationHistory='" + durationHistory + '\'' + + '}'; + } } diff --git a/gradle.properties b/gradle.properties index cc71c934a824..bb737763bcbd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -73,6 +73,7 @@ accessorSmartVersion=2.4.7 oauth2OidcSdkVersion=6.5 protobufVersion=3.19.1 grpcVersion=1.42.1 +reflectionsVersion=0.10 # Repo Urls repoUrl=https://repo.hortonworks.com/content/repositories/releases/ diff --git a/workspace/src/main/java/com/sequenceiq/cloudbreak/workspace/model/Tenant.java b/workspace/src/main/java/com/sequenceiq/cloudbreak/workspace/model/Tenant.java index 48846d2b4dad..4841325df60b 100644 --- a/workspace/src/main/java/com/sequenceiq/cloudbreak/workspace/model/Tenant.java +++ b/workspace/src/main/java/com/sequenceiq/cloudbreak/workspace/model/Tenant.java @@ -4,6 +4,7 @@ import java.util.HashSet; import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; import javax.persistence.CascadeType; import javax.persistence.Column; @@ -15,6 +16,8 @@ import javax.persistence.OneToMany; import javax.persistence.SequenceGenerator; +import com.sequenceiq.cloudbreak.util.DatabaseUtil; + @Entity public class Tenant implements Serializable { @@ -93,4 +96,23 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(id); } + + @Override + public String toString() { + return "Tenant{" + + "id=" + id + + ", name='" + name + '\'' + + ", description='" + description + '\'' + + ", users=" + DatabaseUtil.lazyLoadSafeToString(users, this::usersToString) + + ", workspaces=" + DatabaseUtil.lazyLoadSafeToString(workspaces, this::workspacesToString) + + '}'; + } + + private String usersToString() { + return users.stream().map(User::getUserCrn).collect(Collectors.toSet()).toString(); + } + + private String workspacesToString() { + return workspaces.stream().map(Workspace::getResourceCrn).collect(Collectors.toSet()).toString(); + } } diff --git a/workspace/src/main/java/com/sequenceiq/cloudbreak/workspace/model/User.java b/workspace/src/main/java/com/sequenceiq/cloudbreak/workspace/model/User.java index 27fd398d38a5..5ba4cd8644dc 100644 --- a/workspace/src/main/java/com/sequenceiq/cloudbreak/workspace/model/User.java +++ b/workspace/src/main/java/com/sequenceiq/cloudbreak/workspace/model/User.java @@ -91,4 +91,15 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hashCode(userId); } + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", userName='" + userName + '\'' + + ", userId='" + userId + '\'' + + ", userCrn='" + userCrn + '\'' + + ", tenant=" + tenant + + '}'; + } } diff --git a/workspace/src/main/java/com/sequenceiq/cloudbreak/workspace/model/UserPreferences.java b/workspace/src/main/java/com/sequenceiq/cloudbreak/workspace/model/UserPreferences.java index 6d72ed2f0012..bce57fd49a2b 100644 --- a/workspace/src/main/java/com/sequenceiq/cloudbreak/workspace/model/UserPreferences.java +++ b/workspace/src/main/java/com/sequenceiq/cloudbreak/workspace/model/UserPreferences.java @@ -57,4 +57,13 @@ public User getUser() { public void setUser(User user) { this.user = user; } + + @Override + public String toString() { + return "UserPreferences{" + + "id=" + id + + ", externalId='" + externalId + '\'' + + ", user=" + user + + '}'; + } }