diff --git a/doc/sphinx-guides/source/installation/config.rst b/doc/sphinx-guides/source/installation/config.rst index 79b02fab6da..484a8c70df1 100644 --- a/doc/sphinx-guides/source/installation/config.rst +++ b/doc/sphinx-guides/source/installation/config.rst @@ -1256,10 +1256,18 @@ By default this setting is absent and Dataverse assumes it to be false. :ApplicationTermsOfUse ++++++++++++++++++++++ -Upload an HTML file containing the Terms of Use to be displayed at sign up. Supported HTML tags are listed under the :doc:`/user/dataset-management` section of the User Guide. +Upload an default language HTML file containing the Terms of Use to be displayed at sign up. Supported HTML tags are listed under the :doc:`/user/dataset-management` section of the User Guide. ``curl -X PUT -d@/tmp/apptou.html http://localhost:8080/api/admin/settings/:ApplicationTermsOfUse`` +To upload a language specific Terms of Use file, + +``curl -X PUT -d@/tmp/apptou_fr.html http://localhost:8080/api/admin/settings/:ApplicationTermsOfUse/lang/fr`` + +To delete language specific option, + +``curl -X DELETE http://localhost:8080/api/admin/settings/:ApplicationTermsOfUse/lang/fr`` + Unfortunately, in most cases, the text file will probably be too big to upload (>1024 characters) due to a bug. A workaround has been posted to https://github.com/IQSS/dataverse/issues/2669 :ApplicationPrivacyPolicyUrl diff --git a/src/main/java/edu/harvard/iq/dataverse/api/Admin.java b/src/main/java/edu/harvard/iq/dataverse/api/Admin.java index 89f53c097f5..f8006ea340e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/api/Admin.java +++ b/src/main/java/edu/harvard/iq/dataverse/api/Admin.java @@ -156,6 +156,13 @@ public Response putSetting(@PathParam("name") String name, String content) { return ok(jsonObjectBuilder().add(s.getName(), s.getContent())); } + @Path("settings/{name}/lang/{lang}") + @PUT + public Response putSetting(@PathParam("name") String name, @PathParam("lang") String lang, String content) { + Setting s = settingsSvc.set(name, lang, content); + return ok("Setting " + name + " - " + lang + " - added."); + } + @Path("settings/{name}") @GET public Response getSetting(@PathParam("name") String name) { @@ -172,6 +179,13 @@ public Response deleteSetting(@PathParam("name") String name) { return ok("Setting " + name + " deleted."); } + @Path("settings/{name}/lang/{lang}") + @DELETE + public Response deleteSetting(@PathParam("name") String name, @PathParam("lang") String lang) { + settingsSvc.delete(name, lang); + return ok("Setting " + name + " - " + lang + " deleted."); + } + @Path("authenticationProviderFactories") @GET public Response listAuthProviderFactories() { diff --git a/src/main/java/edu/harvard/iq/dataverse/settings/Setting.java b/src/main/java/edu/harvard/iq/dataverse/settings/Setting.java index 80653770447..160ed693eee 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/Setting.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/Setting.java @@ -7,6 +7,8 @@ import javax.persistence.Id; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; /** * A single value in the config of dataverse. @@ -14,16 +16,30 @@ */ @NamedQueries({ @NamedQuery( name="Setting.deleteByName", - query="DELETE FROM Setting s WHERE s.name=:name"), + query="DELETE FROM Setting s WHERE s.name=:name AND s.lang IS NULL"), @NamedQuery( name="Setting.findAll", - query="SELECT s FROM Setting s") + query="SELECT s FROM Setting s"), + @NamedQuery( name="Setting.findByName", + query = "SELECT s FROM Setting s WHERE s.name=:name AND s.lang IS NULL" ), + @NamedQuery( name="Setting.deleteByNameAndLang", + query="DELETE FROM Setting s WHERE s.name=:name AND s.lang=:lang"), + @NamedQuery( name="Setting.findByNameAndLang", + query = "SELECT s FROM Setting s WHERE s.name=:name AND s.lang=:lang" ) + }) @Entity public class Setting implements Serializable { - + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(columnDefinition = "TEXT") private String name; + @Column(columnDefinition = "TEXT") + private String lang; + @Column(columnDefinition = "TEXT") private String content; @@ -31,8 +47,14 @@ public Setting() { } public Setting(String name, String content) { + this.name = name; + this.content = content; + } + + public Setting(String name, String lang, String content) { this.name = name; this.content = content; + this.lang = lang; } public String getName() { @@ -51,6 +73,14 @@ public void setContent(String content) { this.content = content; } + public String getLang() { + return lang; + } + + public void setLang(String lang) { + this.lang = lang; + } + @Override public int hashCode() { int hash = 7; diff --git a/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java index c1295f29796..14e4474b264 100644 --- a/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java +++ b/src/main/java/edu/harvard/iq/dataverse/settings/SettingsServiceBean.java @@ -5,6 +5,7 @@ import edu.harvard.iq.dataverse.api.ApiBlockingFilter; import edu.harvard.iq.dataverse.util.StringUtil; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -429,8 +430,14 @@ public String toString() { * @return the actual setting, or {@code null}. */ public String get( String name ) { - Setting s = em.find( Setting.class, name ); - return (s!=null) ? s.getContent() : null; + List tokens = em.createNamedQuery("Setting.findByName", Setting.class) + .setParameter("name", name ) + .getResultList(); + String val = null; + if(tokens.size() > 0) { + val = tokens.get(0).getContent(); + } + return (val!=null) ? val : null; } /** @@ -483,10 +490,26 @@ public String get( String name, String defaultValue ) { String val = get(name); return (val!=null) ? val : defaultValue; } + + public String get(String name, String lang, String defaultValue ) { + List tokens = em.createNamedQuery("Setting.findByNameAndLang", Setting.class) + .setParameter("name", name ) + .setParameter("lang", lang ) + .getResultList(); + String val = null; + if(tokens.size() > 0) { + val = tokens.get(0).getContent(); + } + return (val!=null) ? val : defaultValue; + } public String getValueForKey( Key key, String defaultValue ) { return get( key.toString(), defaultValue ); } + + public String getValueForKey( Key key, String lang, String defaultValue ) { + return get( key.toString(), lang, defaultValue ); + } public Setting set( String name, String content ) { Setting s = new Setting( name, content ); @@ -495,6 +518,14 @@ public Setting set( String name, String content ) { .setInfo(name + ": " + content)); return s; } + + public Setting set( String name, String lang, String content ) { + Setting s = new Setting( name, lang, content ); + em.merge(s); + actionLogSvc.log( new ActionLogRecord(ActionLogRecord.ActionType.Setting, "set") + .setInfo(name + ": " +lang + ": " + content)); + return s; + } public Setting setValueForKey( Key key, String content ) { return set( key.toString(), content ); @@ -531,6 +562,15 @@ public void delete( String name ) { .setParameter("name", name) .executeUpdate(); } + + public void delete( String name, String lang ) { + actionLogSvc.log( new ActionLogRecord(ActionLogRecord.ActionType.Setting, "delete") + .setInfo(name)); + em.createNamedQuery("Setting.deleteByNameAndLang") + .setParameter("name", name) + .setParameter("lang", lang) + .executeUpdate(); + } public Set listAll() { return new HashSet<>(em.createNamedQuery("Setting.findAll", Setting.class).getResultList()); diff --git a/src/main/java/edu/harvard/iq/dataverse/util/BundleUtil.java b/src/main/java/edu/harvard/iq/dataverse/util/BundleUtil.java index 6b6f5f02a6b..1311a2495ae 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/BundleUtil.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/BundleUtil.java @@ -146,7 +146,7 @@ public static String getStringFromDefaultPropertyFile(String key, String propert return getStringFromBundleNoMissingCheck(key, null, bundle); } - private static Locale getDefaultLocale() { + public static Locale getDefaultLocale() { String localeEnvVar = System.getenv().get("LANG"); if (localeEnvVar != null) { if (localeEnvVar.indexOf('.') > 0) { diff --git a/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java b/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java index b36c6e2bdec..35dc00d5aff 100644 --- a/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java +++ b/src/main/java/edu/harvard/iq/dataverse/util/SystemConfig.java @@ -57,7 +57,7 @@ public class SystemConfig { public static final String FQDN = "dataverse.fqdn"; /** - * A JVM option for specifying the "official" URL of the site. + * A JVM option for specifying the "official" URL of the site. * Unlike the FQDN option above, this would be a complete URL, * with the protocol, port number etc. */ @@ -489,8 +489,17 @@ public boolean isThumbnailGenerationDisabledForPDF() { } public String getApplicationTermsOfUse() { + String language = BundleUtil.getCurrentLocale().getLanguage(); String saneDefaultForAppTermsOfUse = BundleUtil.getStringFromBundle("system.app.terms"); - String appTermsOfUse = settingsService.getValueForKey(SettingsServiceBean.Key.ApplicationTermsOfUse, saneDefaultForAppTermsOfUse); + String appTermsOfUse = ""; + if(language.equalsIgnoreCase(BundleUtil.getDefaultLocale().getLanguage()) ) + { + appTermsOfUse = settingsService.getValueForKey(SettingsServiceBean.Key.ApplicationTermsOfUse, saneDefaultForAppTermsOfUse); + } + else + { + appTermsOfUse = settingsService.getValueForKey(SettingsServiceBean.Key.ApplicationTermsOfUse, language, saneDefaultForAppTermsOfUse); + } return appTermsOfUse; } diff --git a/src/main/java/propertyFiles/Bundle.properties b/src/main/java/propertyFiles/Bundle.properties index 92a4e7a1b4d..ac2bdb9844e 100755 --- a/src/main/java/propertyFiles/Bundle.properties +++ b/src/main/java/propertyFiles/Bundle.properties @@ -2385,6 +2385,7 @@ staticSearchFields.dvObjectType=Type staticSearchFields.fileTag=File Tag staticSearchFields.fileAccess=Access staticSearchFields.publicationStatus=Publication Status +staticSearchFields.subject_ss=Subject #dataverse category - Facet Labels Researcher=Researcher diff --git a/src/main/resources/db/migration/V4.16.0.1__5303-addColumn-to-settingTable.sql b/src/main/resources/db/migration/V4.16.0.1__5303-addColumn-to-settingTable.sql new file mode 100644 index 00000000000..d294afe8b56 --- /dev/null +++ b/src/main/resources/db/migration/V4.16.0.1__5303-addColumn-to-settingTable.sql @@ -0,0 +1,13 @@ +ALTER TABLE ONLY setting DROP CONSTRAINT setting_pkey ; + +ALTER TABLE setting ADD COLUMN ID SERIAL PRIMARY KEY; + +ALTER TABLE setting ADD COLUMN lang text; + +ALTER TABLE setting + ADD CONSTRAINT non_empty_lang + CHECK (lang <> ''); + +CREATE UNIQUE INDEX unique_settings + ON setting + (name, coalesce(lang, '')); \ No newline at end of file