X-Git-Url: https://dev.e-taxonomy.eu/gitweb/cdmlib.git/blobdiff_plain/0b9c5cf211758d893e5ea2261acec87401644f97..45546a913cf144912d383d54758aa51c81367ec9:/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IdentifiableServiceBase.java?ds=inline diff --git a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IdentifiableServiceBase.java b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IdentifiableServiceBase.java index 266aebfd01..de1dd9fb4e 100644 --- a/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IdentifiableServiceBase.java +++ b/cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IdentifiableServiceBase.java @@ -1,9 +1,9 @@ // $Id$ /** * Copyright (C) 2007 EDIT -* European Distributed Institute of Taxonomy +* European Distributed Institute of Taxonomy * http://www.e-taxonomy.eu -* +* * The contents of this file are subject to the Mozilla Public License Version 1.1 * See LICENSE.TXT at the top of this package for the full license terms. */ @@ -36,15 +36,14 @@ import eu.etaxonomy.cdm.model.common.ISourceable; import eu.etaxonomy.cdm.model.common.IdentifiableEntity; import eu.etaxonomy.cdm.model.common.IdentifiableSource; import eu.etaxonomy.cdm.model.common.LSID; -import eu.etaxonomy.cdm.model.common.UuidAndTitleCache; import eu.etaxonomy.cdm.model.media.Rights; import eu.etaxonomy.cdm.model.name.NonViralName; import eu.etaxonomy.cdm.model.reference.Reference; import eu.etaxonomy.cdm.model.reference.ReferenceFactory; -import eu.etaxonomy.cdm.model.taxon.TaxonBase; import eu.etaxonomy.cdm.persistence.dao.common.IIdentifiableDao; import eu.etaxonomy.cdm.persistence.dao.hibernate.HibernateBeanInitializer; import eu.etaxonomy.cdm.persistence.dao.initializer.AutoPropertyInitializer; +import eu.etaxonomy.cdm.persistence.dto.UuidAndTitleCache; import eu.etaxonomy.cdm.persistence.query.MatchMode; import eu.etaxonomy.cdm.persistence.query.OrderHint; import eu.etaxonomy.cdm.persistence.query.OrderHint.SortOrder; @@ -57,10 +56,10 @@ import eu.etaxonomy.cdm.strategy.merge.IMergable; import eu.etaxonomy.cdm.strategy.merge.IMergeStrategy; import eu.etaxonomy.cdm.strategy.merge.MergeException; -public abstract class IdentifiableServiceBase> extends AnnotatableServiceBase +public abstract class IdentifiableServiceBase> extends AnnotatableServiceBase implements IIdentifiableEntityService{ - + protected static final int UPDATE_TITLE_CACHE_DEFAULT_STEP_SIZE = 1000; protected static final Logger logger = Logger.getLogger(IdentifiableServiceBase.class); @@ -68,29 +67,29 @@ public abstract class IdentifiableServiceBase getRights(T t, Integer pageSize, Integer pageNumber, List propertyPaths) { Integer numberOfResults = dao.countRights(t); - + List results = new ArrayList(); if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize) - results = dao.getRights(t, pageSize, pageNumber,propertyPaths); + results = dao.getRights(t, pageSize, pageNumber,propertyPaths); } - + return new DefaultPagerImpl(pageNumber, numberOfResults, pageSize, results); } - + @Override @Transactional(readOnly = true) public Pager getSources(T t, Integer pageSize, Integer pageNumber, List propertyPaths) { Integer numberOfResults = dao.countSources(t); - + List results = new ArrayList(); if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize) - results = dao.getSources(t, pageSize, pageNumber,propertyPaths); + results = dao.getSources(t, pageSize, pageNumber,propertyPaths); } - + return new DefaultPagerImpl(pageNumber, numberOfResults, pageSize, results); } - + @Transactional(readOnly = false) @Override public T replace(T x, T y) { @@ -99,9 +98,9 @@ public abstract class IdentifiableServiceBase findByTitle(String title) as it is somewhat less cumbersome. Admittedly, I don't + * List findByTitle(String title) as it is somewhat less cumbersome. Admittedly, I don't * understand what is going on with the configurators etc. so maybe there is a good reason for - * the design of this method. + * the design of this method. * @param title * @return */ @@ -109,7 +108,7 @@ public abstract class IdentifiableServiceBase findCdmObjectsByTitle(String title){ return ((IIdentifiableDao)dao).findByTitle(title); } - + @Transactional(readOnly = true) protected List findCdmObjectsByTitle(String title, Class clazz){ return ((IIdentifiableDao)dao).findByTitleAndClass(title, clazz); @@ -118,7 +117,7 @@ public abstract class IdentifiableServiceBase findCdmObjectsByTitle(String title, CdmBase sessionObject){ return ((IIdentifiableDao)dao).findByTitle(title, sessionObject); } - + /* * TODO - Migrated from CommonServiceBase * (non-Javadoc) @@ -135,56 +134,56 @@ public abstract class IdentifiableServiceBase> getUuidAndTitleCache() { return dao.getUuidAndTitleCache(); - } - - @Transactional(readOnly = true) + } + + @Transactional(readOnly = true) @Override - public Pager findByTitle(Class clazz, String queryString,MatchMode matchmode, List criteria, Integer pageSize, Integer pageNumber, List orderHints, List propertyPaths) { - Integer numberOfResults = dao.countByTitle(clazz, queryString, matchmode, criteria); - - List results = new ArrayList(); - if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize) - results = dao.findByTitle(clazz, queryString, matchmode, criteria, pageSize, pageNumber, orderHints, propertyPaths); - } - - return new DefaultPagerImpl(pageNumber, numberOfResults, pageSize, results); + public Pager findByTitle(Class clazz, String queryString,MatchMode matchmode, List criteria, Integer pageSize, Integer pageNumber, List orderHints, List propertyPaths) { + Integer numberOfResults = dao.countByTitle(clazz, queryString, matchmode, criteria); + + List results = new ArrayList(); + if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize) + results = dao.findByTitle(clazz, queryString, matchmode, criteria, pageSize, pageNumber, orderHints, propertyPaths); + } + + return new DefaultPagerImpl(pageNumber, numberOfResults, pageSize, results); } - + @Transactional(readOnly = true) @Override public Pager findByTitle(IIdentifiableEntityServiceConfigurator config){ return findByTitle(config.getClazz(), config.getTitleSearchStringSqlized(), config.getMatchMode(), config.getCriteria(), config.getPageSize(), config.getPageNumber(), config.getOrderHints(), config.getPropertyPaths()); } - + @Transactional(readOnly = true) @Override public List listByTitle(Class clazz, String queryString,MatchMode matchmode, List criteria, Integer pageSize, Integer pageNumber, List orderHints, List propertyPaths) { Integer numberOfResults = dao.countByTitle(clazz, queryString, matchmode, criteria); - + List results = new ArrayList(); if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize) - results = dao.findByTitle(clazz, queryString, matchmode, criteria, pageSize, pageNumber, orderHints, propertyPaths); + results = dao.findByTitle(clazz, queryString, matchmode, criteria, pageSize, pageNumber, orderHints, propertyPaths); } return results; } - + @Transactional(readOnly = true) @Override public Pager findTitleCache(Class clazz, String queryString, Integer pageSize, Integer pageNumber, List orderHints, MatchMode matchMode){ long numberOfResults = dao.countTitleCache(clazz, queryString, matchMode); - + List results = new ArrayList(); if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize) results = dao.findTitleCache(clazz, queryString, pageSize, pageNumber, orderHints, matchMode); } int r = 0; r += numberOfResults; - + return new DefaultPagerImpl(pageNumber, r , pageSize, results); } @@ -192,40 +191,40 @@ public abstract class IdentifiableServiceBase listByReferenceTitle(Class clazz, String queryString,MatchMode matchmode, List criteria, Integer pageSize, Integer pageNumber, List orderHints, List propertyPaths) { Integer numberOfResults = dao.countByReferenceTitle(clazz, queryString, matchmode, criteria); - + List results = new ArrayList(); if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize) - results = dao.findByReferenceTitle(clazz, queryString, matchmode, criteria, pageSize, pageNumber, orderHints, propertyPaths); + results = dao.findByReferenceTitle(clazz, queryString, matchmode, criteria, pageSize, pageNumber, orderHints, propertyPaths); } return results; } - + @Transactional(readOnly = true) @Override public T find(LSID lsid) { return dao.find(lsid); } - + @Transactional(readOnly = true) @Override public Pager search(Class clazz, String queryString, Integer pageSize, Integer pageNumber, List orderHints, List propertyPaths) { Integer numberOfResults = dao.count(clazz,queryString); - + List results = new ArrayList(); if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize) - results = dao.search(clazz,queryString, pageSize, pageNumber, orderHints, propertyPaths); + results = dao.search(clazz,queryString, pageSize, pageNumber, orderHints, propertyPaths); } - + return new DefaultPagerImpl(pageNumber, numberOfResults, pageSize, results); } - + @Override @Transactional(readOnly = false) public void updateTitleCache() { updateTitleCache(null, null, null, null); } - - @Transactional(readOnly = false) //TODO check transactional behaviour, e.g. what happens with the session if count is very large + + @Transactional(readOnly = false) //TODO check transactional behaviour, e.g. what happens with the session if count is very large protected void updateTitleCacheImpl(Class clazz, Integer stepSize, IIdentifiableEntityCacheStrategy cacheStrategy, IProgressMonitor monitor) { if (stepSize == null){ stepSize = UPDATE_TITLE_CACHE_DEFAULT_STEP_SIZE; @@ -233,7 +232,7 @@ public abstract class IdentifiableServiceBase orderHints = new ArrayList(); orderHints.add( new OrderHint("id", OrderHint.SortOrder.ASCENDING)); - - + + Map, AutoPropertyInitializer> oldAutoInit = switchOfAutoinitializer(); List list = this.list(clazz, stepSize, i, orderHints, null); switchOnOldAutoInitializer(oldAutoInit); - + List entitiesToUpdate = new ArrayList(); for (T entity : list){ HibernateProxyHelper.deproxy(entity, clazz); @@ -285,9 +284,9 @@ public abstract class IdentifiableServiceBase, AutoPropertyInitializer> switchOfAutoinitializer() { HibernateBeanInitializer initializer = (HibernateBeanInitializer)this.appContext.getBean("defaultBeanInitializer"); @@ -307,12 +306,13 @@ public abstract class IdentifiableServiceBase cacheStrategy, List entitiesToUpdate, T entity) { - - assert (entity.isProtectedTitleCache() == false ); - + + //assert (entity.isProtectedTitleCache() == false ); + //exclude recursive inreferences if (entity.isInstanceOf(Reference.class)){ Reference ref = CdmBase.deproxy(entity, Reference.class); @@ -320,31 +320,32 @@ public abstract class IdentifiableServiceBase)entity).getType()).getCacheStrategy(); } } - entity.setCacheStrategy(entityCacheStrategy); - + + //old titleCache entity.setProtectedTitleCache(true); + String oldTitleCache = entity.getTitleCache(); entity.setTitleCache(oldTitleCache, false); //before we had entity.setProtectedTitleCache(false) but this deleted the titleCache itself - + entity.setCacheStrategy(entityCacheStrategy); //NonViralNames and Reference have more caches //TODO handle in NameService String oldNameCache = null; String oldFullTitleCache = null; String oldAbbrevTitleCache = null; if (entity instanceof NonViralName ){ - + try{ NonViralName nvn = (NonViralName) entity; if (!nvn.isProtectedNameCache()){ @@ -360,7 +361,7 @@ public abstract class IdentifiableServiceBase ref = (Reference) entity; if (!ref.isProtectedAbbrevTitleCache()){ @@ -384,10 +385,11 @@ public abstract class IdentifiableServiceBase clazz, IMatchStrategy matchStrategy, IMergeStrategy mergeStrategy) { DeduplicateState dedupState = new DeduplicateState(); - + if (clazz == null){ logger.warn("Deduplication clazz must not be null!"); return 0; @@ -463,16 +465,16 @@ public abstract class IdentifiableServiceBase nextGroup = new ArrayList(); - + int result = 0; // double countTotal = count(clazz); -// -// Number countPagesN = Math.ceil(countTotal/dedupState.pageSize.doubleValue()) ; +// +// Number countPagesN = Math.ceil(countTotal/dedupState.pageSize.doubleValue()) ; // int countPages = countPagesN.intValue(); -// - +// + List orderHints = Arrays.asList(new OrderHint[]{new OrderHint("titleCache", SortOrder.ASCENDING)}); - + while (! dedupState.isCompleted){ //get x page sizes List objectList = getPages(clazz, dedupState, orderHints); @@ -483,7 +485,7 @@ public abstract class IdentifiableServiceBase(); nextGroup.add(object); - nUnEqual++; + nUnEqual++; } dedupState.lastTitleCache = currentTitleCache; } @@ -535,7 +537,7 @@ public abstract class IdentifiableServiceBase clazz, String queryString,MatchMode matchmode, List criteria){ Integer numberOfResults = dao.countByTitle(clazz, queryString, matchmode, criteria); - + return numberOfResults; } - + @Transactional(readOnly = true) @Override public Integer countByTitle(IIdentifiableEntityServiceConfigurator config){ return countByTitle(config.getClazz(), config.getTitleSearchStringSqlized(), config.getMatchMode(), config.getCriteria()); - + } @Override @Transactional(readOnly = true) public Pager> findByIdentifier( - Class clazz, String identifier, DefinedTerm identifierType, MatchMode matchmode, + Class clazz, String identifier, DefinedTerm identifierType, MatchMode matchmode, boolean includeEntity, Integer pageSize, Integer pageNumber, List propertyPaths) { - + Integer numberOfResults = dao.countByIdentifier(clazz, identifier, identifierType, matchmode); List daoResults = new ArrayList(); if(numberOfResults > 0) { // no point checking again daoResults = dao.findByIdentifier(clazz, identifier, identifierType, matchmode, includeEntity, pageSize, pageNumber, propertyPaths); } - + List> result = new ArrayList>(); for (Object[] daoObj : daoResults){ if (includeEntity){ result.add(new FindByIdentifierDTO((DefinedTerm)daoObj[0], (String)daoObj[1], (S)daoObj[2])); }else{ - result.add(new FindByIdentifierDTO((DefinedTerm)daoObj[0], (String)daoObj[1], (UUID)daoObj[2], (String)daoObj[3])); + result.add(new FindByIdentifierDTO((DefinedTerm)daoObj[0], (String)daoObj[1], (UUID)daoObj[2], (String)daoObj[3])); } } return new DefaultPagerImpl>(pageNumber, numberOfResults, pageSize, result); } -} +}