Revision e1fef636
Added by Katja Luther over 2 years ago
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/description/IDescriptiveDataSetDao.java | ||
---|---|---|
12 | 12 |
import eu.etaxonomy.cdm.model.description.Feature; |
13 | 13 |
import eu.etaxonomy.cdm.persistence.dao.common.IIdentifiableDao; |
14 | 14 |
import eu.etaxonomy.cdm.persistence.dao.hibernate.common.IdentifiableDaoBase; |
15 |
import eu.etaxonomy.cdm.persistence.dto.DescriptiveDataSetBaseDto; |
|
16 | 15 |
import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache; |
17 | 16 |
|
18 | 17 |
public interface IDescriptiveDataSetDao extends IIdentifiableDao<DescriptiveDataSet> { |
... | ... | |
36 | 35 |
* @param uuid |
37 | 36 |
* @return |
38 | 37 |
*/ |
39 |
DescriptiveDataSetBaseDto getDescriptiveDataSetDtoByUuid(UUID uuid); |
|
38 |
// DescriptiveDataSetBaseDto getDescriptiveDataSetDtoByUuid(UUID uuid);
|
|
40 | 39 |
} |
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dao/hibernate/description/DescriptiveDataSetDao.java | ||
---|---|---|
24 | 24 |
import eu.etaxonomy.cdm.model.description.DescriptiveSystemRole; |
25 | 25 |
import eu.etaxonomy.cdm.model.description.Feature; |
26 | 26 |
import eu.etaxonomy.cdm.model.description.QuantitativeData; |
27 |
import eu.etaxonomy.cdm.persistence.dao.description.IDescriptionDao; |
|
27 | 28 |
import eu.etaxonomy.cdm.persistence.dao.description.IDescriptiveDataSetDao; |
28 | 29 |
import eu.etaxonomy.cdm.persistence.dao.hibernate.common.IdentifiableDaoBase; |
29 | 30 |
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonNodeDao; |
30 | 31 |
import eu.etaxonomy.cdm.persistence.dao.term.IDefinedTermDao; |
31 | 32 |
import eu.etaxonomy.cdm.persistence.dao.term.ITermTreeDao; |
32 |
import eu.etaxonomy.cdm.persistence.dto.DescriptiveDataSetBaseDto; |
|
33 |
import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto; |
|
34 |
import eu.etaxonomy.cdm.persistence.dto.TermDto; |
|
35 |
import eu.etaxonomy.cdm.persistence.dto.TermTreeDto; |
|
36 | 33 |
import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache; |
37 | 34 |
|
38 | 35 |
@Repository |
... | ... | |
51 | 48 |
@Autowired |
52 | 49 |
private ITaxonNodeDao nodeDao; |
53 | 50 |
|
51 |
@Autowired |
|
52 |
private IDescriptionDao descriptionDao; |
|
53 |
|
|
54 | 54 |
public DescriptiveDataSetDao() { |
55 | 55 |
super(DescriptiveDataSet.class); |
56 | 56 |
} |
... | ... | |
240 | 240 |
return list; |
241 | 241 |
} |
242 | 242 |
|
243 |
private List<UUID> getDescriptionUuidsForDescriptiveDataSet(UUID uuid) { |
|
244 |
Session session = getSession(); |
|
243 | 245 |
|
246 |
String queryString = "SELECT t.uuid FROM DescriptiveDataSet a JOIN a.descriptions as t WHERE a.uuid = :uuid"; |
|
244 | 247 |
|
245 |
@Override |
|
246 |
public DescriptiveDataSetBaseDto getDescriptiveDataSetDtoByUuid(UUID uuid) { |
|
247 |
String queryString = DescriptiveDataSetBaseDto.getDescriptiveDataSetDtoSelect() |
|
248 |
+ " WHERE a.uuid = :uuid" |
|
249 |
+ " ORDER BY a.titleCache"; |
|
250 |
Query query = getSession().createQuery(queryString); |
|
248 |
|
|
249 |
Query query; |
|
250 |
query = session.createQuery(queryString); |
|
251 | 251 |
query.setParameter("uuid", uuid); |
252 | 252 |
|
253 |
@SuppressWarnings("unchecked") |
|
254 |
List<Object[]> result = query.list(); |
|
255 | 253 |
|
256 |
List<DescriptiveDataSetBaseDto> list = DescriptiveDataSetBaseDto.descriptiveDataSetBaseDtoListFrom(result); |
|
257 |
UUID descriptiveSystemUuid = null; |
|
258 |
UUID minRankUuid = null; |
|
259 |
UUID maxRankUuid = null; |
|
260 |
if (result != null && !result.isEmpty()){ |
|
261 |
Object[] descriptiveDataSetResult = result.get(0); |
|
262 |
descriptiveSystemUuid = (UUID)descriptiveDataSetResult[4]; |
|
263 |
minRankUuid = (UUID)descriptiveDataSetResult[5]; |
|
264 |
maxRankUuid = (UUID)descriptiveDataSetResult[6]; |
|
265 |
}else{ |
|
266 |
return null; |
|
267 |
} |
|
268 |
//get descriptiveSystem |
|
269 |
DescriptiveDataSetBaseDto dto = list.get(0); |
|
270 |
if (descriptiveSystemUuid != null){ |
|
271 |
TermTreeDto treeDto = termTreeDao.getTermTreeDtosByUuid(descriptiveSystemUuid); |
|
272 |
dto.setDescriptiveSystem(treeDto); |
|
254 |
@SuppressWarnings("unchecked") |
|
255 |
List<UUID> result = query.list(); |
|
256 |
List<UUID> list = new ArrayList<>(); |
|
257 |
for(UUID object : result){ |
|
258 |
list.add(object); |
|
273 | 259 |
} |
274 |
//get taxon nodes |
|
275 |
List<UUID> nodeUuids = getNodeUuidsForDescriptiveDataSet(uuid); |
|
276 |
List<TaxonNodeDto> nodeDtos = nodeDao.getTaxonNodeDtos(nodeUuids); |
|
277 |
Set<TaxonNodeDto> nodeSet = new HashSet<>(nodeDtos); |
|
278 |
dto.setSubTreeFilter(nodeSet); |
|
279 |
|
|
280 |
TermDto minRank = termDao.getTermDto(minRankUuid); |
|
281 |
TermDto maxRank = termDao.getTermDto(maxRankUuid); |
|
282 |
dto.setMaxRank(maxRank); |
|
283 |
dto.setMinRank(minRank); |
|
284 |
return dto; |
|
260 |
|
|
261 |
return list; |
|
285 | 262 |
} |
263 |
|
|
264 |
|
|
265 |
|
|
266 |
|
|
267 |
// @Override |
|
268 |
// public DescriptiveDataSetBaseDto getDescriptiveDataSetDtoByUuid(UUID uuid) { |
|
269 |
// String queryString = DescriptiveDataSetBaseDto.getDescriptiveDataSetDtoSelect() |
|
270 |
// + " WHERE a.uuid = :uuid" |
|
271 |
// + " ORDER BY a.titleCache"; |
|
272 |
// Query query = getSession().createQuery(queryString); |
|
273 |
// query.setParameter("uuid", uuid); |
|
274 |
// |
|
275 |
// @SuppressWarnings("unchecked") |
|
276 |
// List<Object[]> result = query.list(); |
|
277 |
// |
|
278 |
// List<DescriptiveDataSetBaseDto> list = DescriptiveDataSetBaseDto.descriptiveDataSetBaseDtoListFrom(result); |
|
279 |
// UUID descriptiveSystemUuid = null; |
|
280 |
// UUID minRankUuid = null; |
|
281 |
// UUID maxRankUuid = null; |
|
282 |
// if (result != null && !result.isEmpty()){ |
|
283 |
// Object[] descriptiveDataSetResult = result.get(0); |
|
284 |
// descriptiveSystemUuid = (UUID)descriptiveDataSetResult[4]; |
|
285 |
// minRankUuid = (UUID)descriptiveDataSetResult[5]; |
|
286 |
// maxRankUuid = (UUID)descriptiveDataSetResult[6]; |
|
287 |
// }else{ |
|
288 |
// return null; |
|
289 |
// } |
|
290 |
// //get descriptiveSystem |
|
291 |
// DescriptiveDataSetBaseDto dto = list.get(0); |
|
292 |
// if (descriptiveSystemUuid != null){ |
|
293 |
// TermTreeDto treeDto = termTreeDao.getTermTreeDtosByUuid(descriptiveSystemUuid); |
|
294 |
// dto.setDescriptiveSystem(treeDto); |
|
295 |
// } |
|
296 |
// //get taxon nodes |
|
297 |
// List<UUID> nodeUuids = getNodeUuidsForDescriptiveDataSet(uuid); |
|
298 |
// List<TaxonNodeDto> nodeDtos = nodeDao.getTaxonNodeDtos(nodeUuids); |
|
299 |
// Set<TaxonNodeDto> nodeSet = new HashSet<>(nodeDtos); |
|
300 |
// dto.setSubTreeFilter(nodeSet); |
|
301 |
// |
|
302 |
// List<UUID> descriptionUuidList = getDescriptionUuidsForDescriptiveDataSet(uuid); |
|
303 |
// Set<UUID> descriptionUuids = new HashSet<>(descriptionUuidList); |
|
304 |
// dto.setDescriptionUuids(descriptionUuids); |
|
305 |
// |
|
306 |
// TermDto minRank = termDao.getTermDto(minRankUuid); |
|
307 |
// TermDto maxRank = termDao.getTermDto(maxRankUuid); |
|
308 |
// dto.setMaxRank(maxRank); |
|
309 |
// dto.setMinRank(minRank); |
|
310 |
// return dto; |
|
311 |
// } |
|
286 | 312 |
} |
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/dto/DescriptiveDataSetBaseDto.java | ||
---|---|---|
34 | 34 |
private TermTreeDto descriptiveSystem; |
35 | 35 |
private Set<TaxonNodeDto> subTreeFilter; |
36 | 36 |
private Set<TermDto> geoFilter; |
37 |
private Set<UUID> descriptionUuids; |
|
37 | 38 |
|
38 | 39 |
private Set<Representation> representations = new HashSet<>(); |
39 | 40 |
private String representation_L10n = null; |
... | ... | |
219 | 220 |
this.geoFilter = geoFilter; |
220 | 221 |
} |
221 | 222 |
|
223 |
public Set<UUID> getDescriptionUuids() { |
|
224 |
return descriptionUuids; |
|
225 |
} |
|
226 |
|
|
227 |
public void setDescriptionUuids(Set<UUID> descriptionUuids) { |
|
228 |
this.descriptionUuids = descriptionUuids; |
|
229 |
} |
|
230 |
|
|
222 | 231 |
|
223 | 232 |
} |
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DescriptionServiceImpl.java | ||
---|---|---|
449 | 449 |
if (descriptionBase.getDescribedSpecimenOrObservation() != null){ |
450 | 450 |
descriptionSpecimenMap.put(descriptionBase.getDescribedSpecimenOrObservation().getUuid(), descriptionBase); |
451 | 451 |
} |
452 |
if (descriptionBase instanceof TaxonDescription){ |
|
453 |
|
|
454 |
descriptionSpecimenMap.put(((TaxonDescription)descriptionBase).getTaxon().getUuid(), descriptionBase); |
|
455 |
} |
|
456 |
if (descriptionBase instanceof TaxonNameDescription){ |
|
457 |
|
|
458 |
descriptionSpecimenMap.put(((TaxonNameDescription)descriptionBase).getTaxonName().getUuid(), descriptionBase); |
|
459 |
} |
|
452 | 460 |
} |
453 | 461 |
MergeResult<DescriptionBase> mergeResult = null; |
454 | 462 |
for(DescriptionBaseDto descDto : descriptions) { |
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DescriptiveDataSetService.java | ||
---|---|---|
15 | 15 |
import java.util.stream.Collectors; |
16 | 16 |
|
17 | 17 |
import org.apache.log4j.Logger; |
18 |
import org.hibernate.Query; |
|
19 |
import org.hibernate.Session; |
|
18 | 20 |
import org.springframework.beans.factory.annotation.Autowired; |
19 | 21 |
import org.springframework.stereotype.Service; |
20 | 22 |
import org.springframework.transaction.annotation.Transactional; |
... | ... | |
73 | 75 |
import eu.etaxonomy.cdm.persistence.dto.SpecimenNodeWrapper; |
74 | 76 |
import eu.etaxonomy.cdm.persistence.dto.TaxonNodeDto; |
75 | 77 |
import eu.etaxonomy.cdm.persistence.dto.TermDto; |
78 |
import eu.etaxonomy.cdm.persistence.dto.TermTreeDto; |
|
76 | 79 |
import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache; |
77 | 80 |
import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy; |
78 | 81 |
import eu.etaxonomy.cdm.strategy.generate.PolytomousKeyGenerator; |
... | ... | |
98 | 101 |
@Autowired |
99 | 102 |
private IDefinedTermDao termDao; |
100 | 103 |
|
104 |
@Autowired |
|
105 |
private ITermTreeService termTreeService; |
|
106 |
|
|
101 | 107 |
@Autowired |
102 | 108 |
private IDescriptionService descriptionService; |
103 | 109 |
|
... | ... | |
127 | 133 |
return dao.getDescriptiveDataSetUuidAndTitleCache( limitOfInitialElements, pattern); |
128 | 134 |
} |
129 | 135 |
|
130 |
@Override |
|
131 |
public DescriptiveDataSetBaseDto getDescriptiveDataSetDtoByUuid(UUID uuid) { |
|
132 |
return dao.getDescriptiveDataSetDtoByUuid(uuid); |
|
133 |
} |
|
136 |
// @Override
|
|
137 |
// public DescriptiveDataSetBaseDto getDescriptiveDataSetDtoByUuid(UUID uuid) {
|
|
138 |
// return dao.getDescriptiveDataSetDtoByUuid(uuid);
|
|
139 |
// }
|
|
134 | 140 |
|
135 | 141 |
|
136 | 142 |
@Override |
... | ... | |
150 | 156 |
|| description.getTypes().contains(DescriptionType.DEFAULT_VALUES_FOR_AGGREGATION) |
151 | 157 |
|| description.getTypes().contains(DescriptionType.SECONDARY_DATA) |
152 | 158 |
)){ |
153 |
rowWrapper = createTaxonRowWrapper(description.getUuid(), descriptiveDataSet.getUuid());
|
|
159 |
rowWrapper = createTaxonRowWrapper((TaxonDescription)description, descriptiveDataSet.getUuid());
|
|
154 | 160 |
} |
155 | 161 |
else if (HibernateProxyHelper.isInstanceOf(description, SpecimenDescription.class)&& |
156 | 162 |
!description.getTypes().contains(DescriptionType.CLONE_FOR_SOURCE)){ |
... | ... | |
236 | 242 |
} |
237 | 243 |
|
238 | 244 |
@Override |
239 |
public TaxonRowWrapperDTO createTaxonRowWrapper(UUID taxonDescriptionUuid, UUID descriptiveDataSetUuid) {
|
|
245 |
public TaxonRowWrapperDTO createTaxonRowWrapper(TaxonDescription taxonDescription, UUID descriptiveDataSetUuid) {
|
|
240 | 246 |
TaxonNode taxonNode = null; |
241 | 247 |
Classification classification = null; |
242 | 248 |
// TaxonDescription description = (TaxonDescription) descriptionService.loadDto(taxonDescriptionUuid, |
243 | 249 |
// Arrays.asList("taxon", "descriptionElements", "descriptionElements.feature")); |
244 |
DescriptionBaseDto description = descriptionService.loadDto(taxonDescriptionUuid); |
|
250 |
// DescriptionBaseDto description = descriptionService.loadDto(taxonDescriptionUuid); |
|
251 |
DescriptionBaseDto description = DescriptionBaseDto.fromDescription(taxonDescription); |
|
245 | 252 |
|
246 | 253 |
DescriptiveDataSet descriptiveDataSet = dao.load(descriptiveDataSetUuid, null); |
247 | 254 |
Optional<TaxonNode> first = descriptiveDataSet.getTaxonSubtreeFilter().stream() |
... | ... | |
259 | 266 |
// descriptions.add(DescriptionBaseDto.fromDescription(desc)); |
260 | 267 |
// } |
261 | 268 |
} |
262 |
descriptions = new HashSet<>(descriptionService.loadDtosForTaxon(description.getTaxonDto().getUuid())); |
|
269 |
//TODO: fix getting descriptions |
|
270 |
// descriptions = new HashSet<>(descriptionService.loadDtosForTaxon(description.getTaxonDto().getUuid())); |
|
263 | 271 |
|
264 | 272 |
return new TaxonRowWrapperDTO(description, nodeDto, descriptions); |
265 | 273 |
} |
... | ... | |
420 | 428 |
// TaxonDescription defaultTaxonDescription = findDefaultDescription(description.getUuid(), descriptiveDataSet.getUuid()); |
421 | 429 |
TaxonDescription defaultTaxonDescription = recurseDefaultDescription(taxonNode, descriptiveDataSet); |
422 | 430 |
TaxonRowWrapperDTO taxonRowWrapper = defaultTaxonDescription != null |
423 |
? createTaxonRowWrapper(defaultTaxonDescription.getUuid(), descriptiveDataSet.getUuid()) : null;
|
|
431 |
? createTaxonRowWrapper(defaultTaxonDescription, descriptiveDataSet.getUuid()) : null; |
|
424 | 432 |
// use description not specimen for specimenRow |
425 | 433 |
SpecimenRowWrapperDTO specimenRowWrapperDTO = new SpecimenRowWrapperDTO(DescriptionBaseDto.fromDescription(description), SpecimenOrObservationDTOFactory.fromEntity(specimen), specimen.getRecordBasis(), new TaxonNodeDto(taxonNode), fieldUnit, identifier, country); |
426 | 434 |
specimenRowWrapperDTO.setDefaultDescription(taxonRowWrapper); |
... | ... | |
646 | 654 |
}); |
647 | 655 |
dataSet.addDescription(newTaxonDescription); |
648 | 656 |
saveOrUpdate(dataSet); |
649 |
return createTaxonRowWrapper(newTaxonDescription.getUuid(), dataSet.getUuid());
|
|
657 |
return createTaxonRowWrapper(newTaxonDescription, dataSet.getUuid()); |
|
650 | 658 |
} |
651 | 659 |
|
652 | 660 |
@Override |
... | ... | |
937 | 945 |
|
938 | 946 |
} |
939 | 947 |
|
948 |
@Override |
|
949 |
public DescriptiveDataSetBaseDto getDescriptiveDataSetDtoByUuid(UUID uuid) { |
|
950 |
String queryString = DescriptiveDataSetBaseDto.getDescriptiveDataSetDtoSelect() |
|
951 |
+ " WHERE a.uuid = :uuid" |
|
952 |
+ " ORDER BY a.titleCache"; |
|
953 |
Query query = getSession().createQuery(queryString); |
|
954 |
query.setParameter("uuid", uuid); |
|
955 |
|
|
956 |
@SuppressWarnings("unchecked") |
|
957 |
List<Object[]> result = query.list(); |
|
958 |
|
|
959 |
List<DescriptiveDataSetBaseDto> list = DescriptiveDataSetBaseDto.descriptiveDataSetBaseDtoListFrom(result); |
|
960 |
UUID descriptiveSystemUuid = null; |
|
961 |
UUID minRankUuid = null; |
|
962 |
UUID maxRankUuid = null; |
|
963 |
if (result != null && !result.isEmpty()){ |
|
964 |
Object[] descriptiveDataSetResult = result.get(0); |
|
965 |
descriptiveSystemUuid = (UUID)descriptiveDataSetResult[4]; |
|
966 |
minRankUuid = (UUID)descriptiveDataSetResult[5]; |
|
967 |
maxRankUuid = (UUID)descriptiveDataSetResult[6]; |
|
968 |
}else{ |
|
969 |
return null; |
|
970 |
} |
|
971 |
//get descriptiveSystem |
|
972 |
DescriptiveDataSetBaseDto dto = list.get(0); |
|
973 |
if (descriptiveSystemUuid != null){ |
|
974 |
TermTreeDto treeDto = termTreeService.getTermTreeDtoByUuid(descriptiveSystemUuid); |
|
975 |
dto.setDescriptiveSystem(treeDto); |
|
976 |
} |
|
977 |
//get taxon nodes |
|
978 |
List<UUID> nodeUuids = getNodeUuidsForDescriptiveDataSet(uuid); |
|
979 |
List<TaxonNodeDto> nodeDtos = taxonNodeService.getTaxonNodeDtos(nodeUuids); |
|
980 |
Set<TaxonNodeDto> nodeSet = new HashSet<>(nodeDtos); |
|
981 |
dto.setSubTreeFilter(nodeSet); |
|
982 |
|
|
983 |
List<UUID> descriptionUuidList = getDescriptionUuidsForDescriptiveDataSet(uuid); |
|
984 |
Set<UUID> descriptionUuids = new HashSet<>(descriptionUuidList); |
|
985 |
dto.setDescriptionUuids(descriptionUuids); |
|
986 |
|
|
987 |
TermDto minRank = termDao.getTermDto(minRankUuid); |
|
988 |
TermDto maxRank = termDao.getTermDto(maxRankUuid); |
|
989 |
dto.setMaxRank(maxRank); |
|
990 |
dto.setMinRank(minRank); |
|
991 |
return dto; |
|
992 |
} |
|
993 |
|
|
994 |
private List<UUID> getNodeUuidsForDescriptiveDataSet(UUID uuid) { |
|
995 |
Session session = getSession(); |
|
996 |
|
|
997 |
String queryString = "SELECT t.uuid FROM DescriptiveDataSet a JOIN a.taxonSubtreeFilter as t WHERE a.uuid = :uuid"; |
|
998 |
|
|
999 |
|
|
1000 |
Query query; |
|
1001 |
query = session.createQuery(queryString); |
|
1002 |
query.setParameter("uuid", uuid); |
|
1003 |
|
|
1004 |
|
|
1005 |
@SuppressWarnings("unchecked") |
|
1006 |
List<UUID> result = query.list(); |
|
1007 |
List<UUID> list = new ArrayList<>(); |
|
1008 |
for(UUID object : result){ |
|
1009 |
list.add(object); |
|
1010 |
} |
|
1011 |
|
|
1012 |
return list; |
|
1013 |
} |
|
1014 |
|
|
1015 |
private List<UUID> getDescriptionUuidsForDescriptiveDataSet(UUID uuid) { |
|
1016 |
Session session = getSession(); |
|
1017 |
|
|
1018 |
String queryString = "SELECT t.uuid FROM DescriptiveDataSet a JOIN a.descriptions as t WHERE a.uuid = :uuid"; |
|
1019 |
|
|
1020 |
|
|
1021 |
Query query; |
|
1022 |
query = session.createQuery(queryString); |
|
1023 |
query.setParameter("uuid", uuid); |
|
1024 |
|
|
1025 |
|
|
1026 |
@SuppressWarnings("unchecked") |
|
1027 |
List<UUID> result = query.list(); |
|
1028 |
List<UUID> list = new ArrayList<>(); |
|
1029 |
for(UUID object : result){ |
|
1030 |
list.add(object); |
|
1031 |
} |
|
1032 |
|
|
1033 |
return list; |
|
1034 |
} |
|
1035 |
|
|
940 | 1036 |
} |
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IDescriptiveDataSetService.java | ||
---|---|---|
119 | 119 |
|
120 | 120 |
/** |
121 | 121 |
* Creates a taxon row wrapper object for the given description |
122 |
* @param taxonDescriptionUuid the taxon description for which the wrapper should be created
|
|
122 |
* @param taxonDescription the taxon description for which the wrapper should be created |
|
123 | 123 |
* @param descriptiveDataSet the data set it should be used in |
124 | 124 |
* @return the created row wrapper |
125 | 125 |
*/ |
126 |
public TaxonRowWrapperDTO createTaxonRowWrapper(UUID taxonDescriptionUuid, UUID descriptiveDataSetUuid);
|
|
126 |
public TaxonRowWrapperDTO createTaxonRowWrapper(TaxonDescription taxonDescription, UUID descriptiveDataSetUuid);
|
|
127 | 127 |
|
128 | 128 |
/** |
129 | 129 |
* Returns a {@link SpecimenDescription} for a given specimen with corresponding |
Also available in: Unified diff
ref #9772: fix getting taxonRowWrapper