mirror of
https://github.com/ilri/cgspace-java-helpers.git
synced 2025-05-11 15:46:09 +02:00
Compare commits
59 Commits
Author | SHA1 | Date | |
---|---|---|---|
13c6612c7f
|
|||
813517c789
|
|||
5f9490e4e5
|
|||
9a46416331
|
|||
2be5c62d92
|
|||
2bd7d5e679
|
|||
70cf68b8bc
|
|||
4f81e1e17e
|
|||
5113a91257
|
|||
3c36452891
|
|||
3a860dabe4
|
|||
5f44c9ea8a
|
|||
32a14c0ea5
|
|||
13d3dfb885
|
|||
1e7df1ce46
|
|||
443e5576ab
|
|||
8531992412
|
|||
27016f5f77
|
|||
3a583c4f86
|
|||
28668f76c9
|
|||
e0153fd38a
|
|||
12a606ac61
|
|||
692a62b454
|
|||
d4ca92066a
|
|||
5ad8c556e9
|
|||
77425c13bf
|
|||
5e0a456fb5
|
|||
9050caf37f
|
|||
639148dc19
|
|||
369f81d181
|
|||
7a91305742
|
|||
b15dd50c16
|
|||
0c35e81362
|
|||
2fb8d274c9
|
|||
169b063e9a
|
|||
0cb533b2c4
|
|||
ee6518035e
|
|||
14051984f3
|
|||
9faf657c59
|
|||
7fb78c2722
|
|||
6ef9f521bf
|
|||
1a345de36a
|
|||
eb66ccbd0d
|
|||
62138540ae
|
|||
c0d0e40321
|
|||
f2a637f0a8
|
|||
6e38a2f7e1
|
|||
f9d7e5f6a2
|
|||
9e965afdb7
|
|||
408a0e1c19
|
|||
ea9f669e9c
|
|||
546101bc92
|
|||
0a7cf7bf59
|
|||
8c0a8fbcd1
|
|||
c05a2e4f96
|
|||
cf2af393c0
|
|||
1f6ba4af67
|
|||
5ceaebaeae
|
|||
f3dcc6e261
|
12
.github/workflows/maven.yml
vendored
12
.github/workflows/maven.yml
vendored
@ -5,9 +5,9 @@ name: Build
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ dspace6 ]
|
branches: [ dspace7 ]
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ dspace6 ]
|
branches: [ dspace7 ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
@ -15,11 +15,11 @@ jobs:
|
|||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v4
|
||||||
- name: Set up JDK 8
|
- name: Set up JDK 17
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v4
|
||||||
with:
|
with:
|
||||||
java-version: 8
|
java-version: 17
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
cache: 'maven'
|
cache: 'maven'
|
||||||
- name: Build with Maven
|
- name: Build with Maven
|
||||||
|
4
.idea/misc.xml
generated
4
.idea/misc.xml
generated
@ -1,11 +1,13 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
|
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||||
<component name="MavenProjectsManager">
|
<component name="MavenProjectsManager">
|
||||||
<option name="originalFiles">
|
<option name="originalFiles">
|
||||||
<list>
|
<list>
|
||||||
<option value="$PROJECT_DIR$/pom.xml" />
|
<option value="$PROJECT_DIR$/pom.xml" />
|
||||||
</list>
|
</list>
|
||||||
</option>
|
</option>
|
||||||
|
<option name="workspaceImportForciblyTurnedOn" value="true" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="11" project-jdk-type="JavaSDK" />
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="17" project-jdk-type="JavaSDK" />
|
||||||
</project>
|
</project>
|
33
CHANGELOG.md
33
CHANGELOG.md
@ -4,6 +4,39 @@ All notable changes to this project will be documented in this file.
|
|||||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## Unreleased
|
||||||
|
### Updated
|
||||||
|
- Update dspace-api dependency to 7.6.3
|
||||||
|
- Update gson dependency to 2.11.0 to match dspace-api
|
||||||
|
|
||||||
|
## [7.6.1.3] - 2024-06-26
|
||||||
|
### Updated
|
||||||
|
- Add more formats to `NormalizeDOIs` curation task
|
||||||
|
|
||||||
|
## [7.6.1.2] - 2024-04-25
|
||||||
|
### Changed
|
||||||
|
- Remove reporting from curation tasks since "results" are enough
|
||||||
|
|
||||||
|
## [7.6.1.1] - 2024-04-23
|
||||||
|
### Added
|
||||||
|
- New `NormalizeDOIs` curation task
|
||||||
|
|
||||||
|
### Updated
|
||||||
|
- Update dependencies in `pom.xml`
|
||||||
|
|
||||||
|
## [7.6.1] - 2024-01-02
|
||||||
|
### Changed
|
||||||
|
- Pin gson dependency to 2.9.0 to avoid dependency convergence issues with DSpace
|
||||||
|
|
||||||
|
## [7.6] - 2024-01-02
|
||||||
|
### Updated
|
||||||
|
- `iso_3166-1.json` from iso-codes 4.13.0-SNAPSHOT, which [adds common names for Iran, Laos, and Syria](https://salsa.debian.org/iso-codes-team/iso-codes/-/merge_requests/32)
|
||||||
|
- DSpace 7.6 compatibility
|
||||||
|
|
||||||
|
## [6.2] - 2023-02-20
|
||||||
|
### Updated
|
||||||
|
- `iso_3166-1.json` from iso-codes 4.12.0, which updates the name for TR to "Türkiye"
|
||||||
|
|
||||||
## [6.1] - 2022-10-31
|
## [6.1] - 2022-10-31
|
||||||
### Updated
|
### Updated
|
||||||
- Update dependencies in `pom.xml`
|
- Update dependencies in `pom.xml`
|
||||||
|
15
README.md
15
README.md
@ -4,8 +4,9 @@ DSpace curation tasks and other Java-based helpers used on the [CGSpace](https:/
|
|||||||
- **CountryCodeTagger**: add ISO 3166-1 Alpha2 country codes to items based on their existing country metadata
|
- **CountryCodeTagger**: add ISO 3166-1 Alpha2 country codes to items based on their existing country metadata
|
||||||
- **FixJpgJpgThumbnails**: fix low-quality ".jpg.jpg" thumbnails by replacing them with their originals
|
- **FixJpgJpgThumbnails**: fix low-quality ".jpg.jpg" thumbnails by replacing them with their originals
|
||||||
- **FixLowQualityThumbnails**: remove low-quality thumbnails when PDF bitstreams are present
|
- **FixLowQualityThumbnails**: remove low-quality thumbnails when PDF bitstreams are present
|
||||||
|
- **NormalizeDOIs**: normalize DOIs by stripping whitespace, lowercasing, and converting to https://doi.org/ format
|
||||||
|
|
||||||
Tested on DSpace 6.3. Read more about the [DSpace curation system](https://wiki.lyrasis.org/display/DSDOC6x/Curation+System).
|
Tested on DSpace 7.6.3. Read more about the [DSpace curation system](https://wiki.lyrasis.org/display/DSDOC7x/Curation+System).
|
||||||
|
|
||||||
## Build and Install
|
## Build and Install
|
||||||
|
|
||||||
@ -16,7 +17,7 @@ To use these curation tasks in a DSpace project add the following dependency to
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.github.ilri.cgspace</groupId>
|
<groupId>io.github.ilri.cgspace</groupId>
|
||||||
<artifactId>cgspace-java-helpers</artifactId>
|
<artifactId>cgspace-java-helpers</artifactId>
|
||||||
<version>6.1-SNAPSHOT</version>
|
<version>7.6.1.4-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -32,18 +33,14 @@ $ mvn package
|
|||||||
Copy the resulting jar to the DSpace `lib` directory:
|
Copy the resulting jar to the DSpace `lib` directory:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
$ cp target/cgspace-java-helpers-6.1-SNAPSHOT.jar ~/dspace/lib/
|
$ cp target/cgspace-java-helpers-7.6.1.4-SNAPSHOT.jar ~/dspace/lib/
|
||||||
```
|
```
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
Please refer to the appropriate README.md file:
|
Please refer to the appropriate README.md file:
|
||||||
|
|
||||||
- Curation Tasks: [src/main/java/io/github/ilri/cgspace/ctasks/README.md](https://github.com/ilri/cgspace-java-helpers/blob/dspace6/src/main/java/io/github/ilri/cgspace/ctasks/README.md)
|
- Curation Tasks: [src/main/java/io/github/ilri/cgspace/ctasks/README.md](https://github.com/ilri/cgspace-java-helpers/blob/dspace7/src/main/java/io/github/ilri/cgspace/ctasks/README.md)
|
||||||
- Scripts: [src/main/java/io/github/ilri/cgspace/scripts/README.md](https://github.com/ilri/cgspace-java-helpers/blob/dspace6/src/main/java/io/github/ilri/cgspace/scripts/README.md)
|
- Scripts: [src/main/java/io/github/ilri/cgspace/scripts/README.md](https://github.com/ilri/cgspace-java-helpers/blob/dspace7/src/main/java/io/github/ilri/cgspace/scripts/README.md)
|
||||||
|
|
||||||
## TODO
|
|
||||||
|
|
||||||
- Add a curation task to normalize DOIs to "https://doi.org" format
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
This project was initially created according to the [Maven Getting Started Guide](https://maven.apache.org/guides/getting-started/):
|
This project was initially created according to the [Maven Getting Started Guide](https://maven.apache.org/guides/getting-started/):
|
||||||
|
81
pom.xml
81
pom.xml
@ -6,50 +6,57 @@
|
|||||||
|
|
||||||
<groupId>io.github.ilri.cgspace</groupId>
|
<groupId>io.github.ilri.cgspace</groupId>
|
||||||
<artifactId>cgspace-java-helpers</artifactId>
|
<artifactId>cgspace-java-helpers</artifactId>
|
||||||
<version>6.1</version>
|
<version>7.6.1.4-SNAPSHOT</version>
|
||||||
|
|
||||||
<name>cgspace-java-helpers</name>
|
<name>cgspace-java-helpers</name>
|
||||||
<url>https://github.com/ilri/cgspace-java-helpers</url>
|
<url>https://github.com/ilri/cgspace-java-helpers</url>
|
||||||
|
<description>Curation tasks and helper scripts for the CGSpace institutional repository</description>
|
||||||
|
|
||||||
|
<developers>
|
||||||
|
<developer>
|
||||||
|
<name>Alan Orth</name>
|
||||||
|
<email>maven@mjanja.mozmail.com</email>
|
||||||
|
<organizationUrl>https://mjanja.ch</organizationUrl>
|
||||||
|
</developer>
|
||||||
|
</developers>
|
||||||
|
|
||||||
<licenses>
|
<licenses>
|
||||||
<license>
|
<license>
|
||||||
<name>GPL-3.0-only</name>
|
<name>GPL-3.0-only</name>
|
||||||
<url>https://spdx.org/licenses/GPL-3.0-or-later.html</url>
|
<url>https://spdx.org/licenses/GPL-3.0-only.html</url>
|
||||||
</license>
|
</license>
|
||||||
</licenses>
|
</licenses>
|
||||||
|
|
||||||
<!-- brings the sonatype snapshot repository and signing requirement on board -->
|
|
||||||
<parent>
|
|
||||||
<groupId>org.sonatype.oss</groupId>
|
|
||||||
<artifactId>oss-parent</artifactId>
|
|
||||||
<version>9</version>
|
|
||||||
<relativePath />
|
|
||||||
</parent>
|
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
<maven.compiler.source>1.8</maven.compiler.source>
|
<maven.compiler.release>11</maven.compiler.release>
|
||||||
<maven.compiler.target>1.8</maven.compiler.target>
|
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.google.code.gson</groupId>
|
<groupId>com.google.code.gson</groupId>
|
||||||
<artifactId>gson</artifactId>
|
<artifactId>gson</artifactId>
|
||||||
<version>2.9.1</version>
|
<version>2.11.0</version>
|
||||||
|
<!-- Ignore gson's dependency on error_prone_annotations because it causes dependency convergence with something pulled in by dspace-api -->
|
||||||
|
<exclusions>
|
||||||
|
<exclusion>
|
||||||
|
<groupId>com.google.errorprone</groupId>
|
||||||
|
<artifactId>error_prone_annotations</artifactId>
|
||||||
|
</exclusion>
|
||||||
|
</exclusions>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.dspace</groupId>
|
<groupId>org.dspace</groupId>
|
||||||
<artifactId>dspace-api</artifactId>
|
<artifactId>dspace-api</artifactId>
|
||||||
<version>6.3</version>
|
<version>7.6.3</version>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<scm>
|
<scm>
|
||||||
<connection>scm:git:git://github.com/ilri/cgspace-java-helpers.git</connection>
|
<connection>scm:git:git://github.com/ilri/cgspace-java-helpers.git</connection>
|
||||||
<developerConnection>scm:git:ssh://github.com:nanosai/cgspace-java-helpers.git</developerConnection>
|
<developerConnection>scm:git:ssh://github.com:ilri/cgspace-java-helpers.git</developerConnection>
|
||||||
<url>http://github.com/ilri/cgspace-java-helpers</url>
|
<url>https://github.com/ilri/cgspace-java-helpers</url>
|
||||||
</scm>
|
</scm>
|
||||||
|
|
||||||
<distributionManagement>
|
<distributionManagement>
|
||||||
@ -69,32 +76,28 @@
|
|||||||
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
|
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-clean-plugin</artifactId>
|
<artifactId>maven-clean-plugin</artifactId>
|
||||||
<version>3.2.0</version>
|
<version>3.3.2</version>
|
||||||
</plugin>
|
</plugin>
|
||||||
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
|
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-resources-plugin</artifactId>
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
<version>3.3.0</version>
|
<version>3.3.1</version>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-compiler-plugin</artifactId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<version>3.10.1</version>
|
<version>3.13.0</version>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-surefire-plugin</artifactId>
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
<version>3.0.0-M7</version>
|
<version>3.2.5</version>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-jar-plugin</artifactId>
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
<version>3.3.0</version>
|
<version>3.4.1</version>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-install-plugin</artifactId>
|
<artifactId>maven-install-plugin</artifactId>
|
||||||
<version>3.0.1</version>
|
<version>3.1.1</version>
|
||||||
</plugin>
|
|
||||||
<plugin>
|
|
||||||
<artifactId>maven-deploy-plugin</artifactId>
|
|
||||||
<version>3.0.0</version>
|
|
||||||
</plugin>
|
</plugin>
|
||||||
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
|
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
|
||||||
<plugin>
|
<plugin>
|
||||||
@ -103,9 +106,33 @@
|
|||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
<artifactId>maven-project-info-reports-plugin</artifactId>
|
<artifactId>maven-project-info-reports-plugin</artifactId>
|
||||||
<version>3.4.1</version>
|
<version>3.5.0</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.sonatype.plugins</groupId>
|
||||||
|
<artifactId>nexus-staging-maven-plugin</artifactId>
|
||||||
|
<version>1.7.0</version>
|
||||||
|
<extensions>true</extensions>
|
||||||
|
<configuration>
|
||||||
|
<serverId>ossrh</serverId>
|
||||||
|
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
|
||||||
|
<autoReleaseAfterClose>true</autoReleaseAfterClose>
|
||||||
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</pluginManagement>
|
</pluginManagement>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
|
<repositories>
|
||||||
|
<!-- Check Maven Central first (before other repos below) -->
|
||||||
|
<repository>
|
||||||
|
<id>maven-central</id>
|
||||||
|
<url>https://repo.maven.apache.org/maven2</url>
|
||||||
|
</repository>
|
||||||
|
<!-- For Handle Server -->
|
||||||
|
<repository>
|
||||||
|
<id>handle.net</id>
|
||||||
|
<url>https://handle.net/maven</url>
|
||||||
|
</repository>
|
||||||
|
</repositories>
|
||||||
</project>
|
</project>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2020 Alan Orth
|
* Copyright (C) 2020 Alan Orth
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package io.github.ilri.cgspace.ctasks;
|
package io.github.ilri.cgspace.ctasks;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2020 Alan Orth
|
* Copyright (C) 2020 Alan Orth
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package io.github.ilri.cgspace.ctasks;
|
package io.github.ilri.cgspace.ctasks;
|
||||||
@ -10,14 +10,14 @@ import javax.annotation.Nullable;
|
|||||||
|
|
||||||
public class CountriesVocabulary {
|
public class CountriesVocabulary {
|
||||||
|
|
||||||
class Country {
|
static class Country {
|
||||||
private String name; // required
|
private final String name; // required
|
||||||
private String common_name; // optional
|
private final String common_name; // optional
|
||||||
private String official_name; // optional
|
private final String official_name; // optional
|
||||||
private String cgspace_name; // optional
|
private final String cgspace_name; // optional
|
||||||
private String numeric; // required Hmmmm need to cast this...
|
private final String numeric; // required Hmmmm need to cast this...
|
||||||
private String alpha_2; // required
|
private final String alpha_2; // required
|
||||||
private String alpha_3; // required
|
private final String alpha_3; // required
|
||||||
|
|
||||||
public Country(
|
public Country(
|
||||||
String name,
|
String name,
|
||||||
|
@ -1,14 +1,15 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2020 Alan Orth
|
* Copyright (C) 2020 Alan Orth
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package io.github.ilri.cgspace.ctasks;
|
package io.github.ilri.cgspace.ctasks;
|
||||||
|
|
||||||
import com.google.gson.Gson;
|
import com.google.gson.Gson;
|
||||||
|
|
||||||
import org.apache.log4j.Logger;
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.dspace.authorize.AuthorizeException;
|
import org.dspace.authorize.AuthorizeException;
|
||||||
import org.dspace.content.DSpaceObject;
|
import org.dspace.content.DSpaceObject;
|
||||||
import org.dspace.content.Item;
|
import org.dspace.content.Item;
|
||||||
@ -23,7 +24,15 @@ import java.io.InputStreamReader;
|
|||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add ISO 3166-1 Alpha2 country codes to items based on their existing country metadata.
|
||||||
|
*
|
||||||
|
* @author Alan Orth for the International Livestock Research Institute
|
||||||
|
* @version 7.6.1.2
|
||||||
|
* @since 5.1
|
||||||
|
*/
|
||||||
public class CountryCodeTagger extends AbstractCurationTask {
|
public class CountryCodeTagger extends AbstractCurationTask {
|
||||||
public class CountryCodeTaggerConfig {
|
public class CountryCodeTaggerConfig {
|
||||||
private final String isocodesJsonPath = "/io/github/ilri/cgspace/ctasks/iso_3166-1.json";
|
private final String isocodesJsonPath = "/io/github/ilri/cgspace/ctasks/iso_3166-1.json";
|
||||||
@ -33,10 +42,10 @@ public class CountryCodeTagger extends AbstractCurationTask {
|
|||||||
private final String iso3166Alpha2Field = taskProperty("iso3166-alpha2.field");
|
private final String iso3166Alpha2Field = taskProperty("iso3166-alpha2.field");
|
||||||
private final boolean forceupdate = taskBooleanProperty("forceupdate", false);
|
private final boolean forceupdate = taskBooleanProperty("forceupdate", false);
|
||||||
|
|
||||||
private Logger log = Logger.getLogger(CountryCodeTagger.class);
|
private final Logger log = LogManager.getLogger();
|
||||||
}
|
}
|
||||||
|
|
||||||
public class CountryCodeTaggerResult {
|
public static class CountryCodeTaggerResult {
|
||||||
private int status = Curator.CURATE_UNSET;
|
private int status = Curator.CURATE_UNSET;
|
||||||
private String result = null;
|
private String result = null;
|
||||||
|
|
||||||
@ -75,7 +84,6 @@ public class CountryCodeTagger extends AbstractCurationTask {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setResult(alpha2Result.getResult());
|
setResult(alpha2Result.getResult());
|
||||||
report(alpha2Result.getResult());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return alpha2Result.getStatus();
|
return alpha2Result.getStatus();
|
||||||
@ -84,14 +92,13 @@ public class CountryCodeTagger extends AbstractCurationTask {
|
|||||||
public CountryCodeTaggerResult performAlpha2(Item item, CountryCodeTaggerConfig config)
|
public CountryCodeTaggerResult performAlpha2(Item item, CountryCodeTaggerConfig config)
|
||||||
throws IOException, SQLException {
|
throws IOException, SQLException {
|
||||||
CountryCodeTaggerResult alpha2Result = new CountryCodeTaggerResult();
|
CountryCodeTaggerResult alpha2Result = new CountryCodeTaggerResult();
|
||||||
String itemHandle = item.getHandle();
|
|
||||||
|
|
||||||
List<MetadataValue> itemCountries =
|
List<MetadataValue> itemCountries =
|
||||||
itemService.getMetadataByMetadataString(item, config.iso3166Field);
|
itemService.getMetadataByMetadataString(item, config.iso3166Field);
|
||||||
|
|
||||||
// skip items that don't have country metadata
|
// skip items that don't have country metadata
|
||||||
if (itemCountries.size() == 0) {
|
if (itemCountries.isEmpty()) {
|
||||||
alpha2Result.setResult(itemHandle + ": no countries, skipping.");
|
alpha2Result.setResult("No countries, skipping.");
|
||||||
alpha2Result.setStatus(Curator.CURATE_SKIP);
|
alpha2Result.setStatus(Curator.CURATE_SKIP);
|
||||||
} else {
|
} else {
|
||||||
Gson gson = new Gson();
|
Gson gson = new Gson();
|
||||||
@ -101,7 +108,7 @@ public class CountryCodeTagger extends AbstractCurationTask {
|
|||||||
BufferedReader reader =
|
BufferedReader reader =
|
||||||
new BufferedReader(
|
new BufferedReader(
|
||||||
new InputStreamReader(
|
new InputStreamReader(
|
||||||
this.getClass().getResourceAsStream(config.isocodesJsonPath)));
|
Objects.requireNonNull(this.getClass().getResourceAsStream(config.isocodesJsonPath))));
|
||||||
ISO3166CountriesVocabulary isocodesCountriesJson =
|
ISO3166CountriesVocabulary isocodesCountriesJson =
|
||||||
gson.fromJson(reader, ISO3166CountriesVocabulary.class);
|
gson.fromJson(reader, ISO3166CountriesVocabulary.class);
|
||||||
reader.close();
|
reader.close();
|
||||||
@ -109,8 +116,8 @@ public class CountryCodeTagger extends AbstractCurationTask {
|
|||||||
reader =
|
reader =
|
||||||
new BufferedReader(
|
new BufferedReader(
|
||||||
new InputStreamReader(
|
new InputStreamReader(
|
||||||
this.getClass()
|
Objects.requireNonNull(this.getClass()
|
||||||
.getResourceAsStream(config.cgspaceCountriesJsonPath)));
|
.getResourceAsStream(config.cgspaceCountriesJsonPath))));
|
||||||
CGSpaceCountriesVocabulary cgspaceCountriesJson =
|
CGSpaceCountriesVocabulary cgspaceCountriesJson =
|
||||||
gson.fromJson(reader, CGSpaceCountriesVocabulary.class);
|
gson.fromJson(reader, CGSpaceCountriesVocabulary.class);
|
||||||
reader.close();
|
reader.close();
|
||||||
@ -133,7 +140,7 @@ public class CountryCodeTagger extends AbstractCurationTask {
|
|||||||
List<MetadataValue> itemAlpha2CountryCodes =
|
List<MetadataValue> itemAlpha2CountryCodes =
|
||||||
itemService.getMetadataByMetadataString(item, config.iso3166Alpha2Field);
|
itemService.getMetadataByMetadataString(item, config.iso3166Alpha2Field);
|
||||||
|
|
||||||
if (itemAlpha2CountryCodes.size() == 0) {
|
if (itemAlpha2CountryCodes.isEmpty()) {
|
||||||
List<String> newAlpha2Codes = new ArrayList<String>();
|
List<String> newAlpha2Codes = new ArrayList<String>();
|
||||||
for (MetadataValue itemCountry : itemCountries) {
|
for (MetadataValue itemCountry : itemCountries) {
|
||||||
// check ISO 3166-1 countries
|
// check ISO 3166-1 countries
|
||||||
@ -157,7 +164,7 @@ public class CountryCodeTagger extends AbstractCurationTask {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newAlpha2Codes.size() > 0) {
|
if (!newAlpha2Codes.isEmpty()) {
|
||||||
try {
|
try {
|
||||||
itemService.addMetadata(
|
itemService.addMetadata(
|
||||||
Curator.curationContext(),
|
Curator.curationContext(),
|
||||||
@ -170,21 +177,20 @@ public class CountryCodeTagger extends AbstractCurationTask {
|
|||||||
itemService.update(Curator.curationContext(), item);
|
itemService.update(Curator.curationContext(), item);
|
||||||
} catch (SQLException | AuthorizeException sqle) {
|
} catch (SQLException | AuthorizeException sqle) {
|
||||||
config.log.debug(sqle.getMessage());
|
config.log.debug(sqle.getMessage());
|
||||||
alpha2Result.setResult(itemHandle + ": error");
|
alpha2Result.setResult("Error");
|
||||||
alpha2Result.setStatus(Curator.CURATE_ERROR);
|
alpha2Result.setStatus(Curator.CURATE_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
alpha2Result.setResult(
|
alpha2Result.setResult(
|
||||||
itemHandle
|
"Added "
|
||||||
+ ": added "
|
|
||||||
+ newAlpha2Codes.size()
|
+ newAlpha2Codes.size()
|
||||||
+ " alpha2 country code(s)");
|
+ " alpha2 country code(s)");
|
||||||
} else {
|
} else {
|
||||||
alpha2Result.setResult(itemHandle + ": no matching countries found");
|
alpha2Result.setResult("No matching countries found");
|
||||||
}
|
}
|
||||||
alpha2Result.setStatus(Curator.CURATE_SUCCESS);
|
alpha2Result.setStatus(Curator.CURATE_SUCCESS);
|
||||||
} else {
|
} else {
|
||||||
alpha2Result.setResult(itemHandle + ": item has country codes, skipping");
|
alpha2Result.setResult("Item already has country codes, skipping unless forced");
|
||||||
alpha2Result.setStatus(Curator.CURATE_SKIP);
|
alpha2Result.setStatus(Curator.CURATE_SKIP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2020 Alan Orth
|
* Copyright (C) 2020 Alan Orth
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package io.github.ilri.cgspace.ctasks;
|
package io.github.ilri.cgspace.ctasks;
|
||||||
|
100
src/main/java/io/github/ilri/cgspace/ctasks/NormalizeDOIs.java
Normal file
100
src/main/java/io/github/ilri/cgspace/ctasks/NormalizeDOIs.java
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2024 Alan Orth
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.github.ilri.cgspace.ctasks;
|
||||||
|
|
||||||
|
import org.dspace.content.DSpaceObject;
|
||||||
|
import org.dspace.content.Item;
|
||||||
|
import org.dspace.content.MetadataValue;
|
||||||
|
import org.dspace.core.Constants;
|
||||||
|
import org.dspace.curate.AbstractCurationTask;
|
||||||
|
import org.dspace.curate.Curator;
|
||||||
|
import org.dspace.curate.Suspendable;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempt to normalize DOIs by stripping whitespace, lower casing, and
|
||||||
|
* converting to <code>https://doi.org</code> format. The reason is that DOIs are case
|
||||||
|
* insensitive and must be unique, which we can only guarantee if they are
|
||||||
|
* normalized to the same format.
|
||||||
|
*
|
||||||
|
* See: <a href="https://www.crossref.org/documentation/member-setup/constructing-your-dois/">https://www.crossref.org/documentation/member-setup/constructing-your-dois/</a>
|
||||||
|
*
|
||||||
|
* TODO: set curation to failed if invalid DOI submitted (and configure to reject in workflow)
|
||||||
|
* TODO: allow operation on communities and collections (currently only works on items)
|
||||||
|
*
|
||||||
|
* @author Alan Orth for the International Livestock Research Institute
|
||||||
|
* @version 7.6.1.3
|
||||||
|
* @since 7.6.1.1
|
||||||
|
*/
|
||||||
|
@Suspendable
|
||||||
|
public class NormalizeDOIs extends AbstractCurationTask {
|
||||||
|
@Override
|
||||||
|
public int perform(DSpaceObject dso) throws IOException {
|
||||||
|
if (dso.getType() == Constants.ITEM) {
|
||||||
|
Item item = (Item) dso;
|
||||||
|
String result;
|
||||||
|
|
||||||
|
// Keep track of whether we change metadata, and how many
|
||||||
|
boolean metadataChanged = false;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
// Hard coding the metadata field for now since I can't figure out how to read the taskProperty
|
||||||
|
List<MetadataValue> itemDOIs = itemService.getMetadataByMetadataString(item, "cg.identifier.doi");
|
||||||
|
|
||||||
|
// skip items that don't have DOIs
|
||||||
|
if (itemDOIs.isEmpty()) {
|
||||||
|
setResult("No DOIs, skipping");
|
||||||
|
return Curator.CURATE_SKIP;
|
||||||
|
} else {
|
||||||
|
for (MetadataValue itemDOI : itemDOIs) {
|
||||||
|
String newDOI = getNormalizedDOI(itemDOI);
|
||||||
|
|
||||||
|
// Check if the normalized DOI is different than the original
|
||||||
|
if (!newDOI.equals(itemDOI.getValue())) {
|
||||||
|
itemDOI.setValue(newDOI);
|
||||||
|
metadataChanged = true;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (metadataChanged) {
|
||||||
|
result = "Normalized " + count + " DOI(s)";
|
||||||
|
} else {
|
||||||
|
result = "All DOIs already normalized";
|
||||||
|
}
|
||||||
|
setResult(result);
|
||||||
|
|
||||||
|
return Curator.CURATE_SUCCESS;
|
||||||
|
} else {
|
||||||
|
setResult("Object skipped");
|
||||||
|
return Curator.CURATE_SKIP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getNormalizedDOI(MetadataValue itemDOI) {
|
||||||
|
// Convert to lowercase
|
||||||
|
String newDOI = itemDOI.getValue().toLowerCase();
|
||||||
|
// Strip leading and trailing whitespace
|
||||||
|
newDOI = newDOI.strip();
|
||||||
|
// Convert to HTTPS
|
||||||
|
newDOI = newDOI.replace("http://", "https://");
|
||||||
|
// Prefer doi.org to dx.doi.org
|
||||||
|
newDOI = newDOI.replace("dx.doi.org", "doi.org");
|
||||||
|
// Prefer doi.org to www.doi.org
|
||||||
|
newDOI = newDOI.replace("www.doi.org", "doi.org");
|
||||||
|
// Fix URL encoded slashes (%2f)
|
||||||
|
newDOI = newDOI.replace("%2f", "/");
|
||||||
|
// Replace values like doi: 10.11648/j.jps.20140201.14
|
||||||
|
newDOI = newDOI.replaceAll("^doi: 10\\.", "https://doi.org/10.");
|
||||||
|
// Replace values like 10.3390/foods12010115
|
||||||
|
newDOI = newDOI.replaceAll("^10\\.", "https://doi.org/10.");
|
||||||
|
|
||||||
|
return newDOI;
|
||||||
|
}
|
||||||
|
}
|
@ -2,8 +2,9 @@
|
|||||||
DSpace curation tasks used on the [CGSpace](https://cgspace.cgiar.org) institutional repository:
|
DSpace curation tasks used on the [CGSpace](https://cgspace.cgiar.org) institutional repository:
|
||||||
|
|
||||||
- **CountryCodeTagger**: add ISO 3166-1 Alpha2 country codes to items based on their existing country metadata
|
- **CountryCodeTagger**: add ISO 3166-1 Alpha2 country codes to items based on their existing country metadata
|
||||||
|
- **NormalizeDOIs**: normalize DOIs by stripping whitespace, lowercasing, and converting to https://doi.org/ format
|
||||||
|
|
||||||
Tested on DSpace 6.3. Read more about the [DSpace curation system](https://wiki.lyrasis.org/display/DSDOC5x/Curation+System).
|
Tested on DSpace 7.6.3. Read more about the [DSpace curation system](https://wiki.lyrasis.org/display/DSDOC7x/Curation+System).
|
||||||
|
|
||||||
## Build and Install
|
## Build and Install
|
||||||
|
|
||||||
@ -14,7 +15,7 @@ To use these curation tasks in a DSpace project add the following dependency to
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.github.ilri.cgspace</groupId>
|
<groupId>io.github.ilri.cgspace</groupId>
|
||||||
<artifactId>cgspace-java-helpers</artifactId>
|
<artifactId>cgspace-java-helpers</artifactId>
|
||||||
<version>6.1-SNAPSHOT</version>
|
<version>7.6.1.4-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -30,18 +31,19 @@ $ mvn package
|
|||||||
Copy the resulting jar to the DSpace `lib` directory:
|
Copy the resulting jar to the DSpace `lib` directory:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ cp target/cgspace-java-helpers-6.1-SNAPSHOT.jar ~/dspace/lib/
|
$ cp target/cgspace-java-helpers-7.6.1.4-SNAPSHOT.jar ~/dspace/lib/
|
||||||
```
|
```
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
Add the curation task to DSpace's `config/modules/curate.cfg`:
|
Add the curation task(s) to DSpace's `config/modules/curate.cfg`:
|
||||||
|
|
||||||
```
|
```
|
||||||
plugin.named.org.dspace.curate.CurationTask = io.github.ilri.cgspace.ctasks.CountryCodeTagger = countrycodetagger
|
plugin.named.org.dspace.curate.CurationTask = io.github.ilri.cgspace.ctasks.CountryCodeTagger = countrycodetagger
|
||||||
plugin.named.org.dspace.curate.CurationTask = io.github.ilri.cgspace.ctasks.CountryCodeTagger = countrycodetagger.force
|
plugin.named.org.dspace.curate.CurationTask = io.github.ilri.cgspace.ctasks.CountryCodeTagger = countrycodetagger.force
|
||||||
|
plugin.named.org.dspace.curate.CurationTask = io.github.ilri.cgspace.ctasks.NormalizeDOIs = normalizedois
|
||||||
```
|
```
|
||||||
|
|
||||||
And then add the following variables to your `local.cfg` or some other [configuration file that is included](https://wiki.lyrasis.org/display/DSDOC6x/Configuration+Reference#ConfigurationReference-IncludingotherPropertyFiles):
|
And then add the following variables to your `local.cfg` or some other [configuration file that is included](https://wiki.lyrasis.org/display/DSDOC7x/Configuration+Reference#ConfigurationReference-IncludingotherPropertyFiles):
|
||||||
|
|
||||||
```
|
```
|
||||||
# name of the field containing ISO 3166-1 country names
|
# name of the field containing ISO 3166-1 country names
|
||||||
@ -60,7 +62,7 @@ countrycodetagger.iso3166-alpha2.field = cg.coverage.iso3166-alpha2
|
|||||||
Once the jar is installed and you have added appropriate configuration in `~/dspace/config/modules`:
|
Once the jar is installed and you have added appropriate configuration in `~/dspace/config/modules`:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ ~/dspace/bin/dspace curate -t countrycodetagger -i 10568/3 -r - -s object
|
$ ~/dspace/bin/dspace curate -e eperson@repo.org -t countrycodetagger -i 10568/3 -r - -s object
|
||||||
```
|
```
|
||||||
|
|
||||||
*Note*: it is very important to set the database transaction scope to something sensible (`object`) if you're curating a community or collection with more than a few hundred items.
|
*Note*: it is very important to set the database transaction scope to something sensible (`object`) if you're curating a community or collection with more than a few hundred items.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2020 Alan Orth
|
* Copyright (C) 2020 Alan Orth
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package io.github.ilri.cgspace.scripts;
|
package io.github.ilri.cgspace.scripts;
|
||||||
@ -138,7 +138,7 @@ public class FixJpgJpgThumbnails {
|
|||||||
for (Bitstream originalBitstream : originalBundleBitstreams) {
|
for (Bitstream originalBitstream : originalBundleBitstreams) {
|
||||||
String originalName = originalBitstream.getName();
|
String originalName = originalBitstream.getName();
|
||||||
|
|
||||||
long originalBitstreamBytes = originalBitstream.getSize();
|
long originalBitstreamBytes = originalBitstream.getSizeBytes();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
- check if the original file name is the same as the thumbnail name minus the extra ".jpg"
|
- check if the original file name is the same as the thumbnail name minus the extra ".jpg"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2022 Alan Orth
|
* Copyright (C) 2022 Alan Orth
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: GPL-3.0-or-later
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package io.github.ilri.cgspace.scripts;
|
package io.github.ilri.cgspace.scripts;
|
||||||
|
@ -4,7 +4,7 @@ Java-based helpers used on the [CGSpace](https://cgspace.cgiar.org) institutiona
|
|||||||
- **FixJpgJpgThumbnails**: fix low-quality ".jpg.jpg" thumbnails by replacing them with their originals
|
- **FixJpgJpgThumbnails**: fix low-quality ".jpg.jpg" thumbnails by replacing them with their originals
|
||||||
- **FixLowQualityThumbnails**: remove low-quality thumbnails when PDF bitstreams are present
|
- **FixLowQualityThumbnails**: remove low-quality thumbnails when PDF bitstreams are present
|
||||||
|
|
||||||
Tested on DSpace 6.3. Read more about the [DSpace curation system](https://wiki.lyrasis.org/display/DSDOC6x/Curation+System).
|
Tested on DSpace 7.6.3. Read more about the [DSpace curation system](https://wiki.lyrasis.org/display/DSDOC7x/Curation+System).
|
||||||
|
|
||||||
## Build and Install
|
## Build and Install
|
||||||
|
|
||||||
@ -15,7 +15,7 @@ To use these curation tasks in a DSpace project add the following dependency to
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>io.github.ilri.cgspace</groupId>
|
<groupId>io.github.ilri.cgspace</groupId>
|
||||||
<artifactId>cgspace-java-helpers</artifactId>
|
<artifactId>cgspace-java-helpers</artifactId>
|
||||||
<version>6.1-SNAPSHOT</version>
|
<version>7.6.1.4-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -31,7 +31,7 @@ $ mvn package
|
|||||||
Copy the resulting jar to the DSpace `lib` directory:
|
Copy the resulting jar to the DSpace `lib` directory:
|
||||||
|
|
||||||
```console
|
```console
|
||||||
$ cp target/cgspace-java-helpers-6.1-SNAPSHOT.jar ~/dspace/lib/
|
$ cp target/cgspace-java-helpers-7.6.1.4-SNAPSHOT.jar ~/dspace/lib/
|
||||||
```
|
```
|
||||||
|
|
||||||
## Invocation
|
## Invocation
|
||||||
|
@ -16,14 +16,6 @@
|
|||||||
"name": "Congo, The Democratic Republic of the",
|
"name": "Congo, The Democratic Republic of the",
|
||||||
"numeric": "180"
|
"numeric": "180"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"alpha_2": "IR",
|
|
||||||
"alpha_3": "IRN",
|
|
||||||
"name": "Iran, Islamic Republic of",
|
|
||||||
"cgspace_name": "Iran",
|
|
||||||
"numeric": "364",
|
|
||||||
"official_name": "Islamic Republic of Iran"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"alpha_2": "KP",
|
"alpha_2": "KP",
|
||||||
"alpha_3": "PRK",
|
"alpha_3": "PRK",
|
||||||
@ -33,13 +25,6 @@
|
|||||||
"numeric": "408",
|
"numeric": "408",
|
||||||
"official_name": "Democratic People's Republic of Korea"
|
"official_name": "Democratic People's Republic of Korea"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"alpha_2": "LA",
|
|
||||||
"alpha_3": "LAO",
|
|
||||||
"name": "Lao People's Democratic Republic",
|
|
||||||
"cgspace_name": "Laos",
|
|
||||||
"numeric": "418"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"alpha_2": "FM",
|
"alpha_2": "FM",
|
||||||
"alpha_3": "FSM",
|
"alpha_3": "FSM",
|
||||||
@ -54,13 +39,6 @@
|
|||||||
"name": "Russian Federation",
|
"name": "Russian Federation",
|
||||||
"cgspace_name": "Russia",
|
"cgspace_name": "Russia",
|
||||||
"numeric": "643"
|
"numeric": "643"
|
||||||
},
|
|
||||||
{
|
|
||||||
"alpha_2": "SY",
|
|
||||||
"alpha_3": "SYR",
|
|
||||||
"name": "Syrian Arab Republic",
|
|
||||||
"cgspace_name": "Syria",
|
|
||||||
"numeric": "760"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -821,6 +821,7 @@
|
|||||||
{
|
{
|
||||||
"alpha_2": "IR",
|
"alpha_2": "IR",
|
||||||
"alpha_3": "IRN",
|
"alpha_3": "IRN",
|
||||||
|
"common_name": "Iran",
|
||||||
"flag": "🇮🇷",
|
"flag": "🇮🇷",
|
||||||
"name": "Iran, Islamic Republic of",
|
"name": "Iran, Islamic Republic of",
|
||||||
"numeric": "364",
|
"numeric": "364",
|
||||||
@ -953,6 +954,7 @@
|
|||||||
{
|
{
|
||||||
"alpha_2": "LA",
|
"alpha_2": "LA",
|
||||||
"alpha_3": "LAO",
|
"alpha_3": "LAO",
|
||||||
|
"common_name": "Laos",
|
||||||
"flag": "🇱🇦",
|
"flag": "🇱🇦",
|
||||||
"name": "Lao People's Democratic Republic",
|
"name": "Lao People's Democratic Republic",
|
||||||
"numeric": "418"
|
"numeric": "418"
|
||||||
@ -1653,6 +1655,7 @@
|
|||||||
{
|
{
|
||||||
"alpha_2": "SY",
|
"alpha_2": "SY",
|
||||||
"alpha_3": "SYR",
|
"alpha_3": "SYR",
|
||||||
|
"common_name": "Syria",
|
||||||
"flag": "🇸🇾",
|
"flag": "🇸🇾",
|
||||||
"name": "Syrian Arab Republic",
|
"name": "Syrian Arab Republic",
|
||||||
"numeric": "760"
|
"numeric": "760"
|
||||||
@ -1746,9 +1749,9 @@
|
|||||||
"alpha_2": "TR",
|
"alpha_2": "TR",
|
||||||
"alpha_3": "TUR",
|
"alpha_3": "TUR",
|
||||||
"flag": "🇹🇷",
|
"flag": "🇹🇷",
|
||||||
"name": "Turkey",
|
"name": "Türkiye",
|
||||||
"numeric": "792",
|
"numeric": "792",
|
||||||
"official_name": "Republic of Turkey"
|
"official_name": "Republic of Türkiye"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"alpha_2": "TV",
|
"alpha_2": "TV",
|
||||||
|
Reference in New Issue
Block a user