1 /*-
2  * See the file LICENSE for redistribution information.
3  *
4  * Copyright (c) 2002, 2014 Oracle and/or its affiliates.  All rights reserved.
5  *
6  */
7 
8 package com.sleepycat.persist.model;
9 
10 /**
11  * The metadata for a secondary key field.  A secondary key may be specified
12  * with the {@link SecondaryKey} annotation.
13  *
14  * <p>{@code SecondaryKeyMetadata} objects are thread-safe.  Multiple threads
15  * may safely call the methods of a shared {@code SecondaryKeyMetadata}
16  * object.</p>
17  *
18  * @author Mark Hayes
19  */
20 public class SecondaryKeyMetadata extends FieldMetadata {
21 
22     private static final long serialVersionUID = 8118924993396722502L;
23 
24     private String keyName;
25     private Relationship relationship;
26     private String elementClassName;
27     private String relatedEntity;
28     private DeleteAction deleteAction;
29 
30     /**
31      * Used by an {@code EntityModel} to construct secondary key metadata.
32      */
SecondaryKeyMetadata(String name, String className, String declaringClassName, String elementClassName, String keyName, Relationship relationship, String relatedEntity, DeleteAction deleteAction)33     public SecondaryKeyMetadata(String name,
34                                 String className,
35                                 String declaringClassName,
36                                 String elementClassName,
37                                 String keyName,
38                                 Relationship relationship,
39                                 String relatedEntity,
40                                 DeleteAction deleteAction) {
41         super(name, className, declaringClassName);
42         this.elementClassName = elementClassName;
43         this.keyName = keyName;
44         this.relationship = relationship;
45         this.relatedEntity = relatedEntity;
46         this.deleteAction = deleteAction;
47     }
48 
49     /**
50      * Returns the class name of the array or collection element for a {@link
51      * Relationship#ONE_TO_MANY ONE_TO_MANY} or {@link
52      * Relationship#MANY_TO_MANY MANY_TO_MANY} relationship, or null for a
53      * Relationship#ONE_TO_ONE ONE_TO_ONE} or {@link Relationship#MANY_TO_ONE
54      * MANY_TO_ONE} relationship.
55      */
getElementClassName()56     public String getElementClassName() {
57         return elementClassName;
58     }
59 
60     /**
61      * Returns the key name, which may be different from the field name.
62      */
getKeyName()63     public String getKeyName() {
64         return keyName;
65     }
66 
67     /**
68      * Returns the relationship between instances of the entity class and the
69      * secondary keys.  This may be specified using the {@link
70      * SecondaryKey#relate} annotation.
71      */
getRelationship()72     public Relationship getRelationship() {
73         return relationship;
74     }
75 
76     /**
77      * Returns the class name of the related (foreign) entity, for which
78      * foreign key constraints are specified using the {@link
79      * SecondaryKey#relatedEntity} annotation.
80      */
getRelatedEntity()81     public String getRelatedEntity() {
82         return relatedEntity;
83     }
84 
85     /**
86      * Returns the action to take when a related entity is deleted having a
87      * primary key value that exists as a secondary key value for this entity.
88      * This may be specified using the {@link
89      * SecondaryKey#onRelatedEntityDelete} annotation.
90      */
getDeleteAction()91     public DeleteAction getDeleteAction() {
92         return deleteAction;
93     }
94 
95     @Override
equals(Object other)96     public boolean equals(Object other) {
97         if (other instanceof SecondaryKeyMetadata) {
98             SecondaryKeyMetadata o = (SecondaryKeyMetadata) other;
99             return super.equals(o) &&
100                    relationship == o.relationship &&
101                    ClassMetadata.nullOrEqual(deleteAction, o.deleteAction) &&
102                    ClassMetadata.nullOrEqual(keyName, o.keyName) &&
103                    ClassMetadata.nullOrEqual(elementClassName,
104                                              o.elementClassName) &&
105                    ClassMetadata.nullOrEqual(relatedEntity, o.relatedEntity);
106         } else {
107             return false;
108         }
109     }
110 
111     @Override
hashCode()112     public int hashCode() {
113         return super.hashCode() +
114                relationship.hashCode() +
115                ClassMetadata.hashCode(deleteAction) +
116                ClassMetadata.hashCode(keyName) +
117                ClassMetadata.hashCode(elementClassName) +
118                ClassMetadata.hashCode(relatedEntity);
119     }
120 }
121