From a950fa033792cd79164f969b96292418ec619ac0 Mon Sep 17 00:00:00 2001
From: Kai Zimmermann
Date: Mon, 28 Mar 2016 11:17:06 +0200
Subject: [PATCH] Documented equals dashcode policy
---
.../hawkbit/repository/model/BaseEntity.java | 14 +++++++++++
.../repository/model/DistributionSet.java | 4 ----
.../model/DistributionSetIdName.java | 3 ---
.../model/DistributionSetMetadata.java | 5 +---
.../model/DsMetadataCompositeKey.java | 2 --
.../repository/model/ExternalArtifact.java | 5 +---
.../hawkbit/repository/model/NamedEntity.java | 23 +++++++++++++++++++
.../repository/model/SoftwareModule.java | 7 +-----
.../hawkbit/repository/model/Target.java | 6 +++++
.../hawkbit/repository/model/TargetTag.java | 5 ----
.../model/TenantAwareBaseEntity.java | 16 +++++++++++++
.../repository/model/TenantConfiguration.java | 23 +++++--------------
12 files changed, 68 insertions(+), 45 deletions(-)
diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/BaseEntity.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/BaseEntity.java
index 964cbb728..09cfc3953 100644
--- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/BaseEntity.java
+++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/BaseEntity.java
@@ -122,6 +122,13 @@ public abstract class BaseEntity implements Serializable, Identifiable {
this.id = id;
}
+ /**
+ * Defined equals/hashcode strategy for the repository in general is that an
+ * entity is equal if it has the same {@link #getId()} and
+ * {@link #getOptLockRevision()} and class.
+ *
+ * @see java.lang.Object#hashCode()
+ */
@Override
public int hashCode() { // NOSONAR - as this is generated code
final int prime = 31;
@@ -131,6 +138,13 @@ public abstract class BaseEntity implements Serializable, Identifiable {
return result;
}
+ /**
+ * Defined equals/hashcode strategy for the repository in general is that an
+ * entity is equal if it has the same {@link #getId()} and
+ * {@link #getOptLockRevision()} and class.
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
@Override
public boolean equals(final Object obj) { // NOSONAR - as this is generated
// code
diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/DistributionSet.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/DistributionSet.java
index 390421bf8..58303340e 100644
--- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/DistributionSet.java
+++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/DistributionSet.java
@@ -46,10 +46,6 @@ import org.eclipse.persistence.annotations.CascadeOnDelete;
* A {@link Target} has exactly one target {@link DistributionSet} assigned.
*
*
- *
- *
- *
- *
*/
@Entity
@Table(name = "sp_distribution_set", uniqueConstraints = {
diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/DistributionSetIdName.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/DistributionSetIdName.java
index fd90e9d04..f8662567a 100644
--- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/DistributionSetIdName.java
+++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/DistributionSetIdName.java
@@ -15,9 +15,6 @@ import java.io.Serializable;
*
*/
public class DistributionSetIdName implements Serializable {
- /**
- *
- */
private static final long serialVersionUID = 1L;
private final Long id;
diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/DistributionSetMetadata.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/DistributionSetMetadata.java
index e9597f60b..4303ffd96 100644
--- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/DistributionSetMetadata.java
+++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/DistributionSetMetadata.java
@@ -23,10 +23,7 @@ import javax.persistence.ManyToOne;
import javax.persistence.Table;
/**
- * Metadata for {@link DistributionSet}.
- *
- *
- *
+ * Meta data for {@link DistributionSet}.
*
*/
@IdClass(DsMetadataCompositeKey.class)
diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/DsMetadataCompositeKey.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/DsMetadataCompositeKey.java
index a23595679..adc37d65a 100644
--- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/DsMetadataCompositeKey.java
+++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/DsMetadataCompositeKey.java
@@ -14,8 +14,6 @@ import java.io.Serializable;
* The DistributionSet Metadata composite key which contains the meta data key
* and the ID of the DistributionSet itself.
*
- *
- *
*/
public final class DsMetadataCompositeKey implements Serializable {
private static final long serialVersionUID = 1L;
diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/ExternalArtifact.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/ExternalArtifact.java
index 2369d000b..f3d1f9bb9 100644
--- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/ExternalArtifact.java
+++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/ExternalArtifact.java
@@ -22,12 +22,9 @@ import javax.persistence.Table;
import javax.validation.constraints.NotNull;
/**
- * External artifact representation with all the necessray informattion to
+ * External artifact representation with all the necessary information to
* generate an artifact {@link URL} at runtime.
*
- *
- *
- *
*/
@Table(name = "sp_external_artifact", indexes = {
@Index(name = "sp_idx_external_artifact_prim", columnList = "id,tenant") })
diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/NamedEntity.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/NamedEntity.java
index e14d88161..ebf3d8939 100644
--- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/NamedEntity.java
+++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/NamedEntity.java
@@ -60,4 +60,27 @@ public abstract class NamedEntity extends TenantAwareBaseEntity {
public void setName(final String name) {
this.name = name;
}
+
+ @Override
+ public int hashCode() { // NOSONAR - as this is generated
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + this.getClass().getName().hashCode();
+ return result;
+ }
+
+ @Override
+ public boolean equals(final Object obj) { // NOSONAR - as this is generated
+ if (this == obj) {
+ return true;
+ }
+ if (!super.equals(obj)) {
+ return false;
+ }
+ if (!(obj instanceof NamedEntity)) {
+ return false;
+ }
+
+ return true;
+ }
}
diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/SoftwareModule.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/SoftwareModule.java
index 99a57a2c4..a86c0b864 100644
--- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/SoftwareModule.java
+++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/SoftwareModule.java
@@ -33,12 +33,7 @@ import org.eclipse.persistence.annotations.CascadeOnDelete;
/**
* Base Software Module that is supported by OS level provisioning mechanism on
- * the edge controller, e.g. OS, JVM, AgentHub
- *
- *
- *
- *
- *
+ * the edge controller, e.g. OS, JVM, AgentHub.
*
*/
@Entity
diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/Target.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/Target.java
index 62713dc3f..973c7382a 100644
--- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/Target.java
+++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/Target.java
@@ -131,6 +131,12 @@ public class Target extends NamedEntity implements Persistable {
securityToken = null;
}
+ /**
+ * Note: For Target we extended the general strategy by adding controllerId
+ * as well.
+ *
+ * @see org.eclipse.hawkbit.repository.model.BaseEntity#equals(java.lang.Object)
+ */
@Override
public boolean equals(final Object obj) {// NOSONAR - as this is generated
if (this == obj) {
diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TargetTag.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TargetTag.java
index 90a246b61..5b7f03713 100644
--- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TargetTag.java
+++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TargetTag.java
@@ -21,11 +21,6 @@ import javax.persistence.UniqueConstraint;
* A {@link TargetTag} is used to describe Target attributes and use them also
* for filtering the target list.
*
- *
- *
- *
- *
- *
*/
@Entity
@Table(name = "sp_target_tag", indexes = {
diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TenantAwareBaseEntity.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TenantAwareBaseEntity.java
index ea223e2d7..d4f03c973 100644
--- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TenantAwareBaseEntity.java
+++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TenantAwareBaseEntity.java
@@ -75,6 +75,14 @@ public abstract class TenantAwareBaseEntity extends BaseEntity {
return "BaseEntity [id=" + super.getId() + "]";
}
+ /**
+ * Tenant aware entities extend the equals/hashcode strategy with the tenant
+ * name. That would allow for instance in a multi-schema based data
+ * separation setup to have the same primary key for different entities of
+ * different tenants.
+ *
+ * @see org.eclipse.hawkbit.repository.model.BaseEntity#hashCode()
+ */
@Override
public int hashCode() {
final int prime = 31;
@@ -83,6 +91,14 @@ public abstract class TenantAwareBaseEntity extends BaseEntity {
return result;
}
+ /**
+ * Tenant aware entities extend the equals/hashcode strategy with the tenant
+ * name. That would allow for instance in a multi-schema based data
+ * separation setup to have the same primary key for different entities of
+ * different tenants.
+ *
+ * @see org.eclipse.hawkbit.repository.model.BaseEntity#equals(java.lang.Object)
+ */
@Override
public boolean equals(final Object obj) {
if (this == obj) {
diff --git a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TenantConfiguration.java b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TenantConfiguration.java
index c35cea1c7..de5398e5b 100644
--- a/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TenantConfiguration.java
+++ b/hawkbit-repository/src/main/java/org/eclipse/hawkbit/repository/model/TenantConfiguration.java
@@ -19,9 +19,6 @@ import javax.persistence.UniqueConstraint;
/**
* A JPA entity which stores the tenant specific configuration.
*
- *
- *
- *
*/
@Entity
@Table(name = "sp_tenant_configuration", uniqueConstraints = @UniqueConstraint(columnNames = { "conf_key",
@@ -88,31 +85,23 @@ public class TenantConfiguration extends TenantAwareBaseEntity implements Serial
@Override
public int hashCode() {
final int prime = 31;
- int result = 1;
- result = prime * result + (key == null ? 0 : key.hashCode());
+ int result = super.hashCode();
+ result = prime * result + this.getClass().getName().hashCode();
return result;
}
@Override
- public boolean equals(final Object obj) { // NOSONAR - as this is generated
- // code
+ public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
- if (obj == null) {
+ if (!super.equals(obj)) {
return false;
}
- if (getClass() != obj.getClass()) {
- return false;
- }
- final TenantConfiguration other = (TenantConfiguration) obj;
- if (key == null) {
- if (other.key != null) {
- return false;
- }
- } else if (!key.equals(other.key)) {
+ if (!(obj instanceof TenantConfiguration)) {
return false;
}
+
return true;
}