Project

General

Profile

Download (7.28 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
package eu.etaxonomy.cdm.model.common;
10

    
11
import java.util.HashSet;
12
import java.util.Set;
13

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

    
24
import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;
25
import org.hibernate.annotations.Cascade;
26
import org.hibernate.annotations.CascadeType;
27
import org.hibernate.envers.Audited;
28

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

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

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

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

    
66
// ************ CONSTRUCTOR ********************************************/
67

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

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

    
80
//********************* GETTER / SETTER *******************************/
81

    
82
    @SuppressWarnings("unchecked")
83
    @Override
84
    public Set<SOURCE> getSources() {
85
        return (Set<SOURCE>)this.sources;
86
    }
87

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

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

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

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

    
125

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

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

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

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

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

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

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

    
187
//****************** CLONE ************************************************/
188

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

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

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

    
203
		//no changes to: -
204
		return result;
205
	}
206
}
(52-52/58)