Project

General

Profile

Download (7.17 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2007 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9

    
10
package eu.etaxonomy.cdm.model.common;
11

    
12

    
13
import java.util.HashSet;
14
import java.util.Set;
15

    
16
import javax.persistence.FetchType;
17
import javax.persistence.MappedSuperclass;
18
import javax.persistence.OneToMany;
19
import javax.xml.bind.annotation.XmlAccessType;
20
import javax.xml.bind.annotation.XmlAccessorType;
21
import javax.xml.bind.annotation.XmlElement;
22
import javax.xml.bind.annotation.XmlElementWrapper;
23
import javax.xml.bind.annotation.XmlRootElement;
24
import javax.xml.bind.annotation.XmlType;
25

    
26
import org.apache.log4j.Logger;
27
import org.hibernate.annotations.Cascade;
28
import org.hibernate.annotations.CascadeType;
29
import org.hibernate.envers.Audited;
30

    
31
import eu.etaxonomy.cdm.model.reference.ICdmTarget;
32
import eu.etaxonomy.cdm.model.reference.ISourceable;
33
import eu.etaxonomy.cdm.model.reference.OriginalSourceBase;
34
import eu.etaxonomy.cdm.model.reference.OriginalSourceType;
35
import eu.etaxonomy.cdm.model.reference.Reference;
36
import eu.etaxonomy.cdm.strategy.merge.Merge;
37
import eu.etaxonomy.cdm.strategy.merge.MergeMode;
38

    
39
/**
40
 * Abstract class for all objects that may have (multiple) sources
41
 * @author a.mueller
42
 * @since 14-Jan-2019 13:06:47
43
 */
44
@XmlAccessorType(XmlAccessType.FIELD)
45
@XmlType(name = "SourcedEntityBase", propOrder = {
46
        "sources"
47
})
48
@XmlRootElement(name = "SourcedEntityBase")
49
@MappedSuperclass
50
@Audited
51
public abstract class SourcedEntityBase<SOURCE extends OriginalSourceBase<? extends SourcedEntityBase<SOURCE>>>
52
        extends AnnotatableEntity
53
        implements ISourceable<SOURCE>{
54

    
55
    private static final long serialVersionUID = -5614669050360359126L;
56
	@SuppressWarnings("unused")
57
	private static final Logger logger = Logger.getLogger(SourcedEntityBase.class);
58

    
59
    @XmlElementWrapper(name = "Sources")
60
    @XmlElement(name = "Source")
61
    @OneToMany(fetch = FetchType.LAZY, orphanRemoval=true)
62
    @Cascade({CascadeType.SAVE_UPDATE, CascadeType.MERGE, CascadeType.DELETE})
63
    @Merge(MergeMode.ADD_CLONE)
64
    //TODO should be Set<SOURCE> but this currently throws exception in DefaultMergeStrategyTest
65
    private Set<OriginalSourceBase> sources = new HashSet<>();
66

    
67
// ************ CONSTRUCTOR ********************************************/
68

    
69
	//for hibernate use only
70
    protected SourcedEntityBase() {
71
		super();
72
	}
73

    
74
//
75
//	public SourcedEntityBase(Reference citation, String citationMicroReference,
76
//			String originalNameString) {
77
//		this.citationMicroReference = citationMicroReference;
78
//		this.originalNameString = originalNameString;
79
//		this.citation = citation;
80
//	}
81

    
82
//********************* GETTER / SETTER *******************************/
83

    
84
    @Override
85
    public Set<SOURCE> getSources() {
86
        return (Set<SOURCE>)this.sources;
87
    }
88

    
89
    @Override
90
    public void addSource(SOURCE source) {
91
        if (source != null){
92
            this.sources.add(source);
93
        }
94
    }
95

    
96
    @Override
97
    public SOURCE addSource(OriginalSourceType type, String id, String idNamespace,
98
            Reference citation, String microCitation) {
99
        if (id == null && idNamespace == null && citation == null && microCitation == null){
100
            return null;
101
        }
102
        SOURCE source = createNewSource(type, id, idNamespace, citation, microCitation, null, null);
103
        addSource(source);
104
        return source;
105
    }
106

    
107
    @Override
108
    public SOURCE addSource(OriginalSourceType type, Reference reference, String microReference,
109
            String originalInformation) {
110
        if (reference == null && isBlank(microReference) && isBlank(originalInformation)){
111
            return null;
112
        }
113
        SOURCE source = createNewSource(type, null, null, reference, microReference, originalInformation, null);
114
        addSource(source);
115
        return source;
116
    }
117

    
118
    @Override
119
    public SOURCE addAggregationSource(ICdmTarget target) {
120
        SOURCE source = createNewSource(OriginalSourceType.Aggregation, null, null, null,
121
                null, null, target);
122
        addSource(source);
123
        return source;
124
    }
125

    
126

    
127
    @Override
128
    public void addSources(Set<SOURCE> sources){
129
        if (sources != null){
130
            for (SOURCE source: sources){
131
                addSource(source);
132
            }
133
        }
134
    }
135

    
136
    @Override
137
    public SOURCE addImportSource(String id, String idNamespace, Reference citation, String microCitation) {
138
        if (id == null && idNamespace == null && citation == null && microCitation == null){
139
            return null;
140
        }
141
        SOURCE source = createNewSource(OriginalSourceType.Import, id, idNamespace, citation, microCitation, null, null);
142
        addSource(source);
143
        return source;
144
    }
145

    
146
    @Override
147
    public SOURCE addPrimaryTaxonomicSource(Reference citation, String microCitation) {
148
        if (citation == null && microCitation == null){
149
            return null;
150
        }
151
        SOURCE source = createNewSource(OriginalSourceType.PrimaryTaxonomicSource, null, null, citation, microCitation, null, null);
152
        addSource(source);
153
        return source;
154
    }
155

    
156
    @Override
157
    public SOURCE addPrimaryTaxonomicSource(Reference citation) {
158
        return addPrimaryTaxonomicSource(citation, null);
159
    }
160
//
161
//    /**
162
//     * Adds a {@link IOriginalSource source} to this description element.
163
//     * @param type the type of the source
164
//     * @param idInSource the id used in the source
165
//     * @param idNamespace the namespace for the id in the source
166
//     * @param citation the source as a {@link Reference reference}
167
//     * @param microReference the details (e.g. page number) in the reference
168
//     * @param nameUsedInSource the taxon name used in the source
169
//     * @param originalNameString the name as text used in the source
170
//     */
171
//    public void addSource(OriginalSourceType type, String idInSource, String idNamespace, Reference citation, String microReference, TaxonName nameUsedInSource, String originalNameString){
172
//        DescriptionElementSource newSource = DescriptionElementSource.NewInstance(type, idInSource, idNamespace, citation, microReference, nameUsedInSource, originalNameString);
173
//        addSource(newSource);
174
//    }
175

    
176
    @Override
177
    public void removeSource(SOURCE source) {
178
        this.sources.remove(source);
179
    }
180

    
181
    public void removeSources(){
182
        this.sources.clear();
183
    }
184

    
185
    protected abstract SOURCE createNewSource(OriginalSourceType type, String idInSource, String idNamespace,
186
            Reference citation, String microReference, String originalInformation, ICdmTarget target);
187

    
188
//****************** CLONE ************************************************/
189

    
190
	@Override
191
	public SourcedEntityBase<SOURCE> clone() throws CloneNotSupportedException{
192

    
193
	    @SuppressWarnings("unchecked")
194
        SourcedEntityBase<SOURCE> result = (SourcedEntityBase<SOURCE>)super.clone();
195

    
196
        //Sources
197
        result.sources = new HashSet<>();
198
        for (SOURCE source : getSources()){
199
            @SuppressWarnings("unchecked")
200
            SOURCE newSource = (SOURCE)source.clone();
201
            result.addSource(newSource);
202
        }
203

    
204
		//no changes to: -
205
		return result;
206
	}
207
}
(50-50/56)