From d9eab0682e0a27d8480e0d36a24fa80bd220dd81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Arias=20de=20Reyna?= Date: Wed, 7 Nov 2018 16:09:49 +0100 Subject: [PATCH 01/61] Adding Draft type of metadata to domain. Not used yet --- .../base/BaseMetadataCategory.java | 8 +- .../datamanager/base/BaseMetadataIndexer.java | 2 +- .../datamanager/base/BaseMetadataManager.java | 4 +- .../org/fao/geonet/kernel/mef/Importer.java | 2 +- .../org/fao/geonet/kernel/mef/MEFLib.java | 2 +- .../kernel/oaipmh/services/GetRecord.java | 2 +- .../oaipmh/services/ListIdentifiers.java | 2 +- .../resources/config-spring-geonetwork.xml | 7 + ...orksWithoutTransactionIntegrationTest.java | 2 +- .../kernel/DataManagerIntegrationTest.java | 6 +- ...orksWithoutTransactionIntegrationTest.java | 2 +- .../fao/geonet/domain/AbstractMetadata.java | 12 +- .../java/org/fao/geonet/domain/Metadata.java | 28 +- .../org/fao/geonet/domain/MetadataDraft.java | 38 +++ .../fao/geonet/domain/MetadataRelation.java | 6 +- .../MetadataDraftEntityListenerManager.java | 42 +++ .../repository/MetadataDraftRepository.java | 62 +++++ .../MetadataDraftRepositoryImpl.java | 257 ++++++++++++++++++ .../repository/MetadataRepositoryCustom.java | 4 +- .../reports/MetadataReportsQueries.java | 2 +- .../repository/BasicAbstractMetadataTest.java | 96 +++++++ .../MetadataCategoryRepositoryTest.java | 10 +- ...ataRepositoryIssue1876IntegrationTest.java | 2 +- .../repository/report/ReportsQueriesTest.java | 2 +- .../specification/MetadataSpecsTest.java | 10 +- .../hooks/md/MetadataDraftModified.java | 82 ++++++ .../events/hooks/md/MetadataModified.java | 6 +- .../hooks/md/MetadataSharingUpdate.java | 79 ++++++ .../geonet/events/md/MetadataDraftAdd.java | 41 +++ .../md/MetadataDraftIndexCompleted.java | 47 ++++ .../geonet/events/md/MetadataDraftRemove.java | 41 +++ .../geonet/events/md/MetadataDraftUpdate.java | 41 +++ .../events/md/sharing/MetadataShare.java | 68 +++++ .../geonet/kernel/harvest/BaseAligner.java | 4 +- .../harvester/arcsde/ArcSDEHarvester.java | 2 +- .../kernel/harvest/harvester/csw/Aligner.java | 2 +- .../harvester/fragment/FragmentHarvester.java | 4 +- .../harvest/harvester/geoPREST/Aligner.java | 2 +- .../harvest/harvester/geonet/Aligner.java | 3 +- .../harvest/harvester/geonet20/Aligner.java | 3 +- .../LocalFilesystemHarvester.java | 2 +- .../harvest/harvester/oaipmh/Harvester.java | 2 +- .../harvest/harvester/ogcwxs/Harvester.java | 2 +- .../harvest/harvester/webdav/Harvester.java | 2 +- .../geonet/api/records/MetadataTagApi.java | 12 +- .../metadata/BatchUpdateCategories.java | 4 +- .../services/metadata/GetCategories.java | 2 +- .../reports/ReportInternalMetadata.java | 4 +- .../geonet/services/category/RemoveTest.java | 4 +- 49 files changed, 987 insertions(+), 82 deletions(-) create mode 100644 domain/src/main/java/org/fao/geonet/domain/MetadataDraft.java create mode 100644 domain/src/main/java/org/fao/geonet/entitylistener/MetadataDraftEntityListenerManager.java create mode 100644 domain/src/main/java/org/fao/geonet/repository/MetadataDraftRepository.java create mode 100644 domain/src/main/java/org/fao/geonet/repository/MetadataDraftRepositoryImpl.java create mode 100644 domain/src/test/java/org/fao/geonet/repository/BasicAbstractMetadataTest.java create mode 100644 events/src/main/java/org/fao/geonet/events/hooks/md/MetadataDraftModified.java create mode 100644 events/src/main/java/org/fao/geonet/events/hooks/md/MetadataSharingUpdate.java create mode 100644 events/src/main/java/org/fao/geonet/events/md/MetadataDraftAdd.java create mode 100644 events/src/main/java/org/fao/geonet/events/md/MetadataDraftIndexCompleted.java create mode 100644 events/src/main/java/org/fao/geonet/events/md/MetadataDraftRemove.java create mode 100644 events/src/main/java/org/fao/geonet/events/md/MetadataDraftUpdate.java create mode 100644 events/src/main/java/org/fao/geonet/events/md/sharing/MetadataShare.java diff --git a/core/src/main/java/org/fao/geonet/kernel/datamanager/base/BaseMetadataCategory.java b/core/src/main/java/org/fao/geonet/kernel/datamanager/base/BaseMetadataCategory.java index 92d21071464..0fbb8c1ce42 100644 --- a/core/src/main/java/org/fao/geonet/kernel/datamanager/base/BaseMetadataCategory.java +++ b/core/src/main/java/org/fao/geonet/kernel/datamanager/base/BaseMetadataCategory.java @@ -68,7 +68,7 @@ public void apply(@Nonnull Metadata entity) { */ @Override public boolean isCategorySet(final String mdId, final int categId) throws Exception { - Set categories = getMetadataUtils().findOne(mdId).getMetadataCategories(); + Set categories = getMetadataUtils().findOne(mdId).getCategories(); for (MetadataCategory category : categories) { if (category.getId() == categId) { return true; @@ -91,10 +91,10 @@ public void unsetCategory(final ServiceContext context, final String mdId, final return; } boolean changed = false; - for (MetadataCategory category : metadata.getMetadataCategories()) { + for (MetadataCategory category : metadata.getCategories()) { if (category.getId() == categId) { changed = true; - metadata.getMetadataCategories().remove(category); + metadata.getCategories().remove(category); break; } } @@ -120,7 +120,7 @@ public Collection getCategories(final String mdId) throws Exce throw new IllegalArgumentException("No metadata found with id: " + mdId); } - return metadata.getMetadataCategories(); + return metadata.getCategories(); } protected SvnManager getSvnManager() { diff --git a/core/src/main/java/org/fao/geonet/kernel/datamanager/base/BaseMetadataIndexer.java b/core/src/main/java/org/fao/geonet/kernel/datamanager/base/BaseMetadataIndexer.java index 8794113bc4b..e271dc1e7bd 100644 --- a/core/src/main/java/org/fao/geonet/kernel/datamanager/base/BaseMetadataIndexer.java +++ b/core/src/main/java/org/fao/geonet/kernel/datamanager/base/BaseMetadataIndexer.java @@ -521,7 +521,7 @@ public void indexMetadata(final String metadataId, boolean forceRefreshReaders, moreFields.add(SearchManager.makeField(Geonet.IndexFieldNames.IS_PUBLISHED_TO_ALL, "n", true, true)); } - for (MetadataCategory category : fullMd.getMetadataCategories()) { + for (MetadataCategory category : fullMd.getCategories()) { moreFields.add(SearchManager.makeField(Geonet.IndexFieldNames.CAT, category.getName(), true, true)); } diff --git a/core/src/main/java/org/fao/geonet/kernel/datamanager/base/BaseMetadataManager.java b/core/src/main/java/org/fao/geonet/kernel/datamanager/base/BaseMetadataManager.java index e133eeafe7b..5c8dfe405ad 100644 --- a/core/src/main/java/org/fao/geonet/kernel/datamanager/base/BaseMetadataManager.java +++ b/core/src/main/java/org/fao/geonet/kernel/datamanager/base/BaseMetadataManager.java @@ -467,7 +467,7 @@ public String createMetadata(ServiceContext context, String templateId, String g if (group.getDefaultCategory() != null) { newMetadata.getMetadataCategories().add(group.getDefaultCategory()); } - Collection filteredCategories = Collections2.filter(templateMetadata.getMetadataCategories(), + Collection filteredCategories = Collections2.filter(templateMetadata.getCategories(), new Predicate() { @Override public boolean apply(@Nullable MetadataCategory input) { @@ -894,7 +894,7 @@ private Element buildInfoElem(ServiceContext context, String id, String version) addElement(info, Edit.Info.Elem.OWNERNAME, ownerName); } - for (MetadataCategory category : metadata.getMetadataCategories()) { + for (MetadataCategory category : metadata.getCategories()) { addElement(info, Edit.Info.Elem.CATEGORY, category.getName()); } diff --git a/core/src/main/java/org/fao/geonet/kernel/mef/Importer.java b/core/src/main/java/org/fao/geonet/kernel/mef/Importer.java index 55e943ef802..eff6a2b0d38 100644 --- a/core/src/main/java/org/fao/geonet/kernel/mef/Importer.java +++ b/core/src/main/java/org/fao/geonet/kernel/mef/Importer.java @@ -536,7 +536,7 @@ public static void addCategoriesToMetadata(AbstractMetadata metadata, Element fi if (Log.isDebugEnabled(Geonet.MEF)) { Log.debug(Geonet.MEF, " - Setting category : " + catName); } - metadata.getMetadataCategories().add(oneByName); + metadata.getCategories().add(oneByName); } } } diff --git a/core/src/main/java/org/fao/geonet/kernel/mef/MEFLib.java b/core/src/main/java/org/fao/geonet/kernel/mef/MEFLib.java index 0776b432758..0bb5e681199 100644 --- a/core/src/main/java/org/fao/geonet/kernel/mef/MEFLib.java +++ b/core/src/main/java/org/fao/geonet/kernel/mef/MEFLib.java @@ -350,7 +350,7 @@ static Element buildInfoCategories(AbstractMetadata md) Element categ = new Element("categories"); - for (MetadataCategory category : md.getMetadataCategories()) { + for (MetadataCategory category : md.getCategories()) { String name = category.getName(); Element cat = new Element("category"); diff --git a/core/src/main/java/org/fao/geonet/kernel/oaipmh/services/GetRecord.java b/core/src/main/java/org/fao/geonet/kernel/oaipmh/services/GetRecord.java index 1c9fbf6b188..477311c62dd 100644 --- a/core/src/main/java/org/fao/geonet/kernel/oaipmh/services/GetRecord.java +++ b/core/src/main/java/org/fao/geonet/kernel/oaipmh/services/GetRecord.java @@ -107,7 +107,7 @@ public static Record buildRecordStat(ServiceContext context, Specification + + + + + + + diff --git a/core/src/test/java/org/fao/geonet/DataManagerWorksWithoutTransactionIntegrationTest.java b/core/src/test/java/org/fao/geonet/DataManagerWorksWithoutTransactionIntegrationTest.java index bae64caa259..2e74b705c2b 100644 --- a/core/src/test/java/org/fao/geonet/DataManagerWorksWithoutTransactionIntegrationTest.java +++ b/core/src/test/java/org/fao/geonet/DataManagerWorksWithoutTransactionIntegrationTest.java @@ -72,7 +72,7 @@ public void run() throws Exception { AbstractMetadata updateMd = _dataManager.updateMetadata(serviceContext, mdId, newMd, false, false, false, "eng", new ISODate().getDateAndTime(), false); assertNotNull(updateMd); - final boolean hasNext = updateMd.getMetadataCategories().iterator().hasNext(); + final boolean hasNext = updateMd.getCategories().iterator().hasNext(); assertTrue(hasNext); } }); diff --git a/core/src/test/java/org/fao/geonet/kernel/DataManagerIntegrationTest.java b/core/src/test/java/org/fao/geonet/kernel/DataManagerIntegrationTest.java index 4efed71f714..262b54db7b7 100644 --- a/core/src/test/java/org/fao/geonet/kernel/DataManagerIntegrationTest.java +++ b/core/src/test/java/org/fao/geonet/kernel/DataManagerIntegrationTest.java @@ -202,7 +202,7 @@ public void testCreateMetadataWithTemplateMetadata() throws Exception { final AbstractMetadata metadata = new Metadata(); metadata.setDataAndFixCR(sampleMetadataXml) .setUuid(UUID.randomUUID().toString()); - metadata.getMetadataCategories().add(category); + metadata.getCategories().add(category); metadata.getDataInfo().setSchemaId("iso19139"); metadata.getSourceInfo().setSourceId(source.getUuid()).setOwner(1); @@ -211,8 +211,8 @@ public void testCreateMetadataWithTemplateMetadata() throws Exception { principal.getId(), templateMd.getUuid(), MetadataType.METADATA.codeString, true); AbstractMetadata newMetadata = _metadataRepository.findOne(newMetadataId); - assertEquals(1, newMetadata.getMetadataCategories().size()); - assertEquals(category, newMetadata.getMetadataCategories().iterator().next()); + assertEquals(1, newMetadata.getCategories().size()); + assertEquals(category, newMetadata.getCategories().iterator().next()); assertEqualsText(metadata.getUuid(), newMetadata.getXmlData(false), "gmd:parentIdentifier/gco:CharacterString"); } diff --git a/core/src/test/java/org/fao/geonet/kernel/DataManagerWorksWithoutTransactionIntegrationTest.java b/core/src/test/java/org/fao/geonet/kernel/DataManagerWorksWithoutTransactionIntegrationTest.java index a6ab3efd362..b9daced0e8c 100644 --- a/core/src/test/java/org/fao/geonet/kernel/DataManagerWorksWithoutTransactionIntegrationTest.java +++ b/core/src/test/java/org/fao/geonet/kernel/DataManagerWorksWithoutTransactionIntegrationTest.java @@ -82,7 +82,7 @@ MetadataType.METADATA.codeString, null, metadataCategory, new ISODate().getDateA AbstractMetadata updateMd = dm.updateMetadata(serviceContext, mdId, newMd, false, false, false, "eng", new ISODate().getDateAndTime(), false); assertNotNull(updateMd); - final boolean hasNext = updateMd.getMetadataCategories().iterator().hasNext(); + final boolean hasNext = updateMd.getCategories().iterator().hasNext(); assertTrue(hasNext); } }); diff --git a/domain/src/main/java/org/fao/geonet/domain/AbstractMetadata.java b/domain/src/main/java/org/fao/geonet/domain/AbstractMetadata.java index 15500a8d42d..21b643566cf 100644 --- a/domain/src/main/java/org/fao/geonet/domain/AbstractMetadata.java +++ b/domain/src/main/java/org/fao/geonet/domain/AbstractMetadata.java @@ -23,6 +23,7 @@ package org.fao.geonet.domain; import java.io.IOException; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -64,7 +65,6 @@ @MappedSuperclass public abstract class AbstractMetadata extends GeonetEntity { static final String ID_SEQ_NAME = "metadata_id_seq"; - public static final String METADATA_CATEG_JOIN_TABLE_NAME = "MetadataCateg"; public static final String METADATA_CATEG_JOIN_TABLE_CATEGORY_ID = "categoryId"; private int _id; private String _uuid; @@ -80,7 +80,7 @@ public abstract class AbstractMetadata extends GeonetEntity { * @return the id of the metadata */ @Id - @SequenceGenerator(name = Metadata.ID_SEQ_NAME, initialValue = 100, allocationSize = 1) + @SequenceGenerator(name=AbstractMetadata.ID_SEQ_NAME, initialValue = 100, allocationSize = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = ID_SEQ_NAME) @Column(nullable = false) public int getId() { @@ -309,8 +309,10 @@ protected static void transform(Document in, AbstractMetadata out) { } @Transient - public abstract Set getMetadataCategories(); - - public abstract void setMetadataCategories(@Nonnull Set categories); + public Set getCategories() { + return (Set) metadataCategories; + } + @Transient + protected Set metadataCategories = new HashSet(); } diff --git a/domain/src/main/java/org/fao/geonet/domain/Metadata.java b/domain/src/main/java/org/fao/geonet/domain/Metadata.java index 62d39db7a12..22147dc09e1 100644 --- a/domain/src/main/java/org/fao/geonet/domain/Metadata.java +++ b/domain/src/main/java/org/fao/geonet/domain/Metadata.java @@ -23,14 +23,15 @@ package org.fao.geonet.domain; -import org.apache.lucene.document.Document; -import org.fao.geonet.domain.userfeedback.UserFeedback; -import org.fao.geonet.entitylistener.MetadataEntityListenerManager; +import java.io.Serializable; +import java.util.List; +import java.util.Set; import javax.annotation.Nonnull; import javax.persistence.Access; import javax.persistence.AccessType; import javax.persistence.CascadeType; +import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; import javax.persistence.FetchType; @@ -39,10 +40,10 @@ import javax.persistence.ManyToMany; import javax.persistence.OneToMany; import javax.persistence.Table; -import java.io.Serializable; -import java.util.HashSet; -import java.util.List; -import java.util.Set; + +import org.apache.lucene.document.Document; +import org.fao.geonet.domain.userfeedback.UserFeedback; +import org.fao.geonet.entitylistener.MetadataEntityListenerManager; /** * @See {@link AbstractMetadata} @@ -56,11 +57,10 @@ public class Metadata extends AbstractMetadata implements Serializable { private static final long serialVersionUID = -5557599895424227101L; public static final String TABLENAME = "Metadata"; - private Set metadataCategories = new HashSet(); + public static final String METADATA_CATEG_JOIN_TABLE_NAME = "MetadataCateg"; private List userFeedbacks; public Metadata() { - super(); } public static Metadata createFromLuceneIndexDocument(Document doc) { @@ -75,8 +75,12 @@ public static Metadata createFromLuceneIndexDocument(Document doc) { * * @return the metadata categories */ - @ManyToMany(cascade = { CascadeType.DETACH, CascadeType.REFRESH }, fetch = FetchType.EAGER) - @JoinTable(name = METADATA_CATEG_JOIN_TABLE_NAME, joinColumns = @JoinColumn(name = "metadataId"), inverseJoinColumns = @JoinColumn(name = METADATA_CATEG_JOIN_TABLE_CATEGORY_ID)) + @ManyToMany(cascade = {CascadeType.DETACH, CascadeType.REFRESH}, + fetch = FetchType.EAGER) + @JoinTable(name = METADATA_CATEG_JOIN_TABLE_NAME, + joinColumns = @JoinColumn(name = "metadataId"), + inverseJoinColumns = @JoinColumn(name = + METADATA_CATEG_JOIN_TABLE_CATEGORY_ID)) @Nonnull public Set getMetadataCategories() { return metadataCategories; @@ -87,7 +91,7 @@ public Set getMetadataCategories() { * * @param categories */ - public void setMetadataCategories(@Nonnull Set categories) { + protected void setMetadataCategories(@Nonnull Set categories) { this.metadataCategories = categories; } diff --git a/domain/src/main/java/org/fao/geonet/domain/MetadataDraft.java b/domain/src/main/java/org/fao/geonet/domain/MetadataDraft.java new file mode 100644 index 00000000000..333f01f566d --- /dev/null +++ b/domain/src/main/java/org/fao/geonet/domain/MetadataDraft.java @@ -0,0 +1,38 @@ +package org.fao.geonet.domain; + +import java.io.Serializable; + +import javax.persistence.Access; +import javax.persistence.AccessType; +import javax.persistence.Entity; +import javax.persistence.EntityListeners; +import javax.persistence.Table; + +import org.apache.lucene.document.Document; +import org.fao.geonet.entitylistener.MetadataDraftEntityListenerManager; + +/** + * This is a normal {@link Metadata} but on its draft version. + * + * Privileges, categories and non-XML properties will not be stored. + * + * @author María Arias de Reyna + */ +@Entity +@Table(name = MetadataDraft.TABLENAME) +@Access(AccessType.PROPERTY) +@EntityListeners(MetadataDraftEntityListenerManager.class) +public class MetadataDraft extends AbstractMetadata implements Serializable { + + private static final long serialVersionUID = -1933627969445820867L; + public static final String TABLENAME = "MetadataDraft"; + + public MetadataDraft() { + } + + public static MetadataDraft createFromLuceneIndexDocument(Document doc) { + MetadataDraft metadata = new MetadataDraft(); + transform(doc, metadata); + return metadata; + } +} diff --git a/domain/src/main/java/org/fao/geonet/domain/MetadataRelation.java b/domain/src/main/java/org/fao/geonet/domain/MetadataRelation.java index b18ec420079..8c453e96770 100644 --- a/domain/src/main/java/org/fao/geonet/domain/MetadataRelation.java +++ b/domain/src/main/java/org/fao/geonet/domain/MetadataRelation.java @@ -30,10 +30,10 @@ /** * Tables that links related metadata.

Object is its own entity so that it is easier to add * relations without having to load the related metadata.

Note: It is important that both - * Metadata are managed (have been saved or loaded from the database.) For example: + * Metadata are managed (have been saved or loaded from the MetadataRepository.) For example: *


- *      Metadata metadata1 = _metadataUtils.findOne(id);
- *      Metadata metadata2 = _metadataUtils.findOne(id2);
+ *      Metadata metadata1 = _metadataRepo.findOne(id);
+ *      Metadata metadata2 = _metadataRepo.findOne(id2);
  *      new MetadataRelation(metadata1, metadata2);
  *     
*

diff --git a/domain/src/main/java/org/fao/geonet/entitylistener/MetadataDraftEntityListenerManager.java b/domain/src/main/java/org/fao/geonet/entitylistener/MetadataDraftEntityListenerManager.java new file mode 100644 index 00000000000..71f86eea44f --- /dev/null +++ b/domain/src/main/java/org/fao/geonet/entitylistener/MetadataDraftEntityListenerManager.java @@ -0,0 +1,42 @@ +package org.fao.geonet.entitylistener; + +import javax.persistence.PostLoad; +import javax.persistence.PostPersist; +import javax.persistence.PostRemove; +import javax.persistence.PostUpdate; +import javax.persistence.PrePersist; +import javax.persistence.PreRemove; +import javax.persistence.PreUpdate; + +import org.fao.geonet.domain.MetadataDraft; + +public class MetadataDraftEntityListenerManager extends AbstractEntityListenerManager { + @PrePersist + public void prePresist(final MetadataDraft entity) { + handleEvent(PersistentEventType.PrePersist, entity); + } + @PreRemove + public void preRemove(final MetadataDraft entity) { + handleEvent(PersistentEventType.PreRemove, entity); + } + @PostPersist + public void postPersist(final MetadataDraft entity) { + handleEvent(PersistentEventType.PostPersist, entity); + } + @PostRemove + public void postRemove(final MetadataDraft entity) { + handleEvent(PersistentEventType.PostRemove, entity); + } + @PreUpdate + public void preUpdate(final MetadataDraft entity) { + handleEvent(PersistentEventType.PreUpdate, entity); + } + @PostUpdate + public void postUpdate(final MetadataDraft entity) { + handleEvent(PersistentEventType.PostUpdate, entity); + } + @PostLoad + public void postLoad(final MetadataDraft entity) { + handleEvent(PersistentEventType.PostLoad, entity); + } +} diff --git a/domain/src/main/java/org/fao/geonet/repository/MetadataDraftRepository.java b/domain/src/main/java/org/fao/geonet/repository/MetadataDraftRepository.java new file mode 100644 index 00000000000..a86ea6247e9 --- /dev/null +++ b/domain/src/main/java/org/fao/geonet/repository/MetadataDraftRepository.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2001-2016 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +package org.fao.geonet.repository; + +import java.util.List; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +import org.fao.geonet.domain.MetadataDraft; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +/** + * Data Access object for the {@link MetadataDraft} entities. + * + * The use of this class is discouraged, you should use IMetadataUtils or IMetadataManager instead. + * + * @author Jesse + */ +public interface MetadataDraftRepository + extends GeonetRepository, + MetadataRepositoryCustom, + JpaSpecificationExecutor { + /** + * Find one metadata by the metadata's uuid. + * + * @param uuid the uuid of the metadata to find + * @return one metadata or null. + */ + @Nullable + MetadataDraft findOneByUuid(@Nonnull String uuid); + + /** + * Find all metadata harvested by the identified harvester. + * + * @param uuid the uuid of the harvester + * @return all metadata harvested by the identified harvester. + */ + @Nonnull + List findAllByHarvestInfo_Uuid(@Nonnull String uuid); +} diff --git a/domain/src/main/java/org/fao/geonet/repository/MetadataDraftRepositoryImpl.java b/domain/src/main/java/org/fao/geonet/repository/MetadataDraftRepositoryImpl.java new file mode 100644 index 00000000000..65ef1024e11 --- /dev/null +++ b/domain/src/main/java/org/fao/geonet/repository/MetadataDraftRepositoryImpl.java @@ -0,0 +1,257 @@ +/* + * Copyright (C) 2001-2016 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +package org.fao.geonet.repository; + +import com.google.common.collect.Maps; + +import org.fao.geonet.domain.ISODate; +import org.fao.geonet.domain.MetadataDraft; +import org.fao.geonet.domain.MetadataDraft_; +import org.fao.geonet.domain.MetadataDataInfo_; +import org.fao.geonet.domain.MetadataSourceInfo; +import org.fao.geonet.domain.Pair; +import org.fao.geonet.repository.reports.MetadataReportsQueries; +import org.jdom.Element; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.data.repository.NoRepositoryBean; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import javax.persistence.Tuple; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Order; +import javax.persistence.criteria.Path; +import javax.persistence.criteria.Root; + +/** + * Implementation for all {@link Metadata} queries that cannot be automatically generated by + * Spring-data. + * + * @author Jesse + */ +@NoRepositoryBean +public class MetadataDraftRepositoryImpl implements MetadataRepositoryCustom { + + @PersistenceContext + EntityManager _entityManager; + + @Override + public MetadataReportsQueries getMetadataReports() { + return new MetadataReportsQueries(_entityManager); + } + + @Override + public MetadataDraft findOne(String id) { + try { + return _entityManager.find(MetadataDraft.class, Integer.parseInt(id)); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("id parameter of findByIdString must be parsable to an integer. It was '" + id + "'"); + } + } + + @Override + public + @Nonnull + Page> findAllIdsAndChangeDates(@Nullable Pageable pageable) { + CriteriaBuilder cb = _entityManager.getCriteriaBuilder(); + CriteriaQuery cbQuery = cb.createQuery(Tuple.class); + Root root = cbQuery.from(MetadataDraft.class); + + cbQuery.multiselect(cb.count(root)); + Long total = (Long) _entityManager.createQuery(cbQuery).getSingleResult().get(0); + cbQuery.multiselect(root.get(MetadataDraft_.id), root.get(MetadataDraft_.dataInfo).get(MetadataDataInfo_.changeDate)); + + if (pageable != null && pageable.getSort() != null) { + final Sort sort = pageable.getSort(); + List orders = SortUtils.sortToJpaOrders(cb, sort, root); + + cbQuery.orderBy(orders); + } + + TypedQuery query = _entityManager.createQuery(cbQuery); + if (pageable != null) { + query.setFirstResult(pageable.getOffset()); + query.setMaxResults(pageable.getPageSize()); + } + + ArrayList> finalResults = new ArrayList>(); + for (Tuple tuple : query.getResultList()) { + final Integer mdId = (Integer) tuple.get(0); + final ISODate changeDate = (ISODate) tuple.get(1); + finalResults.add(Pair.read(mdId, changeDate)); + } + return new PageImpl>(finalResults, pageable, total); + } + + @Nonnull + @Override + public List findAllIdsBy(@Nonnull Specification spec) { + CriteriaBuilder cb = _entityManager.getCriteriaBuilder(); + CriteriaQuery cbQuery = cb.createQuery(Integer.class); + Root root = cbQuery.from(MetadataDraft.class); + cbQuery.select(root.get(MetadataDraft_.id)); + + cbQuery.where(spec.toPredicate(root, cbQuery, cb)); + return _entityManager.createQuery(cbQuery).getResultList(); + } + + + @Override + public MetadataDraft findOneOldestByChangeDate() { + final CriteriaBuilder cb = _entityManager.getCriteriaBuilder(); + final CriteriaQuery query = cb.createQuery(MetadataDraft.class); + final Root metadataRoot = query.from(MetadataDraft.class); + final Path changeDate = metadataRoot.get(MetadataDraft_.dataInfo).get(MetadataDataInfo_.changeDate); + query.orderBy(cb.asc(changeDate)); + return _entityManager.createQuery(query).setMaxResults(1).getSingleResult(); + } + + @Override + public Map findAllSourceInfo(Specification spec) { + CriteriaBuilder cb = _entityManager.getCriteriaBuilder(); + CriteriaQuery cbQuery = cb.createQuery(Object[].class); + Root root = cbQuery.from(MetadataDraft.class); + cbQuery.select(cb.array(root.get(MetadataDraft_.id), root.get(MetadataDraft_.sourceInfo))); + + cbQuery.where(spec.toPredicate(root, cbQuery, cb)); + Map results = Maps.newHashMap(); + final List resultList = _entityManager.createQuery(cbQuery).getResultList(); + for (Object[] objects : resultList) { + final Integer metadataId = (Integer) objects[0]; + final MetadataSourceInfo sourceInfo = (MetadataSourceInfo) objects[1]; + results.put(metadataId, sourceInfo); + } + + return results; + } + + /** + * @see org.fao.geonet.repository.MetadataRepositoryCustom#findAllSimple(org.springframework.data.jpa.domain.Specification) + */ + @Override + public List findAllSimple(String id) { + Query query = _entityManager.createQuery( + "select new org.fao.geonet.repository.SimpleMetadata(" + + "id, uuid, dataInfo.changeDate, dataInfo.type_JPAWorkaround) " + + "from Metadata where harvestInfo.uuid = :id").setParameter("id", id); + + //TODO paginate + + return query.getResultList(); + } + + + @Override + public Element findAllUuidsAndChangeDatesAndSchemaId(List ids, @Nonnull Pageable pageable) { + CriteriaBuilder cb = _entityManager.getCriteriaBuilder(); + CriteriaQuery cbQuery = cb.createQuery(Tuple.class); + Root root = cbQuery.from(MetadataDraft.class); + + cbQuery.multiselect(root.get(MetadataDraft_.uuid), root.get(MetadataDraft_.dataInfo).get(MetadataDataInfo_.changeDate), root.get(MetadataDraft_.dataInfo).get(MetadataDataInfo_.schemaId)); + + cbQuery.where(root.get(MetadataDraft_.id).in(ids), cb.equal(root.get(MetadataDraft_.dataInfo).get(MetadataDataInfo_.type_JPAWorkaround), 'n')); + + if (pageable != null && pageable.getSort() != null) { + final Sort sort = pageable.getSort(); + List orders = SortUtils.sortToJpaOrders(cb, sort, root); + + cbQuery.orderBy(orders); + } + + TypedQuery query = _entityManager.createQuery(cbQuery); + if (pageable != null) { + query.setFirstResult(pageable.getOffset()); + query.setMaxResults(pageable.getPageSize()); + } + + Element result = new Element("metadata"); + for (Tuple tuple : query.getResultList()) { + + Element record = new Element("record"); + Element uuid = new Element("uuid"); + Element schemaid = new Element("schemaid"); + Element changedate = new Element("changedate"); + + uuid.addContent((String) tuple.get(0)); + changedate.addContent(((ISODate) tuple.get(1)).toString()); + schemaid.addContent((String) tuple.get(2)); + + record.addContent(uuid); + record.addContent(changedate); + record.addContent(schemaid); + + result.addContent(record); + + } + return result; + } + + @Override + public Element findAllUuidsAndChangeDatesAndSchemaId(List ids) { + CriteriaBuilder cb = _entityManager.getCriteriaBuilder(); + CriteriaQuery cbQuery = cb.createQuery(Tuple.class); + Root root = cbQuery.from(MetadataDraft.class); + + cbQuery.multiselect(root.get(MetadataDraft_.uuid), root.get(MetadataDraft_.dataInfo).get(MetadataDataInfo_.changeDate), root.get(MetadataDraft_.dataInfo).get(MetadataDataInfo_.schemaId)); + + cbQuery.where(root.get(MetadataDraft_.id).in(ids), cb.equal(root.get(MetadataDraft_.dataInfo).get(MetadataDataInfo_.type_JPAWorkaround), 'n')); + + TypedQuery query = _entityManager.createQuery(cbQuery); + + Element result = new Element("metadata"); + for (Tuple tuple : query.getResultList()) { + + Element record = new Element("record"); + Element uuid = new Element("uuid"); + Element schemaid = new Element("schemaid"); + Element changedate = new Element("changedate"); + + uuid.addContent((String) tuple.get(0)); + changedate.addContent(((ISODate) tuple.get(1)).toString()); + schemaid.addContent((String) tuple.get(2)); + + record.addContent(uuid); + record.addContent(changedate); + record.addContent(schemaid); + + result.addContent(record); + + } + return result; + } + +} diff --git a/domain/src/main/java/org/fao/geonet/repository/MetadataRepositoryCustom.java b/domain/src/main/java/org/fao/geonet/repository/MetadataRepositoryCustom.java index 735f8fe0fc2..39522036e4e 100644 --- a/domain/src/main/java/org/fao/geonet/repository/MetadataRepositoryCustom.java +++ b/domain/src/main/java/org/fao/geonet/repository/MetadataRepositoryCustom.java @@ -66,7 +66,7 @@ public interface MetadataRepositoryCustom { * @param id the id in string form instead of integer. */ @Nullable - AbstractMetadata findOne(@Nonnull String id); + T findOne(@Nonnull String id); /** * Find the list of Metadata Ids and changes dates for the metadata.

When constructing sort @@ -95,7 +95,7 @@ public interface MetadataRepositoryCustom { * @return the metadata with the oldest change date */ @Nullable - AbstractMetadata findOneOldestByChangeDate(); + T findOneOldestByChangeDate(); /** * Load the source info objects for all the metadata selected by the spec. diff --git a/domain/src/main/java/org/fao/geonet/repository/reports/MetadataReportsQueries.java b/domain/src/main/java/org/fao/geonet/repository/reports/MetadataReportsQueries.java index 34a3315fbef..b84ce1fc64e 100644 --- a/domain/src/main/java/org/fao/geonet/repository/reports/MetadataReportsQueries.java +++ b/domain/src/main/java/org/fao/geonet/repository/reports/MetadataReportsQueries.java @@ -97,7 +97,7 @@ public List getUpdatedMetadata(ISODate dateFrom, ISO * Retrieves created metadata in the period specified, that is not available in ALL group. * Optionally filters metadata in groups. */ - public List getInternalMetadata(ISODate dateFrom, ISODate dateTo, Set groups, + public List getInternalMetadata(ISODate dateFrom, ISODate dateTo, Set groups, @Nonnull Specification operationAllowedSpecification) { final CriteriaBuilder cb = _entityManager.getCriteriaBuilder(); final CriteriaQuery cbQuery = cb.createQuery(Metadata.class); diff --git a/domain/src/test/java/org/fao/geonet/repository/BasicAbstractMetadataTest.java b/domain/src/test/java/org/fao/geonet/repository/BasicAbstractMetadataTest.java new file mode 100644 index 00000000000..5dca53a0511 --- /dev/null +++ b/domain/src/test/java/org/fao/geonet/repository/BasicAbstractMetadataTest.java @@ -0,0 +1,96 @@ +/* + * Copyright (C) 2001-2016 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +package org.fao.geonet.repository; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import org.fao.geonet.domain.AbstractMetadata; +import org.fao.geonet.domain.Metadata; +import org.fao.geonet.domain.MetadataDraft; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Basic Metadata and Draft Tests + * + * @author delawen María Arias de Reyna + */ +public class BasicAbstractMetadataTest extends AbstractSpringDataTest { + + @Autowired + MetadataRepository _metadatarepo; + + @Autowired + MetadataDraftRepository _metadatadraftrepo; + + @Autowired + MetadataCategoryRepository _categoryRepo; + + @Test + public void testMetadataWithRepositoryDAO() throws Exception { + Metadata md = new Metadata(); + populate(md); + _metadatarepo.save(md); + + md = _metadatarepo.findOneByUuid(md.getUuid()); + + assertNotNull(md); + + _metadatarepo.delete(md); + + md = _metadatarepo.findOneByUuid(md.getUuid()); + + assertNull(md); + } + + @Test + public void testDraftWithRepositoryDAO() throws Exception { + MetadataDraft md = new MetadataDraft(); + populate(md); + _metadatadraftrepo.save(md); + + md = _metadatadraftrepo.findOneByUuid(md.getUuid()); + + assertNotNull(md); + + _metadatadraftrepo.delete(md); + + md = _metadatadraftrepo.findOneByUuid(md.getUuid()); + + assertNull(md); + } + + private void populate(AbstractMetadata md) { + md.setUuid("test-metadata"); + md.setData(""); + md.getSourceInfo().setGroupOwner(1); + md.getSourceInfo().setOwner(1); + md.getSourceInfo().setSourceId("test-faking"); + md.getDataInfo().setSchemaId("isoFake"); + } + + + +} diff --git a/domain/src/test/java/org/fao/geonet/repository/MetadataCategoryRepositoryTest.java b/domain/src/test/java/org/fao/geonet/repository/MetadataCategoryRepositoryTest.java index 1e3e2e6c5e5..fbe897584b7 100644 --- a/domain/src/test/java/org/fao/geonet/repository/MetadataCategoryRepositoryTest.java +++ b/domain/src/test/java/org/fao/geonet/repository/MetadataCategoryRepositoryTest.java @@ -105,12 +105,12 @@ public void testDeleteDeletesFromMetadata() throws Exception { MetadataCategory cat2 = _repo.save(newMetadataCategory(_inc)); Metadata metadata1 = MetadataRepositoryTest.newMetadata(_inc); - metadata1.getMetadataCategories().add(cat1); - metadata1.getMetadataCategories().add(cat2); + metadata1.getCategories().add(cat1); + metadata1.getCategories().add(cat2); metadata1 = _metadataRepo.save(metadata1); Metadata metadata2 = MetadataRepositoryTest.newMetadata(_inc); - metadata2.getMetadataCategories().add(cat1); + metadata2.getCategories().add(cat1); metadata2 = _metadataRepo.save(metadata2); _repo.deleteCategoryAndMetadataReferences(cat1.getId()); @@ -120,11 +120,11 @@ public void testDeleteDeletesFromMetadata() throws Exception { // org.fao.geonet.services.category.Remove assumes that this test passes. If this test can't pass // then there needs to be a way to fix Remove as well. - final Set foundCategories = _metadataRepo.findOne(metadata1.getId()).getMetadataCategories(); + final Set foundCategories = _metadataRepo.findOne(metadata1.getId()).getCategories(); assertEquals(1, foundCategories.size()); assertEquals(cat2.getId(), foundCategories.iterator().next().getId()); - assertEquals(0, _metadataRepo.findOne(metadata2.getId()).getMetadataCategories().size()); + assertEquals(0, _metadataRepo.findOne(metadata2.getId()).getCategories().size()); } private MetadataCategory newMetadataCategory() { diff --git a/domain/src/test/java/org/fao/geonet/repository/MetadataRepositoryIssue1876IntegrationTest.java b/domain/src/test/java/org/fao/geonet/repository/MetadataRepositoryIssue1876IntegrationTest.java index e63381d54ae..b448ff6fcb5 100644 --- a/domain/src/test/java/org/fao/geonet/repository/MetadataRepositoryIssue1876IntegrationTest.java +++ b/domain/src/test/java/org/fao/geonet/repository/MetadataRepositoryIssue1876IntegrationTest.java @@ -45,7 +45,7 @@ public void setUp() throws UnknownHostException, IOException { @Test(timeout = 500) public void testSelectMetadata() { Metadata m = mdRepo.findOne(16667); - Set d = m.getMetadataCategories(); + Set d = m.getCategories(); Assert.assertNotNull("Metadata is null", m); } diff --git a/domain/src/test/java/org/fao/geonet/repository/report/ReportsQueriesTest.java b/domain/src/test/java/org/fao/geonet/repository/report/ReportsQueriesTest.java index 45cfc397fda..5211398954f 100644 --- a/domain/src/test/java/org/fao/geonet/repository/report/ReportsQueriesTest.java +++ b/domain/src/test/java/org/fao/geonet/repository/report/ReportsQueriesTest.java @@ -232,7 +232,7 @@ public void testGetInternalMetadata() throws Exception { ISODate dateFrom = new ISODate("2014-01-01T00:00:0"); ISODate dateTo = new ISODate("2014-04-01T00:00:0"); Set groupsSet = new HashSet(); - List updatedMetadata = _metadataRepository.getMetadataReports(). + List updatedMetadata = _metadataRepository.getMetadataReports(). getInternalMetadata(dateFrom, dateTo, groupsSet, OperationAllowedSpecs.isPublic(ReservedOperation.view)); assertEquals(1, updatedMetadata.size()); diff --git a/domain/src/test/java/org/fao/geonet/repository/specification/MetadataSpecsTest.java b/domain/src/test/java/org/fao/geonet/repository/specification/MetadataSpecsTest.java index 2aa1b866f7f..4c2dfe39c9f 100644 --- a/domain/src/test/java/org/fao/geonet/repository/specification/MetadataSpecsTest.java +++ b/domain/src/test/java/org/fao/geonet/repository/specification/MetadataSpecsTest.java @@ -124,17 +124,17 @@ public void testHasCategory() throws Exception { final MetadataCategory cat4 = _categoryRepo.save(MetadataCategoryRepositoryTest.newMetadataCategory(_inc)); final Metadata metadata = newMetadata(_inc); - metadata.getMetadataCategories().add(cat1); - metadata.getMetadataCategories().add(cat2); + metadata.getCategories().add(cat1); + metadata.getCategories().add(cat2); Metadata md1 = _repository.save(metadata); final Metadata metadata2 = newMetadata(_inc); - metadata2.getMetadataCategories().add(cat1); - metadata2.getMetadataCategories().add(cat3); + metadata2.getCategories().add(cat1); + metadata2.getCategories().add(cat3); Metadata md2 = _repository.save(metadata2); final Metadata metadata3 = newMetadata(_inc); - metadata3.getMetadataCategories().add(cat2); + metadata3.getCategories().add(cat2); Metadata md3 = _repository.save(metadata3); List found = _repository.findAll(hasCategory(cat1), SortUtils.createSort(Metadata_.id)); diff --git a/events/src/main/java/org/fao/geonet/events/hooks/md/MetadataDraftModified.java b/events/src/main/java/org/fao/geonet/events/hooks/md/MetadataDraftModified.java new file mode 100644 index 00000000000..898efbf9448 --- /dev/null +++ b/events/src/main/java/org/fao/geonet/events/hooks/md/MetadataDraftModified.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2001-2016 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +/** + * + */ +package org.fao.geonet.events.hooks.md; + +import org.fao.geonet.domain.MetadataDraft; +import org.fao.geonet.entitylistener.GeonetworkEntityListener; +import org.fao.geonet.entitylistener.PersistentEventType; +import org.fao.geonet.events.md.MetadataDraftAdd; +import org.fao.geonet.events.md.MetadataDraftRemove; +import org.fao.geonet.events.md.MetadataDraftUpdate; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.context.ApplicationEventPublisherAware; +import org.springframework.stereotype.Component; + +/** + * Hook events to database events + * + * @author delawen + */ +@Component +public class MetadataDraftModified + implements GeonetworkEntityListener, + ApplicationEventPublisherAware { + + private ApplicationEventPublisher eventPublisher; + + /** + * @see org.fao.geonet.entitylistener.GeonetworkEntityListener#getEntityClass() + */ + @Override + public Class getEntityClass() { + return MetadataDraft.class; + } + + /** + * @see org.fao.geonet.entitylistener.GeonetworkEntityListener#handleEvent(org.fao.geonet.entitylistener.PersistentEventType, + * java.lang.Object) + */ + @Override + public void handleEvent(PersistentEventType type, MetadataDraft entity) { + if (type == PersistentEventType.PostPersist) { + this.eventPublisher.publishEvent(new MetadataDraftAdd(entity)); + } else if (type == PersistentEventType.PostUpdate) { + this.eventPublisher.publishEvent(new MetadataDraftUpdate(entity)); + } else if (type == PersistentEventType.PostRemove) { + this.eventPublisher.publishEvent(new MetadataDraftRemove(entity)); + } + } + + /** + * @see org.springframework.context.ApplicationEventPublisherAware#setApplicationEventPublisher(org.springframework.context.ApplicationEventPublisher) + */ + @Override + public void setApplicationEventPublisher( + ApplicationEventPublisher applicationEventPublisher) { + this.eventPublisher = applicationEventPublisher; + } +} diff --git a/events/src/main/java/org/fao/geonet/events/hooks/md/MetadataModified.java b/events/src/main/java/org/fao/geonet/events/hooks/md/MetadataModified.java index 4064a576659..9e39b8e265d 100644 --- a/events/src/main/java/org/fao/geonet/events/hooks/md/MetadataModified.java +++ b/events/src/main/java/org/fao/geonet/events/hooks/md/MetadataModified.java @@ -61,11 +61,9 @@ public Class getEntityClass() { */ @Override public void handleEvent(PersistentEventType type, Metadata entity) { - if (entity.getId() == 0 - && (type == PersistentEventType.PrePersist || type == PersistentEventType.PreUpdate)) { + if (type == PersistentEventType.PostPersist) { this.eventPublisher.publishEvent(new MetadataAdd(entity)); - } else if ((type == PersistentEventType.PostPersist || type == PersistentEventType.PostUpdate) - && entity.getId() != 0) { + } else if (type == PersistentEventType.PostUpdate) { this.eventPublisher.publishEvent(new MetadataUpdate(entity)); } else if (type == PersistentEventType.PostRemove) { this.eventPublisher.publishEvent(new MetadataRemove(entity)); diff --git a/events/src/main/java/org/fao/geonet/events/hooks/md/MetadataSharingUpdate.java b/events/src/main/java/org/fao/geonet/events/hooks/md/MetadataSharingUpdate.java new file mode 100644 index 00000000000..04cbc77f3dc --- /dev/null +++ b/events/src/main/java/org/fao/geonet/events/hooks/md/MetadataSharingUpdate.java @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2001-2016 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +/** + * + */ +package org.fao.geonet.events.hooks.md; + +import org.fao.geonet.domain.OperationAllowed; +import org.fao.geonet.entitylistener.GeonetworkEntityListener; +import org.fao.geonet.entitylistener.PersistentEventType; +import org.fao.geonet.events.md.sharing.MetadataShare; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.context.ApplicationEventPublisherAware; +import org.springframework.stereotype.Component; + +/** + * Hook events to database events + * + * @author delawen + */ +@Component +public class MetadataSharingUpdate implements GeonetworkEntityListener, + ApplicationEventPublisherAware { + + private ApplicationEventPublisher eventPublisher; + + /** + * @see org.fao.geonet.entitylistener.GeonetworkEntityListener#getEntityClass() + */ + @Override + public Class getEntityClass() { + return OperationAllowed.class; + } + + /** + * @see org.fao.geonet.entitylistener.GeonetworkEntityListener#handleEvent(org.fao.geonet.entitylistener.PersistentEventType, + * java.lang.Object) + */ + @Override + public void handleEvent(PersistentEventType type, OperationAllowed entity) { + if (type == PersistentEventType.PostPersist) { + this.eventPublisher.publishEvent(new MetadataShare(entity, MetadataShare.Type.ADD)); + } else if (type == PersistentEventType.PostUpdate) { + this.eventPublisher.publishEvent(new MetadataShare(entity, MetadataShare.Type.UPDATE)); + } else if (type == PersistentEventType.PostRemove) { + this.eventPublisher.publishEvent(new MetadataShare(entity, MetadataShare.Type.REMOVE)); + } + } + + /** + * @see org.springframework.context.ApplicationEventPublisherAware#setApplicationEventPublisher(org.springframework.context.ApplicationEventPublisher) + */ + @Override + public void setApplicationEventPublisher( + ApplicationEventPublisher applicationEventPublisher) { + this.eventPublisher = applicationEventPublisher; + } +} diff --git a/events/src/main/java/org/fao/geonet/events/md/MetadataDraftAdd.java b/events/src/main/java/org/fao/geonet/events/md/MetadataDraftAdd.java new file mode 100644 index 00000000000..ca6c504670d --- /dev/null +++ b/events/src/main/java/org/fao/geonet/events/md/MetadataDraftAdd.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2001-2016 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +package org.fao.geonet.events.md; + +import org.fao.geonet.domain.MetadataDraft; + +/** + * Event launched when a metadata is created on the database + * + * @author delawen + */ +public class MetadataDraftAdd extends MetadataEvent { + + private static final long serialVersionUID = 324534556246220509L; + + public MetadataDraftAdd(MetadataDraft md) { + super(md); + } + +} diff --git a/events/src/main/java/org/fao/geonet/events/md/MetadataDraftIndexCompleted.java b/events/src/main/java/org/fao/geonet/events/md/MetadataDraftIndexCompleted.java new file mode 100644 index 00000000000..addb5006f20 --- /dev/null +++ b/events/src/main/java/org/fao/geonet/events/md/MetadataDraftIndexCompleted.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2001-2016 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +/** + * + */ +package org.fao.geonet.events.md; + +import org.fao.geonet.domain.MetadataDraft; + +/** + * Event launched when the indexation of a metadata record is finished + * + * @author delawen + */ +public class MetadataDraftIndexCompleted extends MetadataEvent { + + private static final long serialVersionUID = 6646733956246220509L; + + /** + * @param metadata + */ + public MetadataDraftIndexCompleted(MetadataDraft metadata) { + super(metadata); + } + +} diff --git a/events/src/main/java/org/fao/geonet/events/md/MetadataDraftRemove.java b/events/src/main/java/org/fao/geonet/events/md/MetadataDraftRemove.java new file mode 100644 index 00000000000..c5923b684aa --- /dev/null +++ b/events/src/main/java/org/fao/geonet/events/md/MetadataDraftRemove.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2001-2016 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +package org.fao.geonet.events.md; + +import org.fao.geonet.domain.MetadataDraft; + +/** + * Event launched when a metadata is removed from the database + * + * @author delawen + */ +public class MetadataDraftRemove extends MetadataEvent { + + private static final long serialVersionUID = 324534556246220509L; + + public MetadataDraftRemove(MetadataDraft md) { + super(md); + } + +} diff --git a/events/src/main/java/org/fao/geonet/events/md/MetadataDraftUpdate.java b/events/src/main/java/org/fao/geonet/events/md/MetadataDraftUpdate.java new file mode 100644 index 00000000000..19b73dec5c0 --- /dev/null +++ b/events/src/main/java/org/fao/geonet/events/md/MetadataDraftUpdate.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2001-2016 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +package org.fao.geonet.events.md; + +import org.fao.geonet.domain.MetadataDraft; + +/** + * Event launched when a metadata is updated on the database + * + * @author delawen + */ +public class MetadataDraftUpdate extends MetadataEvent { + + private static final long serialVersionUID = 324534556246220509L; + + public MetadataDraftUpdate(MetadataDraft md) { + super(md); + } + +} diff --git a/events/src/main/java/org/fao/geonet/events/md/sharing/MetadataShare.java b/events/src/main/java/org/fao/geonet/events/md/sharing/MetadataShare.java new file mode 100644 index 00000000000..f3d38ed2692 --- /dev/null +++ b/events/src/main/java/org/fao/geonet/events/md/sharing/MetadataShare.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2001-2016 Food and Agriculture Organization of the + * United Nations (FAO-UN), United Nations World Food Programme (WFP) + * and United Nations Environment Programme (UNEP) + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or (at + * your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + * + * Contact: Jeroen Ticheler - FAO - Viale delle Terme di Caracalla 2, + * Rome - Italy. email: geonetwork@osgeo.org + */ + +package org.fao.geonet.events.md.sharing; + +import org.fao.geonet.domain.OperationAllowed; +import org.springframework.context.ApplicationEvent; + +/** + * Event launched when a metadata sharing/privileges is modified + * + * @author delawen + */ +public class MetadataShare extends ApplicationEvent { + + private static final long serialVersionUID = -748471747316454884L; + + public enum Type { + ADD, UPDATE, REMOVE + } + + private OperationAllowed op; + private Type type; + + + public MetadataShare(OperationAllowed op, Type type) { + super(op); + this.setOp(op); + this.setType(type); + } + + public OperationAllowed getOp() { + return op; + } + + public void setOp(OperationAllowed op) { + this.op = op; + } + + public Type getType() { + return type; + } + + public void setType(Type type) { + this.type = type; + } + +} diff --git a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/BaseAligner.java b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/BaseAligner.java index 23085f3f4aa..bd2f18d58c3 100644 --- a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/BaseAligner.java +++ b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/BaseAligner.java @@ -90,7 +90,7 @@ public void addCategories(AbstractMetadata metadata, Iterable categories } final MetadataCategory metadataCategory = nameToCategoryMap.get(catId); if (metadataCategory != null) { - metadata.getMetadataCategories().add(metadataCategory); + metadata.getCategories().add(metadataCategory); } else { log.warning("Unable to map category: " + catId + " (" + name + ") to a category in Geonetwork"); } @@ -105,7 +105,7 @@ public void addCategories(AbstractMetadata metadata, Iterable categories } else { final MetadataCategory metadataCategory = nameToCategoryMap.get(catId); if (metadataCategory != null) { - metadata.getMetadataCategories().add(metadataCategory); + metadata.getCategories().add(metadataCategory); } else { log.warning("Unable to map category: " + catId + " to a category in Geonetwork"); } diff --git a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/arcsde/ArcSDEHarvester.java b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/arcsde/ArcSDEHarvester.java index d70b88ca090..ad2e9e09a79 100644 --- a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/arcsde/ArcSDEHarvester.java +++ b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/arcsde/ArcSDEHarvester.java @@ -390,7 +390,7 @@ private void updateMetadata(Element xml, String id, GroupMapper localGroups, fin operationAllowedRepository.deleteAllByIdAttribute(OperationAllowedId_.metadataId, Integer.parseInt(id)); aligner.addPrivileges(id, params.getPrivileges(), localGroups, dataMan, context, log); - metadata.getMetadataCategories().clear(); + metadata.getCategories().clear(); aligner.addCategories(metadata, params.getCategories(), localCateg, context, log, null, true); dataMan.flush(); diff --git a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/csw/Aligner.java b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/csw/Aligner.java index 3b7565ea799..c791566b2f6 100644 --- a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/csw/Aligner.java +++ b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/csw/Aligner.java @@ -389,7 +389,7 @@ private boolean updatingLocalMetadata(RecordInfo ri, String id, Boolean force) t addPrivileges(id, params.getPrivileges(), localGroups, dataMan, context, log); - metadata.getMetadataCategories().clear(); + metadata.getCategories().clear(); addCategories(metadata, params.getCategories(), localCateg, context, log, null, true); return true; diff --git a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/fragment/FragmentHarvester.java b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/fragment/FragmentHarvester.java index 26c6aa88a69..c76585edc9a 100644 --- a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/fragment/FragmentHarvester.java +++ b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/fragment/FragmentHarvester.java @@ -586,7 +586,7 @@ private void update(String id, Element template, String title, boolean isSubtemp addPrivileges(id, params.privileges, localGroups, dataMan, context, log); } - metadata.getMetadataCategories().clear(); + metadata.getCategories().clear(); addCategories(metadata, params.categories, localCateg, context, log, null, true); if (isSubtemplate) { @@ -632,7 +632,7 @@ private void createMetadata(String recUuid, Element template) throws Exception, if (metadataCategory == null) { throw new IllegalArgumentException("No category found with name: " + params.isoCategory); } - metadata.getMetadataCategories().add(metadataCategory); + metadata.getCategories().add(metadataCategory); } metadata = dataMan.insertMetadata(context, metadata, template, true, false, false, UpdateDatestamp.NO, false, false); diff --git a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/geoPREST/Aligner.java b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/geoPREST/Aligner.java index 11839030348..832cde972e9 100644 --- a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/geoPREST/Aligner.java +++ b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/geoPREST/Aligner.java @@ -233,7 +233,7 @@ private void updateMetadata(RecordInfo ri, String id) throws Exception { repository.deleteAllByIdAttribute(OperationAllowedId_.metadataId, Integer.parseInt(id)); addPrivileges(id, params.getPrivileges(), localGroups, dataMan, context, log); - metadata.getMetadataCategories().clear(); + metadata.getCategories().clear(); addCategories(metadata, params.getCategories(), localCateg, context, log, null, true); dataMan.flush(); diff --git a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/geonet/Aligner.java b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/geonet/Aligner.java index 3b960c6e66b..637d6ae001f 100644 --- a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/geonet/Aligner.java +++ b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/geonet/Aligner.java @@ -840,7 +840,8 @@ private void updateMetadata(RecordInfo ri, String id, Element md, metadataManager.save(metadata); } } - metadata.getMetadataCategories().clear(); + + metadata.getCategories().clear(); addCategories(metadata, params.getCategories(), localCateg, context, log, null, true); metadata = metadataRepository.findOne(id); diff --git a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/geonet20/Aligner.java b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/geonet20/Aligner.java index 52fe6329c57..504b63b94b0 100644 --- a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/geonet20/Aligner.java +++ b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/geonet20/Aligner.java @@ -264,7 +264,7 @@ public boolean apply(@Nullable String input) { log.debug(" - Setting categories : " + categories); } - metadata.getMetadataCategories().addAll(categories); + metadata.getCategories().addAll(categories); } private void addPrivileges(String id) throws Exception { @@ -325,7 +325,6 @@ private void updateCategories(String id, Element info) throws Exception { //--- remove old categories - @SuppressWarnings("unchecked") Collection locCateg = dataMan.getCategories(id); for (MetadataCategory el : locCateg) { diff --git a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/localfilesystem/LocalFilesystemHarvester.java b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/localfilesystem/LocalFilesystemHarvester.java index fb7d1688890..c448ccab6ee 100644 --- a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/localfilesystem/LocalFilesystemHarvester.java +++ b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/localfilesystem/LocalFilesystemHarvester.java @@ -189,7 +189,7 @@ void updateMetadata(Element xml, final String id, GroupMapper localGroups, repository.deleteAllByIdAttribute(OperationAllowedId_.metadataId, Integer.parseInt(id)); aligner.addPrivileges(id, params.getPrivileges(), localGroups, dataMan, context, log); - metadata.getMetadataCategories().clear(); + metadata.getCategories().clear(); aligner.addCategories(metadata, params.getCategories(), localCateg, context, log, null, true); dataMan.flush(); diff --git a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/oaipmh/Harvester.java b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/oaipmh/Harvester.java index 6cd1fa25308..8c66df151b3 100644 --- a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/oaipmh/Harvester.java +++ b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/oaipmh/Harvester.java @@ -497,7 +497,7 @@ private void updateMetadata(XmlRequest t, RecordInfo ri, String id, String proce repository.deleteAllByIdAttribute(OperationAllowedId_.metadataId, Integer.parseInt(id)); addPrivileges(id, params.getPrivileges(), localGroups, dataMan, context, log); - metadata.getMetadataCategories().clear(); + metadata.getCategories().clear(); addCategories(metadata, params.getCategories(), localCateg, context,log, null, true); dataMan.flush(); diff --git a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/ogcwxs/Harvester.java b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/ogcwxs/Harvester.java index cdee8ee7785..0a15b7c4802 100644 --- a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/ogcwxs/Harvester.java +++ b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/ogcwxs/Harvester.java @@ -845,7 +845,7 @@ private WxSLayerRegistry addLayerMetadata(Element layer, Element capa) throws JD if (metadataCategory == null) { throw new IllegalArgumentException("No category found with name: " + params.datasetCategory); } - metadata.getMetadataCategories().add(metadataCategory); + metadata.getCategories().add(metadataCategory); } if (!dataMan.existsMetadataUuid(reg.uuid)) { result.addedMetadata++; diff --git a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/webdav/Harvester.java b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/webdav/Harvester.java index 9b3ae6602e2..87211bd2780 100644 --- a/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/webdav/Harvester.java +++ b/harvesters/src/main/java/org/fao/geonet/kernel/harvest/harvester/webdav/Harvester.java @@ -487,7 +487,7 @@ private void updateMetadata(RemoteFile rf, RecordInfo record, Boolean force) thr repository.deleteAllByIdAttribute(OperationAllowedId_.metadataId, Integer.parseInt(record.id)); addPrivileges(record.id, params.getPrivileges(), localGroups, dataMan, context, log); - metadata.getMetadataCategories().clear(); + metadata.getCategories().clear(); addCategories(metadata, params.getCategories(), localCateg, context, log, null, true); dataMan.flush(); diff --git a/services/src/main/java/org/fao/geonet/api/records/MetadataTagApi.java b/services/src/main/java/org/fao/geonet/api/records/MetadataTagApi.java index 85a5cc9f858..983d80bc3b6 100644 --- a/services/src/main/java/org/fao/geonet/api/records/MetadataTagApi.java +++ b/services/src/main/java/org/fao/geonet/api/records/MetadataTagApi.java @@ -113,7 +113,7 @@ public Set getTags( ) throws Exception { AbstractMetadata metadata = ApiUtils.canViewRecord(metadataUuid, request); ApplicationContext appContext = ApplicationContextHolder.get(); - return metadata.getMetadataCategories(); + return metadata.getCategories(); } @@ -160,7 +160,7 @@ public void updateTags( if (clear) { appContext.getBean(IMetadataManager.class).update( - metadata.getId(), entity -> entity.getMetadataCategories().clear()); + metadata.getId(), entity -> entity.getCategories().clear()); } DataManager dataManager = appContext.getBean(DataManager.class); @@ -221,7 +221,7 @@ public void deleteTags( if (id == null || id.length == 0) { appContext.getBean(IMetadataManager.class).update( - metadata.getId(), entity -> entity.getMetadataCategories().clear()); + metadata.getId(), entity -> entity.getCategories().clear()); } DataManager dataManager = appContext.getBean(DataManager.class); @@ -315,14 +315,14 @@ public MetadataProcessingReport updateTags( report.addNotEditableMetadataId(info.getId()); } else { if (clear) { - info.getMetadataCategories().clear(); + info.getCategories().clear(); } if (id != null) { for (int c : id) { final MetadataCategory category = categoryRepository.findOne(c); if (category != null) { - info.getMetadataCategories().add(category); + info.getCategories().add(category); listOfUpdatedRecords.add(String.valueOf(info.getId())); } else { report.addMetadataInfos(info.getId(), String.format( @@ -414,7 +414,7 @@ public MetadataProcessingReport updateTags( ApiUtils.createServiceContext(request), String.valueOf(info.getId()))) { report.addNotEditableMetadataId(info.getId()); } else { - info.getMetadataCategories().clear(); + info.getCategories().clear(); metadataManager.save(info); report.incrementProcessedRecords(); } diff --git a/services/src/main/java/org/fao/geonet/services/metadata/BatchUpdateCategories.java b/services/src/main/java/org/fao/geonet/services/metadata/BatchUpdateCategories.java index 7068f0f7a73..5630717bdde 100644 --- a/services/src/main/java/org/fao/geonet/services/metadata/BatchUpdateCategories.java +++ b/services/src/main/java/org/fao/geonet/services/metadata/BatchUpdateCategories.java @@ -112,7 +112,7 @@ public Element serviceSpecificExec(Element params, ServiceContext context) throw // --- remove old operations if (!"replace".equals(mode)) { - info.getMetadataCategories().clear(); + info.getCategories().clear(); } // --- set new ones @@ -126,7 +126,7 @@ public Element serviceSpecificExec(Element params, ServiceContext context) throw if (name.startsWith("_") && !name.equals(Params.CONTENT_TYPE)) { final MetadataCategory category = categoryRepository.findOne(Integer.valueOf(name.substring(1))); if (category != null) { - info.getMetadataCategories().add(category); + info.getCategories().add(category); } else { context.warning("Unable to find category with name: " + name.substring(1)); } diff --git a/services/src/main/java/org/fao/geonet/services/metadata/GetCategories.java b/services/src/main/java/org/fao/geonet/services/metadata/GetCategories.java index 31dd54c7bb7..eaccf1b0149 100644 --- a/services/src/main/java/org/fao/geonet/services/metadata/GetCategories.java +++ b/services/src/main/java/org/fao/geonet/services/metadata/GetCategories.java @@ -89,7 +89,7 @@ public Element exec(Element params, ServiceContext context) throws Exception { HashSet hsMetadataCat = new HashSet(); - for (MetadataCategory cat : metadata.getMetadataCategories()) { + for (MetadataCategory cat : metadata.getCategories()) { hsMetadataCat.add(cat.getId() + ""); } diff --git a/services/src/main/java/org/fao/geonet/services/reports/ReportInternalMetadata.java b/services/src/main/java/org/fao/geonet/services/reports/ReportInternalMetadata.java index 6fd20f1867f..72e59cdf7a7 100644 --- a/services/src/main/java/org/fao/geonet/services/reports/ReportInternalMetadata.java +++ b/services/src/main/java/org/fao/geonet/services/reports/ReportInternalMetadata.java @@ -84,14 +84,14 @@ public Element exec(Element params, ServiceContext context) // Retrieve metadata //final Sort sort = new Sort(Sort.Direction.DESC, SortUtils.createPath(Metadata_.dataInfo, MetadataDataInfo_.changeDate)); - final List records = context.getBean(MetadataRepository.class).getMetadataReports(). + final List records = context.getBean(MetadataRepository.class).getMetadataReports(). getInternalMetadata(beginDateIso, endDateIso, groupList, OperationAllowedSpecs.isPublic(ReservedOperation.view)); // Process metadata results for the report Element response = new Element(Jeeves.Elem.RESPONSE); // Process the records - for (Metadata metadata : records) { + for (AbstractMetadata metadata : records) { User userOwner = context.getBean(UserRepository.class).findOne(metadata.getSourceInfo().getOwner()); Group groupOwner = context.getBean(GroupRepository.class).findOne(metadata.getSourceInfo().getGroupOwner()); diff --git a/services/src/test/java/org/fao/geonet/services/category/RemoveTest.java b/services/src/test/java/org/fao/geonet/services/category/RemoveTest.java index 280340c41ac..dcf093d3490 100644 --- a/services/src/test/java/org/fao/geonet/services/category/RemoveTest.java +++ b/services/src/test/java/org/fao/geonet/services/category/RemoveTest.java @@ -62,7 +62,7 @@ public void testExec() throws Exception { assertEquals(beforeCount, _categoryRepository.count()); AbstractMetadata entity = MetadataRepositoryTest.newMetadata(inc); - entity.getMetadataCategories().add(category); + entity.getCategories().add(category); entity = metadataManager.save(entity); ServiceContext context = createServiceContext(); @@ -72,6 +72,6 @@ public void testExec() throws Exception { assertEquals(beforeCount - 1, _categoryRepository.count()); assertEquals(1, metadataUtils.count()); entity = metadataUtils.findOne(entity.getId()); - assertTrue(entity.getMetadataCategories().isEmpty()); + assertTrue(entity.getCategories().isEmpty()); } } From 56ae2f534a02179429c0360f2b5d74a002cae095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mar=C3=ADa=20Arias=20de=20Reyna?= Date: Thu, 8 Nov 2018 08:49:17 +0100 Subject: [PATCH 02/61] Adding the DataManager utilities for draft. Draft is not added yet when editing a metadata, but the app knows how to deal with it --- ...MergeUsersByUsernameDatabaseMigration.java | 3 +- .../java/org/fao/geonet/constants/Geonet.java | 1 + .../org/fao/geonet/kernel/AccessManager.java | 3 +- .../org/fao/geonet/kernel/XmlSerializer.java | 13 +- .../kernel/backup/ArchiveAllMetadataJob.java | 38 +- .../kernel/datamanager/IMetadataCategory.java | 6 +- .../kernel/datamanager/IMetadataManager.java | 8 +- .../datamanager/IMetadataOperations.java | 20 + .../kernel/datamanager/IMetadataUtils.java | 35 +- .../base/BaseMetadataCategory.java | 18 +- .../datamanager/base/BaseMetadataIndexer.java | 14 + .../datamanager/base/BaseMetadataManager.java | 147 +++---- .../base/BaseMetadataOperations.java | 80 +++- .../datamanager/base/BaseMetadataUtils.java | 66 +-- .../draft/DraftMetadataIndexer.java | 47 +++ .../draft/DraftMetadataManager.java | 125 ++++++ .../datamanager/draft/DraftMetadataUtils.java | 391 ++++++++++++++++++ .../kernel/oaipmh/services/GetRecord.java | 2 +- .../kernel/oaipmh/services/ListRecords.java | 12 +- .../geonet/kernel/search/EsSearchManager.java | 5 +- .../geonet/kernel/search/UnusedSearcher.java | 6 +- ...eUsersByUsernameDatabaseMigrationTest.java | 9 +- .../kernel/DataManagerIntegrationTest.java | 2 +- .../datamanager/BaseMetadataCategoryTest.java | 120 ++++++ .../datamanager/BaseMetadataManagerTest.java | 181 ++++++++ .../BaseMetadataOperationTest.java | 157 +++++++ .../BaseMetadataValidatorTest.java | 119 ++++++ .../DraftMetadataCategoryTest.java | 110 +++++ .../datamanager/DraftMetadataManagerTest.java | 205 +++++++++ .../src/test/resources/draft-test-context.xml | 27 ++ .../geonet/domain/SchematronCriteriaType.java | 4 +- .../specification/MetadataSpecs.java | 122 +++--- .../repository/GeonetRepositoryTest.java | 29 +- .../repository/MetadataRepositoryTest.java | 4 +- .../specification/MetadataSpecsTest.java | 60 +-- .../geonet/events/md/MetadataPublished.java | 41 ++ .../geonet/events/md/MetadataUnpublished.java | 41 ++ .../kernel/harvest/HarvestManagerImpl.java | 2 +- .../harvester/arcsde/ArcSDEHarvester.java | 3 +- .../LocalFilesystemHarvester.java | 3 +- .../harvester/InspireAtomHarvester.java | 6 +- .../fao/geonet/api/categories/TagsApi.java | 19 +- .../guiservices/metadata/GetByOwner.java | 7 +- .../geonet/guiservices/metadata/Sitemap.java | 4 +- .../geonet/services/subtemplate/GetTypes.java | 3 +- .../main/SearchSuggestionIntegrationTest.java | 51 ++- 46 files changed, 2064 insertions(+), 305 deletions(-) create mode 100644 core/src/main/java/org/fao/geonet/kernel/datamanager/draft/DraftMetadataIndexer.java create mode 100644 core/src/main/java/org/fao/geonet/kernel/datamanager/draft/DraftMetadataManager.java create mode 100644 core/src/main/java/org/fao/geonet/kernel/datamanager/draft/DraftMetadataUtils.java create mode 100644 core/src/test/java/org/fao/geonet/kernel/datamanager/BaseMetadataCategoryTest.java create mode 100644 core/src/test/java/org/fao/geonet/kernel/datamanager/BaseMetadataManagerTest.java create mode 100644 core/src/test/java/org/fao/geonet/kernel/datamanager/BaseMetadataOperationTest.java create mode 100644 core/src/test/java/org/fao/geonet/kernel/datamanager/BaseMetadataValidatorTest.java create mode 100644 core/src/test/java/org/fao/geonet/kernel/datamanager/DraftMetadataCategoryTest.java create mode 100644 core/src/test/java/org/fao/geonet/kernel/datamanager/DraftMetadataManagerTest.java create mode 100644 core/src/test/resources/draft-test-context.xml create mode 100644 events/src/main/java/org/fao/geonet/events/md/MetadataPublished.java create mode 100644 events/src/main/java/org/fao/geonet/events/md/MetadataUnpublished.java diff --git a/core/src/main/java/org/fao/geonet/MergeUsersByUsernameDatabaseMigration.java b/core/src/main/java/org/fao/geonet/MergeUsersByUsernameDatabaseMigration.java index ce12c6b8e65..67991017c6c 100644 --- a/core/src/main/java/org/fao/geonet/MergeUsersByUsernameDatabaseMigration.java +++ b/core/src/main/java/org/fao/geonet/MergeUsersByUsernameDatabaseMigration.java @@ -34,6 +34,7 @@ import org.fao.geonet.repository.specification.UserGroupSpecs; import org.fao.geonet.utils.Log; import org.springframework.context.ApplicationContext; +import org.springframework.data.jpa.domain.Specification; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -119,7 +120,7 @@ void transferMetadata(ApplicationContext applicationContext, List oldMetad User oldOwner = oldMetadataOwnerList.get(i); // Transfer metadata to user but keep old group - List metadataList = metadataRepository.findAll(MetadataSpecs.isOwnedByUser(oldOwner.getId())); + List metadataList = metadataRepository.findAll((Specification)MetadataSpecs.isOwnedByUser(oldOwner.getId())); for (Metadata metadata : metadataList) { dataManager.updateMetadataOwner(metadata.getId(), Integer.toString(newMetadataOwner.getId()), Integer.toString(metadata.getSourceInfo().getGroupOwner())); diff --git a/core/src/main/java/org/fao/geonet/constants/Geonet.java b/core/src/main/java/org/fao/geonet/constants/Geonet.java index 9621ced1906..0ac6f140a97 100644 --- a/core/src/main/java/org/fao/geonet/constants/Geonet.java +++ b/core/src/main/java/org/fao/geonet/constants/Geonet.java @@ -672,5 +672,6 @@ public static class IndexFieldNames { public static final String LOCALE = "locale"; public static final String IS_PUBLISHED_TO_ALL = "_isPublishedToAll"; public static final String FEEDBACKCOUNT = "feedbackCount"; + public static final String DRAFT = "_draft"; } } diff --git a/core/src/main/java/org/fao/geonet/kernel/AccessManager.java b/core/src/main/java/org/fao/geonet/kernel/AccessManager.java index af6e9bd67f5..f8fa84e0e5c 100644 --- a/core/src/main/java/org/fao/geonet/kernel/AccessManager.java +++ b/core/src/main/java/org/fao/geonet/kernel/AccessManager.java @@ -49,6 +49,7 @@ import org.fao.geonet.domain.User; import org.fao.geonet.domain.UserGroup; import org.fao.geonet.domain.User_; +import org.fao.geonet.kernel.datamanager.IMetadataUtils; import org.fao.geonet.kernel.setting.Settings; import org.fao.geonet.repository.GroupRepository; import org.fao.geonet.repository.GroupRepositoryCustom; @@ -255,7 +256,7 @@ public boolean canEdit(final ServiceContext context, final String id) throws Exc public boolean isOwner(final ServiceContext context, final String id) throws Exception { //--- retrieve metadata info - AbstractMetadata info = context.getBean(MetadataRepository.class).findOne(id); + AbstractMetadata info = context.getBean(IMetadataUtils.class).findOne(id); if (info == null) return false; diff --git a/core/src/main/java/org/fao/geonet/kernel/XmlSerializer.java b/core/src/main/java/org/fao/geonet/kernel/XmlSerializer.java index 27c1754a74a..3b2b119e0ea 100644 --- a/core/src/main/java/org/fao/geonet/kernel/XmlSerializer.java +++ b/core/src/main/java/org/fao/geonet/kernel/XmlSerializer.java @@ -159,9 +159,9 @@ public boolean isLoggingEmptyWithHeld() { * @param forEditing If true, then withheld elements are not removed. */ protected Element internalSelect(String id, boolean isIndexingTask, boolean forEditing) throws Exception { - IMetadataUtils _metadataRepository = ApplicationContextHolder.get().getBean(IMetadataUtils.class); + IMetadataUtils _metadataUtils = ApplicationContextHolder.get().getBean(IMetadataUtils.class); - AbstractMetadata metadata = _metadataRepository.findOne(Integer.parseInt(id)); + AbstractMetadata metadata = _metadataUtils.findOne(Integer.parseInt(id)); if (metadata == null) return null; @@ -241,7 +241,7 @@ protected void updateDb(final String id, final Element xml, final String changeD final String uuid) throws SQLException { if (resolveXLinks()) Processor.removeXLink(xml); - IMetadataManager _metadataRepository = ApplicationContextHolder.get().getBean(IMetadataManager.class); + IMetadataManager _metadataManager = ApplicationContextHolder.get().getBean(IMetadataManager.class); IMetadataUtils metadataUtils = ApplicationContextHolder.get().getBean(IMetadataUtils.class); int metadataId = Integer.valueOf(id); @@ -261,19 +261,20 @@ protected void updateDb(final String id, final Element xml, final String changeD md.setUuid(uuid); } - _metadataRepository.save(md); + _metadataManager.save(md); } /** * Deletes an xml element given its id. */ + protected void deleteDb(String id) throws Exception { - IMetadataManager _metadataRepository = ApplicationContextHolder.get().getBean(IMetadataManager.class); + IMetadataManager _metadataManager = ApplicationContextHolder.get().getBean(IMetadataManager.class); // TODO: Ultimately we want to remove any xlinks in this document // that aren't already in use from the xlink cache. For now we // rely on the admin clearing cache and reindexing regularly - _metadataRepository.delete(Integer.valueOf(id)); + _metadataManager.delete(Integer.valueOf(id)); // Assert.isTrue(!_metadataRepository.exists(Integer.valueOf(id)), "Metadata should have been deleted"); diff --git a/core/src/main/java/org/fao/geonet/kernel/backup/ArchiveAllMetadataJob.java b/core/src/main/java/org/fao/geonet/kernel/backup/ArchiveAllMetadataJob.java index 245a95b7a20..daa35c251d3 100644 --- a/core/src/main/java/org/fao/geonet/kernel/backup/ArchiveAllMetadataJob.java +++ b/core/src/main/java/org/fao/geonet/kernel/backup/ArchiveAllMetadataJob.java @@ -23,14 +23,20 @@ package org.fao.geonet.kernel.backup; -import com.google.common.base.Function; -import com.google.common.collect.Lists; -import com.vividsolutions.jts.util.Assert; -import jeeves.server.UserSession; -import jeeves.server.context.ServiceContext; -import jeeves.server.dispatchers.ServiceManager; +import java.nio.file.Files; +import java.nio.file.Path; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; + +import javax.annotation.Nullable; + import org.fao.geonet.ApplicationContextHolder; import org.fao.geonet.constants.Geonet; +import org.fao.geonet.domain.AbstractMetadata; import org.fao.geonet.domain.Metadata; import org.fao.geonet.domain.MetadataType; import org.fao.geonet.domain.Profile; @@ -56,15 +62,13 @@ import org.springframework.scheduling.quartz.QuartzJobBean; import org.springframework.stereotype.Service; -import javax.annotation.Nullable; -import java.nio.file.Files; -import java.nio.file.Path; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.HashSet; -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; +import com.google.common.base.Function; +import com.google.common.collect.Lists; +import com.vividsolutions.jts.util.Assert; + +import jeeves.server.UserSession; +import jeeves.server.context.ServiceContext; +import jeeves.server.dispatchers.ServiceManager; @Service public class ArchiveAllMetadataJob extends QuartzJobBean { @@ -120,8 +124,8 @@ public void createBackup(ServiceContext serviceContext) throws Exception { final MetadataRepository metadataRepository = serviceContext.getBean(MetadataRepository.class); loginAsAdmin(serviceContext); - final Specification harvested = Specifications.where(MetadataSpecs.isHarvested(false)). - and(Specifications.not(MetadataSpecs.hasType(MetadataType.SUB_TEMPLATE))); + final Specification harvested = Specifications.where((Specification)MetadataSpecs.isHarvested(false)). + and((Specification)Specifications.not(MetadataSpecs.hasType(MetadataType.SUB_TEMPLATE))); List uuids = Lists.transform(metadataRepository.findAll(harvested), new Function() { @Nullable diff --git a/core/src/main/java/org/fao/geonet/kernel/datamanager/IMetadataCategory.java b/core/src/main/java/org/fao/geonet/kernel/datamanager/IMetadataCategory.java index 3668d59abdc..6e1a60297c2 100644 --- a/core/src/main/java/org/fao/geonet/kernel/datamanager/IMetadataCategory.java +++ b/core/src/main/java/org/fao/geonet/kernel/datamanager/IMetadataCategory.java @@ -39,9 +39,10 @@ public interface IMetadataCategory { * @param context * @param mdId * @param categId + * @return if the category was assigned * @throws Exception */ - void setCategory(ServiceContext context, String mdId, String categId) throws Exception; + boolean setCategory(ServiceContext context, String mdId, String categId) throws Exception; /** * Given a record id and a category id, unassign that category from the previous record @@ -49,9 +50,10 @@ public interface IMetadataCategory { * @param context * @param mdId * @param categId + * @return if the category was deassigned * @throws Exception */ - void unsetCategory(ServiceContext context, String mdId, int categId) throws Exception; + boolean unsetCategory(ServiceContext context, String mdId, int categId) throws Exception; /** * Given a record id, return the list of categories associated to that record diff --git a/core/src/main/java/org/fao/geonet/kernel/datamanager/IMetadataManager.java b/core/src/main/java/org/fao/geonet/kernel/datamanager/IMetadataManager.java index 126af79131d..543dbb6bad2 100644 --- a/core/src/main/java/org/fao/geonet/kernel/datamanager/IMetadataManager.java +++ b/core/src/main/java/org/fao/geonet/kernel/datamanager/IMetadataManager.java @@ -6,7 +6,6 @@ import javax.annotation.Nonnull; import org.fao.geonet.domain.AbstractMetadata; -import org.fao.geonet.domain.Metadata; import org.fao.geonet.kernel.EditLib; import org.fao.geonet.kernel.UpdateDatestamp; import org.fao.geonet.repository.BatchUpdateQuery; @@ -192,8 +191,8 @@ Element updateFixedInfo(String schema, Optional metadataId, String uuid EditLib getEditLib(); /** - * Saves an IMetadata into the database. Useful to avoid using the MetadataRepository classes directly, who may not know how to handle - * IMetadata types + * Saves an AbstractMetadata into the database. Useful to avoid using the MetadataRepository classes directly, who may not know how to handle + * AbstractMetadata types * * @param info */ @@ -236,5 +235,6 @@ Element updateFixedInfo(String schema, Optional metadataId, String uuid * @param The type of the attribute * @return a {@link BatchUpdateQuery} object to allow for updating multiple objects in a single query. */ - public void createBatchUpdateQuery(PathSpec servicesPath, String newUuid, Specification harvested); + public void createBatchUpdateQuery(PathSpec servicesPath, String newUuid, + Specification harvested); } diff --git a/core/src/main/java/org/fao/geonet/kernel/datamanager/IMetadataOperations.java b/core/src/main/java/org/fao/geonet/kernel/datamanager/IMetadataOperations.java index 7985738da75..3b6be34c107 100644 --- a/core/src/main/java/org/fao/geonet/kernel/datamanager/IMetadataOperations.java +++ b/core/src/main/java/org/fao/geonet/kernel/datamanager/IMetadataOperations.java @@ -1,5 +1,7 @@ package org.fao.geonet.kernel.datamanager; +import java.util.Collection; + import org.fao.geonet.domain.OperationAllowed; import org.fao.geonet.domain.ReservedOperation; import org.fao.geonet.repository.UserGroupRepository; @@ -85,6 +87,16 @@ public interface IMetadataOperations { */ boolean setOperation(ServiceContext context, int mdId, int grpId, int opId) throws Exception; + /** + * Set metadata privileges even if the user logged in does not have privileges + * + * @param mdId The metadata identifier + * @param grpId The group identifier + * @param opId The operation identifier + * @return true if the operation was set. + */ + boolean forceSetOperation(ServiceContext context, int mdId, int grpId, int opId) throws Exception; + /** * Check that the operation has not been added and if not that it can be added. *