Remove EditGroups URL template from Wikibase schema (#3779)

* Remove EditGroups URL template from Wikibase schema

Instead it is fetched from the manifest and stored in operation metadata.

Closes #3656.

* Fix compatibility with older JDKs

* Remove unnecessary fallback in ManifestV1 constructor
This commit is contained in:
Antonin Delpeuch 2021-04-01 13:58:28 +02:00 committed by GitHub
parent 2de5929350
commit fa9d670d30
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 59 additions and 26 deletions

View File

@ -43,7 +43,6 @@ ImportSchemaDialog.launch = function() {
if (!schema.siteIri || !schema.mediaWikiApiEndpoint) {
schema.siteIri = WikidataManifestV1_0.wikibase.site_iri;
schema.mediaWikiApiEndpoint = WikidataManifestV1_0.mediawiki.api;
schema.editGroupsURLSchema = WikidataManifestV1_0.editgroups.url_schema;
}
} catch(e) {
elmts.invalidSchema.text($.i18n('import-wikibase-schema/invalid-schema'));

View File

@ -53,7 +53,11 @@ PerformEditsDialog.launch = function(logged_in_username, max_severity) {
"wikidata",
"perform-wikibase-edits",
{},
{ summary: elmts.editSummary.val(), maxlag: elmts.maxlag.val() },
{
summary: elmts.editSummary.val(),
maxlag: elmts.maxlag.val(),
editGroupsUrlSchema: WikibaseManager.getSelectedWikibaseEditGroupsURLSchema()
},
{ includeEngine: true, cellsChanged: true, columnStatsChanged: true },
{ onDone: function() { dismiss(); } }
);

View File

@ -1279,8 +1279,7 @@ SchemaAlignment.getJSON = function() {
return {
itemDocuments: list,
siteIri: WikibaseManager.getSelectedWikibaseSiteIri(),
mediaWikiApiEndpoint: WikibaseManager.getSelectedWikibaseApi(),
editGroupsURLSchema: WikibaseManager.getSelectedWikibaseEditGroupsURLSchema()
mediaWikiApiEndpoint: WikibaseManager.getSelectedWikibaseApi()
};
} else {
return null;

View File

@ -40,7 +40,8 @@ public class PerformWikibaseEditsCommand extends EngineDependentCommand {
String summary = request.getParameter("summary");
String maxlagStr = request.getParameter("maxlag");
int maxlag = maxlagStr == null ? 5 : Integer.parseInt(maxlagStr);
return new PerformWikibaseEditsOperation(engineConfig, summary, maxlag);
String editGroupsUrlSchema = request.getParameter("editGroupsUrlSchema");
return new PerformWikibaseEditsOperation(engineConfig, summary, maxlag, editGroupsUrlSchema);
}
}

View File

@ -20,4 +20,5 @@ public interface Manifest {
String getConstraintsRelatedId(String name);
String getEditGroupsUrlSchema();
}

View File

@ -6,6 +6,8 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.wikidata.wdtk.wikibaseapi.ApiConnection;
public class ManifestV1 implements Manifest {
private String version;
@ -16,6 +18,7 @@ public class ManifestV1 implements Manifest {
private String subclassOfPid;
private String mediaWikiApiEndpoint;
private String reconServiceEndpoint;
private String editGroupsUrlSchema;
private Map<String, String> constraintsRelatedIdMap = new HashMap<>();
@ -44,6 +47,9 @@ public class ManifestV1 implements Manifest {
JsonNode reconciliation = manifest.path("reconciliation");
reconServiceEndpoint = reconciliation.path("endpoint").textValue();
JsonNode editGroups = manifest.path("editgroups");
editGroupsUrlSchema = editGroups.path("url_schema").textValue();
}
@Override
@ -91,4 +97,9 @@ public class ManifestV1 implements Manifest {
return constraintsRelatedIdMap.get(name);
}
@Override
public String getEditGroupsUrlSchema() {
return editGroupsUrlSchema;
}
}

View File

@ -64,6 +64,10 @@ import com.google.refine.util.Pool;
public class PerformWikibaseEditsOperation extends EngineDependentOperation {
static final Logger logger = LoggerFactory.getLogger(PerformWikibaseEditsOperation.class);
// only used for backwards compatibility, these things are configurable through
// the manifest now.
static final private String WIKIDATA_EDITGROUPS_URL_SCHEMA = "([[:toollabs:editgroups/b/OR/${batch_id}|details]])";
@JsonProperty("summary")
private String summary;
@ -71,6 +75,9 @@ public class PerformWikibaseEditsOperation extends EngineDependentOperation {
@JsonProperty("maxlag")
private int maxlag;
@JsonProperty("editGroupsUrlSchema")
private String editGroupsUrlSchema;
@JsonCreator
public PerformWikibaseEditsOperation(
@JsonProperty("engineConfig")
@ -78,7 +85,9 @@ public class PerformWikibaseEditsOperation extends EngineDependentOperation {
@JsonProperty("summary")
String summary,
@JsonProperty("maxlag")
Integer maxlag) {
Integer maxlag,
@JsonProperty("editGroupsUrlSchema")
String editGroupsUrlSchema) {
super(engineConfig);
Validate.notNull(summary, "An edit summary must be provided.");
Validate.notEmpty(summary, "An edit summary must be provided.");
@ -89,6 +98,8 @@ public class PerformWikibaseEditsOperation extends EngineDependentOperation {
maxlag = 5;
}
this.maxlag = maxlag;
// a fallback to Wikidata for backwards compatibility is done later on
this.editGroupsUrlSchema = editGroupsUrlSchema;
}
@Override
@ -99,7 +110,12 @@ public class PerformWikibaseEditsOperation extends EngineDependentOperation {
@Override
public Process createProcess(Project project, Properties options)
throws Exception {
return new PerformEditsProcess(project, createEngine(project), getBriefDescription(project), summary);
return new PerformEditsProcess(
project,
createEngine(project),
getBriefDescription(project),
editGroupsUrlSchema,
summary);
}
static public class PerformWikibaseEditsChange implements Change {
@ -158,11 +174,12 @@ public class PerformWikibaseEditsOperation extends EngineDependentOperation {
protected Project _project;
protected Engine _engine;
protected WikibaseSchema _schema;
protected String _editGroupsUrlSchema;
protected String _summary;
protected List<String> _tags;
protected final long _historyEntryID;
protected PerformEditsProcess(Project project, Engine engine, String description, String summary) {
protected PerformEditsProcess(Project project, Engine engine, String description, String editGroupsUrlSchema, String summary) {
super(description);
this._project = project;
this._engine = engine;
@ -176,6 +193,13 @@ public class PerformWikibaseEditsOperation extends EngineDependentOperation {
}
this._tags = Arrays.asList(tag);
this._historyEntryID = HistoryEntry.allocateID();
if (editGroupsUrlSchema == null &&
ApiConnection.URL_WIKIDATA_API.equals(_schema.getMediaWikiApiEndpoint())) {
// For backward compatibility, if no editGroups schema is provided
// and we edit Wikidata, then add Wikidata's editGroups schema
editGroupsUrlSchema = WIKIDATA_EDITGROUPS_URL_SCHEMA;
}
this._editGroupsUrlSchema = editGroupsUrlSchema;
}
@Override
@ -193,7 +217,7 @@ public class PerformWikibaseEditsOperation extends EngineDependentOperation {
WikibaseDataEditor wbde = new WikibaseDataEditor(connection, _schema.getSiteIri());
String summary;
if (StringUtils.isBlank(_schema.getEditGroupsURLSchema())) {
if (StringUtils.isBlank(_editGroupsUrlSchema)) {
summary = _summary;
} else {
// Generate batch id
@ -203,7 +227,7 @@ public class PerformWikibaseEditsOperation extends EngineDependentOperation {
// from the user-supplied ones, we replace these separators by similar unicode characters to
// make sure they can be told apart.
String summaryWithoutCommas = _summary.replaceAll(", "," ").replaceAll(": ","։ ");
summary = summaryWithoutCommas + " " + _schema.getEditGroupsURLSchema().replace("${batch_id}", batchId);
summary = summaryWithoutCommas + " " + _editGroupsUrlSchema.replace("${batch_id}", batchId);
}
// Evaluate the schema

View File

@ -28,12 +28,12 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.openrefine.wikidata.qa.QAWarningStore;
import org.openrefine.wikidata.schema.exceptions.SkipSchemaExpressionException;
import org.openrefine.wikidata.updates.ItemUpdate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.wikidata.wdtk.wikibaseapi.ApiConnection;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@ -67,9 +67,6 @@ public class WikibaseSchema implements OverlayModel {
@JsonProperty("mediaWikiApiEndpoint")
protected String mediaWikiApiEndpoint;
@JsonIgnore
protected String editGroupsURLSchema;
/**
* Constructor.
*/
@ -83,12 +80,10 @@ public class WikibaseSchema implements OverlayModel {
@JsonCreator
public WikibaseSchema(@JsonProperty("itemDocuments") List<WbItemDocumentExpr> exprs,
@JsonProperty("siteIri") String siteIri,
@JsonProperty("mediaWikiApiEndpoint") String mediaWikiApiEndpoint,
@JsonProperty("editGroupsURLSchema") String editGroupsURLSchema) {
@JsonProperty("mediaWikiApiEndpoint") String mediaWikiApiEndpoint) {
this.itemDocumentExprs = exprs;
this.siteIri = siteIri;
this.mediaWikiApiEndpoint = mediaWikiApiEndpoint;
this.editGroupsURLSchema = editGroupsURLSchema;
this.mediaWikiApiEndpoint = mediaWikiApiEndpoint != null ? mediaWikiApiEndpoint : ApiConnection.URL_WIKIDATA_API;
}
/**
@ -112,11 +107,6 @@ public class WikibaseSchema implements OverlayModel {
return mediaWikiApiEndpoint;
}
@JsonIgnore
public String getEditGroupsURLSchema() {
return editGroupsURLSchema;
}
/**
* Evaluates all item documents in a particular expression context. This
* specifies, among others, a row where the values of the variables will be

View File

@ -3,6 +3,7 @@
"description": "Perform Wikibase edits",
"summary": "test null edit",
"maxlag": 5,
"editGroupsUrlSchema": "([[:toollabs:editgroups/b/OR/${batch_id}|details]])",
"engineConfig": {
"mode": "row-based",
"facets": []

View File

@ -23,6 +23,7 @@ public class ManifestV1Test {
assertEquals("https://wdreconcile.toolforge.org/${lang}/api", manifest.getReconServiceEndpoint());
assertEquals("P2302", manifest.getConstraintsRelatedId("property_constraint_pid"));
assertEquals("Q19474404", manifest.getConstraintsRelatedId("single_value_constraint_qid"));
assertEquals("([[:toollabs:editgroups/b/OR/${batch_id}|details]])", manifest.getEditGroupsUrlSchema());
}
@Test

View File

@ -58,7 +58,7 @@ public class PerformWikibaseEditsOperationTest extends OperationTest {
@Test(expectedExceptions=IllegalArgumentException.class)
public void testConstructor() {
new PerformWikibaseEditsOperation(EngineConfig.reconstruct("{}"), "", 5);
new PerformWikibaseEditsOperation(EngineConfig.reconstruct("{}"), "", 5, "");
}
@Test

View File

@ -23,7 +23,6 @@
******************************************************************************/
package org.openrefine.wikidata.schema;
import org.testng.Assert;
import static org.testng.Assert.assertEquals;
import java.io.IOException;
@ -48,6 +47,7 @@ import org.wikidata.wdtk.datamodel.interfaces.Statement;
import org.wikidata.wdtk.datamodel.interfaces.StatementRank;
import org.wikidata.wdtk.datamodel.interfaces.StringValue;
import org.wikidata.wdtk.datamodel.interfaces.TimeValue;
import org.wikidata.wdtk.wikibaseapi.ApiConnection;
import com.google.refine.browsing.Engine;
import com.google.refine.browsing.EngineConfig;
@ -106,7 +106,9 @@ public class WikibaseSchemaTest extends WikidataRefineTest {
// this json file was generated by an earlier version of the software
// it contains extra "type" fields that are now ignored.
String serialized = TestingData.jsonFromFile("schema/roarmap.json");
WikibaseSchema.reconstruct(serialized);
WikibaseSchema schema = WikibaseSchema.reconstruct(serialized);
// Check that we fall back on Wikidata if no API endpoint was supplied
assertEquals(schema.getMediaWikiApiEndpoint(), ApiConnection.URL_WIKIDATA_API);
}
@Test