import java.io.IOException;\r
import java.util.ArrayList;\r
import java.util.Arrays;\r
+import java.util.Collection;\r
import java.util.HashMap;\r
import java.util.HashSet;\r
import java.util.List;\r
import java.util.Map;\r
import java.util.Set;\r
+import java.util.UUID;\r
\r
import org.apache.log4j.Logger;\r
import org.apache.lucene.index.CorruptIndexException;\r
import org.apache.lucene.search.BooleanClause.Occur;\r
import org.apache.lucene.search.BooleanQuery;\r
import org.apache.lucene.search.SortField;\r
+import org.hibernate.TransientObjectException;\r
import org.hibernate.search.spatial.impl.Rectangle;\r
import org.springframework.beans.factory.annotation.Autowired;\r
import org.springframework.stereotype.Service;\r
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacade;\r
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeConfigurator;\r
import eu.etaxonomy.cdm.api.facade.DerivedUnitFacadeNotSupportedException;\r
+import eu.etaxonomy.cdm.api.service.molecular.ISequenceService;\r
import eu.etaxonomy.cdm.api.service.pager.Pager;\r
import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;\r
+import eu.etaxonomy.cdm.api.service.search.ILuceneIndexToolProvider;\r
import eu.etaxonomy.cdm.api.service.search.ISearchResultBuilder;\r
import eu.etaxonomy.cdm.api.service.search.LuceneSearch;\r
import eu.etaxonomy.cdm.api.service.search.LuceneSearch.TopGroupsWithMaxScore;\r
import eu.etaxonomy.cdm.model.description.DescriptionBase;\r
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
import eu.etaxonomy.cdm.model.description.IndividualsAssociation;\r
-import eu.etaxonomy.cdm.model.location.WaterbodyOrCountry;\r
+import eu.etaxonomy.cdm.model.location.Country;\r
import eu.etaxonomy.cdm.model.media.Media;\r
+import eu.etaxonomy.cdm.model.molecular.DnaSample;\r
+import eu.etaxonomy.cdm.model.molecular.Sequence;\r
import eu.etaxonomy.cdm.model.occurrence.DerivationEvent;\r
import eu.etaxonomy.cdm.model.occurrence.DerivedUnit;\r
import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;\r
-import eu.etaxonomy.cdm.model.occurrence.FieldObservation;\r
+import eu.etaxonomy.cdm.model.occurrence.FieldUnit;\r
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;\r
+import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationType;\r
import eu.etaxonomy.cdm.model.taxon.Taxon;\r
import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
-import eu.etaxonomy.cdm.persistence.dao.AbstractBeanInitializer;\r
import eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao;\r
+import eu.etaxonomy.cdm.persistence.dao.initializer.AbstractBeanInitializer;\r
import eu.etaxonomy.cdm.persistence.dao.occurrence.IOccurrenceDao;\r
import eu.etaxonomy.cdm.persistence.dao.taxon.ITaxonDao;\r
import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
@Autowired\r
private ITaxonService taxonService;\r
\r
+ @Autowired\r
+ private ISequenceService sequenceService;\r
+\r
@Autowired\r
private AbstractBeanInitializer beanInitializer;\r
\r
@Autowired\r
private ITaxonDao taxonDao;\r
\r
+ @Autowired\r
+ private ILuceneIndexToolProvider luceneIndexToolProvider;\r
\r
\r
public OccurrenceServiceImpl() {\r
* move to termService\r
*/\r
@Override\r
- public WaterbodyOrCountry getCountryByIso(String iso639) {\r
+ public Country getCountryByIso(String iso639) {\r
return this.definedTermDao.getCountryByIso(iso639);\r
\r
}\r
* move to termService\r
*/\r
@Override\r
- public List<WaterbodyOrCountry> getWaterbodyOrCountryByName(String name) {\r
- List<? extends DefinedTermBase> terms = this.definedTermDao.findByTitle(WaterbodyOrCountry.class, name, null, null, null, null, null, null) ;\r
- List<WaterbodyOrCountry> countries = new ArrayList<WaterbodyOrCountry>();\r
+ public List<Country> getCountryByName(String name) {\r
+ List<? extends DefinedTermBase> terms = this.definedTermDao.findByTitle(Country.class, name, null, null, null, null, null, null) ;\r
+ List<Country> countries = new ArrayList<Country>();\r
for (int i=0;i<terms.size();i++){\r
- countries.add((WaterbodyOrCountry)terms.get(i));\r
+ countries.add((Country)terms.get(i));\r
}\r
return countries;\r
}\r
return new DefaultPagerImpl<DerivationEvent>(pageNumber, numberOfResults, pageSize, results);\r
}\r
\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#countDeterminations(eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase, eu.etaxonomy.cdm.model.taxon.TaxonBase)\r
+ */\r
+ @Override\r
+ public int countDeterminations(SpecimenOrObservationBase occurence, TaxonBase taxonbase) {\r
+ return dao.countDeterminations(occurence, taxonbase);\r
+ }\r
+\r
@Override\r
public Pager<DeterminationEvent> getDeterminations(SpecimenOrObservationBase occurrence, TaxonBase taxonBase, Integer pageSize,Integer pageNumber, List<String> propertyPaths) {\r
Integer numberOfResults = dao.countDeterminations(occurrence, taxonBase);\r
}\r
\r
@Override\r
- public List<UuidAndTitleCache<FieldObservation>> getFieldObservationUuidAndTitleCache() {\r
- return dao.getFieldObservationUuidAndTitleCache();\r
+ public List<UuidAndTitleCache<FieldUnit>> getFieldUnitUuidAndTitleCache() {\r
+ return dao.getFieldUnitUuidAndTitleCache();\r
}\r
\r
/* (non-Javadoc)\r
occurrenceIds.add(o.getId());\r
}\r
}\r
-\r
occurrences = (List<T>) dao.listByIds(occurrenceIds, pageSize, pageNumber, orderHints, propertyPaths);\r
\r
return new DefaultPagerImpl<T>(pageNumber, occurrenceIds.size(), pageSize, occurrences);\r
\r
}\r
\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#pageByAssociatedTaxon(java.lang.Class, java.util.Set, eu.etaxonomy.cdm.model.taxon.Taxon, java.lang.Integer, java.lang.Integer, java.lang.Integer, java.util.List, java.util.List)\r
+ */\r
+ @SuppressWarnings("unchecked")\r
+ @Override\r
+ public <T extends SpecimenOrObservationBase> Pager<T> pageByAssociatedTaxon(Class<T> type, Set<TaxonRelationshipEdge> includeRelationships,\r
+ String taxonUUID, Integer maxDepth, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {\r
+\r
+ UUID uuid = UUID.fromString(taxonUUID);\r
+ Taxon tax = (Taxon) taxonDao.load(uuid);\r
+ //TODO REMOVE NULL STATEMENT\r
+type=null;\r
+ return pageByAssociatedTaxon( type,includeRelationships,tax, maxDepth, pageSize, pageNumber, orderHints, propertyPaths );\r
+\r
+ }\r
+\r
+\r
@Override\r
public Pager<SearchResult<SpecimenOrObservationBase>> findByFullText(\r
Class<? extends SpecimenOrObservationBase> clazz, String queryString, Rectangle boundingBox, List<Language> languages,\r
BooleanQuery finalQuery = new BooleanQuery();\r
BooleanQuery textQuery = new BooleanQuery();\r
\r
- LuceneSearch luceneSearch = new LuceneSearch(getSession(), FieldObservation.class);\r
- QueryFactory queryFactory = new QueryFactory(luceneSearch);\r
+ LuceneSearch luceneSearch = new LuceneSearch(luceneIndexToolProvider, FieldUnit.class);\r
+ QueryFactory queryFactory = luceneIndexToolProvider.newQueryFactoryFor(FieldUnit.class);\r
\r
// --- criteria\r
- luceneSearch.setClazz(clazz);\r
+ luceneSearch.setCdmTypRestriction(clazz);\r
if(queryString != null){\r
textQuery.add(queryFactory.newTermQuery("titleCache", queryString), Occur.SHOULD);\r
finalQuery.add(textQuery, Occur.MUST);\r
return luceneSearch;\r
}\r
\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#getFieldUnits(eu.etaxonomy.cdm.model.occurrence.DerivedUnit)\r
+ */\r
+ @Override\r
+ public Collection<FieldUnit> getFieldUnits(UUID derivedUnitUuid) {\r
+ //It will search recursively over all {@link DerivationEvent}s and get the "originals" ({@link SpecimenOrObservationBase})\r
+ //from which this DerivedUnit was derived until all FieldUnits are found.\r
+\r
+ //FIXME: use HQL queries to increase performance\r
+ Collection<FieldUnit> fieldUnits = new ArrayList<FieldUnit>();\r
+ SpecimenOrObservationBase derivedUnit = load(derivedUnitUuid);\r
+ if(derivedUnit instanceof DerivedUnit){\r
+ getFieldUnits((DerivedUnit) derivedUnit, fieldUnits);\r
+ }\r
+ return fieldUnits;\r
+ }\r
+\r
+\r
+ /**\r
+ * @param original\r
+ * @param fieldUnits\r
+ */\r
+ private void getFieldUnits(DerivedUnit derivedUnit, Collection<FieldUnit> fieldUnits) {\r
+ Set<SpecimenOrObservationBase> originals = derivedUnit.getOriginals();\r
+ if(originals!=null && !originals.isEmpty()){\r
+ for(SpecimenOrObservationBase<?> original:originals){\r
+ if(original instanceof FieldUnit){\r
+ fieldUnits.add((FieldUnit) original);\r
+ }\r
+ else if(original instanceof DerivedUnit){\r
+ getFieldUnits((DerivedUnit) original, fieldUnits);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#moveSequence(eu.etaxonomy.cdm.model.molecular.DnaSample, eu.etaxonomy.cdm.model.molecular.DnaSample, eu.etaxonomy.cdm.model.molecular.Sequence)\r
+ */\r
+ @Override\r
+ public boolean moveSequence(DnaSample from, DnaSample to, Sequence sequence) {\r
+ //reload specimens to avoid session conflicts\r
+ from = (DnaSample) load(from.getUuid());\r
+ to = (DnaSample) load(to.getUuid());\r
+ sequence = sequenceService.load(sequence.getUuid());\r
+\r
+ if(from==null || to==null || sequence==null){\r
+ throw new TransientObjectException("One of the CDM entities has not been saved to the data base yet. Moving only works for persisted/saved CDM entities.\n" +\r
+ "Operation was move "+sequence+ " from "+from+" to "+to);\r
+ }\r
+ from.removeSequence(sequence);\r
+ saveOrUpdate(from);\r
+ to.addSequence(sequence);\r
+ saveOrUpdate(to);\r
+ return true;\r
+ }\r
+\r
+ /* (non-Javadoc)\r
+ * @see eu.etaxonomy.cdm.api.service.IOccurrenceService#moveDerivate(eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase, eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase, eu.etaxonomy.cdm.model.occurrence.DerivedUnit)\r
+ */\r
+ @Override\r
+ public boolean moveDerivate(SpecimenOrObservationBase<?> from, SpecimenOrObservationBase<?> to, DerivedUnit derivate) {\r
+ //reload specimens to avoid session conflicts\r
+ from = load(from.getUuid());\r
+ to = load(to.getUuid());\r
+ derivate = (DerivedUnit) load(derivate.getUuid());\r
+\r
+ if(from==null || to==null || derivate==null){\r
+ throw new TransientObjectException("One of the CDM entities has not been saved to the data base yet. Moving only works for persisted/saved CDM entities.\n" +\r
+ "Operation was move "+derivate+ " from "+from+" to "+to);\r
+ }\r
+\r
+ SpecimenOrObservationType derivateType = derivate.getRecordBasis();\r
+ SpecimenOrObservationType toType = to.getRecordBasis();\r
+ //check if type is a sub derivate type\r
+ if(toType==SpecimenOrObservationType.FieldUnit //moving to FieldUnit always works\r
+ || (derivateType.isKindOf(toType) && toType!=derivateType)){ //moving only to parent derivate type\r
+ //remove derivation event from parent specimen of dragged object\r
+ DerivationEvent eventToRemove = null;\r
+ for(DerivationEvent event:from.getDerivationEvents()){\r
+ if(event.getDerivatives().contains(derivate)){\r
+ eventToRemove = event;\r
+ break;\r
+ }\r
+ }\r
+ from.removeDerivationEvent(eventToRemove);\r
+ saveOrUpdate(from);\r
+ //add new derivation event to target\r
+ to.addDerivationEvent(DerivationEvent.NewSimpleInstance(to, derivate, eventToRemove==null?null:eventToRemove.getType()));\r
+ saveOrUpdate(to);\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+\r
}\r