Skip to content

Commit 79c4b57

Browse files
authored
Merge pull request DSpace#11718 from 4Science/task/main/DURACOM-427
[DSpace-CRIS] Porting of authority framework functionalities (Backend)
2 parents 5899572 + a6d67af commit 79c4b57

218 files changed

Lines changed: 23908 additions & 1274 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ jobs:
2525
# - surefire.rerunFailingTestsCount => try again for flakey tests, and keep track of/report on number of retries
2626
- type: "Unit Tests"
2727
java: 21
28-
mvnflags: "-DskipUnitTests=false -Dsurefire.rerunFailingTestsCount=2"
28+
mvnflags: "-Dtest.argLine=-Xmx2048m -DskipUnitTests=false -Dsurefire.rerunFailingTestsCount=2"
2929
resultsdir: "**/target/surefire-reports/**"
3030
# NOTE: ITs skip all code validation checks, as they are already done by Unit Test job.
3131
# - enforcer.skip => Skip maven-enforcer-plugin rules

dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataImport.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
import org.dspace.content.RelationshipType;
4444
import org.dspace.content.WorkspaceItem;
4545
import org.dspace.content.authority.Choices;
46+
import org.dspace.content.authority.factory.ContentAuthorityServiceFactory;
47+
import org.dspace.content.authority.service.MetadataAuthorityService;
4648
import org.dspace.content.factory.ContentServiceFactory;
4749
import org.dspace.content.service.CollectionService;
4850
import org.dspace.content.service.EntityService;
@@ -164,6 +166,9 @@ public class MetadataImport extends DSpaceRunnable<MetadataImportScriptConfigura
164166
.getAuthorityValueService();
165167
protected ConfigurationService configurationService
166168
= DSpaceServicesFactory.getInstance().getConfigurationService();
169+
protected MetadataAuthorityService metadataAuthorityService = ContentAuthorityServiceFactory
170+
.getInstance()
171+
.getMetadataAuthorityService();
167172

168173
/**
169174
* Create an instance of the metadata importer. Requires a context and an array of CSV lines
@@ -1138,7 +1143,18 @@ protected BulkEditMetadataValue getBulkEditValueFromCSV(Context c, String langua
11381143
dcv.setElement(element);
11391144
dcv.setQualifier(qualifier);
11401145
dcv.setLanguage(language);
1141-
if (fromAuthority != null) {
1146+
1147+
final StringBuilder builder = new StringBuilder();
1148+
builder.append(schema).append("_").append(element);
1149+
1150+
if (StringUtils.isNotEmpty(qualifier)) {
1151+
builder.append("_").append(qualifier);
1152+
}
1153+
1154+
boolean isAuthorityControlled = metadataAuthorityService.isAuthorityAllowed(builder.toString(),
1155+
Constants.ITEM, null);
1156+
1157+
if (fromAuthority != null && isAuthorityControlled) {
11421158
if (value.indexOf(':') > 0) {
11431159
value = value.substring(0, value.indexOf(':'));
11441160
}

dspace-api/src/main/java/org/dspace/app/sitemap/GenerateSitemaps.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
*/
88
package org.dspace.app.sitemap;
99

10+
import static org.dspace.core.Constants.ENTITY_TYPE_NONE;
1011
import static org.dspace.discovery.SearchUtils.RESOURCE_TYPE_FIELD;
1112

1213
import java.io.File;
@@ -266,8 +267,12 @@ public static void generateSitemaps(boolean makeHTMLMap, boolean makeSitemapOrg)
266267
List<String> entityTypeFieldValues = discoverResult.getSearchDocument(doc).get(0)
267268
.getSearchFieldValues("search.entitytype");
268269
if (CollectionUtils.isNotEmpty(entityTypeFieldValues)) {
269-
url = uiURLStem + "entities/" + StringUtils.lowerCase(entityTypeFieldValues.get(0)) + "/"
270-
+ doc.getID();
270+
String entityType = StringUtils.lowerCase(entityTypeFieldValues.get(0));
271+
if (!ENTITY_TYPE_NONE.equalsIgnoreCase(entityType)) {
272+
url = uiURLStem + "entities/" + entityType + "/" + doc.getID();
273+
} else {
274+
url = uiURLStem + "items/" + doc.getID();
275+
}
271276
} else {
272277
url = uiURLStem + "items/" + doc.getID();
273278
}

dspace-api/src/main/java/org/dspace/app/suggestion/SolrSuggestionStorageServiceImpl.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import org.dspace.content.dto.MetadataValueDTO;
4545
import org.dspace.content.service.ItemService;
4646
import org.dspace.core.Context;
47+
import org.dspace.core.exception.SQLRuntimeException;
4748
import org.dspace.services.factory.DSpaceServicesFactory;
4849
import org.dspace.util.UUIDUtils;
4950
import org.springframework.beans.factory.annotation.Autowired;
@@ -70,7 +71,7 @@ public class SolrSuggestionStorageServiceImpl implements SolrSuggestionStorageSe
7071
*
7172
* @return solr client
7273
*/
73-
protected SolrClient getSolr() {
74+
public SolrClient getSolr() {
7475
if (solrSuggestionClient == null) {
7576
String solrService = DSpaceServicesFactory.getInstance().getConfigurationService()
7677
.getProperty("suggestion.solr.server", "http://localhost:8983/solr/suggestion");
@@ -315,12 +316,18 @@ private Suggestion convertSolrDoc(Context context, SolrDocument solrDoc, String
315316

316317
Suggestion suggestion = new Suggestion(sourceName, target, (String) solrDoc.getFieldValue(SUGGESTION_ID));
317318
suggestion.setDisplay((String) solrDoc.getFieldValue(DISPLAY));
318-
suggestion.getMetadata()
319-
.add(new MetadataValueDTO("dc", "title", null, null, (String) solrDoc.getFieldValue(TITLE)));
320-
suggestion.getMetadata()
321-
.add(new MetadataValueDTO("dc", "date", "issued", null, (String) solrDoc.getFieldValue(DATE)));
322-
suggestion.getMetadata().add(
323-
new MetadataValueDTO("dc", "description", "abstract", null, (String) solrDoc.getFieldValue(ABSTRACT)));
319+
if (StringUtils.isNotBlank((String) solrDoc.getFieldValue(TITLE))) {
320+
suggestion.getMetadata()
321+
.add(new MetadataValueDTO("dc", "title", null, null, (String) solrDoc.getFieldValue(TITLE)));
322+
}
323+
if (StringUtils.isNotBlank((String) solrDoc.getFieldValue(DATE))) {
324+
suggestion.getMetadata()
325+
.add(new MetadataValueDTO("dc", "date", "issued", null, (String) solrDoc.getFieldValue(DATE)));
326+
}
327+
if (StringUtils.isNotBlank((String) solrDoc.getFieldValue(ABSTRACT))) {
328+
suggestion.getMetadata().add(
329+
new MetadataValueDTO("dc", "description", "abstract", null, (String) solrDoc.getFieldValue(ABSTRACT)));
330+
}
324331

325332
suggestion.setExternalSourceUri((String) solrDoc.getFieldValue(EXTERNAL_URI));
326333
if (solrDoc.containsKey(CATEGORY)) {
@@ -352,7 +359,7 @@ private Item findItem(Context context, UUID itemId) {
352359
try {
353360
return itemService.find(context, itemId);
354361
} catch (SQLException e) {
355-
throw new RuntimeException(e);
362+
throw new SQLRuntimeException(e);
356363
}
357364
}
358365

dspace-api/src/main/java/org/dspace/app/suggestion/loader/PublicationLoader.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import java.util.List;
1616

1717
import org.apache.commons.lang3.Strings;
18+
import org.apache.logging.log4j.LogManager;
19+
import org.apache.logging.log4j.Logger;
1820
import org.apache.solr.client.solrj.SolrServerException;
1921
import org.dspace.app.suggestion.SolrSuggestionProvider;
2022
import org.dspace.app.suggestion.Suggestion;
@@ -37,6 +39,8 @@
3739
*/
3840
public class PublicationLoader extends SolrSuggestionProvider {
3941

42+
private static final Logger log = LogManager.getLogger(PublicationLoader.class);
43+
4044
protected List<String> names;
4145

4246
protected ExternalDataProvider primaryProvider;
@@ -122,7 +126,11 @@ public void importRecords(Context context, Item researcher)
122126
loaded = metadata.size();
123127
List<Suggestion> records = reduceAndTransform(researcher, metadata);
124128
for (Suggestion record : records) {
125-
solrSuggestionStorageService.addSuggestion(record, false, false);
129+
try {
130+
solrSuggestionStorageService.addSuggestion(record, false, false);
131+
} catch (SolrServerException | IOException e) {
132+
log.error("Failed to add suggestion: {}", record.getID(), e);
133+
}
126134
}
127135
}
128136
solrSuggestionStorageService.commit();

dspace-api/src/main/java/org/dspace/app/util/DCInputsReader.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.LinkedList;
1515
import java.util.List;
1616
import java.util.Map;
17+
import java.util.Set;
1718
import javax.xml.parsers.DocumentBuilder;
1819
import javax.xml.parsers.FactoryConfigurationError;
1920

@@ -708,4 +709,60 @@ public String getInputFormNameByCollectionAndField(Collection collection, String
708709
throw new DCInputsReaderException("No field configuration found!");
709710
}
710711

712+
713+
/**
714+
* Resolves and retrieves {@link DCInputSet} definitions for nested metadata groups.
715+
* <p>
716+
* Scans the parent {@code formName} for fields with {@code input-type} 'group' or 'inline-group'.
717+
* For each match, it resolves a sub-form using the naming convention:
718+
* {@code [parentFormName]-[schema]-[element]-[qualifier]}
719+
* </p>
720+
* <ul>
721+
* <li><b>group:</b> Standard nested container.</li>
722+
* <li><b>inline-group:</b> UI hint for compact/horizontal layout.</li>
723+
* </ul>
724+
* <b>Example:</b> {@code publicationStepGroup} + {@code dc.contributor.author}
725+
* &rarr; {@code publicationStepGroup-dc-contributor-author}
726+
*
727+
* @param formName The parent form identifier.
728+
* @return List of resolved input sets for nested groups.
729+
* @throws DCInputsReaderException if sub-form retrieval fails.
730+
*/
731+
public List<DCInputSet> getInputsByGroup(String formName)
732+
throws DCInputsReaderException {
733+
734+
List<DCInputSet> results = new ArrayList<DCInputSet>();
735+
736+
// cache miss - construct new DCInputSet
737+
List<List<Map<String, String>>> pages = formDefns.get(formName);
738+
if (pages == null) {
739+
return results;
740+
}
741+
742+
Iterator<List<Map<String, String>>> iterator = pages.iterator();
743+
744+
while (iterator.hasNext()) {
745+
List<Map<String, String>> input = iterator.next();
746+
747+
for (Map<String, String> entry : input) {
748+
Set<Map.Entry<String, String>> entrySet =
749+
entry.entrySet();
750+
751+
for (Map.Entry<String, String> attr : entrySet) {
752+
if (attr.getKey().equals("input-type") &&
753+
(attr.getValue().equals("group") || attr.getValue().equals("inline-group"))) {
754+
String schema = entry.get("dc-schema");
755+
String element = entry.get("dc-element");
756+
String qualifier = entry.get("dc-qualifier");
757+
String subFormName = formName + "-" + Utils.standardize(schema, element, qualifier, "-");
758+
results.add(getInputsByFormName(subFormName));
759+
}
760+
}
761+
}
762+
763+
}
764+
765+
return results;
766+
}
767+
711768
}

0 commit comments

Comments
 (0)