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; }