package nl.ipo.cds.dao.impl; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.naming.NamingException; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.BasicAttribute; import javax.naming.directory.DirContext; import javax.naming.directory.ModificationItem; import javax.persistence.EntityManager; import javax.persistence.EntityNotFoundException; import javax.persistence.NoResultException; import javax.persistence.PersistenceContext; import javax.persistence.Query; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Order; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import nl.idgis.commons.jobexecutor.AbstractJob; import nl.idgis.commons.jobexecutor.Job; import nl.idgis.commons.jobexecutor.JobLogger.LogLevel; import nl.ipo.cds.dao.DatasetCriteria; import nl.ipo.cds.dao.JobCriteria; import nl.ipo.cds.dao.JobInfo; import nl.ipo.cds.dao.JobLogCriteria; import nl.ipo.cds.dao.ManagerDao; import nl.ipo.cds.dao.SortField; import nl.ipo.cds.dao.SortOrder; import nl.ipo.cds.dao.impl.ldap.GebruikerAttributesMapper; import nl.ipo.cds.dao.impl.ldap.GebruikerContextMapper; import nl.ipo.cds.domain.AttributeMapping; import nl.ipo.cds.domain.Bronhouder; import nl.ipo.cds.domain.BronhouderThema; import nl.ipo.cds.domain.CodeListMapping; import nl.ipo.cds.domain.Dataset; import nl.ipo.cds.domain.DatasetFilter; import nl.ipo.cds.domain.DatasetType; import nl.ipo.cds.domain.DbGebruiker; import nl.ipo.cds.domain.EtlJob; import nl.ipo.cds.domain.FilterExpression; import nl.ipo.cds.domain.Gebruiker; import nl.ipo.cds.domain.GebruikerThemaAutorisatie; import nl.ipo.cds.domain.Identity; import nl.ipo.cds.domain.JobLog; import nl.ipo.cds.domain.JobType; import nl.ipo.cds.domain.LdapGebruiker; import nl.ipo.cds.domain.MappingOperation; import nl.ipo.cds.domain.MetadataDocument; import nl.ipo.cds.domain.Thema; import nl.ipo.cds.domain.TypeGebruik; import nl.ipo.cds.utils.DateTimeUtils; import org.deegree.geometry.Geometry; import org.deegree.geometry.io.WKBReader; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.ldap.core.AttributesMapper; import org.springframework.ldap.core.DistinguishedName; import org.springframework.ldap.core.LdapTemplate; import org.springframework.orm.jpa.JpaObjectRetrievalFailureException; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; import com.vividsolutions.jts.io.ParseException; public class ManagerDaoImpl implements ManagerDao { private EntityManager entityManager; private LdapTemplate ldapTemplate; /** * The base DN for the LDAP server. */ private String ldapBase = "dc=inspire,dc=idgis,dc=eu"; /** * The DN of the LDAP group that contains all CDS users. Any inetOrgPerson that is a member of this group * has access to the CDS. */ private String ldapGroupDn = "cn=cds-gebruikers,ou=Group"; /** * Base DN to use when creating new users. Existing users are persisted using their original DN. */ private String ldapPeopleBaseDn = "ou=People"; @PersistenceContext(unitName = "cds") public void setEntityManager(EntityManager entityManager) { this.entityManager = entityManager; } public EntityManager getEntityManager () { return entityManager; } public ManagerDaoImpl(LdapTemplate ldapTemplate) { this.ldapTemplate = ldapTemplate; } public void setLdapTemplate (final LdapTemplate ldapTemplate) { this.ldapTemplate = ldapTemplate; } public LdapTemplate getLdapTemplate () { return ldapTemplate; } public void setLdapBase (final String ldapBase) { this.ldapBase = ldapBase; } public String getLdapBase () { return ldapBase; } public void setLdapGroupDn (final String ldapGroupDn) { this.ldapGroupDn = ldapGroupDn; } public String getLdapGroupDn () { return ldapGroupDn; } public void setLdapPeopleBaseDn (final String baseDn) { this.ldapPeopleBaseDn = baseDn; } public String getLdapPeopleBaseDn () { return ldapPeopleBaseDn; } // ------------- // Werk tabellen // ------------- // JOB @Override @Transactional(propagation=Propagation.MANDATORY) // New transaction because a job is process-data; is not allowed to roll-back public void create(AbstractJob job) { job.setCreateTime(DateTimeUtils.now()); this.entityManager.persist(job); } @Override public AbstractJob getJob(Long pk) { AbstractJob job = this.entityManager.find(AbstractJob.class, pk); return job; } @Override public AbstractJob getJob (Job job) { return getJob (job.getId ()); } @Override public List<AbstractJob> getAllJobs() { final TypedQuery<AbstractJob> jobQuery; jobQuery = entityManager.createQuery("from EtlJob as job order by job.createTime desc", AbstractJob.class); return jobQuery.getResultList(); } @Override public List<EtlJob> getJobsByStatus(Job.Status status) { final TypedQuery<EtlJob> jobQuery; jobQuery = entityManager.createQuery("from EtlJob as job where job.status = ?1 order by job.createTime desc", EtlJob.class) .setParameter(1, status); return jobQuery.getResultList(); } @Override public List<EtlJob> getJobsByDataset(Bronhouder bronhouder, DatasetType datasetType, String uuid) { final TypedQuery<EtlJob> jobQuery; if (uuid==null){ jobQuery = entityManager.createQuery("from EtlJob as job where (job.bronhouder = ?1 and job.datasettype = ?2) order by job.id desc", EtlJob.class) .setParameter (1, bronhouder) .setParameter (2, datasetType); } else { jobQuery = entityManager.createQuery("from EtlJob as job where (job.bronhouder = ?1 and job.datasettype = ?2 and job.uuid = ?3) order by job.id desc", EtlJob.class) .setParameter (1, bronhouder) .setParameter (2, datasetType) .setParameter (3, uuid); } return jobQuery.getResultList(); } @Override public AbstractJob getLastJob() { AbstractJob job = null; final TypedQuery<AbstractJob> jobQuery; jobQuery = entityManager.createQuery("from AbstractJob as job where job.status = ?1 order by job.priority desc, job.id desc", AbstractJob.class) .setMaxResults(1) .setParameter(1, Job.Status.CREATED); List<AbstractJob> jobs = jobQuery.getResultList(); if ((jobs != null) && (jobs.size() >= 1) ) { // should only be one task job = jobs.get(0); } return job; } @Override public EtlJob getLastCompletedJob (Bronhouder bronhouder, DatasetType datasetType, String uuid) { final TypedQuery<EtlJob> query = entityManager.createQuery ( "from EtlJob as job where (job.status in (?1, ?2) and (job.bronhouder = ?3 and job.datasettype = ?4 and job.uuid = ?5) and job.verversen = true and job.finishTime is not null) order by job.finishTime desc", EtlJob.class ); query .setParameter (1, Job.Status.FINISHED) .setParameter (2, Job.Status.ABORTED) .setParameter (3, bronhouder) .setParameter (4, datasetType) .setParameter (5, uuid) .setMaxResults (1); try { return query.getSingleResult (); } catch (EmptyResultDataAccessException e) { return null; } catch (NoResultException e) { return null; } } @Override public EtlJob getLastCompletedJob(EtlJob job) { return getLastCompletedJob(job.getBronhouder(), job.getDatasetType(), job.getUuid()); } @Override public EtlJob getLastValidationJob (Bronhouder bronhouder, DatasetType datasetType, String uuid) { final TypedQuery<EtlJob> query = entityManager.createQuery ( "from EtlJob as job " + "where " + "job.status in (?1, ?2) " + "and type (job) = ValidateJob " + "and (job.bronhouder = ?4 and job.datasettype = ?5 and job.uuid = ?6) " + "and job.finishTime is not null " + "and not exists (from EtlJob as job2 " + "where job.bronhouder = job2.bronhouder " + "and job.datasettype = job2.datasettype " + "and job.createTime < job2.createTime " + "and type (job2) = RemoveJob)" + "order by job.finishTime desc", EtlJob.class ); query .setParameter (1, Job.Status.FINISHED) .setParameter (2, Job.Status.ABORTED) .setParameter (4, bronhouder) .setParameter (5, datasetType) .setParameter (6, uuid) .setMaxResults (1); try { return query.getSingleResult (); } catch (EmptyResultDataAccessException e) { return null; } catch (NoResultException e) { return null; } } @Override public EtlJob getLastValidationJob(EtlJob job) { return getLastValidationJob(job.getBronhouder(), job.getDatasetType(), job.getUuid()); } @Override public EtlJob getLastJobThatValidated (Bronhouder bronhouder, DatasetType datasetType, String uuid) { final TypedQuery<EtlJob> query = entityManager.createQuery ( "from EtlJob as job " + "where " + "job.status in (?1, ?2) " + "and (type (job) = ValidateJob or (type (job) = ImportJob and (job.verversen = true or job.metadataUpdateDatum is null))) " + "and (job.bronhouder = ?5 and job.datasettype = ?6 and job.uuid = ?7) " + "and job.finishTime is not null " + "and not exists (from EtlJob as job2 " + "where job.bronhouder = job2.bronhouder " + "and job.datasettype = job2.datasettype " + "and job.createTime < job2.createTime " + "and type (job2) = RemoveJob)" + "order by job.finishTime desc", EtlJob.class ); query .setParameter (1, Job.Status.FINISHED) .setParameter (2, Job.Status.ABORTED) .setParameter (5, bronhouder) .setParameter (6, datasetType) .setParameter (7, uuid) .setMaxResults (1); try { return query.getSingleResult (); } catch (EmptyResultDataAccessException e) { return null; } catch (NoResultException e) { return null; } } @Override public EtlJob getLastImportJob (Bronhouder bronhouder, DatasetType datasetType, String uuid) { final TypedQuery<EtlJob> query = entityManager.createQuery ( "from EtlJob as job " + "where " + "job.status = ?1 " + "and type (job) = ImportJob " + "and (job.bronhouder = ?3 and job.datasettype = ?4 and job.uuid = ?5) " + "and job.verversen = true " + "and job.finishTime is not null " + "and not exists (from EtlJob as job2 " + "where job.bronhouder = job2.bronhouder " + "and job.datasettype = job2.datasettype " + "and job.createTime < job2.createTime " + "and type (job2) = RemoveJob)" + "order by job.finishTime desc", EtlJob.class ); query .setParameter (1, Job.Status.FINISHED) .setParameter (3, bronhouder) .setParameter (4, datasetType) .setParameter (5, uuid) .setMaxResults (1); try { return query.getSingleResult (); } catch (EmptyResultDataAccessException e) { return null; } catch (NoResultException e) { return null; } } @Override public EtlJob getLastImportJob(EtlJob job) { return getLastImportJob(job.getBronhouder(), job.getDatasetType(), job.getUuid()); } @Override public EtlJob getLastSuccessfullImportJob(Bronhouder bronhouder, DatasetType datasetType, String uuid) { final TypedQuery<EtlJob> query = entityManager.createQuery ( "from EtlJob as job " + "where " + "job.status in (?1, ?2) " + "and type (job) = ImportJob " + "and (job.bronhouder = ?4 and job.datasettype = ?5 and job.uuid = ?6) " + "and job.finishTime is not null " + "and not exists(from EtlJob as job2 " + "where job.bronhouder = job2.bronhouder " + "and job.datasettype = job2.datasettype " + "and job.createTime < job2.createTime " + "and type (job2) = RemoveJob) " + "and not exists(from JobLog as jobLog " + "where jobLog.job = job " + "and jobLog.logLevel = ?8) " + "order by job.finishTime desc", EtlJob.class ); query .setParameter (1, Job.Status.FINISHED) .setParameter (2, Job.Status.ABORTED) .setParameter (4, bronhouder) .setParameter (5, datasetType) .setParameter (6, uuid) .setParameter (8, LogLevel.ERROR) .setMaxResults (1); try { return query.getSingleResult (); } catch (EmptyResultDataAccessException e) { return null; } catch (NoResultException e) { return null; } } @Override public EtlJob getLastSuccessfullImportJob(EtlJob job) { return getLastSuccessfullImportJob(job.getBronhouder(), job.getDatasetType(), job.getUuid()); } @Override public List<Thema> getImportedThemasWithoutSubsequentTransform() { final TypedQuery<Thema> query = entityManager.createQuery ( "select distinct thema " + "from " + "EtlJob import " + "join import.datasettype as dst " + "join dst.thema as thema " + "where " + "import.status = ?1 " + "and import.verversen = true " + "and type (import) = ImportJob " + "and not exists(from EtlJob as transform " + "where transform.status = ?1 " + "and type (transform) = TransformJob " + "and transform.startTime >= import.finishTime)", Thema.class ); query.setParameter (1, Job.Status.FINISHED); try { return query.getResultList(); } catch (EmptyResultDataAccessException e) { return null; } catch (NoResultException e) { return null; } } @Override public List<Thema> getRemovedThemasWithoutSubsequentTransform() { final TypedQuery<Thema> query = entityManager.createQuery ( "select distinct thema " + "from " + "EtlJob job " + "join job.datasettype as dst " + "join dst.thema as thema " + "where " + "job.status = ?1 " + "and type (job) = RemoveJob " + "and not exists(from EtlJob as transform " + "where transform.status = ?1 " + "and type (transform) = TransformJob " + "and transform.startTime >= job.finishTime)", Thema.class ); query.setParameter (1, Job.Status.FINISHED); try { return query.getResultList(); } catch (EmptyResultDataAccessException e) { return null; } catch (NoResultException e) { return null; } } @Override public EtlJob getLastTransformJob(Job.Status jobStatus) { Assert.notNull(jobStatus, "jobStatus is mandatory because otherwise the order By clause doesn't work because date could have null values"); String queryString = "from EtlJob as job where type (job) = TransformJob"; if(jobStatus != null){ queryString += " and job.status = ?1"; } queryString += " order by job.finishTime desc, job.createTime desc"; final TypedQuery<EtlJob> query = entityManager.createQuery ( queryString, EtlJob.class ); query .setMaxResults (1); if(jobStatus != null){ query.setParameter (1, jobStatus); } try { return query.getSingleResult (); } catch (EmptyResultDataAccessException e) { return null; } catch (NoResultException e) { return null; } } @Override public EtlJob getPendingJob (Bronhouder bronhouder, DatasetType datasetType, String uuid) { final TypedQuery<EtlJob> query = entityManager.createQuery ( "from EtlJob as job where job.status in (?1, ?2) and (job.bronhouder = ?3 and job.datasettype = ?4 and job.uuid = ?5) order by job.createTime desc", EtlJob.class ); query .setParameter (1, Job.Status.CREATED) .setParameter (2, Job.Status.STARTED) .setParameter (3, bronhouder) .setParameter (4, datasetType) .setParameter (5, uuid) .setMaxResults (1); try { return query.getSingleResult (); } catch (EmptyResultDataAccessException e) { return null; } catch (NoResultException e) { return null; } } @Override public EtlJob getPendingJob(EtlJob job) { return getPendingJob(job.getBronhouder(), job.getDatasetType(), job.getUuid()); } @Override public List<JobInfo> getLastCompletedJobs () { /* final Query query = entityManager.createQuery ( "select " + "new nl.ipo.cds.dao.JobInfo(" + "job," + "COUNT(log) as logMessageCount" + ") " + "from " + "JobLog as log " + "left join log.job as job " + //"join job.bronhouder as b " + "where " + "job.status in (?1, ?2) " + "and log.job = job " + "and job.id = " + "(select max(lastJob.id) from EtlJob as lastJob where (lastJob.bronhouder = job.bronhouder and type (lastJob) = type (job) and lastJob.uuid = job.uuid) and job.status in (?1, ?2) order by job.id desc) " + "group by " + "job " + ""); //"order by " + // "min(job.bronhouder.provincie) asc, min(type (job)) asc"); */ final Query query = entityManager.createQuery ( "select " + "new nl.ipo.cds.dao.JobInfo(" + "job," + "(select count(log) from JobLog as log where log.job = job)" + ") " + "from " + "EtlJob job " + "join job.bronhouder as b " + "where " + "job.status in (?1, ?2) " + "and job.id = " + "(select max(lastJob.id) from EtlJob as lastJob where (lastJob.bronhouder = job.bronhouder and type (lastJob) = type (job) and lastJob.uuid = job.uuid) and job.status in (?1, ?2) order by job.id desc) " + "order by " + "b.naam asc, type (job) asc" ); query .setParameter (1, Job.Status.FINISHED) .setParameter (2, Job.Status.ABORTED); // For some reason this query cannot be performed as a typed query, therefore the following statemenet is unchecked: @SuppressWarnings("unchecked") final List<JobInfo> jobInfos = query.getResultList (); return jobInfos; } @Override public long getJobLogCount (AbstractJob job) { final TypedQuery<Long> query = entityManager.createQuery("select count(*) from JobLog as log where log.job = ?1", Long.class); query .setParameter (1, job) .setMaxResults (1); return query.getSingleResult (); } @Override public long getJobLogCount (AbstractJob job, LogLevel logLevel) { final TypedQuery<Long> query = entityManager.createQuery("select count(*) from JobLog as l where l.job = ?1 and l.logLevel = ?2", Long.class); query .setParameter (1, job) .setParameter (2, logLevel) .setMaxResults (1); return query.getSingleResult (); } @Override @Transactional(propagation=Propagation.MANDATORY) // New transaction because a job is process-data; is not allowed to roll-back public void update(AbstractJob job) { this.entityManager.merge(job); } @Override @Transactional(propagation=Propagation.MANDATORY) public void update (EtlJob job) { this.entityManager.merge (job); } @Override @Transactional public void delete(AbstractJob job) { AbstractJob jobToDelete = this.entityManager.getReference(AbstractJob.class, job.getId()); this.entityManager.remove(jobToDelete); // this.entityManager.remove(job);//this alone will raise exception 'Removing a detached instance' } @Override @Transactional public void delete (EtlJob job) { final EtlJob jobToDelete = entityManager.getReference (EtlJob.class, job.getId ()); entityManager.remove (jobToDelete); } // DATASET @Transactional @Override public void create(Dataset dataSet) { this.entityManager.persist(dataSet); } @Override public Dataset getDataSet(Long pk) { return this.entityManager.find(Dataset.class, pk); } @SuppressWarnings("unchecked") @Override public List<Dataset> getAllDatasets() { Query datasetQuery = null; datasetQuery = entityManager.createQuery("from Dataset"); return datasetQuery.getResultList(); } @SuppressWarnings("unchecked") @Override public List<Dataset> getDatasetsByDatasetType(DatasetType dataSetType) { Query datasetQuery = null; datasetQuery = entityManager.createQuery( "from Dataset as dataset where dataset.type.id = ?1").setParameter(1, dataSetType.getId()); return datasetQuery.getResultList(); } @SuppressWarnings("unchecked") @Override public List<Dataset> getDatasetsByBronhouder(Bronhouder bronhouder) { Query datasetQuery = null; datasetQuery = entityManager.createQuery( "from Dataset as dataset where dataset.bronhouder.id = ?1").setParameter(1, bronhouder.getId ()); return datasetQuery.getResultList(); } @SuppressWarnings("unchecked") @Override public List<Dataset> getDatasetsByUUID(String uuid) { Query datasetQuery = null; datasetQuery = entityManager.createQuery( "from Dataset as dataset where dataset.uuid = ?1").setParameter(1, uuid); return datasetQuery.getResultList(); } @SuppressWarnings("unchecked") @Override public Dataset getDataset(Bronhouder bronhouder, DatasetType datasetType, String uuid) { Query datasetQuery = null; datasetQuery = entityManager.createQuery( "from Dataset as dataset where dataset.bronhouder.id = ?1 and dataset.type.id = ?2 and dataset.uuid = ?3") .setParameter(1, bronhouder.getId ()) .setParameter(2, datasetType.getId ()) .setParameter(3, uuid); List<Dataset> datasetList = datasetQuery.getResultList(); if (datasetList.size()>0){ return datasetList.get(0); }else{ return null; } } //W1502 019 @SuppressWarnings("unchecked") @Override public Dataset getDatasetBy(Bronhouder bronhouder, DatasetType datasetType, String uuid) { Query datasetQuery = null; datasetQuery = entityManager.createQuery( "from Dataset as dataset where dataset.bronhouder.id = ?1 and dataset.type.id = ?2 and dataset.uuid = ?3 and dataset.actief=true") .setParameter(1, bronhouder.getId ()) .setParameter(2, datasetType.getId ()) .setParameter(3, uuid); List<Dataset> datasetList = datasetQuery.getResultList(); if (datasetList.size()>0){ return datasetList.get(0); }else{ return null; } } @Override @Transactional public void update(Dataset dataSet) { this.entityManager.merge(dataSet); } @Override @Transactional public void delete(Dataset dataSet) { // Dataset datasetToDelete = this.entityManager.find(Dataset.class, dataSet.getId());//this alone will raise exception 'Removing a detached instance' Dataset datasetToDelete = this.entityManager.getReference(Dataset.class, dataSet.getId()); this.entityManager.remove(datasetToDelete); } // ------------- // Stam tabellen // ------------- @Transactional @Override public void create(JobType jobType) { this.entityManager.persist(jobType); } @Override public JobType getJobType(Long pk) { return this.entityManager.find(JobType.class, pk); } @Override public List<JobType> getAllJobTypes() { final TypedQuery<JobType> jobTypeQuery; jobTypeQuery = entityManager.createQuery("from JobType as jobType order by jobType.naam", JobType.class); return jobTypeQuery.getResultList(); } @Override public JobType getJobTypeByName(String naam) { final TypedQuery<JobType> jobTypeQuery; jobTypeQuery = entityManager.createQuery( "from JobType as jobtype where jobtype.naam = ?1", JobType.class).setParameter(1, naam); List <JobType> jobTypes = jobTypeQuery.getResultList(); if ((jobTypes != null && jobTypes.size() >= 1)) { // should only be one task return jobTypes.get(0); } return null; } @Transactional @Override public void delete(JobType jobType) { JobType jobTypeToDelete = this.entityManager.getReference(JobType.class, jobType.getId()); this.entityManager.remove(jobTypeToDelete); } @Transactional @Override public void create(Bronhouder bronhouder) { this.entityManager.persist(bronhouder); } @Transactional @Override public void update(Bronhouder bronhouder) { this.entityManager.merge(bronhouder); } @Override public Bronhouder getBronhouder(Long pk) { return this.entityManager.find(Bronhouder.class, pk); } @SuppressWarnings("unchecked") @Override public List<Bronhouder> getAllBronhouders() { Query bronhouderQuery = null; bronhouderQuery = entityManager.createQuery("from Bronhouder as bronhouder order by bronhouder.contactNaam"); return bronhouderQuery.getResultList(); } @SuppressWarnings("unchecked") @Override public Bronhouder getBronhouderByContactNaam(String naam) { Bronhouder bronhouder = null; Query bronhouderQuery = null; bronhouderQuery = entityManager.createQuery("from Bronhouder as bronhouder where bronhouder.contactNaam = ?1") .setParameter(1, naam); List <Bronhouder> bronhouders = bronhouderQuery.getResultList(); if ((bronhouders != null && bronhouders.size() >= 1)) { // should only be one task bronhouder = bronhouders.get(0); } return bronhouder ; } @SuppressWarnings("unchecked") @Override public Bronhouder getBronhouderByNaam(String naam) { Bronhouder bronhouder = null; Query bronhouderQuery = null; bronhouderQuery = entityManager.createQuery("from Bronhouder as bronhouder where bronhouder.naam = ?1") .setParameter(1, naam); List <Bronhouder> bronhouders = bronhouderQuery.getResultList(); if ((bronhouders != null && bronhouders.size() >= 1)) { // should only be one task bronhouder = bronhouders.get(0); } return bronhouder ; } @SuppressWarnings("unchecked") @Override public Bronhouder getBronhouderByCommonName (final String commonName) { Bronhouder bronhouder = null; Query bronhouderQuery = null; bronhouderQuery = entityManager.createQuery("from Bronhouder as bronhouder where bronhouder.commonName = ?1") .setParameter(1, commonName); List <Bronhouder> bronhouders = bronhouderQuery.getResultList(); if ((bronhouders != null && bronhouders.size() >= 1)) { // should only be one task bronhouder = bronhouders.get(0); } return bronhouder ; } /** * {@inheritDoc} */ @Override public Bronhouder getBronhouderByCode (final String code) { if (code == null) { return null; } final List<Bronhouder> bronhouders = entityManager .createQuery("from Bronhouder as bronhouder where bronhouder.code = ?1", Bronhouder.class) .setParameter (1, code) .getResultList (); // Code has a unique constraint, therefore there can be at most one bronhouder // in the list. return bronhouders.isEmpty () ? null : bronhouders.get (0); } /** * {@inheritDoc} */ @Override public boolean isUserAuthorizedForBronhouder (Bronhouder bronhouder, String userName) { if (bronhouder == null) { throw new NullPointerException ("bronhouder shouldn't be null"); } if (userName == null) { throw new NullPointerException ("userName cannot be null"); } final Gebruiker gebruiker = getGebruiker (userName); return gebruiker != null && gebruiker.isSuperuser (); } /** * {@inheritDoc} */ @Override public boolean isUserAuthorizedForThema (final Bronhouder bronhouder, final Thema theme, final String username, final TypeGebruik typeGebruik) { if (bronhouder == null) { throw new NullPointerException ("bronhouder cannot be null"); } if (theme == null) { throw new NullPointerException ("theme cannot be null"); } if (username == null) { throw new NullPointerException ("username cannot be null"); } if (typeGebruik == null) { throw new NullPointerException ("typeGebruik cannot be null"); } final Gebruiker gebruiker = getGebruiker (username); final BronhouderThema bronhouderThema = getBronhouderThema (bronhouder, theme); if (gebruiker == null || bronhouderThema == null) { return false; } for (final GebruikerThemaAutorisatie gta: getGebruikerThemaAutorisatie (gebruiker)) { if (gta.getBronhouderThema ().equals (bronhouderThema) && gta.getTypeGebruik ().isAllowed (typeGebruik)) { return true; } } return false; } /** * Deletes the given bronhouder, as well as related entities from the following entity types: * - bronhouder geometry * - BronhouderTheme * - Dataset * - EtlJob * - GebruikerThemaAutorisatie * - JobLog * - Job */ @Transactional @Override public void delete(Bronhouder bronhouder) { // Delete joblog: entityManager .createNativeQuery ("delete from manager.joblog where job_id in (select job_id from manager.etljob where bronhouder_id = ?1)") .setParameter (1, bronhouder.getId ()) .executeUpdate (); // Delete jobs: entityManager .createNativeQuery ("select id into temporary table delete_job_id_temp from manager.etljob where bronhouder_id = ?1") .setParameter (1, bronhouder.getId ()) .executeUpdate (); entityManager .createNativeQuery ("delete from manager.etljob where id in (select id from delete_job_id_temp)") .executeUpdate (); entityManager .createNativeQuery ("delete from manager.job where id in (select id from delete_job_id_temp)") .executeUpdate (); // Delete authorization: entityManager .createNativeQuery ("delete from manager.gebruikerthemaautorisatie where bronhouderthema_bronhouder_id = ?1") .setParameter (1, bronhouder.getId ()) .executeUpdate (); // Delete bronhouderthema: entityManager .createNativeQuery ("delete from manager.bronhouderthema where bronhouder_id = ?1") .setParameter (1, bronhouder.getId ()) .executeUpdate (); // Delete bronhouder geometry: entityManager .createNativeQuery ("delete from manager.bronhouder_geometry where bronhouder_id = ?1") .setParameter (1, bronhouder.getId ()) .executeUpdate (); // Delete the bronhouder itself: final Bronhouder bronhouderToDelete = this.entityManager.getReference (Bronhouder.class, bronhouder.getId ()); this.entityManager.remove (bronhouderToDelete); } @Override public Geometry getBronhouderGeometry (final Bronhouder bronhouder) { final Query query = entityManager.createNativeQuery ("select ST_AsBinary(geom) from manager.bronhouder_geometry where bronhouder_id = ?1"); query.setParameter(1, bronhouder.getId ()); byte[] value; try { value = (byte[])query.getSingleResult (); } catch (NoResultException e) { return null; } catch (EmptyResultDataAccessException e) { return null; } try { return WKBReader.read (value, null); } catch (ParseException e) { return null; } } @Transactional @Override public void create(DatasetType datasetType) { this.entityManager.persist(datasetType); } @Override public DatasetType getDatasetType(Long pk) { return this.entityManager.find(DatasetType.class, pk); } @SuppressWarnings("unchecked") @Override public List<DatasetType> getAllDatasetTypes() { Query datasetTypeQuery = null; datasetTypeQuery = entityManager.createQuery("from DatasetType as datasetType order by datasetType.naam"); return datasetTypeQuery.getResultList(); } @Override public DatasetType getDatasetTypeByName(String naam) { DatasetType datasetType = null; Query datasetTypeQuery = null; datasetTypeQuery = entityManager.createQuery("from DatasetType as datasetType where datasetType.naam = ?1") .setParameter(1, naam); @SuppressWarnings("unchecked") List <DatasetType> datasetTypes = datasetTypeQuery.getResultList(); if ((datasetTypes != null && datasetTypes.size() >= 1)) { // should only be one task datasetType = datasetTypes.get(0); } return datasetType; } @SuppressWarnings("unchecked") @Override public List<DatasetType> getDatasetTypesByThema(Thema thema) { if (thema == null){ throw new IllegalArgumentException ("An instance of Thema must be provided in the search criteria."); } Query datasetTypeQuery = null; datasetTypeQuery = entityManager.createQuery("from DatasetType as datasetType where thema.id = ?1 order by datasetType.naam") .setParameter(1, thema.getId()); return datasetTypeQuery.getResultList(); } @Transactional @Override public void delete(DatasetType datasetType) { DatasetType datasetTypeToDelete = this.entityManager.getReference(DatasetType.class, datasetType.getId()); this.entityManager.remove(datasetTypeToDelete); } @Transactional @Override public void create(Thema thema) { this.entityManager.persist(thema); } @Override public Thema getThema(Long pk) { return this.entityManager.find(Thema.class, pk); } @Transactional @Override public void update(Thema thema) { this.entityManager.merge(thema); } @SuppressWarnings("unchecked") @Override public List<Thema> getAllThemas() { Query themaQuery = null; themaQuery = entityManager.createQuery("from Thema as thema order by thema.naam"); return themaQuery.getResultList(); } @Override public List<Thema> getAllThemas (final Bronhouder bronhouder) { final TypedQuery<Thema> query = entityManager.createQuery ("select a.thema from BronhouderThema a where a.bronhouder = ?1", Thema.class) .setParameter (1, bronhouder); return query.getResultList (); } @SuppressWarnings("unchecked") @Override public Thema getThemaByName(String naam) { Thema thema = null; Query themaQuery = null; themaQuery = entityManager.createQuery("from Thema as thema where thema.naam = ?1") .setParameter(1, naam); List <Thema> themas = themaQuery.getResultList(); if ((themas != null && themas.size() >= 1)) { // should only be one task thema = themas.get(0); } return thema; } @Transactional @Override public void delete(Thema thema) { Thema themaToDelete = this.entityManager.getReference(Thema.class, thema.getId()); this.entityManager.remove(themaToDelete); } @Override @Transactional(propagation=Propagation.MANDATORY) // @Transactional (propagation = Propagation.REQUIRES_NEW) public void create(JobLog log) { this.entityManager.persist(log); } /* (non-Javadoc) * @see nl.ipo.cds.dao.ManagerDao#delete(nl.ipo.cds.domain.JobLog) */ @Override @Transactional public void delete(JobLog jobLog) { JobLog jobLogToDelete = this.entityManager.getReference(JobLog.class, jobLog.getId()); this.entityManager.remove(jobLogToDelete); } @Override public long getJobFaseLogCount (AbstractJob job) { final TypedQuery<Long> query = entityManager.createQuery("select count(*) from JobLog as l where l.job = ?1", Long.class); query .setParameter (1, job) .setMaxResults (1); return query.getSingleResult (); } @Override public List<JobLog> getLastCompletedJobsLog () { final TypedQuery<JobLog> query = entityManager.createQuery ("select log from JobLog as log join log.job as job where job.status in (?1, ?2) and job.id = " + "(select lastJob.id from Job as lastJob where (lastJob.bronhouder = job.bronhouder and lastJob.type = job.type and lastJob.uuid = job.uuid) and job.status in (?1, ?2) order by job.id desc)", JobLog.class); query .setParameter (1, Job.Status.FINISHED) .setParameter (2, Job.Status.ABORTED); return query.getResultList (); } @Override public List<JobLog> findJobLog (AbstractJob job) { return findJobLog (new JobLogCriteria (job)); } @Override public List<JobLog> findJobLog (JobLogCriteria criteria) { if (!criteria.hasJob ()) { throw new IllegalArgumentException ("Either an instance of Job or JobFase must be provided in the search criteria."); } final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder (); final CriteriaQuery<JobLog> query = criteriaBuilder.createQuery (JobLog.class); final Root<JobLog> from = query.from (JobLog.class); final List<Predicate> predicates = new ArrayList<Predicate> (); // Collect predicates: if (criteria.hasJob ()) { predicates.add (criteriaBuilder.equal (from.get ("job"), criteria.getJob ())); } // Determine order: Order order; String sortField; if (criteria.getSortField () == SortField.BaseSortField.ID) { sortField = "id"; } else { sortField = "message"; } if (criteria.getSortOrder () == SortOrder.ASCENDING) { order = criteriaBuilder.asc (from.get (sortField)); } else { order = criteriaBuilder.desc (from.get (sortField)); } CriteriaQuery<JobLog> select = query.select (from); query .select (from) .where (predicates.toArray(new Predicate[predicates.size ()])) .orderBy (order); final TypedQuery<JobLog> typedQuery = entityManager.createQuery (select); typedQuery.setFirstResult (criteria.getOffset ()); if (criteria.hasLimit ()) { typedQuery.setMaxResults (criteria.getLimit ()); } return typedQuery.getResultList (); } @Override public List<EtlJob> findJob(JobCriteria criteria) { if (!criteria.hasDatasetType()) { throw new IllegalArgumentException ("An instance of Dataset must be provided in the search criteria."); } final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder (); final CriteriaQuery<EtlJob> query = criteriaBuilder.createQuery (EtlJob.class); final Root<EtlJob> from = query.from (EtlJob.class); final List<Predicate> predicates = new ArrayList<Predicate> (); // Collect predicates: if(criteria.getBronhouder() != null){ predicates.add (criteriaBuilder.equal(from.get ("bronhouder"), criteria.getBronhouder())); } if(criteria.getDatasetType() != null){ predicates.add (criteriaBuilder.equal(from.get ("datasettype"), criteria.getDatasetType())); } if(criteria.getCreatieTijd() != null){ predicates.add (criteriaBuilder.greaterThan(from.get("createTime").as(Timestamp.class), criteria.getCreatieTijd())); } if(criteria.isVerversen() != null){ predicates.add (criteriaBuilder.equal(from.get("verversen").as(Boolean.class), criteria.isVerversen())); } if(criteria.getJobStatus() != null){ predicates.add (criteriaBuilder.equal(from.get("status").as(Job.Status.class), criteria.getJobStatus())); } // Determine order: Order order; String sortField = "id"; if (criteria.getSortOrder () == SortOrder.ASCENDING) { order = criteriaBuilder.asc (from.get (sortField)); } else { order = criteriaBuilder.desc (from.get (sortField)); } CriteriaQuery<EtlJob> select = query.select (from); query .select (from) .where (predicates.toArray(new Predicate[predicates.size ()])) .orderBy (order); final TypedQuery<EtlJob> typedQuery = entityManager.createQuery (select); typedQuery.setFirstResult (criteria.getOffset ()); if (criteria.hasLimit ()) { typedQuery.setMaxResults (criteria.getLimit ()); } return typedQuery.getResultList (); } @Override public List<Dataset> findDataset(DatasetCriteria criteria) { if (!criteria.hasBronhouder()) { throw new IllegalArgumentException ("An instance of Bronhouder must be provided in the search criteria."); } final CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder (); final CriteriaQuery<Dataset> query = criteriaBuilder.createQuery (Dataset.class); final Root<Dataset> from = query.from (Dataset.class); final List<Predicate> predicates = new ArrayList<Predicate> (); // Collect predicates: predicates.add(criteriaBuilder.equal(from.get("bronhouder"), criteria.getBronhouder())); if(criteria.getId() != null){ predicates.add(criteriaBuilder.equal(from.get("id").as(Long.class), criteria.getId())); } if(criteria.getDatasetType() != null){ predicates.add(criteriaBuilder.equal(from.get("type"), criteria.getDatasetType())); } if(criteria.getThema () != null) { predicates.add (criteriaBuilder.equal (from.get ("type").get ("thema"), criteria.getThema ())); } // Determine order: Order order; String sortField = "id"; if (criteria.getSortOrder () == SortOrder.ASCENDING) { order = criteriaBuilder.asc (from.get (sortField)); } else { order = criteriaBuilder.desc (from.get (sortField)); } CriteriaQuery<Dataset> select = query.select (from); query .select (from) .where (predicates.toArray(new Predicate[predicates.size ()])) .orderBy (order); final TypedQuery<Dataset> typedQuery = entityManager.createQuery (select); typedQuery.setFirstResult (criteria.getOffset ()); if (criteria.hasLimit ()) { typedQuery.setMaxResults (criteria.getLimit ()); } return typedQuery.getResultList (); } // ------------- // Gebruikers: // ------------- /** * Convenience method for binding or rebinding a user, see create and update for details. * * @param gebruiker * @param rebind */ private void bindGebruiker (LdapGebruiker gebruiker, boolean rebind) { final DistinguishedName dn; if (gebruiker.getDistinguishedName () == null) { dn = new DistinguishedName (getLdapPeopleBaseDn ()); dn.add ("uid", gebruiker.getGebruikersnaam ()); } else { dn = new DistinguishedName (gebruiker.getDistinguishedName ()); } try { final Attributes attributes = new GebruikerAttributesMapper ().toAttributes (gebruiker); // Bind or rebind the user: if (rebind) { ldapTemplate.rebind(dn, null, attributes); } else { ldapTemplate.bind (dn, null, attributes); } // Add group membership: final DistinguishedName gebruikerDn = new DistinguishedName (getLdapBase ()).append (new DistinguishedName (dn)); if (!getUserDns ().contains (gebruikerDn)) { final Attribute attribute = new BasicAttribute ("member", gebruikerDn.toString ()); final ModificationItem modificationItem = new ModificationItem (DirContext.ADD_ATTRIBUTE, attribute); ldapTemplate.modifyAttributes (new DistinguishedName (getLdapGroupDn ()), new ModificationItem[] { modificationItem }); } } catch (NamingException e) { throw new RuntimeException (e); } } private void createDbGebruiker (final DbGebruiker gebruiker) { this.entityManager.persist (gebruiker); } private void updateDbGebruiker (final DbGebruiker gebruiker) { this.entityManager.merge (gebruiker); } /** * Persists a new user. The user must have a value for all required fields and must be unique. * The user is created using an LDAP bind on the server. * * @param gebruiker */ @Override @Transactional public void create (Gebruiker gebruiker) { if (getGebruiker (gebruiker.getGebruikersnaam ()) != null) { throw new IllegalArgumentException (String.format ("User %s already exists", gebruiker.getGebruikersnaam ())); } if (gebruiker.getLdapGebruiker () != null) { bindGebruiker (gebruiker.getLdapGebruiker (), false); } if (gebruiker.getDbGebruiker () != null) { final DbGebruiker existing = getDbGebruiker (gebruiker.getGebruikersnaam ()); if (existing != null) { entityManager.merge (gebruiker.getDbGebruiker ()); } else { createDbGebruiker (gebruiker.getDbGebruiker ()); } } } /** * Updates an existing user. The user must have been previously persisted. * The user is updated using an LDAP rebind on the server, which is effectively the same as * deleting and creating the user. * * @param gebruiker */ @Override public void update(Gebruiker gebruiker) { // Test if the user exists, otherwise the unbind would be ignored: if (getGebruiker (gebruiker.getGebruikersnaam ()) == null) { throw new IllegalArgumentException ("Gebruiker `" + gebruiker.getGebruikersnaam () + "` does not exist."); } if (gebruiker.getLdapGebruiker () != null) { bindGebruiker (gebruiker.getLdapGebruiker (), true); } if (gebruiker.getDbGebruiker () != null) { updateDbGebruiker (gebruiker.getDbGebruiker ()); } } /** * Produces a set of DN's of all users that are a member of the CDS group in LDAP. * * @return The DN's of all members of the CDS group in LDAP. */ @SuppressWarnings("unchecked") private Set<DistinguishedName> getUserDns () { return (Set<DistinguishedName>)ldapTemplate.lookup ( getLdapGroupDn (), new AttributesMapper () { @Override public Object mapFromAttributes (final Attributes attributes) throws NamingException { final Attribute attribute = attributes.get ("member"); final Set<DistinguishedName> values = new HashSet<DistinguishedName> (); for (int i = 0; i < attribute.size (); ++ i) { values.add (new DistinguishedName (attribute.get (i).toString ())); } return values; } }); } private LdapGebruiker getLdapGebruiker (final String gebruikersnaam) { return getLdapGebruiker (gebruikersnaam, getUserDns ()); } private LdapGebruiker getLdapGebruiker (final String gebruikersnaam, final Set<DistinguishedName> members) { final String query = String.format ("(&(objectClass=inetOrgPerson)(uid=%s))", gebruikersnaam); @SuppressWarnings("unchecked") final List<LdapGebruiker> searchResult = (List<LdapGebruiker>)ldapTemplate.search ( new DistinguishedName (), query, new GebruikerContextMapper () ); if (searchResult.isEmpty ()) { return null; } final DistinguishedName gebruikerDn = new DistinguishedName (getLdapBase ()).append (new DistinguishedName (searchResult.get (0).getDistinguishedName ())); return members.contains (gebruikerDn) ? searchResult.get (0) : null; } private DbGebruiker getDbGebruiker (final String gebruikersnaam) { return this.entityManager.find (DbGebruiker.class, gebruikersnaam); } /** * Returns a user by username, the username also corresponds with the 'uid' field in LDAP. Returns null * if the user doesn't exist. * * @param gebruikersnaam * @return The user, or null. */ @Override public Gebruiker getGebruiker(String gebruikersnaam) { final LdapGebruiker ldapGebruiker = getLdapGebruiker (gebruikersnaam); final DbGebruiker dbGebruiker = getDbGebruiker (gebruikersnaam); // LDAP user is mandatory, return null if the user doesn't exist in LDAP: if (ldapGebruiker == null) { return null; } // DB user is optional, no need to check if it could be found. return new Gebruiker (ldapGebruiker, dbGebruiker); } private List<LdapGebruiker> getAllLdapGebruikers () { final Set<DistinguishedName> userDns = getUserDns (); final List<LdapGebruiker> gebruikers = new ArrayList<LdapGebruiker> (); for (final DistinguishedName dn: userDns) { final String username = dn.getValue ("uid"); if (username == null) { continue; } final LdapGebruiker gebruiker = getLdapGebruiker (username); if (gebruiker != null) { gebruikers.add (gebruiker); } } Collections.sort (gebruikers, new Comparator<LdapGebruiker> () { @Override public int compare (final LdapGebruiker o1, final LdapGebruiker o2) { return o1.getGebruikersnaam ().compareTo (o2.getGebruikersnaam ()); } }); return Collections.unmodifiableList (gebruikers); } private List<DbGebruiker> getAllDbGebruikers () { return entityManager.createQuery ("from DbGebruiker as gebruiker order by gebruiker.gebruikersnaam", DbGebruiker.class).getResultList (); } /** * Returns a list containing all available users, ordered by username. An empty list is returned * if no users could be found. * * @return A list containing all users. */ @Override public List<Gebruiker> getAllGebruikers() { final Map<String, DbGebruiker> dbGebruikers = new HashMap<String, DbGebruiker> (); for (final DbGebruiker dbGebruiker: getAllDbGebruikers ()) { dbGebruikers.put (dbGebruiker.getGebruikersnaam (), dbGebruiker); } final List<LdapGebruiker> ldapGebruikers = getAllLdapGebruikers (); final List<Gebruiker> gebruikers = new ArrayList<Gebruiker> (ldapGebruikers.size ()); for (final LdapGebruiker ldapGebruiker: ldapGebruikers) { gebruikers.add (new Gebruiker (ldapGebruiker, dbGebruikers.get (ldapGebruiker.getGebruikersnaam ()))); } return Collections.unmodifiableList (gebruikers); } /** * Deletes the given user. The user must have been previously persisted. * Performs an unbind on the LDAP server. * * @param gebruiker The user to delete. */ @Override public void delete(Gebruiker gebruiker) { // Test if the user exists, otherwise the unbind would be ignored: if (getGebruiker (gebruiker.getGebruikersnaam ()) == null) { throw new IllegalArgumentException ("Gebruiker `" + gebruiker.getGebruikersnaam () + "` does not exist."); } if (gebruiker.getLdapGebruiker () != null) { final DistinguishedName dn; if (gebruiker.getLdapGebruiker ().getDistinguishedName () == null) { dn = new DistinguishedName (getLdapPeopleBaseDn ()); dn.add ("uid", gebruiker.getLdapGebruiker ().getGebruikersnaam ()); } else { dn = new DistinguishedName (gebruiker.getLdapGebruiker ().getDistinguishedName ()); } ldapTemplate.unbind (dn); // Remove group membership: final DistinguishedName gebruikerDn = new DistinguishedName (getLdapBase ()).append (new DistinguishedName (dn)); if (getUserDns ().contains (gebruikerDn)) { final Attribute attribute = new BasicAttribute ("member", gebruikerDn.toString ()); final ModificationItem modificationItem = new ModificationItem (DirContext.REMOVE_ATTRIBUTE, attribute); ldapTemplate.modifyAttributes (new DistinguishedName (getLdapGroupDn ()), new ModificationItem[] { modificationItem }); } } if (gebruiker.getDbGebruiker () != null) { try { final DbGebruiker dbGebruikerToDelete = entityManager.getReference (DbGebruiker.class, gebruiker.getDbGebruiker ().getGebruikersnaam ()); entityManager.remove (dbGebruikerToDelete); } catch (JpaObjectRetrievalFailureException e) { // Ignore this exception: it is valid for a user not to have database backing. } catch (EntityNotFoundException e) { // Ignore this exception: it is valid for a user not to have database backing. } } } /** * Performs authentication for the given user by testing the given plaintext password. * Authentication is performed using a bind operation on the LDAP server. * * @param gebruiker * @param wachtwoord * @return True if the password is correct, false otherwise. */ @Override public boolean authenticate (final String gebruikersNaam, final String wachtwoord) { final LdapGebruiker ldapGebruiker = getLdapGebruiker (gebruikersNaam); if (ldapGebruiker == null) { return false; } final String query = String.format ("(&(objectClass=inetOrgPerson)(uid=%s))", gebruikersNaam); return ldapTemplate.authenticate ( new DistinguishedName (), query, wachtwoord ); } // ----------------------- // -- Gebruikersrollen: -- // ----------------------- /* (non-Javadoc) * @see nl.ipo.cds.dao.ManagerDao#getIdentity(java.lang.Long) */ @Override public Identity getIdentity(Class<Identity> identity, Long i) { return this.entityManager.find(identity, i); } @Override public AttributeMapping getAttributeMapping (final Dataset dataset, final String attributeName) { final TypedQuery<AttributeMapping> query = entityManager.createQuery ( "from AttributeMapping mapping where mapping.dataset = ?1 and attributeName = ?2", AttributeMapping.class ) .setParameter (1, dataset) .setParameter (2, attributeName); try { return query.getSingleResult (); } catch (EmptyResultDataAccessException e) { return null; } catch (NoResultException e) { return null; } } @Override public List<AttributeMapping> getAttributeMappings (final Dataset dataset) { return entityManager.createQuery ( "from AttributeMapping as mapping where mapping.dataset = ?1", AttributeMapping.class ) .setParameter (1, dataset) .getResultList (); } @Override public List<AttributeMapping> getValidAttributeMappings (final Dataset dataset) { return entityManager.createQuery ( "from AttributeMapping as mapping where mapping.dataset = ?1 and mapping.valid = true", AttributeMapping.class ) .setParameter (1, dataset) .getResultList (); } @Override public void create (final AttributeMapping attributeMapping) { entityManager.persist (attributeMapping); } @Override public void update (final AttributeMapping attributeMapping) { entityManager.merge (attributeMapping); } @Override public void delete (final AttributeMapping attributeMapping) { final AttributeMapping deleteAttributeMapping = entityManager.getReference (AttributeMapping.class, attributeMapping.getId ()); entityManager.remove (deleteAttributeMapping); } @Override public void create (final MappingOperation mappingOperation) { entityManager.persist (mappingOperation); } @Override public void update (final MappingOperation mappingOperation) { entityManager.merge (mappingOperation); } @Override public void delete (final MappingOperation mappingOperation) { final MappingOperation deleteMappingOperation = entityManager.getReference (MappingOperation.class, mappingOperation.getId ()); entityManager.remove (deleteMappingOperation); } @Override public DatasetFilter getDatasetFilter (final Dataset dataset) { try { return entityManager .createQuery ("from DatasetFilter as filter where filter.dataset = ?1", DatasetFilter.class) .setParameter (1, dataset) .getSingleResult (); } catch (EmptyResultDataAccessException e) { return null; } catch (NoResultException e) { return null; } } @Override public void create (final DatasetFilter datasetFilter) { entityManager.persist (datasetFilter); } @Override public void update (final DatasetFilter datasetFilter) { entityManager.merge (datasetFilter); } @Override public void delete (final DatasetFilter datasetFilter) { final DatasetFilter deleteFilter = entityManager.getReference (DatasetFilter.class, datasetFilter.getId ()); entityManager.remove (deleteFilter); } @Override public void create (final FilterExpression expression) { entityManager.persist (expression); } @Override public void update (final FilterExpression expression) { entityManager.merge (expression); } @Override public void delete (final FilterExpression expression) { final FilterExpression deleteExpression = entityManager.getReference (FilterExpression.class, expression.getId ()); entityManager.remove (deleteExpression); } public List<CodeListMapping> getCodeListMappings () { return entityManager .createQuery ("from CodeListMapping order by codeSpace", CodeListMapping.class) .getResultList (); } public void create (final CodeListMapping mapping) { entityManager.persist (mapping); } public void update (final CodeListMapping mapping) { entityManager.merge (mapping); } public void delete (final CodeListMapping mapping) { final CodeListMapping deleteMapping = entityManager.getReference (CodeListMapping.class, mapping.getCodeSpace ()); entityManager.remove (deleteMapping); } @SuppressWarnings("unchecked") public List<Object[]> getChangedMetadataDocuments() { final Query query = entityManager.createNativeQuery("select * from manager.metadatadocument_update_datum"); return query.getResultList(); } @Transactional public List<MetadataDocument> getAllMetadataDocuments() { TypedQuery<MetadataDocument> metadataQuery = entityManager.createQuery("from MetadataDocument as md order by md.documentName", MetadataDocument.class); return metadataQuery.getResultList(); } @Override @Transactional public MetadataDocument getMetadataDocument(Long id) { return entityManager.find(MetadataDocument.class, id); } @Override @Transactional public void create(MetadataDocument metatataDocument) { entityManager.persist(metatataDocument); } @Override @Transactional public void update(MetadataDocument metatataDocument) { entityManager.merge(metatataDocument); } @Override @Transactional public void delete(MetadataDocument metatataDocument) { entityManager.remove(metatataDocument); } /** * {@inheritDoc} */ @Override public BronhouderThema getBronhouderThema (final Bronhouder bronhouder, final Thema thema) { final List<BronhouderThema> result = entityManager .createQuery ("from BronhouderThema bt where bt.bronhouder = ?1 and bt.thema = ?2", BronhouderThema.class) .setParameter (1, bronhouder) .setParameter (2, thema) .getResultList (); if (result.size () != 1) { return null; } return result.get (0); } /** * {@inheritDoc} */ @Override public List<BronhouderThema> getBronhouderThemas () { return entityManager .createQuery ("from BronhouderThema b order by b.bronhouder.naam asc, b.thema.naam asc", BronhouderThema.class) .getResultList (); } /** * {@inheritDoc} */ @Override public List<BronhouderThema> getBronhouderThemas (final Bronhouder bronhouder) { return entityManager .createQuery ("from BronhouderThema b where b.bronhouder = ?1 order by b.thema.naam asc", BronhouderThema.class) .setParameter (1, bronhouder) .getResultList (); } /** * {@inheritDoc} */ @Override public List<BronhouderThema> getBronhouderThemas (final Thema thema) { return entityManager .createQuery ("from BronhouderThema b where b.thema = ?1 order by b.bronhouder.naam asc", BronhouderThema.class) .setParameter (1, thema) .getResultList (); } /** * {@inheritDoc} */ @Override public void create (final BronhouderThema bronhouderThema) { entityManager.persist (bronhouderThema); } /** * {@inheritDoc} */ @Override @Transactional public void delete (final BronhouderThema bronhouderThema) { // Delete related GebruikerThemaAutorisatie: final List<GebruikerThemaAutorisatie> gebruikerAuth = new ArrayList<GebruikerThemaAutorisatie> ( entityManager .createQuery ("from GebruikerThemaAutorisatie gta where gta.bronhouderThema = ?1", GebruikerThemaAutorisatie.class) .setParameter (1, bronhouderThema) .getResultList() ); for (final GebruikerThemaAutorisatie gat: gebruikerAuth) { entityManager.remove (gat); } // Delete the BronhouderThema: final BronhouderThema bronhouderThemaToDelete = entityManager .createQuery ("from BronhouderThema bt where bt.bronhouder = ?1 and bt.thema = ?2", BronhouderThema.class) .setParameter (1, bronhouderThema.getBronhouder ()) .setParameter (2, bronhouderThema.getThema ()) .getSingleResult (); entityManager.remove (bronhouderThemaToDelete); } /** * {@inheritDoc} */ @Override @Transactional public GebruikerThemaAutorisatie createGebruikerThemaAutorisatie (final Gebruiker gebruiker, final BronhouderThema bronhouderThema, final TypeGebruik typeGebruik) { if (gebruiker == null) { throw new NullPointerException ("gebruiker cannot be null"); } if (bronhouderThema == null) { throw new NullPointerException ("bronhouderThema cannot be null"); } if (typeGebruik == null) { throw new NullPointerException ("typeGebruik cannot be null"); } // Make sure the user has a database backing: update (gebruiker); // Create a new GebruikerThemaAutorisatie: final GebruikerThemaAutorisatie gta = new GebruikerThemaAutorisatie (gebruiker.getDbGebruiker (), bronhouderThema, typeGebruik); entityManager.persist (gta); return gta; } /** * {@inheritDoc} */ @Override @Transactional public void delete (final GebruikerThemaAutorisatie gebruikerThemaAutorisatie) { if (gebruikerThemaAutorisatie == null) { throw new NullPointerException ("gebruikerThemaAutorisatie cannot be null"); } final GebruikerThemaAutorisatie instanceToDelete = entityManager .createQuery ("from GebruikerThemaAutorisatie gta where gta.gebruiker = ?1 and gta.bronhouderThema = ?2", GebruikerThemaAutorisatie.class) .setParameter (1, gebruikerThemaAutorisatie.getGebruiker ()) .setParameter (2, gebruikerThemaAutorisatie.getBronhouderThema ()) .getSingleResult (); entityManager.remove (instanceToDelete); } /** * {@inheritDoc} */ @Override public List<GebruikerThemaAutorisatie> getGebruikerThemaAutorisatie () { return entityManager .createQuery ("from GebruikerThemaAutorisatie gta order by gta.gebruiker.gebruikersnaam asc, gta.bronhouderThema.thema.naam asc, gta.bronhouderThema.bronhouder.naam asc", GebruikerThemaAutorisatie.class) .getResultList (); } /** * {@inheritDoc} */ @Override public List<GebruikerThemaAutorisatie> getGebruikerThemaAutorisatie (final Gebruiker gebruiker) { if (gebruiker == null) { throw new NullPointerException ("gebruiker cannot be null"); } return entityManager .createQuery ("from GebruikerThemaAutorisatie gta where gta.gebruiker = ?1 order by gta.gebruiker.gebruikersnaam asc, gta.bronhouderThema.thema.naam asc, gta.bronhouderThema.bronhouder.naam asc", GebruikerThemaAutorisatie.class) .setParameter (1, gebruiker.getDbGebruiker ()) .getResultList (); } /** * {@inheritDoc} */ @Override public List<GebruikerThemaAutorisatie> getGebruikerThemaAutorisatie (final Bronhouder bronhouder) { if (bronhouder == null) { throw new NullPointerException ("bronhouder cannot be null"); } return entityManager .createQuery ("from GebruikerThemaAutorisatie gta where gta.bronhouderThema.bronhouder = ?1 order by gta.gebruiker.gebruikersnaam asc, gta.bronhouderThema.thema.naam asc, gta.bronhouderThema.bronhouder.naam asc", GebruikerThemaAutorisatie.class) .setParameter (1, bronhouder) .getResultList (); } /** * {@inheritDoc} */ @Override public List<GebruikerThemaAutorisatie> getGebruikerThemaAutorisatie(final Thema thema) { if (thema == null) { throw new NullPointerException ("thema cannot be null"); } return entityManager .createQuery ("from GebruikerThemaAutorisatie gta where gta.bronhouderThema.thema = ?1 order by gta.gebruiker.gebruikersnaam asc, gta.bronhouderThema.thema.naam asc, gta.bronhouderThema.bronhouder.naam asc", GebruikerThemaAutorisatie.class) .setParameter (1, thema) .getResultList (); } }