From d63ebd58b074a13aeeabd565638f804991388ba1 Mon Sep 17 00:00:00 2001 From: Shweta Nazare <128600182+nshweta90@users.noreply.github.com> Date: Tue, 13 Aug 2024 11:57:26 +0200 Subject: [PATCH 01/65] Dummy check-in --- app/controllers/Application.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index b5ceca1..cdaa689 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -463,4 +463,4 @@ private String getDeployUrl() { : "/"; } -} +} From 52ea72a5072226a6d7a3708ed2cb1ebdba4f54e0 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Tue, 20 Aug 2024 12:21:35 +0200 Subject: [PATCH 02/65] Changes for Docker --- app/controllers/Application.java | 4 +++- build.sbt | 4 ++++ conf/application.conf | 3 ++- project/plugins.sbt | 1 + 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index cdaa689..78c78ac 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -64,11 +64,13 @@ public Application(VocabProvider vocabProvider, LayoutProvider layoutProvider, C } public Result getVocab(String version) { - + Logger.info("Getting vocab for version: "+version); if (request().accepts("text/html")) { Locale locale = getLocale(request(), null); + Logger.info(locale.getLanguage()); return redirect(routes.Application.getVocabPage(version, locale.getLanguage()).url()); } else { + Logger.info(routes.Application.getVocabData(version, null).url()); return redirect(routes.Application.getVocabData(version, null).url()); } diff --git a/build.sbt b/build.sbt index c6bd13d..11e91db 100644 --- a/build.sbt +++ b/build.sbt @@ -16,3 +16,7 @@ libraryDependencies += "commons-io" % "commons-io" % "2.4" javaOptions in Test += "-Dconfig.file=conf/test.conf" scalaVersion := "2.11.11" + +enablePlugins(JavaAppPackaging,DockerPlugin) +dockerExposedPorts := Seq(9000) +dockerBaseImage := "openjdk:8-jdk" diff --git a/conf/application.conf b/conf/application.conf index 0511fa8..f02c62d 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -31,4 +31,5 @@ queries.statement = "CONSTRUCT WHERE {?s ?p ?o }" queries.localize = "CONSTRUCT {?s ?p ?o} WHERE {?s ?p ?o . FILTER(!isLiteral(?o) || lang(?o) = \"\" || langMatches(lang(?o), \"%1$s\" ))}" languages.available = "en ca de es et fi fr hi hr it lt nl pl" -source.site.http = "https://rightsstatements.org" +source.site.http = "http://localhost:4000" +source.site.local="/resources" \ No newline at end of file diff --git a/project/plugins.sbt b/project/plugins.sbt index ea5ebdf..edf2f85 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -3,3 +3,4 @@ resolvers += "Typesafe repository" at "https://repo.typesafe.com/typesafe/releas // Use the Play sbt plugin for Play projects addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.4.3") +addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.1.3") From 83c5f51ec87c0c34338322eb089d7e74645cf41d Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Tue, 20 Aug 2024 12:39:35 +0200 Subject: [PATCH 03/65] Changes for k8s --- k8s/base/deployment.yaml | 31 +++++++++++++++++++ k8s/base/kustomization.yaml | 8 +++++ .../cloud/deployment_patch.yaml.template | 22 +++++++++++++ k8s/overlays/cloud/hpa.yaml.template | 21 +++++++++++++ k8s/overlays/cloud/ingress.yaml.template | 23 ++++++++++++++ k8s/overlays/cloud/kustomization.yaml | 13 ++++++++ k8s/overlays/cloud/service.yaml | 10 ++++++ k8s/overlays/dev/deployment_patch.yaml | 11 +++++++ k8s/overlays/dev/kustomization.yaml | 11 +++++++ k8s/overlays/dev/nodeport.yaml | 10 ++++++ 10 files changed, 160 insertions(+) create mode 100644 k8s/base/deployment.yaml create mode 100644 k8s/base/kustomization.yaml create mode 100644 k8s/overlays/cloud/deployment_patch.yaml.template create mode 100644 k8s/overlays/cloud/hpa.yaml.template create mode 100644 k8s/overlays/cloud/ingress.yaml.template create mode 100644 k8s/overlays/cloud/kustomization.yaml create mode 100644 k8s/overlays/cloud/service.yaml create mode 100644 k8s/overlays/dev/deployment_patch.yaml create mode 100644 k8s/overlays/dev/kustomization.yaml create mode 100644 k8s/overlays/dev/nodeport.yaml diff --git a/k8s/base/deployment.yaml b/k8s/base/deployment.yaml new file mode 100644 index 0000000..757430a --- /dev/null +++ b/k8s/base/deployment.yaml @@ -0,0 +1,31 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: rights-statements-deployment +spec: + # selector.matchLabels is provided via Kustomize + template: + spec: + containers: + - name: rights-statements + image: europeana/rights-statements + ports: + - containerPort: 8080 + livenessProbe: + httpGet: + port: 8080 + path: /actuator/health/liveness + httpHeaders: + - name: Accept + value: application/json + initialDelaySeconds: 90 + periodSeconds: 60 + readinessProbe: + httpGet: + port: 8080 + path: /actuator/health/readiness + httpHeaders: + - name: Accept + value: application/json + initialDelaySeconds: 60 + periodSeconds: 60 diff --git a/k8s/base/kustomization.yaml b/k8s/base/kustomization.yaml new file mode 100644 index 0000000..74ee044 --- /dev/null +++ b/k8s/base/kustomization.yaml @@ -0,0 +1,8 @@ +resources: + - deployment.yaml + +labels: + - includeSelectors: true + pairs: + app: rights-statements + diff --git a/k8s/overlays/cloud/deployment_patch.yaml.template b/k8s/overlays/cloud/deployment_patch.yaml.template new file mode 100644 index 0000000..374f04c --- /dev/null +++ b/k8s/overlays/cloud/deployment_patch.yaml.template @@ -0,0 +1,22 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: rights-statements-deployment +spec: + replicas: ${MIN_REPLICAS} + template: + metadata: + annotations: + fluentd/include: '${COLLECT_LOGS}' + fluentd/multiline: 'true' + spec: + containers: + - name: rights-statements + imagePullPolicy: Always + resources: + requests: + memory: "${MEMORY_REQUEST}M" + cpu: "${CPU_REQUEST}m" + limits: + memory: "${MEMORY_LIMIT}M" + cpu: "${CPU_LIMIT}m" \ No newline at end of file diff --git a/k8s/overlays/cloud/hpa.yaml.template b/k8s/overlays/cloud/hpa.yaml.template new file mode 100644 index 0000000..8884eba --- /dev/null +++ b/k8s/overlays/cloud/hpa.yaml.template @@ -0,0 +1,21 @@ +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: rights-statements-hpa +spec: + maxReplicas: ${MAX_REPLICAS} + minReplicas: ${MIN_REPLICAS} + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: rights-statements-deployment + behavior: + scaleDown: + stabilizationWindowSeconds: 600 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 75 \ No newline at end of file diff --git a/k8s/overlays/cloud/ingress.yaml.template b/k8s/overlays/cloud/ingress.yaml.template new file mode 100644 index 0000000..cd96e77 --- /dev/null +++ b/k8s/overlays/cloud/ingress.yaml.template @@ -0,0 +1,23 @@ +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: rights-statements-ingress + annotations: + ${K8S_INGRESS_ANNOTATIONS} +spec: + ingressClassName: public-iks-k8s-nginx + tls: + - hosts: + - ${K8S_HOSTNAME} + secretName: ${K8S_SECRETNAME} + rules: + - host: ${K8S_HOSTNAME} + http: + paths: + - path: / + pathType: Prefix + backend: + service: + name: rights-statements-service + port: + number: 80 \ No newline at end of file diff --git a/k8s/overlays/cloud/kustomization.yaml b/k8s/overlays/cloud/kustomization.yaml new file mode 100644 index 0000000..0a810b0 --- /dev/null +++ b/k8s/overlays/cloud/kustomization.yaml @@ -0,0 +1,13 @@ +resources: + - ../../base + - service.yaml + - ingress.yaml + - hpa.yaml + +patches: + - path: deployment_patch.yaml + +labels: + - includeSelectors: true + pairs: + app: rights-statements \ No newline at end of file diff --git a/k8s/overlays/cloud/service.yaml b/k8s/overlays/cloud/service.yaml new file mode 100644 index 0000000..90849c0 --- /dev/null +++ b/k8s/overlays/cloud/service.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: Service +metadata: + name: rights-statements-service +spec: + # selector provided via kustomize + ports: + - name: http + port: 80 + targetPort: 8080 \ No newline at end of file diff --git a/k8s/overlays/dev/deployment_patch.yaml b/k8s/overlays/dev/deployment_patch.yaml new file mode 100644 index 0000000..93e2fbe --- /dev/null +++ b/k8s/overlays/dev/deployment_patch.yaml @@ -0,0 +1,11 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: rights-statements-deployment +spec: + template: + spec: + containers: + - name: rights-statements + # required to use local image + imagePullPolicy: Never \ No newline at end of file diff --git a/k8s/overlays/dev/kustomization.yaml b/k8s/overlays/dev/kustomization.yaml new file mode 100644 index 0000000..99973f0 --- /dev/null +++ b/k8s/overlays/dev/kustomization.yaml @@ -0,0 +1,11 @@ +resources: + - ../../base + - nodeport.yaml + +patches: + - path: deployment_patch.yaml + +labels: + - includeSelectors: true + pairs: + app: rights-statements \ No newline at end of file diff --git a/k8s/overlays/dev/nodeport.yaml b/k8s/overlays/dev/nodeport.yaml new file mode 100644 index 0000000..3ac38fe --- /dev/null +++ b/k8s/overlays/dev/nodeport.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: Service +metadata: + name: rights-statements-nodeport +spec: + type: NodePort + ports: + - port: 8080 + nodePort: 31000 + # selector provided via kustomize \ No newline at end of file From a56702667eaa5ab68c4603670721686592311864 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Sun, 25 Aug 2024 22:38:43 +0200 Subject: [PATCH 04/65] Changes for upgrade to java 11 --- app/controllers/Application.java | 295 ++++++++++++----------- app/modules/LayoutProviderModule.java | 8 +- app/modules/VocabProviderModule.java | 6 +- app/services/DirectoryVocabProvider.java | 18 +- app/services/GitLayoutProvider.java | 14 +- app/services/GitVocabProvider.java | 26 +- build.sbt | 12 +- conf/application.conf | 25 +- conf/routes | 24 +- project/build.properties | 2 +- project/plugins.sbt | 4 +- 11 files changed, 242 insertions(+), 192 deletions(-) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index 78c78ac..ee3cbbb 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -4,25 +4,30 @@ import com.github.jknack.handlebars.Handlebars; import com.github.jknack.handlebars.io.TemplateLoader; import com.google.inject.Inject; + import com.hp.hpl.jena.query.QueryExecutionFactory; import com.hp.hpl.jena.query.QueryFactory; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.typesafe.config.ConfigFactory; +import com.typesafe.config.ConfigValue; +import java.util.Map.Entry; +import java.util.Set; +import java.util.stream.Collectors; import org.apache.commons.lang3.StringEscapeUtils; -import play.Configuration; +import play.api.Configuration; import play.Logger; -import play.Play; -import play.api.http.MediaRange; +import play.api.Environment; import play.mvc.Controller; import play.mvc.Http; +import play.mvc.Http.Request; import play.mvc.Result; import services.LayoutProvider; import services.VocabProvider; -import javax.activation.MimeType; -import javax.activation.MimeTypeParseException; -import javax.annotation.Nonnull; +//import javax.activation.MimeType; +//import javax.activation.MimeTypeParseException; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -38,17 +43,17 @@ */ public class Application extends Controller { - private static Map mimeTypeParserMap = Play.application().configuration().getConfig("parser").asMap(); + private static Map mimeTypeParserMap = getMap(ConfigFactory.load().getConfig("parser").entrySet()); - private static Map mimeTypeExtMap = Play.application().configuration().getConfig("extension").asMap(); + private static Map mimeTypeExtMap = getMap(ConfigFactory.load().getConfig("extension").entrySet()); - private static Map defaults = Play.application().configuration().getConfig("default").asMap(); + private static Map defaults =getMap( ConfigFactory.load().getConfig("default").entrySet()); - private static Map validParameters = Play.application().configuration().getConfig("params").asMap(); + private static Map validParameters = getMap(ConfigFactory.load().getConfig("params").entrySet()); - private static Map sparqlQueries = Play.application().configuration().getConfig("queries").asMap(); + private static Map sparqlQueries = getMap(ConfigFactory.load().getConfig("queries").entrySet()); - private static Map languages = Play.application().configuration().getConfig("languages").asMap(); + private static Map languages = getMap(ConfigFactory.load().getConfig("languages").entrySet()); private final VocabProvider vocabProvider; @@ -56,17 +61,20 @@ public class Application extends Controller { private final Configuration configuration; + private Environment env; + @Inject - public Application(VocabProvider vocabProvider, LayoutProvider layoutProvider, Configuration configuration) { + public Application(VocabProvider vocabProvider, LayoutProvider layoutProvider, Configuration configuration,Environment env) { this.vocabProvider = vocabProvider; this.layoutProvider = layoutProvider; this.configuration = configuration; + this.env = env; } - public Result getVocab(String version) { + public Result getVocab(String version, Http.Request request) { Logger.info("Getting vocab for version: "+version); - if (request().accepts("text/html")) { - Locale locale = getLocale(request(), null); + if (request.accepts("text/html")) { + Locale locale = getLocale(request, null); Logger.info(locale.getLanguage()); return redirect(routes.Application.getVocabPage(version, locale.getLanguage()).url()); } else { @@ -76,49 +84,50 @@ public Result getVocab(String version) { } - public Result getVocabData(String version, String extension) { + public Result getVocabData(String version, String extension, Http.Request request) { Model vocab = getVocabModel(version); if (vocab.isEmpty()) { - return notFoundPage(); + return notFoundPage(request); } - MimeType mimeType = getMimeType(request(), extension); - response().setHeader("Content-Location", routes.Application.getVocabData(version, - mimeTypeExtMap.getOrDefault(mimeType.toString(), defaults.get("mime").toString()).toString()) - .url()); - response().setHeader("Link", "<".concat(routes.Application.getVocabData(version, null) - .url()).concat(">; rel=derivedfrom")); + //MimeType mimeType = getMimeType(request, extension); + String mimeType ="application/json"; +// response().setHeader("Content-Location", routes.Application.getVocabData(version, +// mimeTypeExtMap.getOrDefault(mimeType.toString(), defaults.get("mime").toString()).toString()) +// .url()); +// response().setHeader("Link", "<".concat(routes.Application.getVocabData(version, null) +// .url()).concat(">; rel=derivedfrom")); return getData(vocab, mimeType); } - public Result getVocabPage(String version, String language) throws IOException { + public Result getVocabPage(String version, String language,Http.Request request) throws IOException { Model vocab = getVocabModel(version); - Locale locale = getLocale(request(), language); + Locale locale = getLocale(request, language); if (vocab.isEmpty()) { - return notFoundPage(); + return notFoundPage(request); } - response().setHeader("Link", "<".concat(routes.Application.getVocabPage(version, null) - .url()).concat(">; rel=derivedfrom")); - response().setHeader("Content-Language", locale.getLanguage()); +// response().setHeader("Link", "<".concat(routes.Application.getVocabPage(version, null) +// .url()).concat(">; rel=derivedfrom")); +// response().setHeader("Content-Language", locale.getLanguage()); - return getPage(vocab, "/".concat(locale.toLanguageTag()).concat("/statements/vocab.html"), locale.getLanguage(), null); + return getPage(vocab, "/".concat(locale.toLanguageTag()).concat("/statements/vocab.html"), locale.getLanguage(), null,request); } - public Result getStatement(String id, String version) { + public Result getStatement(String id, String version,Http.Request req) { - if (!request().queryString().isEmpty()) { - setAlternates(request(), id, version, true); - return notAcceptablePage(); - } else if (request().accepts("text/html")) { - Locale locale = getLocale(request(), null); + if (!req.queryString().isEmpty()) { + setAlternates(req, id, version, true); + return notAcceptablePage(req); + } else if (req.accepts("text/html")) { + Locale locale = getLocale(req, null); return redirect(routes.Application.getStatementPage(id, version, locale.getLanguage()).url()); } else { return redirect(routes.Application.getStatementData(id, version, null).url()); @@ -126,51 +135,52 @@ public Result getStatement(String id, String version) { } - public Result getStatementData(String id, String version, String extension) { + public Result getStatementData(String id, String version, String extension, Http.Request req) { - if (!request().queryString().isEmpty()) { - setAlternates(request(), id, version, false); - return notAcceptablePage(); + if (!req.queryString().isEmpty()) { + setAlternates(req, id, version, false); + return notAcceptablePage(req); } Model rightsStatement = getStatementModel(id, version); if (rightsStatement.isEmpty()) { - return notFoundPage(); + return notFoundPage(req); } - MimeType mimeType = getMimeType(request(), extension); - response().setHeader("Content-Location", routes.Application.getStatementData(id, version, - mimeTypeExtMap.getOrDefault(mimeType.toString(), defaults.get("mime").toString()).toString()) - .url()); - response().setHeader("Link", "<".concat(routes.Application.getStatementData(id, version, null) - .url()).concat(">; rel=derivedfrom")); + //MimeType mimeType = getMimeType(req, extension); + String mimeType ="application/json"; +// response().setHeader("Content-Location", routes.Application.getStatementData(id, version, +// mimeTypeExtMap.getOrDefault(mimeType.toString(), defaults.get("mime").toString()).toString()) +// .url()); +// response().setHeader("Link", "<".concat(routes.Application.getStatementData(id, version, null) +// .url()).concat(">; rel=derivedfrom")); return getData(rightsStatement, mimeType); } - public Result getStatementPage(String id, String version, String language) throws IOException { + public Result getStatementPage(String id, String version, String language,Http.Request req) throws IOException { Model rightsStatement = getStatementModel(id, version); - Locale locale = getLocale(request(), language); + Locale locale = getLocale(req, language); if (rightsStatement.isEmpty()) { - return notFoundPage(); + return notFoundPage(req); } - response().setHeader("Link", "<".concat(routes.Application.getStatementPage(id, version, null) - .url()).concat(">; rel=derivedfrom")); - response().setHeader("Content-Language", locale.getLanguage()); +// response().setHeader("Link", "<".concat(routes.Application.getStatementPage(id, version, null) +// .url()).concat(">; rel=derivedfrom")); +// response().setHeader("Content-Language", locale.getLanguage()); - return getPage(rightsStatement, "/en/statement.hbs", locale.getLanguage(), getParameters(request(), id)); + return getPage(rightsStatement, "/en/statement.hbs", locale.getLanguage(), getParameters(req, id),req); } - public Result getCollection(String id, String version) { + public Result getCollection(String id, String version,Http.Request req) { - if (request().accepts("text/html")) { - Locale locale = getLocale(request(), null); + if (req.accepts("text/html")) { + Locale locale = getLocale(req, null); return redirect(routes.Application.getCollectionPage(id, version, locale.getLanguage()).url()); } else { return redirect(routes.Application.getCollectionData(id, version, null).url()); @@ -178,46 +188,48 @@ public Result getCollection(String id, String version) { } - public Result getCollectionData(String id, String version, String extension) { + public Result getCollectionData(String id, String version, String extension,Http.Request req) { Model collection = getCollectionModel(id, version); if (collection.isEmpty()) { - return notFoundPage(); + return notFoundPage(req); } - MimeType mimeType = getMimeType(request(), extension); - response().setHeader("Content-Location", routes.Application.getCollectionData(id, version, - mimeTypeExtMap.getOrDefault(mimeType.toString(), defaults.get("mime").toString()).toString()) - .url()); - response().setHeader("Link", "<".concat(routes.Application.getCollectionData(id, version, null) - .url()).concat(">; rel=derivedfrom")); + // MimeType mimeType = getMimeType(req, extension); + + String mimeType ="application/json"; +// response().setHeader("Content-Location", routes.Application.getCollectionData(id, version, +// mimeTypeExtMap.getOrDefault(mimeType.toString(), defaults.get("mime").toString()).toString()) +// .url()); +// response().setHeader("Link", "<".concat(routes.Application.getCollectionData(id, version, null) +// .url()).concat(">; rel=derivedfrom")); return getData(collection, mimeType); } - public Result getCollectionPage(String id, String version, String language) throws IOException { + public Result getCollectionPage(String id, String version, String language,Http.Request req) throws IOException { Model collection = getVocabModel(version); - Locale locale = getLocale(request(), language); + Locale locale = getLocale(req, language); if (collection.isEmpty()) { - return notFoundPage(); + return notFoundPage(req); } - response().setHeader("Link", "<".concat(routes.Application.getCollectionPage(id, version, null) - .url()).concat(">; rel=derivedfrom")); - response().setHeader("Content-Language", locale.getLanguage()); +// response().setHeader("Link", "<".concat(routes.Application.getCollectionPage(id, version, null) +// .url()).concat(">; rel=derivedfrom")); +// response().setHeader("Content-Language", locale.getLanguage()); return getPage(collection, locale.toLanguageTag().concat("/statements/collection-").concat(id).concat(".html"), - locale.getLanguage(), null); + locale.getLanguage(), null,req); } - private Result notFoundPage() { + private Result notFoundPage(Request request) { TemplateLoader loader = layoutProvider.getTemplateLoader(); - loader.setPrefix(getDeployUrl()); + loader.setPrefix(getDeployUrl(request)); try { return notFound(loader.sourceAt("/en/404.html").content()).as("text/html"); } catch (IOException e) { @@ -227,9 +239,9 @@ private Result notFoundPage() { } - private Result notAcceptablePage() { + private Result notAcceptablePage(Request req) { TemplateLoader loader = layoutProvider.getTemplateLoader(); - loader.setPrefix(getDeployUrl()); + loader.setPrefix(getDeployUrl(req)); try { return status(406, loader.sourceAt("/en/406.html").content()).as("text/html"); } catch (IOException e) { @@ -239,17 +251,17 @@ private Result notAcceptablePage() { } - private Result getData(Model model, MimeType mimeType) { + private Result getData(Model model, String mimeType) { OutputStream result = new ByteArrayOutputStream(); - model.write(result, mimeTypeParserMap.getOrDefault(mimeType.toString(), defaults.get("parser").toString()) + model.write(result, mimeTypeParserMap.getOrDefault(mimeType, defaults.get("parser")) .toString()); return ok(result.toString()).as( - mimeType.toString().equals("*/*") ? defaults.get("mime").toString() : mimeType.toString()); + mimeType.equals("*/*") ? defaults.get("mime").toString() : mimeType); } - private Result getPage(Model model, String templateFile, String language, HashMap parameters) + private Result getPage(Model model, String templateFile, String language, HashMap parameters,Http.Request req) throws IOException { Model localized = ModelFactory.createDefaultModel(); @@ -265,11 +277,11 @@ private Result getPage(Model model, String templateFile, String language, HashMa scope.put("data", new ObjectMapper().readValue(boas.toString(), HashMap.class)); TemplateLoader loader = layoutProvider.getTemplateLoader(); - loader.setPrefix(getDeployUrl()); + loader.setPrefix(getDeployUrl(req)); Handlebars handlebars = new Handlebars(loader); try { - handlebars.registerHelpers("helpers.js", Play.application().classloader() + handlebars.registerHelpers("helpers.js",env.classLoader() .getResourceAsStream("public/js/helpers.js")); } catch (Exception e) { Logger.error(e.toString()); @@ -309,51 +321,51 @@ private Model getCollectionModel(String id, String version) { } - private MimeType getMimeType(Http.Request request, String extension) { - - if (extension != null) { - return getMimeTypeByExtension(extension); - } else { - return getMimeTypeFromRequest(request); - } - - } - - private static MimeType getMimeTypeFromRequest(Http.Request request) { - - MimeType mimeType; - List acceptedTypes = request.acceptedTypes(); - - try { - if (! acceptedTypes.isEmpty()) { - mimeType = new MimeType(request.acceptedTypes().get(0).toString()); - } else { - mimeType = new MimeType("*/*"); - } - } catch (MimeTypeParseException e) { - Logger.error(e.toString()); - mimeType = new MimeType(); - } - - return mimeType; - - } - - private static MimeType getMimeTypeByExtension(@Nonnull String extension) { - - for (Map.Entry entry : mimeTypeExtMap.entrySet()) { - if (entry.getValue().equals(extension)) { - try { - return new MimeType(entry.getKey()); - } catch (MimeTypeParseException e) { - Logger.error(e.toString()); - } - } - } - - return new MimeType(); - - } +// private MimeType getMimeType(Http.Request request, String extension) { +// +// if (extension != null) { +// return getMimeTypeByExtension(extension); +// } else { +// return getMimeTypeFromRequest(request); +// } +// +// } + +// private static MimeType getMimeTypeFromRequest(Http.Request request) { +// +// MimeType mimeType; +// List acceptedTypes = request.acceptedTypes(); +// +// try { +// if (! acceptedTypes.isEmpty()) { +// mimeType = new MimeType(request.acceptedTypes().get(0).toString()); +// } else { +// mimeType = new MimeType("*/*"); +// } +// } catch (MimeTypeParseException e) { +// Logger.error(e.toString()); +// mimeType = new MimeType(); +// } +// +// return mimeType; +// +// } + +// private static MimeType getMimeTypeByExtension(@Nonnull String extension) { +// +// for (Map.Entry entry : mimeTypeExtMap.entrySet()) { +// if (entry.getValue().equals(extension)) { +// try { +// return new MimeType(entry.getKey()); +// } catch (MimeTypeParseException e) { +// Logger.error(e.toString()); +// } +// } +// } +// +// return new MimeType(); +// +// } private Locale getLocale(Http.Request request, String language) { @@ -423,14 +435,13 @@ private void setAlternates(Http.Request request, String id, String version, bool alternates.add(String.format("{\"%s\" 0.9 {text/html}}", pageUrl)); - for (Map.Entry entry : mimeTypeExtMap.entrySet()) { + for ( Entry entry : mimeTypeExtMap.entrySet()) { if (entry.getKey().equals("*/*")) { continue; } alternates.add(String.format("{\"%s\" 0.9 {".concat(entry.getKey()).concat("}}"), dataUrl)); } - - response().setHeader("Alternates", String.join(",", alternates)); + //response().setHeader("Alternates", String.join(",", alternates)); } @@ -441,7 +452,7 @@ private void setAlternates(Http.Request request, String id, String version, bool private HashMap getParameters(Http.Request request, String id) { HashMap parameters = new HashMap<>(); - String validParameters = (String) Application.validParameters.get(id); + String validParameters = Application.validParameters.get(id).toString(); if (validParameters != null) { for (String validParameter : validParameters.split(" ")) { @@ -456,13 +467,21 @@ private HashMap getParameters(Http.Request request, String id) { } - private String getDeployUrl() { - if (configuration.getString("source.site.http") != null) { - return configuration.getString("source.site.http"); + private String getDeployUrl(Http.Request req) { + if (configuration.underlying().getString("source.site.http") != null) { + return configuration.underlying().getString("source.site.http"); } - return request().hasHeader("X-Deploy-Url") - ? request().getHeader("X-Deploy-Url") + return req.hasHeader("X-Deploy-Url") + ? req.headers().get("X-Deploy-Url").get() : "/"; } -} + + + +private static Map getMap(Set> inputSet){ + return inputSet.stream() + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + +} +} \ No newline at end of file diff --git a/app/modules/LayoutProviderModule.java b/app/modules/LayoutProviderModule.java index 44a9b57..fe6b061 100644 --- a/app/modules/LayoutProviderModule.java +++ b/app/modules/LayoutProviderModule.java @@ -1,8 +1,9 @@ package modules; import com.google.inject.AbstractModule; -import play.Configuration; -import play.Environment; +import play.api.Configuration; +import play.api.Environment; +import play.api.Play; import services.LayoutProvider; /** @@ -21,7 +22,8 @@ public LayoutProviderModule(Environment environment, Configuration configuration protected void configure() { - String vocabVersion = configuration.getString("layout.provider"); + String vocabVersion = configuration.underlying().getString("layout.provider"); + try { Class bindingClass = environment.classLoader().loadClass(vocabVersion) .asSubclass(LayoutProvider.class); diff --git a/app/modules/VocabProviderModule.java b/app/modules/VocabProviderModule.java index 346f6be..fe1a771 100644 --- a/app/modules/VocabProviderModule.java +++ b/app/modules/VocabProviderModule.java @@ -1,8 +1,8 @@ package modules; import com.google.inject.AbstractModule; -import play.Configuration; -import play.Environment; +import play.api.Configuration; +import play.api.Environment; import services.VocabProvider; /** @@ -21,7 +21,7 @@ public VocabProviderModule(Environment environment, Configuration configuration) protected void configure() { - String vocabVersion = configuration.getString("vocab.provider"); + String vocabVersion = configuration.underlying().getString("vocab.provider"); try { Class bindingClass = environment.classLoader().loadClass(vocabVersion) .asSubclass(VocabProvider.class); diff --git a/app/services/DirectoryVocabProvider.java b/app/services/DirectoryVocabProvider.java index ff5aa58..f0381d6 100644 --- a/app/services/DirectoryVocabProvider.java +++ b/app/services/DirectoryVocabProvider.java @@ -3,8 +3,12 @@ import com.google.inject.Inject; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.typesafe.config.Config; +import com.typesafe.config.ConfigList; +import com.typesafe.config.ConfigValue; +import java.util.List; import org.apache.jena.riot.Lang; -import play.Configuration; +import play.api.Configuration; import play.Logger; import java.io.File; @@ -13,6 +17,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import scala.Option; /** * Created by fo on 10.03.16. @@ -24,16 +29,17 @@ public class DirectoryVocabProvider implements VocabProvider { @Inject public DirectoryVocabProvider(Configuration configuration) { - Configuration source = configuration.getConfig("source.data"); + Config source = configuration.underlying().getConfig("source.data"); + //Configuration source = source; String sourceDir = source.getString("dir"); - Configuration formats = source.getConfig("formats"); + ConfigList formats = source.getList("formats"); Path sourcePath = new File(sourceDir).isAbsolute() ? Paths.get(new File(sourceDir).getPath()) : Paths.get(ClassLoader.getSystemResource(sourceDir).getPath()); - for (String format : formats.asMap().keySet()) { - String ext = formats.getConfig(format).getString("ext"); - String lang = formats.getConfig(format).getString("lang"); + for (ConfigValue format : formats) { + String ext ="";// formats.getConfig(format.subKeys()).get().getString("ext"); + String lang = "";//formats.getConfig(format.toString()).get().getString("lang"); try (DirectoryStream files = Files.newDirectoryStream(sourcePath, "*".concat(ext))) { for (Path file : files) { vocab.read(Files.newInputStream(file), null, lang); diff --git a/app/services/GitLayoutProvider.java b/app/services/GitLayoutProvider.java index 7997ed2..9178f8b 100644 --- a/app/services/GitLayoutProvider.java +++ b/app/services/GitLayoutProvider.java @@ -7,7 +7,7 @@ import org.apache.jena.atlas.RuntimeIOException; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; -import play.Configuration; +import play.api.Configuration; import play.Logger; import java.io.File; @@ -34,7 +34,7 @@ public class ResourceTemplateLoader extends URLTemplateLoader { protected URL getResource(final String location) throws IOException { - File localPath = new File(gitSource.getString("local"), location.substring(1)); + File localPath = new File(gitSource.underlying().getString("local"), location.substring(1)); Logger.debug("Fetching " + localPath.toURI().toURL()); return localPath.toURI().toURL(); @@ -45,14 +45,14 @@ protected URL getResource(final String location) throws IOException { @Inject public GitLayoutProvider(Configuration configuration) { - gitSource = configuration.getConfig("source.site.git"); + gitSource = (Configuration) configuration.underlying().getConfig("source.site.git"); try { - Logger.debug("Checking out template branch ".concat(gitSource.getString("branch"))); - File localPath = new File(gitSource.getString("local")); + Logger.debug("Checking out template branch ".concat(gitSource.underlying().getString("branch"))); + File localPath = new File(gitSource.underlying().getString("local")); FileUtils.deleteDirectory(localPath); - try (Git git = Git.cloneRepository().setURI(gitSource.getString("remote")).setDirectory(localPath).call()) { - git.checkout().setName(gitSource.getString("branch")).call(); + try (Git git = Git.cloneRepository().setURI(gitSource.underlying().getString("remote")).setDirectory(localPath).call()) { + git.checkout().setName(gitSource.underlying().getString("branch")).call(); git.getRepository().close(); } } catch (IOException | GitAPIException e) { diff --git a/app/services/GitVocabProvider.java b/app/services/GitVocabProvider.java index 4c29ea7..a7c1a14 100644 --- a/app/services/GitVocabProvider.java +++ b/app/services/GitVocabProvider.java @@ -4,6 +4,12 @@ import com.google.inject.Singleton; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; + +import com.typesafe.config.Config; +import com.typesafe.config.ConfigValue; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.Set; import org.apache.commons.io.FileUtils; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; @@ -16,13 +22,14 @@ import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.treewalk.TreeWalk; import org.eclipse.jgit.treewalk.filter.PathSuffixFilter; -import play.Configuration; +import play.api.Configuration; import play.Logger; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; +import scala.Option; /** @@ -37,29 +44,28 @@ public class GitVocabProvider implements VocabProvider { @Inject public GitVocabProvider(Configuration configuration) { - Configuration source = configuration.getConfig("source.data"); - Configuration gitSource = source.getConfig("git"); - Configuration formats = source.getConfig("formats"); - + Config source = configuration.underlying().getConfig("source.data"); + Config gitSource = source.getConfig("git"); + Config formats = source.getConfig("formats"); try { String remoteURL = gitSource.getString("remote"); - File localPath = new File(gitSource.getString("local")); + File localPath = new File(String.valueOf(gitSource.getString("local"))); FileUtils.deleteDirectory(localPath); try (Git git = Git.cloneRepository().setURI(remoteURL).setDirectory(localPath).call()) { Repository repository = git.getRepository(); - ObjectId lastCommitId = repository.resolve(gitSource.getString("rev")); + ObjectId lastCommitId = repository.resolve(String.valueOf(gitSource.getString("rev"))); try (RevWalk revWalk = new RevWalk(repository)) { RevCommit commit = revWalk.parseCommit(lastCommitId); RevTree tree = commit.getTree(); - for (String format : formats.asMap().keySet()) { - String ext = formats.getConfig(format).getString("ext"); - String lang = formats.getConfig(format).getString("lang"); + for (String formatName : formats.root().keySet()) { + String ext = formats.getConfig(formatName).getString("ext"); + String lang =formats.getConfig(formatName).getString("lang"); try (TreeWalk treeWalk = new TreeWalk(repository)) { treeWalk.addTree(tree); diff --git a/build.sbt b/build.sbt index 11e91db..c493113 100644 --- a/build.sbt +++ b/build.sbt @@ -2,7 +2,7 @@ name := "rights-app" version := "0.1" -packageName in Universal := "rights-app-dist" +Universal / packageName := "rights-app-dist" lazy val root = (project in file(".")).enablePlugins(PlayJava) @@ -12,11 +12,13 @@ libraryDependencies += "org.apache.jena" % "apache-jena-libs" % "2.13.0" libraryDependencies += "com.github.jknack" % "handlebars" % "2.2.2" libraryDependencies += "org.eclipse.jgit" % "org.eclipse.jgit" % "4.0.1.201506240215-r" libraryDependencies += "commons-io" % "commons-io" % "2.4" +libraryDependencies += "com.google.inject" % "guice" % "3+" +libraryDependencies += guice -javaOptions in Test += "-Dconfig.file=conf/test.conf" - -scalaVersion := "2.11.11" +Test / javaOptions += "-Dconfig.file=conf/test.conf" +Universal / javaOptions ++= Seq("-Dpidfile.path=/dev/null") +scalaVersion := "2.13.14" enablePlugins(JavaAppPackaging,DockerPlugin) dockerExposedPorts := Seq(9000) -dockerBaseImage := "openjdk:8-jdk" +dockerBaseImage := "openjdk:11-jdk" diff --git a/conf/application.conf b/conf/application.conf index f02c62d..0e00683 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -1,10 +1,10 @@ play.modules.enabled += "modules.VocabProviderModule" play.modules.enabled += "modules.LayoutProviderModule" vocab.provider = "services.GitVocabProvider" -source.data.formats.turtle.ext = ".ttl" -source.data.formats.turtle.lang = "TURTLE" -source.data.formats.json.ext = ".json" -source.data.formats.json.lang = "JSONLD" +#source.data.formats.turtle.ext = ".ttl" +#source.data.formats.turtle.lang = "TURTLE" +#source.data.formats.json.ext = ".json" +#source.data.formats.json.lang = "JSONLD" source.data.git.remote = "https://github.com/rightsstatements/data-model.git" source.data.git.local = "/tmp/data-model" source.data.git.rev = "master" @@ -32,4 +32,19 @@ queries.collection = "CONSTRUCT WHERE { Date: Mon, 26 Aug 2024 10:15:08 +0200 Subject: [PATCH 05/65] Changes for logging and temporary landing page --- app/controllers/Application.java | 6 +++++ app/views/index.scala.html | 18 ++++++++++++++ conf/logback.xml | 42 ++++++++++++++++++++++++++++++++ conf/routes | 1 + 4 files changed, 67 insertions(+) create mode 100644 app/views/index.scala.html create mode 100644 conf/logback.xml diff --git a/app/controllers/Application.java b/app/controllers/Application.java index ee3cbbb..182d30e 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -484,4 +484,10 @@ private static Map getMap(Set> i .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); } + + + + public Result index() { + return ok(views.html.index.render()); + } } \ No newline at end of file diff --git a/app/views/index.scala.html b/app/views/index.scala.html new file mode 100644 index 0000000..a6006d2 --- /dev/null +++ b/app/views/index.scala.html @@ -0,0 +1,18 @@ +@() + + + + + + Rights statements + + + + + +

Europeana — Rights statements

+ + + + + \ No newline at end of file diff --git a/conf/logback.xml b/conf/logback.xml new file mode 100644 index 0000000..3b3a710 --- /dev/null +++ b/conf/logback.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + ${application.home:-.}/logs/application.log + + %date [%level] from %logger in %thread - %message%n%xException + + + + + + %highlight(%-5level) %logger{15} - %message%n%xException{10} + + + + + + + + + + + + + + + + + + + + diff --git a/conf/routes b/conf/routes index 9640b91..7e48284 100644 --- a/conf/routes +++ b/conf/routes @@ -1,3 +1,4 @@ +GET / controllers.Application.index() GET /vocab/:version/ controllers.Application.getVocab(version: String, request: Request) GET /vocab/collection-:id/:version/ controllers.Application.getCollection(id: String, version: String,request: Request) GET /vocab/:id/:version/ controllers.Application.getStatement(id: String, version: String,request: Request) From 303e6af8a40e58a5fd00c6a29fb162734401cb19 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Mon, 26 Aug 2024 11:57:50 +0200 Subject: [PATCH 06/65] Changes for docker repository name correction --- build.sbt | 1 + 1 file changed, 1 insertion(+) diff --git a/build.sbt b/build.sbt index c493113..a8ac7e4 100644 --- a/build.sbt +++ b/build.sbt @@ -22,3 +22,4 @@ scalaVersion := "2.13.14" enablePlugins(JavaAppPackaging,DockerPlugin) dockerExposedPorts := Seq(9000) dockerBaseImage := "openjdk:11-jdk" +dockerRepository := Option("docker.io/europeana") From 12a14cfb3ade321acea66aae2422c34215858fe2 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Mon, 26 Aug 2024 13:02:28 +0200 Subject: [PATCH 07/65] Changes for k8s app name correction --- k8s/base/deployment.yaml | 6 +++--- k8s/base/kustomization.yaml | 2 +- k8s/overlays/cloud/deployment_patch.yaml.template | 4 ++-- k8s/overlays/cloud/hpa.yaml.template | 4 ++-- k8s/overlays/cloud/ingress.yaml.template | 4 ++-- k8s/overlays/cloud/kustomization.yaml | 2 +- k8s/overlays/cloud/service.yaml | 2 +- k8s/overlays/dev/deployment_patch.yaml | 4 ++-- k8s/overlays/dev/kustomization.yaml | 2 +- k8s/overlays/dev/nodeport.yaml | 2 +- 10 files changed, 16 insertions(+), 16 deletions(-) diff --git a/k8s/base/deployment.yaml b/k8s/base/deployment.yaml index 757430a..d2ac78a 100644 --- a/k8s/base/deployment.yaml +++ b/k8s/base/deployment.yaml @@ -1,14 +1,14 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: rights-statements-deployment + name: rights-app-deployment spec: # selector.matchLabels is provided via Kustomize template: spec: containers: - - name: rights-statements - image: europeana/rights-statements + - name: rights-app + image: europeana/rights-app ports: - containerPort: 8080 livenessProbe: diff --git a/k8s/base/kustomization.yaml b/k8s/base/kustomization.yaml index 74ee044..334e510 100644 --- a/k8s/base/kustomization.yaml +++ b/k8s/base/kustomization.yaml @@ -4,5 +4,5 @@ resources: labels: - includeSelectors: true pairs: - app: rights-statements + app: rights-app diff --git a/k8s/overlays/cloud/deployment_patch.yaml.template b/k8s/overlays/cloud/deployment_patch.yaml.template index 374f04c..4e27106 100644 --- a/k8s/overlays/cloud/deployment_patch.yaml.template +++ b/k8s/overlays/cloud/deployment_patch.yaml.template @@ -1,7 +1,7 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: rights-statements-deployment + name: rights-app-deployment spec: replicas: ${MIN_REPLICAS} template: @@ -11,7 +11,7 @@ spec: fluentd/multiline: 'true' spec: containers: - - name: rights-statements + - name: rights-app imagePullPolicy: Always resources: requests: diff --git a/k8s/overlays/cloud/hpa.yaml.template b/k8s/overlays/cloud/hpa.yaml.template index 8884eba..afde469 100644 --- a/k8s/overlays/cloud/hpa.yaml.template +++ b/k8s/overlays/cloud/hpa.yaml.template @@ -1,14 +1,14 @@ apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: - name: rights-statements-hpa + name: rights-app-hpa spec: maxReplicas: ${MAX_REPLICAS} minReplicas: ${MIN_REPLICAS} scaleTargetRef: apiVersion: apps/v1 kind: Deployment - name: rights-statements-deployment + name: rights-app-deployment behavior: scaleDown: stabilizationWindowSeconds: 600 diff --git a/k8s/overlays/cloud/ingress.yaml.template b/k8s/overlays/cloud/ingress.yaml.template index cd96e77..b951bbd 100644 --- a/k8s/overlays/cloud/ingress.yaml.template +++ b/k8s/overlays/cloud/ingress.yaml.template @@ -1,7 +1,7 @@ apiVersion: networking.k8s.io/v1 kind: Ingress metadata: - name: rights-statements-ingress + name: rights-app-ingress annotations: ${K8S_INGRESS_ANNOTATIONS} spec: @@ -18,6 +18,6 @@ spec: pathType: Prefix backend: service: - name: rights-statements-service + name: rights-app-service port: number: 80 \ No newline at end of file diff --git a/k8s/overlays/cloud/kustomization.yaml b/k8s/overlays/cloud/kustomization.yaml index 0a810b0..65125e7 100644 --- a/k8s/overlays/cloud/kustomization.yaml +++ b/k8s/overlays/cloud/kustomization.yaml @@ -10,4 +10,4 @@ patches: labels: - includeSelectors: true pairs: - app: rights-statements \ No newline at end of file + app: rights-app \ No newline at end of file diff --git a/k8s/overlays/cloud/service.yaml b/k8s/overlays/cloud/service.yaml index 90849c0..e7e62cd 100644 --- a/k8s/overlays/cloud/service.yaml +++ b/k8s/overlays/cloud/service.yaml @@ -1,7 +1,7 @@ apiVersion: v1 kind: Service metadata: - name: rights-statements-service + name: rights-app-service spec: # selector provided via kustomize ports: diff --git a/k8s/overlays/dev/deployment_patch.yaml b/k8s/overlays/dev/deployment_patch.yaml index 93e2fbe..7c623b3 100644 --- a/k8s/overlays/dev/deployment_patch.yaml +++ b/k8s/overlays/dev/deployment_patch.yaml @@ -1,11 +1,11 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: rights-statements-deployment + name: rights-app-deployment spec: template: spec: containers: - - name: rights-statements + - name: rights-app # required to use local image imagePullPolicy: Never \ No newline at end of file diff --git a/k8s/overlays/dev/kustomization.yaml b/k8s/overlays/dev/kustomization.yaml index 99973f0..752f0d2 100644 --- a/k8s/overlays/dev/kustomization.yaml +++ b/k8s/overlays/dev/kustomization.yaml @@ -8,4 +8,4 @@ patches: labels: - includeSelectors: true pairs: - app: rights-statements \ No newline at end of file + app: rights-app \ No newline at end of file diff --git a/k8s/overlays/dev/nodeport.yaml b/k8s/overlays/dev/nodeport.yaml index 3ac38fe..6575080 100644 --- a/k8s/overlays/dev/nodeport.yaml +++ b/k8s/overlays/dev/nodeport.yaml @@ -1,7 +1,7 @@ apiVersion: v1 kind: Service metadata: - name: rights-statements-nodeport + name: rights-app-nodeport spec: type: NodePort ports: From e7f8a31a658c1b99b8f7afc1cba08f43e7ed804d Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Mon, 26 Aug 2024 13:40:42 +0200 Subject: [PATCH 08/65] Changes for k8s app name correction --- k8s/overlays/cloud/service.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/k8s/overlays/cloud/service.yaml b/k8s/overlays/cloud/service.yaml index e7e62cd..4ca45fc 100644 --- a/k8s/overlays/cloud/service.yaml +++ b/k8s/overlays/cloud/service.yaml @@ -7,4 +7,4 @@ spec: ports: - name: http port: 80 - targetPort: 8080 \ No newline at end of file + targetPort: 9000 \ No newline at end of file From ce0b2ea88738cf9b64c0509ee9b49ec4402303ff Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Mon, 26 Aug 2024 13:51:02 +0200 Subject: [PATCH 09/65] Changes for k8s app name correction --- k8s/base/deployment.yaml | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/k8s/base/deployment.yaml b/k8s/base/deployment.yaml index d2ac78a..b41a180 100644 --- a/k8s/base/deployment.yaml +++ b/k8s/base/deployment.yaml @@ -10,22 +10,22 @@ spec: - name: rights-app image: europeana/rights-app ports: - - containerPort: 8080 - livenessProbe: - httpGet: - port: 8080 - path: /actuator/health/liveness - httpHeaders: - - name: Accept - value: application/json - initialDelaySeconds: 90 - periodSeconds: 60 - readinessProbe: - httpGet: - port: 8080 - path: /actuator/health/readiness - httpHeaders: - - name: Accept - value: application/json - initialDelaySeconds: 60 - periodSeconds: 60 + - containerPort: 9000 +# livenessProbe: +# httpGet: +# port: 8080 +# path: /actuator/health/liveness +# httpHeaders: +# - name: Accept +# value: application/json +# initialDelaySeconds: 90 +# periodSeconds: 60 +# readinessProbe: +# httpGet: +# port: 8080 +# path: /actuator/health/readiness +# httpHeaders: +# - name: Accept +# value: application/json +# initialDelaySeconds: 60 +# periodSeconds: 60 From 4a8350323108f92dad4e71bc9c4c862b57d1e9a2 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Mon, 26 Aug 2024 14:19:47 +0200 Subject: [PATCH 10/65] Changes for k8s app name correction --- conf/application.conf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/conf/application.conf b/conf/application.conf index 0e00683..9dbfa18 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -47,4 +47,7 @@ lang="TURTLE" } play.server.pidfile.path=/dev/null -play.http.secret.key = "^Z5sUMS0j^inD7xJ4/vt0rFC?F>y5@kkdiGN:ROV5lfaP1:[ag72[S8gLD90PZWS" \ No newline at end of file +play.http.secret.key = "^Z5sUMS0j^inD7xJ4/vt0rFC?F>y5@kkdiGN:ROV5lfaP1:[ag72[S8gLD90PZWS" +play.filters.hosts { + allowed = ["."] +} \ No newline at end of file From 93bedf6873d6a8b114805f4c52cbbe5888278f51 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Wed, 28 Aug 2024 19:17:27 +0200 Subject: [PATCH 11/65] Changes for response handling and config reading --- app/controllers/Application.java | 163 +++++++++++++------------------ conf/application.conf | 65 +++++++----- conf/routes | 2 +- 3 files changed, 112 insertions(+), 118 deletions(-) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index 182d30e..5cc08d3 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -10,15 +10,18 @@ import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; import com.typesafe.config.ConfigValue; import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; + import org.apache.commons.lang3.StringEscapeUtils; import play.api.Configuration; import play.Logger; import play.api.Environment; +import play.api.http.MediaRange; import play.mvc.Controller; import play.mvc.Http; import play.mvc.Http.Request; @@ -43,17 +46,17 @@ */ public class Application extends Controller { - private static Map mimeTypeParserMap = getMap(ConfigFactory.load().getConfig("parser").entrySet()); + private static Map mimeTypeParserMap = generateValueMap(ConfigFactory.load().getConfig("parser")); - private static Map mimeTypeExtMap = getMap(ConfigFactory.load().getConfig("extension").entrySet()); + private static Map mimeTypeExtMap = generateValueMap(ConfigFactory.load().getConfig("extension")); - private static Map defaults =getMap( ConfigFactory.load().getConfig("default").entrySet()); + private static Map defaults =generateValueMap( ConfigFactory.load().getConfig("default")); - private static Map validParameters = getMap(ConfigFactory.load().getConfig("params").entrySet()); + private static Map validParameters = generateValueMap(ConfigFactory.load().getConfig("params")); - private static Map sparqlQueries = getMap(ConfigFactory.load().getConfig("queries").entrySet()); + private static Map sparqlQueries = generateValueMap(ConfigFactory.load().getConfig("queries")); - private static Map languages = getMap(ConfigFactory.load().getConfig("languages").entrySet()); + private static Map languages = generateValueMap(ConfigFactory.load().getConfig("languages")); private final VocabProvider vocabProvider; @@ -113,12 +116,11 @@ public Result getVocabPage(String version, String language,Http.Request request) return notFoundPage(request); } -// response().setHeader("Link", "<".concat(routes.Application.getVocabPage(version, null) -// .url()).concat(">; rel=derivedfrom")); -// response().setHeader("Content-Language", locale.getLanguage()); + String linkValue = "<".concat(routes.Application.getVocabPage(version, null).url()).concat(">; rel=derivedfrom"); - return getPage(vocab, "/".concat(locale.toLanguageTag()).concat("/statements/vocab.html"), locale.getLanguage(), null,request); + return getPage(vocab, "/".concat(locale.toLanguageTag()).concat("/statements/vocab.html"), locale.getLanguage(), null,request) + .withHeaders("Content-Language", locale.getLanguage(),"Link",linkValue); } public Result getStatement(String id, String version,Http.Request req) { @@ -148,15 +150,14 @@ public Result getStatementData(String id, String version, String extension, Http return notFoundPage(req); } - //MimeType mimeType = getMimeType(req, extension); - String mimeType ="application/json"; -// response().setHeader("Content-Location", routes.Application.getStatementData(id, version, -// mimeTypeExtMap.getOrDefault(mimeType.toString(), defaults.get("mime").toString()).toString()) -// .url()); -// response().setHeader("Link", "<".concat(routes.Application.getStatementData(id, version, null) -// .url()).concat(">; rel=derivedfrom")); + String mimeType = getMimeType(req, extension); + String location = routes.Application.getStatementData(id, version, + mimeTypeExtMap.getOrDefault(mimeType.toString(), defaults.get("mime").toString()) + .toString()).url(); + String link = "<".concat(routes.Application.getStatementData(id, version, null) + .url()).concat(">; rel=derivedfrom"); - return getData(rightsStatement, mimeType); + return getData(rightsStatement, mimeType).withHeaders("Content-Location", location,"Link", link); } @@ -168,13 +169,9 @@ public Result getStatementPage(String id, String version, String language,Http.R if (rightsStatement.isEmpty()) { return notFoundPage(req); } - -// response().setHeader("Link", "<".concat(routes.Application.getStatementPage(id, version, null) -// .url()).concat(">; rel=derivedfrom")); -// response().setHeader("Content-Language", locale.getLanguage()); - - return getPage(rightsStatement, "/en/statement.hbs", locale.getLanguage(), getParameters(req, id),req); - + return getPage(rightsStatement, "/en/statement.hbs", locale.getLanguage(), + getParameters(req, id), req).withHeaders("Content-Language", locale.getLanguage(),"Link", "<".concat(routes.Application.getStatementPage(id, version, null) + .url()).concat(">; rel=derivedfrom")); } public Result getCollection(String id, String version,Http.Request req) { @@ -196,16 +193,13 @@ public Result getCollectionData(String id, String version, String extension,Http return notFoundPage(req); } - // MimeType mimeType = getMimeType(req, extension); + String mimeType = getMimeType(req, extension); - String mimeType ="application/json"; -// response().setHeader("Content-Location", routes.Application.getCollectionData(id, version, -// mimeTypeExtMap.getOrDefault(mimeType.toString(), defaults.get("mime").toString()).toString()) -// .url()); -// response().setHeader("Link", "<".concat(routes.Application.getCollectionData(id, version, null) -// .url()).concat(">; rel=derivedfrom")); - - return getData(collection, mimeType); + String mime = routes.Application.getCollectionData(id, version, + mimeTypeExtMap.getOrDefault(mimeType.toString(), defaults.get("mime").toString()).toString()).url(); + String link = "<".concat(routes.Application.getCollectionData(id, version, null) + .url()).concat(">; rel=derivedfrom"); + return getData(collection, mimeType).withHeaders("Content-Location", mime,"Link", link); } @@ -217,13 +211,11 @@ public Result getCollectionPage(String id, String version, String language,Http. if (collection.isEmpty()) { return notFoundPage(req); } - -// response().setHeader("Link", "<".concat(routes.Application.getCollectionPage(id, version, null) -// .url()).concat(">; rel=derivedfrom")); -// response().setHeader("Content-Language", locale.getLanguage()); - - return getPage(collection, locale.toLanguageTag().concat("/statements/collection-").concat(id).concat(".html"), - locale.getLanguage(), null,req); + String concat = "<".concat(routes.Application.getCollectionPage(id, version, null) + .url()).concat(">; rel=derivedfrom"); + return getPage(collection, + locale.toLanguageTag().concat("/statements/collection-").concat(id).concat(".html"), + locale.getLanguage(), null, req).withHeaders("Link", concat,"Content-Language", locale.getLanguage()); } @@ -289,6 +281,7 @@ private Result getPage(Model model, String templateFile, String language, HashMa return ok(handlebars.compile(templateFile).apply(scope)).as("text/html"); + } private Model getVocabModel(String version) { @@ -321,51 +314,33 @@ private Model getCollectionModel(String id, String version) { } -// private MimeType getMimeType(Http.Request request, String extension) { -// -// if (extension != null) { -// return getMimeTypeByExtension(extension); -// } else { -// return getMimeTypeFromRequest(request); -// } -// -// } - -// private static MimeType getMimeTypeFromRequest(Http.Request request) { -// -// MimeType mimeType; -// List acceptedTypes = request.acceptedTypes(); -// -// try { -// if (! acceptedTypes.isEmpty()) { -// mimeType = new MimeType(request.acceptedTypes().get(0).toString()); -// } else { -// mimeType = new MimeType("*/*"); -// } -// } catch (MimeTypeParseException e) { -// Logger.error(e.toString()); -// mimeType = new MimeType(); -// } -// -// return mimeType; -// -// } - -// private static MimeType getMimeTypeByExtension(@Nonnull String extension) { -// -// for (Map.Entry entry : mimeTypeExtMap.entrySet()) { -// if (entry.getValue().equals(extension)) { -// try { -// return new MimeType(entry.getKey()); -// } catch (MimeTypeParseException e) { -// Logger.error(e.toString()); -// } -// } -// } -// -// return new MimeType(); -// -// } + private String getMimeType(Http.Request request, String extension) { + + if (extension != null) { + return getMimeTypeByExtension(extension); + } else { + return getMimeTypeFromRequest(request); + } + + } + + private static String getMimeTypeFromRequest(Http.Request request) { + String mimeType = "*/*"; + List acceptedTypes = request.acceptedTypes(); + if (!acceptedTypes.isEmpty()) { + mimeType = request.acceptedTypes().get(0).toString(); + } + return mimeType; + } + + private static String getMimeTypeByExtension(String extension) { + for (Map.Entry entry : mimeTypeExtMap.entrySet()) { + if (entry.getValue().equals(extension)) { + return entry.getKey(); + } + } + return "*/*"; + } private Locale getLocale(Http.Request request, String language) { @@ -435,7 +410,7 @@ private void setAlternates(Http.Request request, String id, String version, bool alternates.add(String.format("{\"%s\" 0.9 {text/html}}", pageUrl)); - for ( Entry entry : mimeTypeExtMap.entrySet()) { + for ( Map.Entry entry : mimeTypeExtMap.entrySet()) { if (entry.getKey().equals("*/*")) { continue; } @@ -479,13 +454,13 @@ private String getDeployUrl(Http.Request req) { -private static Map getMap(Set> inputSet){ - return inputSet.stream() - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - -} - - + private static Map generateValueMap(Config queries) { + Map result = new HashMap<>(); + for(String key : queries.root().keySet()){ + result.put(key,queries.getAnyRef(key)); + } + return result; + } public Result index() { return ok(views.html.index.render()); diff --git a/conf/application.conf b/conf/application.conf index 9dbfa18..ea00668 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -5,47 +5,66 @@ vocab.provider = "services.GitVocabProvider" #source.data.formats.turtle.lang = "TURTLE" #source.data.formats.json.ext = ".json" #source.data.formats.json.lang = "JSONLD" -source.data.git.remote = "https://github.com/rightsstatements/data-model.git" +source.data.git.remote = "https://github.com/europeana/rightsstatements-data-model.git" source.data.git.local = "/tmp/data-model" source.data.git.rev = "master" layout.provider = "services.HttpLayoutProvider" -source.site.git.remote = "https://github.com/rightsstatements/rightsstatements.github.io.git" -source.site.git.local = "/tmp/rightsstatements.github.io" -source.site.git.branch = "origin/production-pages" +source.site.git.remote = "https://github.com/europeana/rightsstatements-website.git" +source.site.git.local = "/tmp/rightsstatements-website.git" +source.site.git.branch = "origin/EA-3884-EA-3882-EA-3884-RightsStatement-Upgrade-to-docker-and-set-up-k8s-deployment" default.mime = "application/json" default.parser = "JSON-LD" params.InC-OW-EU = "relatedURL" params.NoC-CR = "relatedURL" params.NoC-OKLR = "relatedURL" params.NoC-NC = "date" -parser.text/turtle = "TURTLE" -parser.application/json = "JSON-LD" -parser.application/ld"+"json = "JSON-LD" -parser."*"/"*" = "JSON-LD" -extension.text/turtle = "ttl" -extension.application/json = "json" -extension.application/ld"+"json = "jsonld" -extension."*"/"*" = "json" -queries.vocab = "CONSTRUCT WHERE {?s \"%1$s\" . ?s ?p ?o}" -queries.statement = "CONSTRUCT WHERE {?s \"%1$s\" . ?s \"%2$s\" . ?s ?p ?o}" -queries.collection = "CONSTRUCT WHERE { \"%2$s\" . ?p ?o }" -queries.localize = "CONSTRUCT {?s ?p ?o} WHERE {?s ?p ?o . FILTER(!isLiteral(?o) || lang(?o) = \"\" || langMatches(lang(?o), \"%1$s\" ))}" +#parser.text/turtle = "TURTLE" +#parser.application/json = "JSON-LD" +#parser."application/ld+json" = "JSON-LD" +#parser."*"/"*" = "JSON-LD" +#extension.text/turtle = "ttl" +#extension.application/json = "json" +#extension."application/ld+json" = "jsonld" +#extension."*"/"*" = "json" +queries{ +vocab = "CONSTRUCT WHERE {?s \"%1$s\" . ?s ?p ?o}" +statement = "CONSTRUCT WHERE {?s \"%1$s\" . ?s \"%2$s\" . ?s ?p ?o}" +collection = "CONSTRUCT WHERE { \"%2$s\" . ?p ?o }" +localize = "CONSTRUCT {?s ?p ?o} WHERE {?s ?p ?o . FILTER(!isLiteral(?o) || lang(?o) = \"\" || langMatches(lang(?o), \"%1$s\" ))}" +} + + languages.available = "en ca de es et fi fr hi hr it lt nl pl" source.site.http = "http://localhost:4000" source.site.local="/resources" source.data.formats{ -json { -ext =".json" -lang ="JSONLD" + json { + ext =".json" + lang ="JSONLD" + } + turtle { + ext=".ttl" + lang="TURTLE" + } } -turtle { -ext=".ttl" -lang="TURTLE" + +parser{ +text/turtle = "TURTLE" +application/json = "JSON-LD" +#application/ld+json = "JSON-LD" + #"*"/"*" = "JSON-LD" } +extension { + text/turtle = "ttl" + application/json = "json" + #"application/ld+json" = "jsonld" + #"*"/"*" = "json" + } + + -} play.server.pidfile.path=/dev/null play.http.secret.key = "^Z5sUMS0j^inD7xJ4/vt0rFC?F>y5@kkdiGN:ROV5lfaP1:[ag72[S8gLD90PZWS" play.filters.hosts { diff --git a/conf/routes b/conf/routes index 7e48284..0114fb2 100644 --- a/conf/routes +++ b/conf/routes @@ -1,4 +1,4 @@ -GET / controllers.Application.index() +#GET / controllers.Application.index() GET /vocab/:version/ controllers.Application.getVocab(version: String, request: Request) GET /vocab/collection-:id/:version/ controllers.Application.getCollection(id: String, version: String,request: Request) GET /vocab/:id/:version/ controllers.Application.getStatement(id: String, version: String,request: Request) From 9c28cba6e70d5034f6af9e5c83e684f93abc9db2 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Wed, 28 Aug 2024 22:30:22 +0200 Subject: [PATCH 12/65] Changes for response handling and config reading --- conf/application.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/application.conf b/conf/application.conf index ea00668..562ffaa 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -35,7 +35,7 @@ localize = "CONSTRUCT {?s ?p ?o} WHERE {?s ?p ?o . FILTER(!isLiteral(?o) || lang languages.available = "en ca de es et fi fr hi hr it lt nl pl" -source.site.http = "http://localhost:4000" +source.site.http = "https://rights-app-website.test.eanadev.org" source.site.local="/resources" source.data.formats{ From d4bc89f30f0508c5b1cf2df76eacbd49cf22eaa4 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Wed, 28 Aug 2024 22:47:09 +0200 Subject: [PATCH 13/65] Changes for response handling and config reading --- conf/application.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/application.conf b/conf/application.conf index 562ffaa..158afac 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -35,7 +35,7 @@ localize = "CONSTRUCT {?s ?p ?o} WHERE {?s ?p ?o . FILTER(!isLiteral(?o) || lang languages.available = "en ca de es et fi fr hi hr it lt nl pl" -source.site.http = "https://rights-app-website.test.eanadev.org" +source.site.http = "http://rights-app-website.test.eanadev.org" source.site.local="/resources" source.data.formats{ From 10cba03996f81ed7a822e6661e4769e4a4eb3ec5 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Thu, 29 Aug 2024 10:22:17 +0200 Subject: [PATCH 14/65] Changes for response handling and config reading --- app/controllers/Application.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index 5cc08d3..6e1a27b 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -427,7 +427,7 @@ private void setAlternates(Http.Request request, String id, String version, bool private HashMap getParameters(Http.Request request, String id) { HashMap parameters = new HashMap<>(); - String validParameters = Application.validParameters.get(id).toString(); + String validParameters = Application.validParameters.get(id)!=null? Application.validParameters.get(id).toString():null; if (validParameters != null) { for (String validParameter : validParameters.split(" ")) { From 0622fd41a2b33875ea4436d6308d96d4b8216f02 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Tue, 3 Sep 2024 09:55:50 +0200 Subject: [PATCH 15/65] Changes for response handling and config reading --- app/controllers/Application.java | 79 ++++++++++++++++++-------------- conf/application.conf | 22 +++++---- conf/environment.conf | 1 + 3 files changed, 57 insertions(+), 45 deletions(-) create mode 100644 conf/environment.conf diff --git a/app/controllers/Application.java b/app/controllers/Application.java index 6e1a27b..fc5371c 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -12,10 +12,6 @@ import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; -import com.typesafe.config.ConfigValue; -import java.util.Map.Entry; -import java.util.Set; -import java.util.stream.Collectors; import org.apache.commons.lang3.StringEscapeUtils; import play.api.Configuration; @@ -46,9 +42,27 @@ */ public class Application extends Controller { - private static Map mimeTypeParserMap = generateValueMap(ConfigFactory.load().getConfig("parser")); + private static Map mimeTypeParserMap = generateParserMap();// generateValueMap(ConfigFactory.load().getConfig("parser")); - private static Map mimeTypeExtMap = generateValueMap(ConfigFactory.load().getConfig("extension")); + private static Map generateParserMap() { + Map mimeTypeParserMap = new HashMap<>(); + mimeTypeParserMap.put("text/turtle","TURTLE"); + mimeTypeParserMap.put("application/json","JSON-LD"); + mimeTypeParserMap.put("application/ld+json","JSON-LD"); + mimeTypeParserMap.put("*/*","JSON-LD"); + return mimeTypeParserMap; + } + + private static Map mimeTypeExtMap = generateExtentionsMap();//generateValueMap(ConfigFactory.load().getConfig("extension")); + + private static Map generateExtentionsMap() { + Map extensionsMap = new HashMap<>(); + extensionsMap.put("text/turtle" ,"ttl"); + extensionsMap.put("application/json" ,"json"); + extensionsMap.put("application/ld+json" ,"jsonld"); + extensionsMap.put("*/*" ,"json"); + return extensionsMap; + } private static Map defaults =generateValueMap( ConfigFactory.load().getConfig("default")); @@ -95,15 +109,13 @@ public Result getVocabData(String version, String extension, Http.Request reques return notFoundPage(request); } - //MimeType mimeType = getMimeType(request, extension); - String mimeType ="application/json"; -// response().setHeader("Content-Location", routes.Application.getVocabData(version, -// mimeTypeExtMap.getOrDefault(mimeType.toString(), defaults.get("mime").toString()).toString()) -// .url()); -// response().setHeader("Link", "<".concat(routes.Application.getVocabData(version, null) -// .url()).concat(">; rel=derivedfrom")); - return getData(vocab, mimeType); + String mimeType =getMimeType(request, extension); + String mime = routes.Application.getVocabData(version,mimeTypeExtMap.getOrDefault(mimeType.toString(), + defaults.get("mime").toString()).toString()).url(); + String link = "<".concat(routes.Application.getVocabData(version, null) + .url()).concat(">; rel=derivedfrom"); + return getData(vocab, mimeType).withHeaders("Content-Location", mime,"Link", link); } @@ -126,8 +138,7 @@ public Result getVocabPage(String version, String language,Http.Request request) public Result getStatement(String id, String version,Http.Request req) { if (!req.queryString().isEmpty()) { - setAlternates(req, id, version, true); - return notAcceptablePage(req); + return notAcceptablePage(req).withHeaders("Alternates", setAlternates(req, id, version, true)); } else if (req.accepts("text/html")) { Locale locale = getLocale(req, null); return redirect(routes.Application.getStatementPage(id, version, locale.getLanguage()).url()); @@ -140,8 +151,7 @@ public Result getStatement(String id, String version,Http.Request req) { public Result getStatementData(String id, String version, String extension, Http.Request req) { if (!req.queryString().isEmpty()) { - setAlternates(req, id, version, false); - return notAcceptablePage(req); + return notAcceptablePage(req).withHeaders("Alternates",setAlternates(req, id, version, false)); } Model rightsStatement = getStatementModel(id, version); @@ -213,9 +223,10 @@ public Result getCollectionPage(String id, String version, String language,Http. } String concat = "<".concat(routes.Application.getCollectionPage(id, version, null) .url()).concat(">; rel=derivedfrom"); - return getPage(collection, + Result result = getPage(collection, locale.toLanguageTag().concat("/statements/collection-").concat(id).concat(".html"), - locale.getLanguage(), null, req).withHeaders("Link", concat,"Content-Language", locale.getLanguage()); + locale.getLanguage(), null, req); + return result.withHeaders("Link", concat,"Content-Language", locale.getLanguage()); } @@ -266,7 +277,12 @@ private Result getPage(Model model, String templateFile, String language, HashMa OutputStream boas = new ByteArrayOutputStream(); localized.write(boas, "JSON-LD"); - scope.put("data", new ObjectMapper().readValue(boas.toString(), HashMap.class)); + + String output = boas.toString(); + String replacedUrlOutput = output.replace("http://rightsstatements.org/", + configuration.underlying().getString("siteurl")); + scope.put("data", new ObjectMapper().readValue(replacedUrlOutput, HashMap.class)); + TemplateLoader loader = layoutProvider.getTemplateLoader(); loader.setPrefix(getDeployUrl(req)); @@ -279,7 +295,9 @@ private Result getPage(Model model, String templateFile, String language, HashMa Logger.error(e.toString()); } - return ok(handlebars.compile(templateFile).apply(scope)).as("text/html"); + String apply = handlebars.compile(templateFile).apply(scope); + + return ok(apply).as("text/html"); } @@ -383,33 +401,23 @@ private Locale[] getLocalesByCode(String code) { } - private void setAlternates(Http.Request request, String id, String version, boolean includeVocab) { - - Map parameters = request.queryString(); - - if (parameters.size() > 0) { + private String setAlternates(Request request, String id, String version, boolean includeVocab) { + List alternates = new ArrayList<>(); + if (request.queryString().size() > 0) { List recoveryParameters = new ArrayList<>(); - for (Map.Entry parameter : getParameters(request, id).entrySet()) { recoveryParameters.add(parameter.getKey().concat("=").concat(parameter.getValue())); } - if (!recoveryParameters.isEmpty()) { - String vocabUrl = routes.Application.getStatement(id, version).url(); String pageUrl = routes.Application.getStatementPage(id, version, null).url().concat("?") .concat(String.join("&", recoveryParameters)); String dataUrl = routes.Application.getStatementData(id, version, null).url(); - - List alternates = new ArrayList<>(); - if (includeVocab) { alternates.add(String.format("{\"%s\" 0.9}", vocabUrl)); } - alternates.add(String.format("{\"%s\" 0.9 {text/html}}", pageUrl)); - for ( Map.Entry entry : mimeTypeExtMap.entrySet()) { if (entry.getKey().equals("*/*")) { continue; @@ -421,6 +429,7 @@ private void setAlternates(Http.Request request, String id, String version, bool } } + return String.join(",", alternates); } diff --git a/conf/application.conf b/conf/application.conf index 158afac..1ed104d 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -49,18 +49,18 @@ source.data.formats{ } } -parser{ -text/turtle = "TURTLE" -application/json = "JSON-LD" +#parser{ +#text/turtle = "TURTLE" +#application/json = "JSON-LD" #application/ld+json = "JSON-LD" - #"*"/"*" = "JSON-LD" -} -extension { - text/turtle = "ttl" - application/json = "json" +#"*"/"*" = "JSON-LD" +#} +#extension { + # text/turtle = "ttl" + #application/json = "json" #"application/ld+json" = "jsonld" #"*"/"*" = "json" - } + #} @@ -69,4 +69,6 @@ play.server.pidfile.path=/dev/null play.http.secret.key = "^Z5sUMS0j^inD7xJ4/vt0rFC?F>y5@kkdiGN:ROV5lfaP1:[ag72[S8gLD90PZWS" play.filters.hosts { allowed = ["."] -} \ No newline at end of file +} + +siteurl = "http://rights-app.test.eanadev.org/" \ No newline at end of file diff --git a/conf/environment.conf b/conf/environment.conf new file mode 100644 index 0000000..87e60ec --- /dev/null +++ b/conf/environment.conf @@ -0,0 +1 @@ +include "application.conf" From 375ffeb6f5ef7e3e527122dea01c35bb89af7729 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Tue, 3 Sep 2024 12:27:53 +0200 Subject: [PATCH 16/65] Changes for response handling and config reading --- app/controllers/Application.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index fc5371c..8f02b98 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -14,6 +14,7 @@ import com.typesafe.config.ConfigFactory; import org.apache.commons.lang3.StringEscapeUtils; +import play.Logger.ALogger; import play.api.Configuration; import play.Logger; import play.api.Environment; @@ -43,6 +44,7 @@ public class Application extends Controller { private static Map mimeTypeParserMap = generateParserMap();// generateValueMap(ConfigFactory.load().getConfig("parser")); + private ALogger logger =Logger.of(this.getClass()); private static Map generateParserMap() { Map mimeTypeParserMap = new HashMap<>(); @@ -283,6 +285,7 @@ private Result getPage(Model model, String templateFile, String language, HashMa configuration.underlying().getString("siteurl")); scope.put("data", new ObjectMapper().readValue(replacedUrlOutput, HashMap.class)); + logger.info(replacedUrlOutput); TemplateLoader loader = layoutProvider.getTemplateLoader(); loader.setPrefix(getDeployUrl(req)); From 9f1c5754473159a4b80312edcc067bfffce3f1e7 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Tue, 3 Sep 2024 16:11:32 +0200 Subject: [PATCH 17/65] Changes for response handling and config reading --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index a8ac7e4..3d0746b 100644 --- a/build.sbt +++ b/build.sbt @@ -16,7 +16,7 @@ libraryDependencies += "com.google.inject" % "guice" % "3+" libraryDependencies += guice Test / javaOptions += "-Dconfig.file=conf/test.conf" -Universal / javaOptions ++= Seq("-Dpidfile.path=/dev/null") +Universal / javaOptions ++= Seq("-Dpidfile.path=/dev/null","-Dconfig.file=conf/environment.conf") scalaVersion := "2.13.14" enablePlugins(JavaAppPackaging,DockerPlugin) From a3b32163997aa3ab9837fa09a744cb2be626a4f3 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Tue, 3 Sep 2024 16:59:23 +0200 Subject: [PATCH 18/65] Changes for response handling and config reading --- conf/application.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/application.conf b/conf/application.conf index 1ed104d..72da43e 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -35,7 +35,7 @@ localize = "CONSTRUCT {?s ?p ?o} WHERE {?s ?p ?o . FILTER(!isLiteral(?o) || lang languages.available = "en ca de es et fi fr hi hr it lt nl pl" -source.site.http = "http://rights-app-website.test.eanadev.org" +source.site.http = "https://rights-app-website.test.eanadev.org" source.site.local="/resources" source.data.formats{ @@ -71,4 +71,4 @@ play.filters.hosts { allowed = ["."] } -siteurl = "http://rights-app.test.eanadev.org/" \ No newline at end of file +siteurl = "https://rights-app.test.eanadev.org/" \ No newline at end of file From bc2835fe6814c6d1e6fefffb419bcc9fcffec7fc Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Tue, 3 Sep 2024 17:11:08 +0200 Subject: [PATCH 19/65] Changes for id matching --- public/js/helpers.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/public/js/helpers.js b/public/js/helpers.js index 99ea4ab..a223e38 100644 --- a/public/js/helpers.js +++ b/public/js/helpers.js @@ -9,7 +9,10 @@ Handlebars.registerHelper('a', function (href, options) { Handlebars.registerHelper('resource', function(id, graph, options) { for (var i = 0; i < graph.length; i++) { - if (graph[i]['@id'] == id) { + const va1 = graph[i]['@id'].split(":"); + const va2 = id.split(":"); + //console.log(id); + if (va1[1] == va2[1]) { return options.fn(graph[i]); } } @@ -26,7 +29,9 @@ Handlebars.registerHelper('property', function(property, graph, options) { for (var i = 0; i < property.length; i++) { for (var j = 0; j < graph.length; j++) { - if (graph[j]['@id'] == property[i]) { + const va1 = graph[j]['@id'].split(":"); + const va2 = property[i].split(":"); + if (va1[1] == va2[1]) { graphs.push(graph[j]); } } From eb7f67708576558b8db02e60eb7d77d5f704c934 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Tue, 3 Sep 2024 17:13:50 +0200 Subject: [PATCH 20/65] Changes for id matching --- conf/application.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/application.conf b/conf/application.conf index 72da43e..14f1ba8 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -71,4 +71,4 @@ play.filters.hosts { allowed = ["."] } -siteurl = "https://rights-app.test.eanadev.org/" \ No newline at end of file +siteurl = "http://rights-app.test.eanadev.org/" \ No newline at end of file From 12be44695ad6f84ad83acb244764d1c685a34d93 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Tue, 3 Sep 2024 17:21:30 +0200 Subject: [PATCH 21/65] Changes for id matching --- conf/application.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/application.conf b/conf/application.conf index 14f1ba8..1ed104d 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -35,7 +35,7 @@ localize = "CONSTRUCT {?s ?p ?o} WHERE {?s ?p ?o . FILTER(!isLiteral(?o) || lang languages.available = "en ca de es et fi fr hi hr it lt nl pl" -source.site.http = "https://rights-app-website.test.eanadev.org" +source.site.http = "http://rights-app-website.test.eanadev.org" source.site.local="/resources" source.data.formats{ From d205f4a845e4dc3ebc06abc2f095c3068819370d Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Tue, 3 Sep 2024 20:36:55 +0200 Subject: [PATCH 22/65] Changes for id matching --- app/controllers/Application.java | 2 +- conf/application.conf | 4 ++-- conf/logback.xml | 6 +++--- public/js/helpers.js | 13 +++++-------- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index 8f02b98..27bc3ac 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -285,7 +285,7 @@ private Result getPage(Model model, String templateFile, String language, HashMa configuration.underlying().getString("siteurl")); scope.put("data", new ObjectMapper().readValue(replacedUrlOutput, HashMap.class)); - logger.info(replacedUrlOutput); + // logger.info(replacedUrlOutput); TemplateLoader loader = layoutProvider.getTemplateLoader(); loader.setPrefix(getDeployUrl(req)); diff --git a/conf/application.conf b/conf/application.conf index 1ed104d..e7573ae 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -35,7 +35,7 @@ localize = "CONSTRUCT {?s ?p ?o} WHERE {?s ?p ?o . FILTER(!isLiteral(?o) || lang languages.available = "en ca de es et fi fr hi hr it lt nl pl" -source.site.http = "http://rights-app-website.test.eanadev.org" +source.site.http = "http://localhost:4000" source.site.local="/resources" source.data.formats{ @@ -71,4 +71,4 @@ play.filters.hosts { allowed = ["."] } -siteurl = "http://rights-app.test.eanadev.org/" \ No newline at end of file +siteurl = "http://localhost:9000/" \ No newline at end of file diff --git a/conf/logback.xml b/conf/logback.xml index 3b3a710..4b2c97b 100644 --- a/conf/logback.xml +++ b/conf/logback.xml @@ -23,9 +23,9 @@ - - - + + + diff --git a/public/js/helpers.js b/public/js/helpers.js index a223e38..fbd7aea 100644 --- a/public/js/helpers.js +++ b/public/js/helpers.js @@ -7,15 +7,14 @@ Handlebars.registerHelper('a', function (href, options) { }); Handlebars.registerHelper('resource', function(id, graph, options) { - +if(!!graph) { for (var i = 0; i < graph.length; i++) { - const va1 = graph[i]['@id'].split(":"); - const va2 = id.split(":"); - //console.log(id); - if (va1[1] == va2[1]) { + if(graph[i]['@id']==id){ return options.fn(graph[i]); } } +} +return "undefined graph"; }); @@ -29,9 +28,7 @@ Handlebars.registerHelper('property', function(property, graph, options) { for (var i = 0; i < property.length; i++) { for (var j = 0; j < graph.length; j++) { - const va1 = graph[j]['@id'].split(":"); - const va2 = property[i].split(":"); - if (va1[1] == va2[1]) { + if(graph[j]['@id']==property[i]) { graphs.push(graph[j]); } } From 609ef6e6cbc8ce304e049987f8043ea906087540 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Tue, 3 Sep 2024 20:57:33 +0200 Subject: [PATCH 23/65] Changes for id matching --- conf/logback.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/logback.xml b/conf/logback.xml index 4b2c97b..3b3a710 100644 --- a/conf/logback.xml +++ b/conf/logback.xml @@ -23,9 +23,9 @@ - - - + + + From d69f50a6fc0ddc9d5431eb0722ac0f9df9d94d66 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Tue, 3 Sep 2024 21:01:44 +0200 Subject: [PATCH 24/65] Changes for id matching --- conf/application.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/application.conf b/conf/application.conf index e7573ae..1ed104d 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -35,7 +35,7 @@ localize = "CONSTRUCT {?s ?p ?o} WHERE {?s ?p ?o . FILTER(!isLiteral(?o) || lang languages.available = "en ca de es et fi fr hi hr it lt nl pl" -source.site.http = "http://localhost:4000" +source.site.http = "http://rights-app-website.test.eanadev.org" source.site.local="/resources" source.data.formats{ @@ -71,4 +71,4 @@ play.filters.hosts { allowed = ["."] } -siteurl = "http://localhost:9000/" \ No newline at end of file +siteurl = "http://rights-app.test.eanadev.org/" \ No newline at end of file From 0278708af42aaffb7f32f862815f8ed272704311 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Wed, 4 Sep 2024 00:39:49 +0200 Subject: [PATCH 25/65] Changes for id matching --- app/controllers/Application.java | 6 +++--- conf/application.conf | 6 ++++-- public/js/helpers.js | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index 27bc3ac..fe54d2d 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -281,9 +281,9 @@ private Result getPage(Model model, String templateFile, String language, HashMa localized.write(boas, "JSON-LD"); String output = boas.toString(); - String replacedUrlOutput = output.replace("http://rightsstatements.org/", - configuration.underlying().getString("siteurl")); - scope.put("data", new ObjectMapper().readValue(replacedUrlOutput, HashMap.class)); +// String replacedUrlOutput = output.replace("http://rightsstatements.org/", +// configuration.underlying().getString("siteurl")); + scope.put("data", new ObjectMapper().readValue(output, HashMap.class)); // logger.info(replacedUrlOutput); diff --git a/conf/application.conf b/conf/application.conf index 1ed104d..9740f76 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -35,7 +35,7 @@ localize = "CONSTRUCT {?s ?p ?o} WHERE {?s ?p ?o . FILTER(!isLiteral(?o) || lang languages.available = "en ca de es et fi fr hi hr it lt nl pl" -source.site.http = "http://rights-app-website.test.eanadev.org" + source.site.local="/resources" source.data.formats{ @@ -71,4 +71,6 @@ play.filters.hosts { allowed = ["."] } -siteurl = "http://rights-app.test.eanadev.org/" \ No newline at end of file + +siteurl = "http://rights-app.test.eanadev.org/" +source.site.http = "http://rights-app-website.test.eanadev.org" \ No newline at end of file diff --git a/public/js/helpers.js b/public/js/helpers.js index fbd7aea..fe389d2 100644 --- a/public/js/helpers.js +++ b/public/js/helpers.js @@ -7,7 +7,7 @@ Handlebars.registerHelper('a', function (href, options) { }); Handlebars.registerHelper('resource', function(id, graph, options) { -if(!!graph) { +if(graph !== null) { for (var i = 0; i < graph.length; i++) { if(graph[i]['@id']==id){ return options.fn(graph[i]); From a751aeb8adf8ff861408816cbc4e9c57095de00f Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Thu, 19 Sep 2024 12:11:24 +0200 Subject: [PATCH 26/65] Changes for common domain name config --- k8s/overlays/cloud/ingress.yaml.template | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/k8s/overlays/cloud/ingress.yaml.template b/k8s/overlays/cloud/ingress.yaml.template index b951bbd..d2ef74f 100644 --- a/k8s/overlays/cloud/ingress.yaml.template +++ b/k8s/overlays/cloud/ingress.yaml.template @@ -14,7 +14,21 @@ spec: - host: ${K8S_HOSTNAME} http: paths: - - path: / + - path: /vocab + pathType: Prefix + backend: + service: + name: rights-app-service + port: + number: 80 + - path: /data + pathType: Prefix + backend: + service: + name: rights-app-service + port: + number: 80 + - path: /page pathType: Prefix backend: service: From cdd95285ec6aabd06f513ccf0df5c8e66b32517b Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Thu, 19 Sep 2024 13:46:24 +0200 Subject: [PATCH 27/65] Changes for overriding properties --- conf/application.conf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/application.conf b/conf/application.conf index 9740f76..b4938fc 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -11,7 +11,7 @@ source.data.git.rev = "master" layout.provider = "services.HttpLayoutProvider" source.site.git.remote = "https://github.com/europeana/rightsstatements-website.git" source.site.git.local = "/tmp/rightsstatements-website.git" -source.site.git.branch = "origin/EA-3884-EA-3882-EA-3884-RightsStatement-Upgrade-to-docker-and-set-up-k8s-deployment" +source.site.git.branch = "origin/master" default.mime = "application/json" default.parser = "JSON-LD" params.InC-OW-EU = "relatedURL" @@ -72,5 +72,5 @@ play.filters.hosts { } -siteurl = "http://rights-app.test.eanadev.org/" -source.site.http = "http://rights-app-website.test.eanadev.org" \ No newline at end of file +siteurl = +source.site.http = \ No newline at end of file From 135f58c13e6b0150161038a7f428a55d3e14bbd9 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Thu, 19 Sep 2024 14:02:57 +0200 Subject: [PATCH 28/65] Changes for overriding properties --- conf/application.conf | 4 ---- 1 file changed, 4 deletions(-) diff --git a/conf/application.conf b/conf/application.conf index b4938fc..cd5865f 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -70,7 +70,3 @@ play.http.secret.key = "^Z5sUMS0j^inD7xJ4/vt0rFC?F>y5@kkdiGN:ROV5lfaP1:[ag72[S8g play.filters.hosts { allowed = ["."] } - - -siteurl = -source.site.http = \ No newline at end of file From 422e20fddc3bf7fc0c24b94276f2028ef46c443f Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Wed, 25 Sep 2024 22:21:50 +0200 Subject: [PATCH 29/65] Changes for conf defaults and cleanup --- app/controllers/Application.java | 69 ------------------------ app/services/DirectoryVocabProvider.java | 12 ++--- app/services/GitVocabProvider.java | 9 +--- app/services/HttpLayoutProvider.java | 4 -- app/services/LayoutProvider.java | 2 - app/services/VocabProvider.java | 2 - app/views/index.scala.html | 8 +-- conf/application.conf | 36 ++----------- 8 files changed, 9 insertions(+), 133 deletions(-) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index fe54d2d..a4f2def 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -26,8 +26,6 @@ import services.LayoutProvider; import services.VocabProvider; -//import javax.activation.MimeType; -//import javax.activation.MimeTypeParseException; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -100,18 +98,13 @@ public Result getVocab(String version, Http.Request request) { Logger.info(routes.Application.getVocabData(version, null).url()); return redirect(routes.Application.getVocabData(version, null).url()); } - } public Result getVocabData(String version, String extension, Http.Request request) { - Model vocab = getVocabModel(version); - if (vocab.isEmpty()) { return notFoundPage(request); } - - String mimeType =getMimeType(request, extension); String mime = routes.Application.getVocabData(version,mimeTypeExtMap.getOrDefault(mimeType.toString(), defaults.get("mime").toString()).toString()).url(); @@ -122,23 +115,17 @@ public Result getVocabData(String version, String extension, Http.Request reques } public Result getVocabPage(String version, String language,Http.Request request) throws IOException { - Model vocab = getVocabModel(version); Locale locale = getLocale(request, language); - if (vocab.isEmpty()) { return notFoundPage(request); } - String linkValue = "<".concat(routes.Application.getVocabPage(version, null).url()).concat(">; rel=derivedfrom"); - - return getPage(vocab, "/".concat(locale.toLanguageTag()).concat("/statements/vocab.html"), locale.getLanguage(), null,request) .withHeaders("Content-Language", locale.getLanguage(),"Link",linkValue); } public Result getStatement(String id, String version,Http.Request req) { - if (!req.queryString().isEmpty()) { return notAcceptablePage(req).withHeaders("Alternates", setAlternates(req, id, version, true)); } else if (req.accepts("text/html")) { @@ -147,30 +134,23 @@ public Result getStatement(String id, String version,Http.Request req) { } else { return redirect(routes.Application.getStatementData(id, version, null).url()); } - } public Result getStatementData(String id, String version, String extension, Http.Request req) { - if (!req.queryString().isEmpty()) { return notAcceptablePage(req).withHeaders("Alternates",setAlternates(req, id, version, false)); } - Model rightsStatement = getStatementModel(id, version); - if (rightsStatement.isEmpty()) { return notFoundPage(req); } - String mimeType = getMimeType(req, extension); String location = routes.Application.getStatementData(id, version, mimeTypeExtMap.getOrDefault(mimeType.toString(), defaults.get("mime").toString()) .toString()).url(); String link = "<".concat(routes.Application.getStatementData(id, version, null) .url()).concat(">; rel=derivedfrom"); - return getData(rightsStatement, mimeType).withHeaders("Content-Location", location,"Link", link); - } public Result getStatementPage(String id, String version, String language,Http.Request req) throws IOException { @@ -187,36 +167,28 @@ public Result getStatementPage(String id, String version, String language,Http.R } public Result getCollection(String id, String version,Http.Request req) { - if (req.accepts("text/html")) { Locale locale = getLocale(req, null); return redirect(routes.Application.getCollectionPage(id, version, locale.getLanguage()).url()); } else { return redirect(routes.Application.getCollectionData(id, version, null).url()); } - } public Result getCollectionData(String id, String version, String extension,Http.Request req) { - Model collection = getCollectionModel(id, version); - if (collection.isEmpty()) { return notFoundPage(req); } - String mimeType = getMimeType(req, extension); - String mime = routes.Application.getCollectionData(id, version, mimeTypeExtMap.getOrDefault(mimeType.toString(), defaults.get("mime").toString()).toString()).url(); String link = "<".concat(routes.Application.getCollectionData(id, version, null) .url()).concat(">; rel=derivedfrom"); return getData(collection, mimeType).withHeaders("Content-Location", mime,"Link", link); - } public Result getCollectionPage(String id, String version, String language,Http.Request req) throws IOException { - Model collection = getVocabModel(version); Locale locale = getLocale(req, language); @@ -229,7 +201,6 @@ public Result getCollectionPage(String id, String version, String language,Http. locale.toLanguageTag().concat("/statements/collection-").concat(id).concat(".html"), locale.getLanguage(), null, req); return result.withHeaders("Link", concat,"Content-Language", locale.getLanguage()); - } private Result notFoundPage(Request request) { @@ -241,7 +212,6 @@ private Result notFoundPage(Request request) { Logger.error(e.toString()); return notFound("Not Found"); } - } private Result notAcceptablePage(Request req) { @@ -253,17 +223,14 @@ private Result notAcceptablePage(Request req) { Logger.error(e.toString()); return status(406, "Not Acceptable"); } - } private Result getData(Model model, String mimeType) { - OutputStream result = new ByteArrayOutputStream(); model.write(result, mimeTypeParserMap.getOrDefault(mimeType, defaults.get("parser")) .toString()); return ok(result.toString()).as( mimeType.equals("*/*") ? defaults.get("mime").toString() : mimeType); - } private Result getPage(Model model, String templateFile, String language, HashMap parameters,Http.Request req) @@ -281,12 +248,7 @@ private Result getPage(Model model, String templateFile, String language, HashMa localized.write(boas, "JSON-LD"); String output = boas.toString(); -// String replacedUrlOutput = output.replace("http://rightsstatements.org/", -// configuration.underlying().getString("siteurl")); scope.put("data", new ObjectMapper().readValue(output, HashMap.class)); - - // logger.info(replacedUrlOutput); - TemplateLoader loader = layoutProvider.getTemplateLoader(); loader.setPrefix(getDeployUrl(req)); Handlebars handlebars = new Handlebars(loader); @@ -297,52 +259,37 @@ private Result getPage(Model model, String templateFile, String language, HashMa } catch (Exception e) { Logger.error(e.toString()); } - String apply = handlebars.compile(templateFile).apply(scope); - return ok(apply).as("text/html"); - - } private Model getVocabModel(String version) { - Model vocab = ModelFactory.createDefaultModel(); QueryExecutionFactory.create(QueryFactory.create(String.format(sparqlQueries.get("vocab").toString(), version)), vocabProvider.getVocab()).execConstruct(vocab); - return vocab; - } private Model getStatementModel(String id, String version) { - Model statement = ModelFactory.createDefaultModel(); QueryExecutionFactory.create(QueryFactory.create(String.format(sparqlQueries.get("statement").toString(), version, id)), vocabProvider.getVocab()).execConstruct(statement); - return statement; - } private Model getCollectionModel(String id, String version) { - Model collection = ModelFactory.createDefaultModel(); QueryExecutionFactory.create(QueryFactory.create(String.format(sparqlQueries.get("collection").toString(), id, version)), vocabProvider.getVocab()).execConstruct(collection); - return collection; - } private String getMimeType(Http.Request request, String extension) { - if (extension != null) { return getMimeTypeByExtension(extension); } else { return getMimeTypeFromRequest(request); } - } private static String getMimeTypeFromRequest(Http.Request request) { @@ -383,25 +330,18 @@ private Locale getLocale(Http.Request request, String language) { } } } - return availableLocales[0]; - } private Locale[] getLocalesFromRequest(Http.Request request) { - if (!request.acceptLanguages().isEmpty()) { return request.acceptLanguages().stream().map(lang -> lang.toLocale()).toArray(Locale[]::new); } - return null; - } private Locale[] getLocalesByCode(String code) { - return new Locale[]{Locale.forLanguageTag(code)}; - } private String setAlternates(Request request, String id, String version, boolean includeVocab) { @@ -427,13 +367,9 @@ private String setAlternates(Request request, String id, String version, boolean } alternates.add(String.format("{\"%s\" 0.9 {".concat(entry.getKey()).concat("}}"), dataUrl)); } - //response().setHeader("Alternates", String.join(",", alternates)); - } - } return String.join(",", alternates); - } private HashMap getParameters(Http.Request request, String id) { @@ -449,9 +385,7 @@ private HashMap getParameters(Http.Request request, String id) { } } } - return parameters; - } private String getDeployUrl(Http.Request req) { @@ -463,9 +397,6 @@ private String getDeployUrl(Http.Request req) { : "/"; } - - - private static Map generateValueMap(Config queries) { Map result = new HashMap<>(); for(String key : queries.root().keySet()){ diff --git a/app/services/DirectoryVocabProvider.java b/app/services/DirectoryVocabProvider.java index f0381d6..ffb9fef 100644 --- a/app/services/DirectoryVocabProvider.java +++ b/app/services/DirectoryVocabProvider.java @@ -28,18 +28,16 @@ public class DirectoryVocabProvider implements VocabProvider { @Inject public DirectoryVocabProvider(Configuration configuration) { - Config source = configuration.underlying().getConfig("source.data"); - //Configuration source = source; String sourceDir = source.getString("dir"); - ConfigList formats = source.getList("formats"); + Config formats = source.getConfig("formats"); Path sourcePath = new File(sourceDir).isAbsolute() ? Paths.get(new File(sourceDir).getPath()) : Paths.get(ClassLoader.getSystemResource(sourceDir).getPath()); - for (ConfigValue format : formats) { - String ext ="";// formats.getConfig(format.subKeys()).get().getString("ext"); - String lang = "";//formats.getConfig(format.toString()).get().getString("lang"); + for (String formatName : formats.root().keySet()) { + String ext = formats.getConfig(formatName).getString("ext"); + String lang = formats.getConfig(formatName).getString("lang"); try (DirectoryStream files = Files.newDirectoryStream(sourcePath, "*".concat(ext))) { for (Path file : files) { vocab.read(Files.newInputStream(file), null, lang); @@ -48,12 +46,10 @@ public DirectoryVocabProvider(Configuration configuration) { Logger.error(e.toString()); } } - } @Override public Model getVocab() { return vocab; } - } diff --git a/app/services/GitVocabProvider.java b/app/services/GitVocabProvider.java index a7c1a14..cc504f7 100644 --- a/app/services/GitVocabProvider.java +++ b/app/services/GitVocabProvider.java @@ -46,7 +46,7 @@ public GitVocabProvider(Configuration configuration) { Config source = configuration.underlying().getConfig("source.data"); Config gitSource = source.getConfig("git"); - Config formats = source.getConfig("formats"); + Config formats = source.getConfig("formats"); try { String remoteURL = gitSource.getString("remote"); @@ -80,19 +80,12 @@ public GitVocabProvider(Configuration configuration) { vocab.read(bais, null, lang); } } - } - revWalk.dispose(); - } - } - } catch (IOException | GitAPIException e) { - Logger.error(e.toString()); - } } diff --git a/app/services/HttpLayoutProvider.java b/app/services/HttpLayoutProvider.java index b01da3c..379c715 100644 --- a/app/services/HttpLayoutProvider.java +++ b/app/services/HttpLayoutProvider.java @@ -17,15 +17,11 @@ public URLTemplateLoader getTemplateLoader() { } public class HttpTemplateLoader extends URLTemplateLoader { - protected URL getResource(final String location) throws IOException { - Logger.debug("Fetching " + location); // TODO: cache templates, see e.g. https://stackoverflow.com/a/45439170 return new URL(location); - } - } } diff --git a/app/services/LayoutProvider.java b/app/services/LayoutProvider.java index d0a442d..7653c86 100644 --- a/app/services/LayoutProvider.java +++ b/app/services/LayoutProvider.java @@ -6,7 +6,5 @@ * Created by fo on 19.04.16. */ public interface LayoutProvider { - URLTemplateLoader getTemplateLoader(); - } diff --git a/app/services/VocabProvider.java b/app/services/VocabProvider.java index 3e83932..b2140a1 100644 --- a/app/services/VocabProvider.java +++ b/app/services/VocabProvider.java @@ -7,7 +7,5 @@ */ public interface VocabProvider { - public Model getVocab(); - } diff --git a/app/views/index.scala.html b/app/views/index.scala.html index a6006d2..e6b601c 100644 --- a/app/views/index.scala.html +++ b/app/views/index.scala.html @@ -5,14 +5,8 @@ Rights statements - - - -

Europeana — Rights statements

- - - +

Rights statements

\ No newline at end of file diff --git a/conf/application.conf b/conf/application.conf index cd5865f..fe4d2d7 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -1,10 +1,7 @@ play.modules.enabled += "modules.VocabProviderModule" play.modules.enabled += "modules.LayoutProviderModule" vocab.provider = "services.GitVocabProvider" -#source.data.formats.turtle.ext = ".ttl" -#source.data.formats.turtle.lang = "TURTLE" -#source.data.formats.json.ext = ".json" -#source.data.formats.json.lang = "JSONLD" + source.data.git.remote = "https://github.com/europeana/rightsstatements-data-model.git" source.data.git.local = "/tmp/data-model" source.data.git.rev = "master" @@ -18,14 +15,7 @@ params.InC-OW-EU = "relatedURL" params.NoC-CR = "relatedURL" params.NoC-OKLR = "relatedURL" params.NoC-NC = "date" -#parser.text/turtle = "TURTLE" -#parser.application/json = "JSON-LD" -#parser."application/ld+json" = "JSON-LD" -#parser."*"/"*" = "JSON-LD" -#extension.text/turtle = "ttl" -#extension.application/json = "json" -#extension."application/ld+json" = "jsonld" -#extension."*"/"*" = "json" + queries{ vocab = "CONSTRUCT WHERE {?s \"%1$s\" . ?s ?p ?o}" statement = "CONSTRUCT WHERE {?s \"%1$s\" . ?s \"%2$s\" . ?s ?p ?o}" @@ -33,11 +23,8 @@ collection = "CONSTRUCT WHERE { Date: Fri, 27 Sep 2024 10:07:58 +0200 Subject: [PATCH 30/65] Changes for conf defaults and cleanup --- k8s/base/deployment.yaml | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/k8s/base/deployment.yaml b/k8s/base/deployment.yaml index b41a180..d2161eb 100644 --- a/k8s/base/deployment.yaml +++ b/k8s/base/deployment.yaml @@ -11,21 +11,21 @@ spec: image: europeana/rights-app ports: - containerPort: 9000 -# livenessProbe: -# httpGet: -# port: 8080 -# path: /actuator/health/liveness -# httpHeaders: -# - name: Accept -# value: application/json -# initialDelaySeconds: 90 -# periodSeconds: 60 -# readinessProbe: -# httpGet: -# port: 8080 -# path: /actuator/health/readiness -# httpHeaders: -# - name: Accept -# value: application/json -# initialDelaySeconds: 60 -# periodSeconds: 60 + livenessProbe: + httpGet: + port: 9000 + path: /page/1.0/ + httpHeaders: + - name: Accept + value: application/json + initialDelaySeconds: 90 + periodSeconds: 60 + readinessProbe: + httpGet: + port: 9000 + path: /page/1.0/ + httpHeaders: + - name: Accept + value: application/json + initialDelaySeconds: 60 + periodSeconds: 60 From dc702d10f30a4231d4e433d2f3b61c420d1b5c13 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Mon, 30 Sep 2024 10:24:34 +0200 Subject: [PATCH 31/65] Changes for conf defaults and cleanup --- build.sbt | 1 + k8s/overlays/cloud/deployment_patch.yaml.template | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/build.sbt b/build.sbt index 3d0746b..1fd8e28 100644 --- a/build.sbt +++ b/build.sbt @@ -13,6 +13,7 @@ libraryDependencies += "com.github.jknack" % "handlebars" % "2.2.2" libraryDependencies += "org.eclipse.jgit" % "org.eclipse.jgit" % "4.0.1.201506240215-r" libraryDependencies += "commons-io" % "commons-io" % "2.4" libraryDependencies += "com.google.inject" % "guice" % "3+" +libraryDependencies += "co.elastic.apm" % "elastic-apm-agent" % "1.34.1" libraryDependencies += guice Test / javaOptions += "-Dconfig.file=conf/test.conf" diff --git a/k8s/overlays/cloud/deployment_patch.yaml.template b/k8s/overlays/cloud/deployment_patch.yaml.template index 4e27106..64f8d54 100644 --- a/k8s/overlays/cloud/deployment_patch.yaml.template +++ b/k8s/overlays/cloud/deployment_patch.yaml.template @@ -13,6 +13,15 @@ spec: containers: - name: rights-app imagePullPolicy: Always + env: + - name: JAVA_TOOL_OPTIONS + value: "-javaagent:/opt/docker/lib/co.elastic.apm.elastic-apm-agent-1.34.1.jar + -Delastic.apm.application_packages=${ELASTIC_APP_PACKAGES} + -Delastic.apm.server_urls=${ELASTIC_APM_SERVERS} + -Delastic.apm.enabled=${COLLECT_APM} + -Delastic.apm.service_name=${APP_NAME} + -Delastic.apm.environment=${K8S_NAMESPACE}" + resources: requests: memory: "${MEMORY_REQUEST}M" From b622039812a99a210773a159edec9ee949f0e9e5 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Tue, 1 Oct 2024 07:59:37 +0200 Subject: [PATCH 32/65] Changes for conf defaults and cleanup --- k8s/base/deployment.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/k8s/base/deployment.yaml b/k8s/base/deployment.yaml index d2161eb..5192e3a 100644 --- a/k8s/base/deployment.yaml +++ b/k8s/base/deployment.yaml @@ -20,6 +20,7 @@ spec: value: application/json initialDelaySeconds: 90 periodSeconds: 60 + timeoutSeconds: 180 readinessProbe: httpGet: port: 9000 @@ -29,3 +30,4 @@ spec: value: application/json initialDelaySeconds: 60 periodSeconds: 60 + timeoutSeconds: 180 From 93d333fe4cfd12915157de2502d16a5b406a3bec Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Tue, 1 Oct 2024 09:01:12 +0200 Subject: [PATCH 33/65] Changes for conf defaults and cleanup --- k8s/base/deployment.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/k8s/base/deployment.yaml b/k8s/base/deployment.yaml index d2161eb..5192e3a 100644 --- a/k8s/base/deployment.yaml +++ b/k8s/base/deployment.yaml @@ -20,6 +20,7 @@ spec: value: application/json initialDelaySeconds: 90 periodSeconds: 60 + timeoutSeconds: 180 readinessProbe: httpGet: port: 9000 @@ -29,3 +30,4 @@ spec: value: application/json initialDelaySeconds: 60 periodSeconds: 60 + timeoutSeconds: 180 From 9330fe5dc4a82a5408174a733f2ef8740474f51c Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Tue, 1 Oct 2024 11:25:42 +0200 Subject: [PATCH 34/65] Changes for conf defaults and cleanup --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 1fd8e28..23bae1a 100644 --- a/build.sbt +++ b/build.sbt @@ -22,5 +22,5 @@ scalaVersion := "2.13.14" enablePlugins(JavaAppPackaging,DockerPlugin) dockerExposedPorts := Seq(9000) -dockerBaseImage := "openjdk:11-jdk" +dockerBaseImage := "openjdk:24-ea-17-slim-bullseye" dockerRepository := Option("docker.io/europeana") From 53bc23440f217784cc7ebb922f5e2e4ecb1b88dc Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Tue, 1 Oct 2024 11:54:38 +0200 Subject: [PATCH 35/65] Changes for conf defaults and cleanup --- conf/logback.xml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/conf/logback.xml b/conf/logback.xml index 3b3a710..589f73e 100644 --- a/conf/logback.xml +++ b/conf/logback.xml @@ -9,6 +9,7 @@ + ${application.home:-.}/logs/application.log @@ -28,14 +29,20 @@ + + 512 + + 0 + + false - + - - + + From 0799d22817f87c80bd3f0f5d2cb8a2eda1368b41 Mon Sep 17 00:00:00 2001 From: Shweta Nazare <128600182+nshweta90@users.noreply.github.com> Date: Tue, 8 Oct 2024 12:20:35 +0200 Subject: [PATCH 36/65] Update application.conf --- conf/application.conf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/conf/application.conf b/conf/application.conf index fe4d2d7..fa29d9c 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -35,8 +35,9 @@ source.data.formats{ lang="TURTLE" } } +source.site.http = "https://rightsstatements.org" play.server.pidfile.path=/dev/null play.http.secret.key = "^Z5sUMS0j^inD7xJ4/vt0rFC?F>y5@kkdiGN:ROV5lfaP1:[ag72[S8gLD90PZWS" play.filters.hosts { allowed = ["."] -} \ No newline at end of file +} From 1133b2e1e433bc2e3fa9725a82d20146e323a24a Mon Sep 17 00:00:00 2001 From: Shweta Nazare <128600182+nshweta90@users.noreply.github.com> Date: Tue, 8 Oct 2024 13:19:45 +0200 Subject: [PATCH 37/65] Update application.conf --- conf/application.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/application.conf b/conf/application.conf index fa29d9c..cfead38 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -35,7 +35,6 @@ source.data.formats{ lang="TURTLE" } } -source.site.http = "https://rightsstatements.org" play.server.pidfile.path=/dev/null play.http.secret.key = "^Z5sUMS0j^inD7xJ4/vt0rFC?F>y5@kkdiGN:ROV5lfaP1:[ag72[S8gLD90PZWS" play.filters.hosts { From ec2a87a67bc8d62e50e9e1a14600d808701c4c84 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Thu, 10 Oct 2024 10:01:16 +0200 Subject: [PATCH 38/65] Changes for using different base image of jdk 17 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 23bae1a..e60cd1b 100644 --- a/build.sbt +++ b/build.sbt @@ -22,5 +22,5 @@ scalaVersion := "2.13.14" enablePlugins(JavaAppPackaging,DockerPlugin) dockerExposedPorts := Seq(9000) -dockerBaseImage := "openjdk:24-ea-17-slim-bullseye" +dockerBaseImage := "eclipse-temurin:17-jdk" dockerRepository := Option("docker.io/europeana") From 9d9a279ea89918fb81f61ab4d9889e8ae20039ef Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Thu, 10 Oct 2024 11:52:25 +0200 Subject: [PATCH 39/65] Changes for endpoint for liveness readiness probe --- conf/routes | 2 +- k8s/base/deployment.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/routes b/conf/routes index 0114fb2..0210560 100644 --- a/conf/routes +++ b/conf/routes @@ -1,4 +1,4 @@ -#GET / controllers.Application.index() +GET /app/ controllers.Application.index() GET /vocab/:version/ controllers.Application.getVocab(version: String, request: Request) GET /vocab/collection-:id/:version/ controllers.Application.getCollection(id: String, version: String,request: Request) GET /vocab/:id/:version/ controllers.Application.getStatement(id: String, version: String,request: Request) diff --git a/k8s/base/deployment.yaml b/k8s/base/deployment.yaml index 5192e3a..8f4f65b 100644 --- a/k8s/base/deployment.yaml +++ b/k8s/base/deployment.yaml @@ -14,7 +14,7 @@ spec: livenessProbe: httpGet: port: 9000 - path: /page/1.0/ + path: /app/ httpHeaders: - name: Accept value: application/json @@ -24,7 +24,7 @@ spec: readinessProbe: httpGet: port: 9000 - path: /page/1.0/ + path: /app/ httpHeaders: - name: Accept value: application/json From 288cfa38c872940e8a6625f34d4370d43cc6c33e Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Mon, 28 Oct 2024 11:41:16 +0100 Subject: [PATCH 40/65] Changes for endpoint for liveness readiness probe --- app/controllers/Application.java | 5 +++-- conf/logback.xml | 6 ++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index a4f2def..6dae3be 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -89,10 +89,10 @@ public Application(VocabProvider vocabProvider, LayoutProvider layoutProvider, C } public Result getVocab(String version, Http.Request request) { - Logger.info("Getting vocab for version: "+version); + Logger.info("Getting vocab for version: {}", version); if (request.accepts("text/html")) { Locale locale = getLocale(request, null); - Logger.info(locale.getLanguage()); + Logger.info("Vocab language : {}",locale.getLanguage()); return redirect(routes.Application.getVocabPage(version, locale.getLanguage()).url()); } else { Logger.info(routes.Application.getVocabData(version, null).url()); @@ -218,6 +218,7 @@ private Result notAcceptablePage(Request req) { TemplateLoader loader = layoutProvider.getTemplateLoader(); loader.setPrefix(getDeployUrl(req)); try { + Logger.error("Request not acceptable : {} {} ",req.method(), req.uri().toString()); return status(406, loader.sourceAt("/en/406.html").content()).as("text/html"); } catch (IOException e) { Logger.error(e.toString()); diff --git a/conf/logback.xml b/conf/logback.xml index 589f73e..4268724 100644 --- a/conf/logback.xml +++ b/conf/logback.xml @@ -14,22 +14,24 @@ ${application.home:-.}/logs/application.log - %date [%level] from %logger in %thread - %message%n%xException + %d{HH:mm:ss.SSS} %level %C:%L [%t] - %m%n - %highlight(%-5level) %logger{15} - %message%n%xException{10} + %d{HH:mm:ss.SSS} %level %C:%L [%t] - %m%n + true + true 512 0 From dd01e9b3cf092b9821c9946ff8c23c036a408aa1 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Tue, 29 Oct 2024 17:58:52 +0100 Subject: [PATCH 41/65] Changes for adding charset for data responses --- app/controllers/Application.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index a4f2def..ae99db3 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -14,6 +14,7 @@ import com.typesafe.config.ConfigFactory; import org.apache.commons.lang3.StringEscapeUtils; +import org.apache.commons.lang3.StringUtils; import play.Logger.ALogger; import play.api.Configuration; import play.Logger; @@ -229,8 +230,11 @@ private Result getData(Model model, String mimeType) { OutputStream result = new ByteArrayOutputStream(); model.write(result, mimeTypeParserMap.getOrDefault(mimeType, defaults.get("parser")) .toString()); - return ok(result.toString()).as( - mimeType.equals("*/*") ? defaults.get("mime").toString() : mimeType); + String contentTypeValue = mimeType.equals("*/*") ? defaults.get("mime").toString() : mimeType; + if(StringUtils.isNotEmpty(contentTypeValue) ) + return ok(result.toString()).as(contentTypeValue + ";charset=utf-8"); + else + return ok(result.toString()); } private Result getPage(Model model, String templateFile, String language, HashMap parameters,Http.Request req) From e28103b5fbbc2a55026eea790b23864b5964cfa1 Mon Sep 17 00:00:00 2001 From: Hugo Manguinhas Date: Thu, 31 Oct 2024 09:41:58 +0100 Subject: [PATCH 42/65] Update messages.properties Adding nofollow tags to external links --- conf/messages.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/messages.properties b/conf/messages.properties index 44a2c90..fb1e8fd 100644 --- a/conf/messages.properties +++ b/conf/messages.properties @@ -1,7 +1,7 @@ -InC-OW-EU = More information about the Item may be found in the following entry in the EU Orphan Works Database: {0} +InC-OW-EU = More information about the Item may be found in the following entry in the EU Orphan Works Database: {0} NoC-NC = The limitations on commercial use of this Item will expire on {0} -NoC-CR = More information about the contractual restrictions can be found here: {0} -NoC-OKLR = More information about the legal restrictions can be found here: {0} +NoC-CR = More information about the contractual restrictions can be found here: {0} +NoC-OKLR = More information about the legal restrictions can be found here: {0} Disclaimer = DISCLAIMER The purpose of this statement is to help the public understand how this Item may be used. When there is a (non-standard) License or contract that governs re-use of the associated Item, this statement only summarizes the effects of some of its terms. It is not a License, and should not be used to license your Work. To license your own Work, use a License offered at https://creativecommons.org/ notices = Notices provider = This statement is provided by rightsstatements.org From bee65758f44343237281dafae9b3aadeec46e651 Mon Sep 17 00:00:00 2001 From: Hugo Manguinhas Date: Thu, 31 Oct 2024 09:45:22 +0100 Subject: [PATCH 43/65] Update messages_ca.properties --- conf/messages_ca.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/messages_ca.properties b/conf/messages_ca.properties index 29998d1..09ddf12 100644 --- a/conf/messages_ca.properties +++ b/conf/messages_ca.properties @@ -1,7 +1,7 @@ -InC-OW-EU = M\u00e9s informaci\u00f3 sobre aquest material est\u00e0 disponible a la seg\u00fcent entrada de la Base de Dades d\u2019Obres \u00d2rfenes: {0} +InC-OW-EU = M\u00e9s informaci\u00f3 sobre aquest material est\u00e0 disponible a la seg\u00fcent entrada de la Base de Dades d\u2019Obres \u00d2rfenes: {0} NoC-NC = Les limitacions per a usos comercials d\u2019aquest material acabaran el {0} -NoC-CR = Podeu trobar m\u00e9s informaci\u00f3 sobre les limitacions contractuals aqu\u00ed: {0} -NoC-OKLR = Podeu trobar m\u00e9s informaci\u00f3 sobre les limitacions legals aqu\u00ed: {0} +NoC-CR = Podeu trobar m\u00e9s informaci\u00f3 sobre les limitacions contractuals aqu\u00ed: {0} +NoC-OKLR = Podeu trobar m\u00e9s informaci\u00f3 sobre les limitacions legals aqu\u00ed: {0} Disclaimer = El prop\u00f2sit d\u2019aquesta Declaraci\u00f3 \u00e9s ajudar al p\u00fablic a entendre de quina manera pot utilitzar el material. Quan hi ha una llic\u00e8ncia o contracte (no est\u00e0ndard) que regula la reutilitzaci\u00f3 del material en q\u00fcesti\u00f3, aquesta Declaraci\u00f3 nom\u00e9s resumeix els efectes d\u2019algunes de les seves condicions. No \u00e9s una llic\u00e8ncia i no s\u2019hauria d\u2019utilitzar per llicenciar l\u2019obra. Per llicenciar una creaci\u00f3 pr\u00f2pia, utilitzeu una de les llic\u00e8ncies que proposa Creative Commons a https://creativecommons.org/ notices = Observacions provider = Aquesta declaraci\u00f3 de drets est\u00e0 proporcionada per rightsstatements.org From 7b6e3bf2c3d5c804d8d42517b540d6bf10a8f80a Mon Sep 17 00:00:00 2001 From: Hugo Manguinhas Date: Thu, 31 Oct 2024 09:46:40 +0100 Subject: [PATCH 44/65] Update messages_de.properties --- conf/messages_de.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/messages_de.properties b/conf/messages_de.properties index 83a3619..ccea0d2 100644 --- a/conf/messages_de.properties +++ b/conf/messages_de.properties @@ -1,7 +1,7 @@ -InC-OW-EU = Weitere Informationen zum Werk sind ggf. in dem folgenden Eintrag in der EU-Datenbank zu verwaisten Werken zu finden: {0} +InC-OW-EU = Weitere Informationen zum Werk sind ggf. in dem folgenden Eintrag in der EU-Datenbank zu verwaisten Werken zu finden: {0} NoC-NC = Die Beschr\u00e4nkung der kommerziellen Nutzung dieses Objekts gilt bis zum: {0} -NoC-CR = Weitergehende Informationen zu den vertraglichen Beschr\u00e4nkungen sind hier zu finden: {0} -NoC-OKLR = Weitergehende Informationen zu den rechtlichen Beschr\u00e4nkungen sind hier zu finden: {0} +NoC-CR = Weitergehende Informationen zu den vertraglichen Beschr\u00e4nkungen sind hier zu finden: {0} +NoC-OKLR = Weitergehende Informationen zu den rechtlichen Beschr\u00e4nkungen sind hier zu finden: {0} Disclaimer = Dieser Rechtehinweis dient dazu, der Allgemeinheit zu helfen zu erkennen, wie das damit ausgezeichnete Objekt genutzt werden kann. Liegt zus\u00e4tzlich eine (nicht standardisierte) Lizenz oder ein Vertrag vor, der die Nutzung des zugeh\u00f6rigen Objektes regelt, fasst der vorliegende Rechtehinweis nur einige der Auswirkungen der darin enthaltenen Bedingungen zusammen. Der Rechtehinweis ist keine Lizenz und sollte nicht genutzt werden, um ein eigenes Werk zu lizenzieren. Um ein eigenes Werk zu lizenzieren, nutzen Sie bitte eine unter https://creativecommons.org/ angebotene Lizenz. notices = Hinweise: provider = Dieser Rechtehinweis wird von rightsstatements.org zur Verf\u00fcgung gestellt. From 093685c42611105695e753a1b7a8f5f4e86f3014 Mon Sep 17 00:00:00 2001 From: Hugo Manguinhas Date: Thu, 31 Oct 2024 09:47:07 +0100 Subject: [PATCH 45/65] Update messages_es.properties --- conf/messages_es.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/messages_es.properties b/conf/messages_es.properties index 9464e93..3f553c0 100644 --- a/conf/messages_es.properties +++ b/conf/messages_es.properties @@ -1,7 +1,7 @@ -InC-OW-EU = M\u00e1s informaci\u00f3n sobre el material puede encontrarse en la siguiente entrada en la Base de Datos de Obras Hu\u00e9rfanas de la Uni\u00f3n Europea: {0} +InC-OW-EU = M\u00e1s informaci\u00f3n sobre el material puede encontrarse en la siguiente entrada en la Base de Datos de Obras Hu\u00e9rfanas de la Uni\u00f3n Europea: {0} NoC-NC = Las limitaciones sobre el uso comercial de este material expirar\u00e1n en {0} -NoC-CR = M\u00e1s informaci\u00f3n sobre las restricciones contractuales disponible en: {0} -NoC-OKLR = M\u00e1s informaci\u00f3n sobre las restricciones legales disponible en: {0} +NoC-CR = M\u00e1s informaci\u00f3n sobre las restricciones contractuales disponible en: {0} +NoC-OKLR = M\u00e1s informaci\u00f3n sobre las restricciones legales disponible en: {0} Disclaimer = AVISO LEGAL El prop\u00f3sito de esta declaraci\u00f3n es ayudar al p\u00fablico a entender de qu\u00e9 forma este material puede ser utilizado. Cuando exista una licencia (no est\u00e1ndar) o un contrato que regule la reutilizaci\u00f3n del material asociado, esta declaraci\u00f3n solamente resume los efectos de algunos de sus t\u00e9rminos. Esta declaraci\u00f3n no es una licencia y no debe ser utilizada para licenciar su obra. Para licenciar su propio trabajo, utilice una de las licencias disponibles en: https://creativecommons.org/ notices = Advertencias provider = Esta declaraci\u00f3n es provista por rightsstatements.org From cf26d671fef0627b0ecd2b97fb4aa524a31afcce Mon Sep 17 00:00:00 2001 From: Hugo Manguinhas Date: Thu, 31 Oct 2024 09:47:28 +0100 Subject: [PATCH 46/65] Update messages_et.properties --- conf/messages_et.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/messages_et.properties b/conf/messages_et.properties index 6ec1c98..624b8e9 100644 --- a/conf/messages_et.properties +++ b/conf/messages_et.properties @@ -1,7 +1,7 @@ -InC-OW-EU = T\u00e4iendavat infot objekti kohta leiab sellekohasest EL orbteoste andmebaasi kandest: {0} +InC-OW-EU = T\u00e4iendavat infot objekti kohta leiab sellekohasest EL orbteoste andmebaasi kandest: {0} NoC-NC = Objekti \u00e4rilise kasutuse piirangud l\u00f5ppevad: {0} -NoC-CR = T\u00e4iendavat infot lepinguliste piirangute kohta leiate aadressilt: {0} -NoC-OKLR = T\u00e4iendavat infot \u00f5iguslike piirangute kohta leiate aadressilt: {0} +NoC-CR = T\u00e4iendavat infot lepinguliste piirangute kohta leiate aadressilt: {0} +NoC-OKLR = T\u00e4iendavat infot \u00f5iguslike piirangute kohta leiate aadressilt: {0} Disclaimer = LAHTI\u00dcTLUS: Autori\u00f5igusliku seisundi deklaratsioon on m\u00f5eldud selgitama \u00fcldsusele objekti kasutamisv\u00f5imalusi. Juhul kui deklaratsiooni objektiks oleva objekti korduvkasutamist reguleerib (mittestandardne) litsents v\u00f5i leping, kujutab deklaratsioon endast vaid selle teatavate s\u00e4tete kokkuv\u00f5tet. See ei ole litsents ning seda ei peaks kasutama oma teose litsentseerimiseks. Oma isikliku loomingu litsentseerimiseks v\u00f5ite kasutada kodulehel https://creativecommons.org/ pakutavaid litsentse. notices = M\u00e4rkused: provider = Deklaratsiooni allikaks on rightsstatements.org. From 63c08e5bd36c58706bbfaca80a59254bdf94efba Mon Sep 17 00:00:00 2001 From: Hugo Manguinhas Date: Thu, 31 Oct 2024 09:47:53 +0100 Subject: [PATCH 47/65] Update messages_fi.properties --- conf/messages_fi.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/messages_fi.properties b/conf/messages_fi.properties index 72200d5..6aa043e 100644 --- a/conf/messages_fi.properties +++ b/conf/messages_fi.properties @@ -1,7 +1,7 @@ -InC-OW-EU = EU:n orpoteostietokannassa on lis\u00e4tietoja t\u00e4st\u00e4 teoksesta osoitteessa: {0} +InC-OW-EU = EU:n orpoteostietokannassa on lis\u00e4tietoja t\u00e4st\u00e4 teoksesta osoitteessa: {0} NoC-NC = Kohteen kaupallista k\u00e4ytt\u00f6\u00e4 koskevat rajoitukset p\u00e4\u00e4ttyv\u00e4t {0} -NoC-CR = Lis\u00e4tietoa sopimuksellisista rajoituksista: {0} -NoC-OKLR = Lis\u00e4tietoa oikeudellisista rajoituksista: {0} +NoC-CR = Lis\u00e4tietoa sopimuksellisista rajoituksista: {0} +NoC-OKLR = Lis\u00e4tietoa oikeudellisista rajoituksista: {0} Disclaimer = VASTUUVAPAUSLAUSEKE T\u00e4m\u00e4n kuvauksen tarkoituksena on auttaa yleis\u00f6\u00e4 ymm\u00e4rt\u00e4m\u00e4\u00e4n, kuinka t\u00e4t\u00e4 Kohdetta voi k\u00e4ytt\u00e4\u00e4. Silloin kun kyseisen Kohteen uudelleenk\u00e4yt\u00f6st\u00e4 m\u00e4\u00e4r\u00e4t\u00e4\u00e4n (muussa kuin vakiomuotoisessa) lisenssiss\u00e4 tai sopimuksessa, t\u00e4m\u00e4 kuvaus on ainoastaan tiivistelm\u00e4 ao. asiakirjan tiettyjen ehtojen vaikutuksista. K\u00e4ytt\u00f6oikeuskuvaus ei ole lisenssi, eik\u00e4 sit\u00e4 tule k\u00e4ytt\u00e4\u00e4 teoksesi lisensiointiin. Teoksesi lisensiointiin voit k\u00e4ytt\u00e4\u00e4 seuraavassa osoitteessa saatavilla olevia lisenssej\u00e4: https://creativecommons.org/ notices = Huomautukset provider = T\u00e4m\u00e4n lausunnon tarjoaa: rightsstatements.org From 70f47009dd1f0ae4b62c21fd470f678015ce395b Mon Sep 17 00:00:00 2001 From: Hugo Manguinhas Date: Thu, 31 Oct 2024 09:48:15 +0100 Subject: [PATCH 48/65] Update messages_fr.properties --- conf/messages_fr.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/messages_fr.properties b/conf/messages_fr.properties index 9597de6..ee0b135 100644 --- a/conf/messages_fr.properties +++ b/conf/messages_fr.properties @@ -1,7 +1,7 @@ -InC-OW-EU = De plus amples informations sur l\u2019Objet sont \u00e9ventuellement disponibles via l\u2019entr\u00e9e suivante de la Base de donn\u00e9es des \u0152uvres Orphelines de l\u2019UE : {0} +InC-OW-EU = De plus amples informations sur l\u2019Objet sont \u00e9ventuellement disponibles via l\u2019entr\u00e9e suivante de la Base de donn\u00e9es des \u0152uvres Orphelines de l\u2019UE : {0} NoC-NC = Les restrictions concernant l\u2019utilisation de cet Objet \u00e0 des fins commerciales prendront fin le {0} -NoC-CR = De plus amples informations sur les restrictions contractuelles sont disponibles sur {0} -NoC-OKLR = De plus amples informations sur les restrictions juridiques sont disponibles sur {0} +NoC-CR = De plus amples informations sur les restrictions contractuelles sont disponibles sur {0} +NoC-OKLR = De plus amples informations sur les restrictions juridiques sont disponibles sur {0} Disclaimer = AVERTISSEMENT : La pr\u00e9sente d\u00e9claration vise \u00e0 aider le public \u00e0 comprendre les modalit\u00e9s d\u2019utilisation de cet Objet. Quand l\u2019Objet en question est soumis \u00e0 une Licence ou un contrat ad hoc (\u201cnon standardis\u00e9\u201d), la pr\u00e9sente d\u00e9claration se contente d\u2019\u00e9tablir un r\u00e9sum\u00e9 des effets de certaines de ses clauses. Cette D\u00e9claration ne constitue pas une Licence et ne doit pas \u00eatre utilis\u00e9e pour octroyer une licence sur votre \u0152uvre. Pour octroyer une Licence sur votre propre \u0152uvre, veuillez utiliser une Licence propos\u00e9e sur https://creativecommons.org/ notices = Remarques provider = Cette d\u00e9claration est mise \u00e0 disposition par rightsstatements.org From ddfdebf68a51d0b4d386a01ac82e0986677edd59 Mon Sep 17 00:00:00 2001 From: Hugo Manguinhas Date: Thu, 31 Oct 2024 09:48:44 +0100 Subject: [PATCH 49/65] Update messages_hi.properties --- conf/messages_hi.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/messages_hi.properties b/conf/messages_hi.properties index e314cb3..b989b80 100644 --- a/conf/messages_hi.properties +++ b/conf/messages_hi.properties @@ -1,7 +1,7 @@ -InC-OW-EU = \u0935\u093f\u0937\u092f \u092e\u0947\u0902 \u0914\u0930 \u0905\u0927\u093f\u0915 \u091c\u093e\u0928\u0915\u093e\u0930\u0940 \u0908\u092f\u0942 \u0905\u091c\u094d\u091e\u093e\u0924 \u0915\u093e\u0930\u094d\u092f \u0921\u093e\u091f\u093e\u092c\u0947\u0938 {0} \u092e\u0947\u0902 \u092e\u093f\u0932 \u0938\u0915\u0924\u0940 \u0939\u0948\u0964 +InC-OW-EU = \u0935\u093f\u0937\u092f \u092e\u0947\u0902 \u0914\u0930 \u0905\u0927\u093f\u0915 \u091c\u093e\u0928\u0915\u093e\u0930\u0940 \u0908\u092f\u0942 \u0905\u091c\u094d\u091e\u093e\u0924 \u0915\u093e\u0930\u094d\u092f \u0921\u093e\u091f\u093e\u092c\u0947\u0938 {0} \u092e\u0947\u0902 \u092e\u093f\u0932 \u0938\u0915\u0924\u0940 \u0939\u0948\u0964 NoC-NC = \u0938\u093e\u092e\u0917\u094d\u0930\u0940 \u0915\u0940 \u0935\u093e\u0923\u093f\u091c\u094d\u092f\u093f\u0915 \u0909\u092a\u092f\u094b\u0917\u093f\u0924\u093e \u0907\u0938 \u0924\u093e\u0930\u093f\u0916 {0} \u0915\u094b \u0938\u092e\u093e\u092a\u094d\u200d\u0924 \u0939\u094b \u091c\u093e\u092f\u0947\u0917\u0940\u0964 -NoC-CR = \u0905\u0928\u0941\u092c\u0902\u0927 \u0938\u0902\u092c\u0902\u0927\u0940 \u092a\u094d\u0930\u0924\u093f\u092c\u0902\u0927\u094b\u0902 \u0915\u0947 \u092c\u093e\u0930\u0947 \u092e\u0947\u0902 \u0905\u0927\u093f\u0915 \u091c\u093e\u0928\u0915\u093e\u0930\u0940 \u092f\u0939\u093e\u0902 \u092e\u093f\u0932 \u0938\u0915\u0924\u0940 \u0939\u0948: {0} -NoC-OKLR = [\u0915\u093e\u0928\u0942\u0928\u0940 \u092a\u094d\u0930\u0924\u093f\u092c\u0902\u0927\u094b\u0902 \u0915\u0947 \u092c\u093e\u0930\u0947 \u092e\u0947\u0902 \u0905\u0927\u093f\u0915 \u091c\u093e\u0928\u0915\u093e\u0930\u0940 \u092f\u0939\u093e\u0902 \u092e\u093f\u0932 \u0938\u0915\u0924\u0940 \u0939\u0948: {0} +NoC-CR = \u0905\u0928\u0941\u092c\u0902\u0927 \u0938\u0902\u092c\u0902\u0927\u0940 \u092a\u094d\u0930\u0924\u093f\u092c\u0902\u0927\u094b\u0902 \u0915\u0947 \u092c\u093e\u0930\u0947 \u092e\u0947\u0902 \u0905\u0927\u093f\u0915 \u091c\u093e\u0928\u0915\u093e\u0930\u0940 \u092f\u0939\u093e\u0902 \u092e\u093f\u0932 \u0938\u0915\u0924\u0940 \u0939\u0948: {0} +NoC-OKLR = [\u0915\u093e\u0928\u0942\u0928\u0940 \u092a\u094d\u0930\u0924\u093f\u092c\u0902\u0927\u094b\u0902 \u0915\u0947 \u092c\u093e\u0930\u0947 \u092e\u0947\u0902 \u0905\u0927\u093f\u0915 \u091c\u093e\u0928\u0915\u093e\u0930\u0940 \u092f\u0939\u093e\u0902 \u092e\u093f\u0932 \u0938\u0915\u0924\u0940 \u0939\u0948: {0} Disclaimer = \u0926\u093e\u0935\u093e \u0924\u094d\u092f\u093e\u0917 \u092a\u094d\u0930\u0932\u0947\u0916 (\u0921\u093f\u0938\u094d\u0915\u094d\u0932\u0947\u092e\u0930) \u0907\u0938 \u0915\u0925\u0928 \u0915\u093e \u0909\u0926\u094d\u0926\u0947\u0936\u094d\u092f \u091c\u0928 \u0938\u093e\u0927\u093e\u0930\u0923 \u0915\u094b \u092f\u0939 \u0938\u092e\u091d\u093e\u0928\u093e \u0939\u0948 \u0915\u093f \u0907\u0938 \u0938\u093e\u092e\u0917\u094d\u0930\u0940 \u0915\u093e \u0909\u092a\u092f\u094b\u0917 \u0915\u0948\u0938\u0947 \u0915\u093f\u092f\u093e \u091c\u093e \u0938\u0915\u0924\u093e \u0939\u0948\u0964 \u091c\u092c \u092d\u0940 \u0915\u094b\u0908 (\u0917\u0948\u0930-\u092e\u093e\u0928\u0915) \u0932\u093e\u0907\u0938\u0947\u0902\u0938 \u092f\u093e \u0905\u0928\u0941\u092c\u0902\u0927 \u091c\u094b \u0938\u0902\u092c\u0902\u0927\u093f\u0924 \u0938\u093e\u092e\u0917\u094d\u0930\u0940 \u0915\u0947 \u092a\u0941\u0928\u0903 \u092a\u094d\u0930\u092f\u094b\u0917 \u0915\u094b \u0928\u093f\u092f\u0902\u0924\u094d\u0930\u093f\u0924 \u0915\u0930\u0924\u093e \u0939\u0948, \u0924\u092c \u092f\u0939 \u0915\u0925\u0928 \u0938\u093f\u0930\u094d\u092b \u0907\u0938\u0915\u0947 \u0915\u0941\u091b \u0936\u0930\u094d\u0924\u094b\u0902 \u0915\u0947 \u092a\u094d\u0930\u092d\u093e\u0935\u094b\u0902 \u0915\u094b \u0938\u0902\u0915\u094d\u0937\u0947\u092a \u092e\u0947\u0902 \u092a\u094d\u0930\u0938\u094d\u0924\u0941\u0924 \u0915\u0930\u0924\u093e \u0939\u0948\u0964 \u092f\u0939 \u0915\u094b\u0908 \u0932\u093e\u0907\u0938\u0947\u0902\u0938 \u0928\u0939\u0940\u0902 \u0939\u0948 \u0914\u0930 \u0907\u0938\u0915\u093e \u092a\u094d\u0930\u092f\u094b\u0917 \u0905\u092a\u0928\u0947 \u0915\u093e\u0930\u094d\u092f \u0915\u094b \u0932\u093e\u0907\u0938\u0947\u0902\u0938 \u092a\u094d\u0930\u0926\u093e\u0928 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f \u0928\u0939\u0940\u0902 \u0915\u0930\u0928\u093e \u091a\u093e\u0939\u093f\u090f\u0964 \u0932\u093e\u0907\u0938\u0947\u0902\u0938 \u0915\u0947 \u0932\u093f\u090f http://creativecommons.org/ \u092a\u0930 \u091c\u093e\u090f\u0902 \u0964 notices = \u0938\u0942\u091a\u0928\u093e\u090f\u0902 provider = \u092f\u0939 \u0915\u0925\u0928 rightsstatements.org \u00a0 \u0926\u094d\u0935\u093e\u0930\u093e \u0909\u092a\u0932\u092c\u094d\u0927 \u0915\u0930\u093e\u092f\u093e \u0917\u092f\u093e \u0939\u0948\u0964 From 606373526b66884c7d65ef440f9f8b4355afde89 Mon Sep 17 00:00:00 2001 From: Hugo Manguinhas Date: Thu, 31 Oct 2024 09:49:02 +0100 Subject: [PATCH 50/65] Update messages_hr.properties --- conf/messages_hr.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/messages_hr.properties b/conf/messages_hr.properties index 761e863..64f2387 100644 --- a/conf/messages_hr.properties +++ b/conf/messages_hr.properties @@ -1,7 +1,7 @@ -InC-OW-EU = Vi\u0161e informacija o objektu mo\u017eete prona\u0107i u sljede\u0107em zapisu u Bazi podataka djela siro\u010dadi: {0} +InC-OW-EU = Vi\u0161e informacija o objektu mo\u017eete prona\u0107i u sljede\u0107em zapisu u Bazi podataka djela siro\u010dadi: {0} NoC-NC = Ograni\u010denja za komercijalno kori\u0161tenje ovog objekta istje\u010du {0} -NoC-CR = Vi\u0161e informacija o ugovornim ograni\u010denjima mo\u017eete prona\u0107i ovdje: {0} -NoC-OKLR = Vi\u0161e informacija o zakonskim ograni\u010denjima mo\u017eete prona\u0107i ovdje: {0} +NoC-CR = Vi\u0161e informacija o ugovornim ograni\u010denjima mo\u017eete prona\u0107i ovdje: {0} +NoC-OKLR = Vi\u0161e informacija o zakonskim ograni\u010denjima mo\u017eete prona\u0107i ovdje: {0} Disclaimer = ODRICANJE OD ODGOVORNOSTI Svrha je ove izjave pomo\u0107i javnosti da razumije kako se ovaj objekt mo\u017ee koristiti. Kada postoji (nestandardizirana) licencija ili ugovor koji regulira ponovno kori\u0161tenje povezanog objekta, ova izjava samo sa\u017eima u\u010dinke nekih njezinih uvjeta. Ovo nije licencija i ne smije se koristiti za licenciranje va\u0161eg djela. Za licenciranje vlastitog djela upotrijebite licenciju ponu\u0111enu na https://creativecommons.org/ notices = Obavijesti provider = Ovu izjavu pru\u017ea rightsstatements.org From 59a47d566009971e0521d3725b731ed4942ba8ac Mon Sep 17 00:00:00 2001 From: Hugo Manguinhas Date: Thu, 31 Oct 2024 09:49:23 +0100 Subject: [PATCH 51/65] Update messages_it.properties --- conf/messages_it.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/messages_it.properties b/conf/messages_it.properties index 12b8f76..393f6aa 100644 --- a/conf/messages_it.properties +++ b/conf/messages_it.properties @@ -1,7 +1,7 @@ -InC-OW-EU = Maggiori informazioni riguardo all''oggetto sono disponibili nella seguente voce della Banca dati delle Opere Orfane dell''Ue: {0} +InC-OW-EU = Maggiori informazioni riguardo all''oggetto sono disponibili nella seguente voce della Banca dati delle Opere Orfane dell''Ue: {0} NoC-NC = Le limitazioni all''uso commerciale di questo oggetto termineranno il {0} -NoC-CR = Maggiori informazioni sulle restrizioni contrattuali sono disponibili qui: {0} -NoC-OKLR = Maggiori informazioni sulle restrizioni legali sono disponibili qui: {0} +NoC-CR = Maggiori informazioni sulle restrizioni contrattuali sono disponibili qui: {0} +NoC-OKLR = Maggiori informazioni sulle restrizioni legali sono disponibili qui: {0} Disclaimer = DISCLAIMER Lo scopo di questa dichiarazione \u00e8 di aiutare il pubblico a capire come questo oggetto pu\u00f2 essere utilizzato. Quando esistono una licenza o un contratto (non standard) che disciplinano il riuso dell''oggetto associato, questa dichiarazione riassume solo gli effetti di alcuni dei loro termini. Non \u00e8 una licenza e non deve essere usata per dare in licenza la propria opera. Per concedere in licenza la propria opera, utilizzare una licenza disponibile all''indirizzo https://creativecommons.org/ notices = Avvisi provider = Questa dichiarazione \u00e8 fornita da rightsstatements.org From 59b772ba0a0ac04f199284cd79e01602d751942e Mon Sep 17 00:00:00 2001 From: Hugo Manguinhas Date: Thu, 31 Oct 2024 09:49:41 +0100 Subject: [PATCH 52/65] Update messages_lt.properties --- conf/messages_lt.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/messages_lt.properties b/conf/messages_lt.properties index 95e2ee5..de76536 100644 --- a/conf/messages_lt.properties +++ b/conf/messages_lt.properties @@ -1,7 +1,7 @@ -InC-OW-EU = Daugiau informacijos apie Objekt\u0105 galima rasti \u0161iame \u012fra\u0161e ES \u201ek\u016brini\u0173 na\u0161lai\u010di\u0173\u201c duomen\u0173 baz\u0117je: {0} +InC-OW-EU = Daugiau informacijos apie Objekt\u0105 galima rasti \u0161iame \u012fra\u0161e ES \u201ek\u016brini\u0173 na\u0161lai\u010di\u0173\u201c duomen\u0173 baz\u0117je: {0} NoC-NC = Ribojimai komerciniam Objekto panaudojimui nustos galioti {0} -NoC-CR = Daugiau informacijos apie sutartinius apribojimus galite rasti \u010dia: {0} -NoC-OKLR = Daugiau informacijos apie teisinius apribojimus galite rasti \u010dia: {0} +NoC-CR = Daugiau informacijos apie sutartinius apribojimus galite rasti \u010dia: {0} +NoC-OKLR = Daugiau informacijos apie teisinius apribojimus galite rasti \u010dia: {0} Disclaimer = ATSAKOMYB\u0116S APRIBOJIMAS \u0160ios pareik\u0161ties tikslas yra pad\u0117ti visuomen\u0117s nariams suprasti, kaip \u0161\u012f Objekt\u0105 galima naudoti. Tais atvejais, kai Objekto pakartotiniam panaudojimui taikoma (nestandartin\u0117) Licencija ar sutartis, \u0161i pareik\u0161tis tik pateikia kai kuri\u0173 naudojimo s\u0105lyg\u0173 apibendrinim\u0105. \u0160i pareik\u0161tis n\u0117ra Licencija, netur\u0117tum\u0117te jos taikyti savo k\u016brybos licencijavimui. Nor\u0117dami savo k\u016brin\u012f licencijuoti, pasirinkite vien\u0105 licencij\u0173, si\u016blom\u0173 https://creativecommons.org/ notices = Pastabos provider = \u0160i pareik\u0161tis pateikiama a rightsstatements.org From 2382c6cf1194cbf8c1b2dbb84d459d57d7a90f85 Mon Sep 17 00:00:00 2001 From: Hugo Manguinhas Date: Thu, 31 Oct 2024 09:50:01 +0100 Subject: [PATCH 53/65] Update messages_nl.properties --- conf/messages_nl.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/messages_nl.properties b/conf/messages_nl.properties index 987efbd..0dd02a0 100644 --- a/conf/messages_nl.properties +++ b/conf/messages_nl.properties @@ -1,7 +1,7 @@ -InC-OW-EU = Meer informatie over het Item vind je op de volgende pagina in de Europese Databank voor Verweesde Werken: {0} +InC-OW-EU = Meer informatie over het Item vind je op de volgende pagina in de Europese Databank voor Verweesde Werken: {0} NoC-NC = De beperkingen op commercieel gebruik van dit Item vervallen op {0} -NoC-CR = Meer informatie over de contractuele beperkingen vind je hier: {0} -NoC-OKLR = Meer informatie over de wettelijke beperkingen vind je hier: {0} +NoC-CR = Meer informatie over de contractuele beperkingen vind je hier: {0} +NoC-OKLR = Meer informatie over de wettelijke beperkingen vind je hier: {0} Disclaimer = DISCLAIMER Het doel van deze verklaring is om het publiek te helpen begrijpen hoe dit Item gebruikt kan worden. Wanneer er een (niet-standaard) licentie of contract is die het hergebruik van het bijbehorende Item regelt, geeft deze verklaring alleen een samenvatting van de effecten van sommige voorwaarden. Deze verklaring is geen Licentie en dient niet gebruikt te worden om je Werk te licenti\u00ebren. Gebruik een licentie aangeboden op https://creativecommons.org/ om je werk te licenti\u00ebren. notices = Mededelingen provider = Deze verklaring wordt ter beschikking gesteld door rightsstatements.org From af16a4c28d589c61ef0963fadab167ba058a7b08 Mon Sep 17 00:00:00 2001 From: Hugo Manguinhas Date: Thu, 31 Oct 2024 09:50:20 +0100 Subject: [PATCH 54/65] Update messages_pl.properties --- conf/messages_pl.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/messages_pl.properties b/conf/messages_pl.properties index f18c336..d370074 100644 --- a/conf/messages_pl.properties +++ b/conf/messages_pl.properties @@ -1,7 +1,7 @@ -InC-OW-EU = Wi\u0119cej informacji na temat tego obiektu mo\u017cna znale\u017a\u0107 w nast\u0119puj\u0105cym wpisie w bazie utwor\u00f3w osieroconych UE: {0} +InC-OW-EU = Wi\u0119cej informacji na temat tego obiektu mo\u017cna znale\u017a\u0107 w nast\u0119puj\u0105cym wpisie w bazie utwor\u00f3w osieroconych UE: {0} NoC-NC = Ograniczenia wykorzystania komercyjnego dla tego obiektu przestan\u0105 obowi\u0105zywa\u0107 dnia {0} -NoC-CR = Wi\u0119cej informacji o ograniczeniach wynikaj\u0105cych z um\u00f3w mo\u017cna znale\u017a\u0107 tutaj: {0} -NoC-OKLR = Wi\u0119cej informacji na temat ogranicze\u0144 prawnych mo\u017cna znale\u017a\u0107 tutaj: {0} +NoC-CR = Wi\u0119cej informacji o ograniczeniach wynikaj\u0105cych z um\u00f3w mo\u017cna znale\u017a\u0107 tutaj: {0} +NoC-OKLR = Wi\u0119cej informacji na temat ogranicze\u0144 prawnych mo\u017cna znale\u017a\u0107 tutaj: {0} Disclaimer = ZASTRZE\u017bENIE. Celem tego o\u015bwiadczenia jest pom\u00f3c odbiorcom w zrozumieniu, jak wykorzystywany mo\u017ce by\u0107 dany obiekt. W sytuacji, w kt\u00f3rej istnieje (niestandardowa) licencja lub inna umowa, kt\u00f3ra reguluje zasady wykorzystania obiektu, niniejsze o\u015bwiadczenie jedynie podsumowuje skutki prawne cz\u0119\u015bci zapis\u00f3w tej umowy. To o\u015bwiadczenie to nie jest licencja i nie powinno by\u0107 wykorzystywane do licencjonowania utwor\u00f3w. W celu licencjonowania w\u0142asnych utwor\u00f3w mo\u017cna skorzysta\u0107 z licencji dost\u0119pnych na https://creativecommons.org/ notices = Uwagi provider = To o\u015bwiadczenie jest oferowane przez rightsstatements.org From 3b77b27e5d15853975ac90b5039a006eee18f73e Mon Sep 17 00:00:00 2001 From: Hugo Manguinhas Date: Thu, 31 Oct 2024 09:50:35 +0100 Subject: [PATCH 55/65] Update messages_sv-FI.properties --- conf/messages_sv-FI.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/messages_sv-FI.properties b/conf/messages_sv-FI.properties index 71eac23..3d1c614 100644 --- a/conf/messages_sv-FI.properties +++ b/conf/messages_sv-FI.properties @@ -1,7 +1,7 @@ -InC-OW-EU = Mer information om Objektet finns i f\u00f6ljande post i EU:s databas f\u00f6r anonyma verk: {0} +InC-OW-EU = Mer information om Objektet finns i f\u00f6ljande post i EU:s databas f\u00f6r anonyma verk: {0} NoC-NC = Begr\u00e4nsningarna f\u00f6r kommersiell anv\u00e4ndning av detta objekt upph\u00f6r att g\u00e4lla {0}. -NoC-CR = Mer information om de avtalsm\u00e4ssiga begr\u00e4nsningarna finns h\u00e4r: {0} -NoC-OKLR = Mer information om de r\u00e4ttsliga begr\u00e4nsningarna finns h\u00e4r: {0} +NoC-CR = Mer information om de avtalsm\u00e4ssiga begr\u00e4nsningarna finns h\u00e4r: {0} +NoC-OKLR = Mer information om de r\u00e4ttsliga begr\u00e4nsningarna finns h\u00e4r: {0} Disclaimer = ANSVARSFRISKRIVNING. Avsikten med denna beskrivning \u00e4r att hj\u00e4lpa allm\u00e4nheten att f\u00f6rst\u00e5 hur detta Objekt f\u00e5r anv\u00e4ndas. N\u00e4r det finns en (icke-standard) Licens eller avtal som g\u00e4ller \u00e5teranv\u00e4ndning av ifr\u00e5gavarande Objekt, ger denna beskrivning endast en \u00f6versikt av inverkan av vissa villkor. Det h\u00e4r \u00e4r inte en Licens och beskrivningen b\u00f6r inte anv\u00e4ndas f\u00f6r att licensiera ditt Verk. F\u00f6r detta \u00e4ndam\u00e5l kan du anv\u00e4nda en Licens som erbjuds p\u00e5 webbsidan https://creativecommons.org/rightsstatements.org From 0e6c88520ecb876ce6a8cc56b4058c3123fd7418 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Fri, 8 Nov 2024 10:10:14 +0100 Subject: [PATCH 56/65] Changes for probe settings --- k8s/base/deployment.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/k8s/base/deployment.yaml b/k8s/base/deployment.yaml index 8f4f65b..f7555dc 100644 --- a/k8s/base/deployment.yaml +++ b/k8s/base/deployment.yaml @@ -18,8 +18,8 @@ spec: httpHeaders: - name: Accept value: application/json - initialDelaySeconds: 90 - periodSeconds: 60 + initialDelaySeconds: 125 + periodSeconds: 30 timeoutSeconds: 180 readinessProbe: httpGet: @@ -28,6 +28,6 @@ spec: httpHeaders: - name: Accept value: application/json - initialDelaySeconds: 60 - periodSeconds: 60 + initialDelaySeconds: 125 + periodSeconds: 30 timeoutSeconds: 180 From 698609329a619c3814e16b1ac3f6247bd3c932f6 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Mon, 25 Nov 2024 10:16:28 +0100 Subject: [PATCH 57/65] Changes for probe settings --- app/controllers/Application.java | 50 ++++++++++++++++++++++++++++++-- conf/application.conf | 1 + 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index b162750..aaa2ba6 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -13,6 +13,10 @@ import com.typesafe.config.Config; import com.typesafe.config.ConfigFactory; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.Map.Entry; +import java.util.regex.Pattern; import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; import play.Logger.ALogger; @@ -162,11 +166,27 @@ public Result getStatementPage(String id, String version, String language,Http.R if (rightsStatement.isEmpty()) { return notFoundPage(req); } + HashMap parameters = getParameters(req, id); + String validationResult = validateParameters(parameters); + if(validationResult != null) + return status(400,validationResult); return getPage(rightsStatement, "/en/statement.hbs", locale.getLanguage(), - getParameters(req, id), req).withHeaders("Content-Language", locale.getLanguage(),"Link", "<".concat(routes.Application.getStatementPage(id, version, null) + parameters, req).withHeaders("Content-Language", locale.getLanguage(),"Link", "<".concat(routes.Application.getStatementPage(id, version, null) .url()).concat(">; rel=derivedfrom")); } + private String validateParameters(HashMap parameters) { + for(Entry e: parameters.entrySet()) { + if ("relatedURL".equals(e.getKey()) && !isValidRelatedURL(e.getValue().toString())) { + return "Unauthorised use of the relatedURL parameter"; + } + if ("date".equals(e.getKey()) && !isValidDate(e.getValue().toString())) { + return "Wrong format for the date parameter"; + } + } + return null; + } + public Result getCollection(String id, String version,Http.Request req) { if (req.accepts("text/html")) { Locale locale = getLocale(req, null); @@ -386,13 +406,39 @@ private HashMap getParameters(Http.Request request, String id) { for (String validParameter : validParameters.split(" ")) { String suppliedParameter = request.getQueryString(validParameter); if (suppliedParameter != null) { - parameters.put(validParameter, StringEscapeUtils.escapeHtml4(request.getQueryString(validParameter))); + parameters.put(validParameter, StringEscapeUtils.escapeHtml4(request.getQueryString(validParameter))); } } } return parameters; } + /** + * parses a date without an offset, such as '2011-12-03' + * @param value + * @return + */ + private boolean isValidDate(String value) { + DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE; + try{ + formatter.parse(value); + return true; + } catch (DateTimeParseException e){ + return false; + } + } + + private boolean isValidRelatedURL(String value) { + List blackListedURLPatterns = configuration.underlying().getStringList("blacklist.relatedURL"); + List patternList = new ArrayList<>(); + for(String s : blackListedURLPatterns ) + { + Pattern urlPattern = Pattern.compile(s); + patternList.add(urlPattern); + } + return ! patternList.stream().anyMatch(p-> p.matcher(value).matches()); + } + private String getDeployUrl(Http.Request req) { if (configuration.underlying().getString("source.site.http") != null) { return configuration.underlying().getString("source.site.http"); diff --git a/conf/application.conf b/conf/application.conf index cfead38..b35d5b0 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -40,3 +40,4 @@ play.http.secret.key = "^Z5sUMS0j^inD7xJ4/vt0rFC?F>y5@kkdiGN:ROV5lfaP1:[ag72[S8g play.filters.hosts { allowed = ["."] } +blacklist.relatedURL = [".*digwow.net.*",".*iliiili.com.*",".*weebly.com.*"] \ No newline at end of file From 3bcf99a456fc9871794c2e08dbf197428230004f Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Wed, 27 Nov 2024 08:41:30 +0100 Subject: [PATCH 58/65] Changes for param validation --- app/controllers/Application.java | 147 ++++++++++++++++++------------- 1 file changed, 88 insertions(+), 59 deletions(-) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index aaa2ba6..4346e30 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -5,6 +5,7 @@ import com.github.jknack.handlebars.io.TemplateLoader; import com.google.inject.Inject; +import com.hp.hpl.jena.query.QueryExecution; import com.hp.hpl.jena.query.QueryExecutionFactory; import com.hp.hpl.jena.query.QueryFactory; import com.hp.hpl.jena.rdf.model.Model; @@ -19,6 +20,7 @@ import java.util.regex.Pattern; import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpHeaders; import play.Logger.ALogger; import play.api.Configuration; import play.Logger; @@ -46,19 +48,25 @@ */ public class Application extends Controller { - private static Map mimeTypeParserMap = generateParserMap();// generateValueMap(ConfigFactory.load().getConfig("parser")); + public static final String JSON_LD = "JSON-LD"; + public static final String MSG_PARAMETER_IS_NOT_SUPPORTED = "Parameter %s is not supported for this statement"; + public static final String MSG_WRONG_DATE_PARAMETER_FORMAT = "Wrong format for the date parameter"; + public static final String MSG_UNAUTHORISED_RELATED_URL_PARAM = "Unauthorised use of the relatedURL parameter"; + public static final String MIME_TYPE_TEXT_HTML = "text/html"; + public static final String REL_DERIVEDFROM = ">; rel=derivedfrom"; + private static Map mimeTypeParserMap = generateParserMap(); private ALogger logger =Logger.of(this.getClass()); private static Map generateParserMap() { Map mimeTypeParserMap = new HashMap<>(); mimeTypeParserMap.put("text/turtle","TURTLE"); - mimeTypeParserMap.put("application/json","JSON-LD"); - mimeTypeParserMap.put("application/ld+json","JSON-LD"); - mimeTypeParserMap.put("*/*","JSON-LD"); + mimeTypeParserMap.put("application/json",JSON_LD); + mimeTypeParserMap.put("application/ld+json",JSON_LD); + mimeTypeParserMap.put("*/*", JSON_LD); return mimeTypeParserMap; } - private static Map mimeTypeExtMap = generateExtentionsMap();//generateValueMap(ConfigFactory.load().getConfig("extension")); + private static Map mimeTypeExtMap = generateExtentionsMap(); private static Map generateExtentionsMap() { Map extensionsMap = new HashMap<>(); @@ -94,13 +102,13 @@ public Application(VocabProvider vocabProvider, LayoutProvider layoutProvider, C } public Result getVocab(String version, Http.Request request) { - Logger.info("Getting vocab for version: {}", version); - if (request.accepts("text/html")) { + logger.info("Getting vocab for version: {}", version); + if (request.accepts(MIME_TYPE_TEXT_HTML)) { Locale locale = getLocale(request, null); - Logger.info("Vocab language : {}",locale.getLanguage()); + logger.info("Vocab language : {}",locale.getLanguage()); return redirect(routes.Application.getVocabPage(version, locale.getLanguage()).url()); } else { - Logger.info(routes.Application.getVocabData(version, null).url()); + logger.info(routes.Application.getVocabData(version, null).url()); return redirect(routes.Application.getVocabData(version, null).url()); } } @@ -111,11 +119,11 @@ public Result getVocabData(String version, String extension, Http.Request reques return notFoundPage(request); } String mimeType =getMimeType(request, extension); - String mime = routes.Application.getVocabData(version,mimeTypeExtMap.getOrDefault(mimeType.toString(), + String mime = routes.Application.getVocabData(version,mimeTypeExtMap.getOrDefault(mimeType, defaults.get("mime").toString()).toString()).url(); String link = "<".concat(routes.Application.getVocabData(version, null) - .url()).concat(">; rel=derivedfrom"); - return getData(vocab, mimeType).withHeaders("Content-Location", mime,"Link", link); + .url()).concat(REL_DERIVEDFROM); + return getData(vocab, mimeType).withHeaders(HttpHeaders.CONTENT_LOCATION, mime,"Link", link); } @@ -125,15 +133,16 @@ public Result getVocabPage(String version, String language,Http.Request request) if (vocab.isEmpty()) { return notFoundPage(request); } - String linkValue = "<".concat(routes.Application.getVocabPage(version, null).url()).concat(">; rel=derivedfrom"); + String linkValue = "<".concat(routes.Application.getVocabPage(version, null).url()).concat( + REL_DERIVEDFROM); return getPage(vocab, "/".concat(locale.toLanguageTag()).concat("/statements/vocab.html"), locale.getLanguage(), null,request) - .withHeaders("Content-Language", locale.getLanguage(),"Link",linkValue); + .withHeaders(HttpHeaders.CONTENT_LANGUAGE, locale.getLanguage(),"Link",linkValue); } public Result getStatement(String id, String version,Http.Request req) { if (!req.queryString().isEmpty()) { return notAcceptablePage(req).withHeaders("Alternates", setAlternates(req, id, version, true)); - } else if (req.accepts("text/html")) { + } else if (req.accepts(MIME_TYPE_TEXT_HTML)) { Locale locale = getLocale(req, null); return redirect(routes.Application.getStatementPage(id, version, locale.getLanguage()).url()); } else { @@ -151,10 +160,10 @@ public Result getStatementData(String id, String version, String extension, Http } String mimeType = getMimeType(req, extension); String location = routes.Application.getStatementData(id, version, - mimeTypeExtMap.getOrDefault(mimeType.toString(), defaults.get("mime").toString()) + mimeTypeExtMap.getOrDefault(mimeType, defaults.get("mime").toString()) .toString()).url(); String link = "<".concat(routes.Application.getStatementData(id, version, null) - .url()).concat(">; rel=derivedfrom"); + .url()).concat(REL_DERIVEDFROM); return getData(rightsStatement, mimeType).withHeaders("Content-Location", location,"Link", link); } @@ -166,29 +175,33 @@ public Result getStatementPage(String id, String version, String language,Http.R if (rightsStatement.isEmpty()) { return notFoundPage(req); } - HashMap parameters = getParameters(req, id); - String validationResult = validateParameters(parameters); + HashMap parameters = getValidParameterValueMap(req, id); + String validationResult = validateParameters(parameters,req); if(validationResult != null) return status(400,validationResult); return getPage(rightsStatement, "/en/statement.hbs", locale.getLanguage(), parameters, req).withHeaders("Content-Language", locale.getLanguage(),"Link", "<".concat(routes.Application.getStatementPage(id, version, null) - .url()).concat(">; rel=derivedfrom")); + .url()).concat(REL_DERIVEDFROM)); } - private String validateParameters(HashMap parameters) { - for(Entry e: parameters.entrySet()) { - if ("relatedURL".equals(e.getKey()) && !isValidRelatedURL(e.getValue().toString())) { - return "Unauthorised use of the relatedURL parameter"; + private String validateParameters(HashMap parameters, Request req) { + Map suppliedParameters = req.queryString(); + for (Entry e : suppliedParameters.entrySet()) { + if (!"language".equals(e.getKey()) && !parameters.keySet().contains(e.getKey())) { + return String.format(MSG_PARAMETER_IS_NOT_SUPPORTED, e.getKey()); } - if ("date".equals(e.getKey()) && !isValidDate(e.getValue().toString())) { - return "Wrong format for the date parameter"; + if ("relatedURL".equals(e.getKey()) && !isValidRelatedURL(e.getValue())) { + return MSG_UNAUTHORISED_RELATED_URL_PARAM; + } + if ("date".equals(e.getKey()) && !isValidDate(e.getValue())) { + return MSG_WRONG_DATE_PARAMETER_FORMAT; } } return null; } public Result getCollection(String id, String version,Http.Request req) { - if (req.accepts("text/html")) { + if (req.accepts(MIME_TYPE_TEXT_HTML)) { Locale locale = getLocale(req, null); return redirect(routes.Application.getCollectionPage(id, version, locale.getLanguage()).url()); } else { @@ -203,9 +216,9 @@ public Result getCollectionData(String id, String version, String extension,Http } String mimeType = getMimeType(req, extension); String mime = routes.Application.getCollectionData(id, version, - mimeTypeExtMap.getOrDefault(mimeType.toString(), defaults.get("mime").toString()).toString()).url(); + mimeTypeExtMap.getOrDefault(mimeType, defaults.get("mime").toString()).toString()).url(); String link = "<".concat(routes.Application.getCollectionData(id, version, null) - .url()).concat(">; rel=derivedfrom"); + .url()).concat(REL_DERIVEDFROM); return getData(collection, mimeType).withHeaders("Content-Location", mime,"Link", link); } @@ -217,18 +230,18 @@ public Result getCollectionPage(String id, String version, String language,Http. return notFoundPage(req); } String concat = "<".concat(routes.Application.getCollectionPage(id, version, null) - .url()).concat(">; rel=derivedfrom"); + .url()).concat(REL_DERIVEDFROM); Result result = getPage(collection, locale.toLanguageTag().concat("/statements/collection-").concat(id).concat(".html"), locale.getLanguage(), null, req); - return result.withHeaders("Link", concat,"Content-Language", locale.getLanguage()); + return result.withHeaders("Link", concat, HttpHeaders.CONTENT_LANGUAGE, locale.getLanguage()); } private Result notFoundPage(Request request) { TemplateLoader loader = layoutProvider.getTemplateLoader(); loader.setPrefix(getDeployUrl(request)); try { - return notFound(loader.sourceAt("/en/404.html").content()).as("text/html"); + return notFound(loader.sourceAt("/en/404.html").content()).as(MIME_TYPE_TEXT_HTML); } catch (IOException e) { Logger.error(e.toString()); return notFound("Not Found"); @@ -240,7 +253,7 @@ private Result notAcceptablePage(Request req) { loader.setPrefix(getDeployUrl(req)); try { Logger.error("Request not acceptable : {} {} ",req.method(), req.uri().toString()); - return status(406, loader.sourceAt("/en/406.html").content()).as("text/html"); + return status(406, loader.sourceAt("/en/406.html").content()).as(MIME_TYPE_TEXT_HTML); } catch (IOException e) { Logger.error(e.toString()); return status(406, "Not Acceptable"); @@ -262,15 +275,18 @@ private Result getPage(Model model, String templateFile, String language, HashMa throws IOException { Model localized = ModelFactory.createDefaultModel(); - QueryExecutionFactory.create(QueryFactory.create(String.format(sparqlQueries.get("localize").toString(), language)), - model).execConstruct(localized); + try(QueryExecution queryExecution = QueryExecutionFactory.create( + QueryFactory.create(String.format(sparqlQueries.get("localize").toString(), language)), + model)) { + queryExecution.execConstruct(localized); + } Map scope = new HashMap<>(); scope.put("parameters", parameters); scope.put("language", language); OutputStream boas = new ByteArrayOutputStream(); - localized.write(boas, "JSON-LD"); + localized.write(boas, JSON_LD); String output = boas.toString(); scope.put("data", new ObjectMapper().readValue(output, HashMap.class)); @@ -285,27 +301,36 @@ private Result getPage(Model model, String templateFile, String language, HashMa Logger.error(e.toString()); } String apply = handlebars.compile(templateFile).apply(scope); - return ok(apply).as("text/html"); + return ok(apply).as(MIME_TYPE_TEXT_HTML); } private Model getVocabModel(String version) { Model vocab = ModelFactory.createDefaultModel(); - QueryExecutionFactory.create(QueryFactory.create(String.format(sparqlQueries.get("vocab").toString(), version)), - vocabProvider.getVocab()).execConstruct(vocab); + try(QueryExecution queryExecution = QueryExecutionFactory.create( + QueryFactory.create(String.format(sparqlQueries.get("vocab").toString(), version)), + vocabProvider.getVocab())) { + queryExecution.execConstruct(vocab); + } return vocab; } private Model getStatementModel(String id, String version) { Model statement = ModelFactory.createDefaultModel(); - QueryExecutionFactory.create(QueryFactory.create(String.format(sparqlQueries.get("statement").toString(), version, - id)), vocabProvider.getVocab()).execConstruct(statement); + try(QueryExecution queryExecution = QueryExecutionFactory.create( + QueryFactory.create(String.format(sparqlQueries.get("statement").toString(), version, + id)), vocabProvider.getVocab())) { + queryExecution.execConstruct(statement); + } return statement; } private Model getCollectionModel(String id, String version) { Model collection = ModelFactory.createDefaultModel(); - QueryExecutionFactory.create(QueryFactory.create(String.format(sparqlQueries.get("collection").toString(), id, - version)), vocabProvider.getVocab()).execConstruct(collection); + try(QueryExecution queryExecution = QueryExecutionFactory.create( + QueryFactory.create(String.format(sparqlQueries.get("collection").toString(), id, + version)), vocabProvider.getVocab())) { + queryExecution.execConstruct(collection); + } return collection; } @@ -374,7 +399,7 @@ private String setAlternates(Request request, String id, String version, boolean List alternates = new ArrayList<>(); if (request.queryString().size() > 0) { List recoveryParameters = new ArrayList<>(); - for (Map.Entry parameter : getParameters(request, id).entrySet()) { + for (Map.Entry parameter : getValidParameterValueMap(request, id).entrySet()) { recoveryParameters.add(parameter.getKey().concat("=").concat(parameter.getValue())); } if (!recoveryParameters.isEmpty()) { @@ -397,13 +422,11 @@ private String setAlternates(Request request, String id, String version, boolean return String.join(",", alternates); } - private HashMap getParameters(Http.Request request, String id) { - + private HashMap getValidParameterValueMap(Http.Request request, String id) { + List validParams = getConfiguredParameterForId(id); HashMap parameters = new HashMap<>(); - String validParameters = Application.validParameters.get(id)!=null? Application.validParameters.get(id).toString():null; - - if (validParameters != null) { - for (String validParameter : validParameters.split(" ")) { + if (validParams != null) { + for (String validParameter : validParams) { String suppliedParameter = request.getQueryString(validParameter); if (suppliedParameter != null) { parameters.put(validParameter, StringEscapeUtils.escapeHtml4(request.getQueryString(validParameter))); @@ -413,30 +436,36 @@ private HashMap getParameters(Http.Request request, String id) { return parameters; } + private static List getConfiguredParameterForId(String id) { + return Application.validParameters.get(id) != null ? List.of( + Application.validParameters.get(id).toString().split(" ")) : new ArrayList<>(); + } + /** * parses a date without an offset, such as '2011-12-03' * @param value * @return */ - private boolean isValidDate(String value) { + private boolean isValidDate(String[] value) { DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE; try{ - formatter.parse(value); + //considering first value in case multiple values provided for the same parameter + formatter.parse(value[0]); return true; } catch (DateTimeParseException e){ return false; } } - private boolean isValidRelatedURL(String value) { + private boolean isValidRelatedURL(String[] value) { List blackListedURLPatterns = configuration.underlying().getStringList("blacklist.relatedURL"); - List patternList = new ArrayList<>(); - for(String s : blackListedURLPatterns ) - { - Pattern urlPattern = Pattern.compile(s); - patternList.add(urlPattern); + List patternList = new ArrayList<>(); + for(String s : blackListedURLPatterns){ + Pattern urlPattern = Pattern.compile(s); + patternList.add(urlPattern); } - return ! patternList.stream().anyMatch(p-> p.matcher(value).matches()); + //validating the first value in case multiple values provided for same parameter + return !patternList.stream().anyMatch(p -> p.matcher(value[0]).matches()); } private String getDeployUrl(Http.Request req) { From e06fecec041f22354c6e093101bfa4337a495cc5 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Thu, 28 Nov 2024 09:29:27 +0100 Subject: [PATCH 59/65] Changes for param validation --- app/controllers/Application.java | 32 ++++++++++++++++++-------------- conf/application.conf | 3 +-- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index 4346e30..622e4f2 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -85,6 +85,8 @@ private static Map generateExtentionsMap() { private static Map languages = generateValueMap(ConfigFactory.load().getConfig("languages")); + private static List blackListedUrlsPatterns = getUrlPatterns(ConfigFactory.load().getStringList("blacklist.relatedURL")); + private final VocabProvider vocabProvider; private final LayoutProvider layoutProvider; @@ -185,15 +187,16 @@ public Result getStatementPage(String id, String version, String language,Http.R } private String validateParameters(HashMap parameters, Request req) { - Map suppliedParameters = req.queryString(); - for (Entry e : suppliedParameters.entrySet()) { - if (!"language".equals(e.getKey()) && !parameters.keySet().contains(e.getKey())) { - return String.format(MSG_PARAMETER_IS_NOT_SUPPORTED, e.getKey()); + for ( String e : req.queryString().keySet()) { + String value = req.getQueryString(e); + //language parameter is not considered for validation checks see /page/ paths in conf/routes file + if (!"language".equals(e) && !parameters.keySet().contains(e)) { + return String.format(MSG_PARAMETER_IS_NOT_SUPPORTED, e); } - if ("relatedURL".equals(e.getKey()) && !isValidRelatedURL(e.getValue())) { + if ("relatedURL".equals(e) && !isValidRelatedURL(value)) { return MSG_UNAUTHORISED_RELATED_URL_PARAM; } - if ("date".equals(e.getKey()) && !isValidDate(e.getValue())) { + if ("date".equals(e) && !isValidDate(value)) { return MSG_WRONG_DATE_PARAMETER_FORMAT; } } @@ -446,26 +449,27 @@ private static List getConfiguredParameterForId(String id) { * @param value * @return */ - private boolean isValidDate(String[] value) { + private boolean isValidDate(String value) { DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE; try{ - //considering first value in case multiple values provided for the same parameter - formatter.parse(value[0]); + formatter.parse(value); return true; } catch (DateTimeParseException e){ return false; } } - private boolean isValidRelatedURL(String[] value) { - List blackListedURLPatterns = configuration.underlying().getStringList("blacklist.relatedURL"); - List patternList = new ArrayList<>(); + private boolean isValidRelatedURL(String value) { + return !blackListedUrlsPatterns.stream().anyMatch(p -> p.matcher(value).matches()); + } + + private static List getUrlPatterns(List blackListedURLPatterns) { + List patternList = new ArrayList<>(); for(String s : blackListedURLPatterns){ Pattern urlPattern = Pattern.compile(s); patternList.add(urlPattern); } - //validating the first value in case multiple values provided for same parameter - return !patternList.stream().anyMatch(p -> p.matcher(value[0]).matches()); + return patternList; } private String getDeployUrl(Http.Request req) { diff --git a/conf/application.conf b/conf/application.conf index b35d5b0..fe4d2d7 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -39,5 +39,4 @@ play.server.pidfile.path=/dev/null play.http.secret.key = "^Z5sUMS0j^inD7xJ4/vt0rFC?F>y5@kkdiGN:ROV5lfaP1:[ag72[S8gLD90PZWS" play.filters.hosts { allowed = ["."] -} -blacklist.relatedURL = [".*digwow.net.*",".*iliiili.com.*",".*weebly.com.*"] \ No newline at end of file +} \ No newline at end of file From e55df2206dfdad3e7ff61d0fdc2d3b14349310ad Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Thu, 6 Feb 2025 10:25:19 +0100 Subject: [PATCH 60/65] Changes for language param validation --- app/controllers/Application.java | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index 622e4f2..28cc745 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -16,7 +16,6 @@ import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; -import java.util.Map.Entry; import java.util.regex.Pattern; import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; @@ -52,10 +51,11 @@ public class Application extends Controller { public static final String MSG_PARAMETER_IS_NOT_SUPPORTED = "Parameter %s is not supported for this statement"; public static final String MSG_WRONG_DATE_PARAMETER_FORMAT = "Wrong format for the date parameter"; public static final String MSG_UNAUTHORISED_RELATED_URL_PARAM = "Unauthorised use of the relatedURL parameter"; + public static final String MSG_UNSUPPORTED_LANGUAGE_PARAM = "Language % is not supported"; public static final String MIME_TYPE_TEXT_HTML = "text/html"; public static final String REL_DERIVEDFROM = ">; rel=derivedfrom"; - private static Map mimeTypeParserMap = generateParserMap(); - private ALogger logger =Logger.of(this.getClass()); + private static final Map mimeTypeParserMap = generateParserMap(); + private final ALogger logger =Logger.of(this.getClass()); private static Map generateParserMap() { Map mimeTypeParserMap = new HashMap<>(); @@ -66,7 +66,7 @@ private static Map generateParserMap() { return mimeTypeParserMap; } - private static Map mimeTypeExtMap = generateExtentionsMap(); + private static final Map mimeTypeExtMap = generateExtentionsMap(); private static Map generateExtentionsMap() { Map extensionsMap = new HashMap<>(); @@ -77,11 +77,11 @@ private static Map generateExtentionsMap() { return extensionsMap; } - private static Map defaults =generateValueMap( ConfigFactory.load().getConfig("default")); + private static final Map defaults =generateValueMap( ConfigFactory.load().getConfig("default")); - private static Map validParameters = generateValueMap(ConfigFactory.load().getConfig("params")); + private static final Map validParameters = generateValueMap(ConfigFactory.load().getConfig("params")); - private static Map sparqlQueries = generateValueMap(ConfigFactory.load().getConfig("queries")); + private static final Map sparqlQueries = generateValueMap(ConfigFactory.load().getConfig("queries")); private static Map languages = generateValueMap(ConfigFactory.load().getConfig("languages")); @@ -189,7 +189,7 @@ public Result getStatementPage(String id, String version, String language,Http.R private String validateParameters(HashMap parameters, Request req) { for ( String e : req.queryString().keySet()) { String value = req.getQueryString(e); - //language parameter is not considered for validation checks see /page/ paths in conf/routes file + //language parameter is later validated based on available languages if (!"language".equals(e) && !parameters.keySet().contains(e)) { return String.format(MSG_PARAMETER_IS_NOT_SUPPORTED, e); } @@ -199,6 +199,10 @@ private String validateParameters(HashMap parameters, Request re if ("date".equals(e) && !isValidDate(value)) { return MSG_WRONG_DATE_PARAMETER_FORMAT; } + List availableLanguages = Arrays.stream(languages.get("available").toString().split(" ")).toList(); + if ("language".equals(e) && !availableLanguages.contains(value)){ + return String.format(MSG_UNSUPPORTED_LANGUAGE_PARAM,value); + } } return null; } From 0f890dd023cff66c808deed2d4ab2991c472597c Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Mon, 10 Feb 2025 16:39:15 +0100 Subject: [PATCH 61/65] Changes for language param validation --- app/controllers/Application.java | 38 +++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index 28cc745..59df03d 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -51,7 +51,7 @@ public class Application extends Controller { public static final String MSG_PARAMETER_IS_NOT_SUPPORTED = "Parameter %s is not supported for this statement"; public static final String MSG_WRONG_DATE_PARAMETER_FORMAT = "Wrong format for the date parameter"; public static final String MSG_UNAUTHORISED_RELATED_URL_PARAM = "Unauthorised use of the relatedURL parameter"; - public static final String MSG_UNSUPPORTED_LANGUAGE_PARAM = "Language % is not supported"; + public static final String MSG_UNSUPPORTED_LANGUAGE_PARAM = "Unsupported language %s"; public static final String MIME_TYPE_TEXT_HTML = "text/html"; public static final String REL_DERIVEDFROM = ">; rel=derivedfrom"; private static final Map mimeTypeParserMap = generateParserMap(); @@ -130,6 +130,11 @@ public Result getVocabData(String version, String extension, Http.Request reques } public Result getVocabPage(String version, String language,Http.Request request) throws IOException { + + String validationResult = validateLanguageParam(language); + if(validationResult != null) + return status(400,validationResult); + Model vocab = getVocabModel(version); Locale locale = getLocale(request, language); if (vocab.isEmpty()) { @@ -171,22 +176,24 @@ public Result getStatementData(String id, String version, String extension, Http public Result getStatementPage(String id, String version, String language,Http.Request req) throws IOException { + HashMap parameters = getValidParameterValueMap(req, id); + String validationResult = validateParameters(parameters,req,language); + if(validationResult != null) + return status(400,validationResult); + Model rightsStatement = getStatementModel(id, version); Locale locale = getLocale(req, language); if (rightsStatement.isEmpty()) { return notFoundPage(req); } - HashMap parameters = getValidParameterValueMap(req, id); - String validationResult = validateParameters(parameters,req); - if(validationResult != null) - return status(400,validationResult); + return getPage(rightsStatement, "/en/statement.hbs", locale.getLanguage(), parameters, req).withHeaders("Content-Language", locale.getLanguage(),"Link", "<".concat(routes.Application.getStatementPage(id, version, null) .url()).concat(REL_DERIVEDFROM)); } - private String validateParameters(HashMap parameters, Request req) { + private String validateParameters(HashMap parameters, Request req,String language) { for ( String e : req.queryString().keySet()) { String value = req.getQueryString(e); //language parameter is later validated based on available languages @@ -199,12 +206,16 @@ private String validateParameters(HashMap parameters, Request re if ("date".equals(e) && !isValidDate(value)) { return MSG_WRONG_DATE_PARAMETER_FORMAT; } - List availableLanguages = Arrays.stream(languages.get("available").toString().split(" ")).toList(); - if ("language".equals(e) && !availableLanguages.contains(value)){ - return String.format(MSG_UNSUPPORTED_LANGUAGE_PARAM,value); - } } - return null; + return validateLanguageParam(language); + } + + private static String validateLanguageParam(String value) { + List availableLanguages = Arrays.stream(languages.get("available").toString().split(" ")).toList(); + //validate language only if parameter is provide + if(value!=null && !availableLanguages.contains(value)) + return String.format(MSG_UNSUPPORTED_LANGUAGE_PARAM, value); + return null; } public Result getCollection(String id, String version,Http.Request req) { @@ -230,6 +241,11 @@ public Result getCollectionData(String id, String version, String extension,Http } public Result getCollectionPage(String id, String version, String language,Http.Request req) throws IOException { + + String validationResult = validateLanguageParam(language); + if(validationResult != null) + return status(400,validationResult); + Model collection = getVocabModel(version); Locale locale = getLocale(req, language); From 1722964c556d148f049e38abc1bb4af70a15e5cf Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Wed, 12 Feb 2025 14:36:05 +0100 Subject: [PATCH 62/65] Changes for language param validation --- app/controllers/Application.java | 67 +++++++++++++++++++------------- 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index 59df03d..5b6e888 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -16,6 +16,7 @@ import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; +import java.util.Collections; import java.util.regex.Pattern; import org.apache.commons.lang3.StringEscapeUtils; import org.apache.commons.lang3.StringUtils; @@ -83,9 +84,10 @@ private static Map generateExtentionsMap() { private static final Map sparqlQueries = generateValueMap(ConfigFactory.load().getConfig("queries")); - private static Map languages = generateValueMap(ConfigFactory.load().getConfig("languages")); + private static final List languages = generateAvailableLanguageList(ConfigFactory.load().getString("languages.available")); + public static final Locale[] AVAILABLE_LOCALES = languages.stream().map(Locale::forLanguageTag).toArray(Locale[]::new); - private static List blackListedUrlsPatterns = getUrlPatterns(ConfigFactory.load().getStringList("blacklist.relatedURL")); + private static final List blackListedUrlsPatterns = getUrlPatterns(ConfigFactory.load().getStringList("blacklist.relatedURL")); private final VocabProvider vocabProvider; @@ -142,8 +144,9 @@ public Result getVocabPage(String version, String language,Http.Request request) } String linkValue = "<".concat(routes.Application.getVocabPage(version, null).url()).concat( REL_DERIVEDFROM); - return getPage(vocab, "/".concat(locale.toLanguageTag()).concat("/statements/vocab.html"), locale.getLanguage(), null,request) - .withHeaders(HttpHeaders.CONTENT_LANGUAGE, locale.getLanguage(),"Link",linkValue); + String page = getPage(vocab, "/".concat(locale.toLanguageTag()).concat("/statements/vocab.html"), locale.getLanguage(), null,request); + int status = StringUtils.isBlank(language)?MOVED_PERMANENTLY:OK; + return status(status, page).withHeaders(HttpHeaders.CONTENT_LANGUAGE, locale.getLanguage(),"Link",linkValue).as(MIME_TYPE_TEXT_HTML); } public Result getStatement(String id, String version,Http.Request req) { @@ -187,10 +190,12 @@ public Result getStatementPage(String id, String version, String language,Http.R if (rightsStatement.isEmpty()) { return notFoundPage(req); } + String page = getPage(rightsStatement, "/en/statement.hbs", locale.getLanguage(), + parameters, req); - return getPage(rightsStatement, "/en/statement.hbs", locale.getLanguage(), - parameters, req).withHeaders("Content-Language", locale.getLanguage(),"Link", "<".concat(routes.Application.getStatementPage(id, version, null) - .url()).concat(REL_DERIVEDFROM)); + int status = StringUtils.isBlank(language)?MOVED_PERMANENTLY:OK; + return status(status,page).withHeaders("Content-Language", locale.getLanguage(),"Link", "<".concat(routes.Application.getStatementPage(id, version, null) + .url()).concat(REL_DERIVEDFROM)).as(MIME_TYPE_TEXT_HTML); } private String validateParameters(HashMap parameters, Request req,String language) { @@ -211,9 +216,8 @@ private String validateParameters(HashMap parameters, Request re } private static String validateLanguageParam(String value) { - List availableLanguages = Arrays.stream(languages.get("available").toString().split(" ")).toList(); //validate language only if parameter is provide - if(value!=null && !availableLanguages.contains(value)) + if(!StringUtils.isBlank(value) && !languages.contains(value)) return String.format(MSG_UNSUPPORTED_LANGUAGE_PARAM, value); return null; } @@ -241,7 +245,6 @@ public Result getCollectionData(String id, String version, String extension,Http } public Result getCollectionPage(String id, String version, String language,Http.Request req) throws IOException { - String validationResult = validateLanguageParam(language); if(validationResult != null) return status(400,validationResult); @@ -254,10 +257,13 @@ public Result getCollectionPage(String id, String version, String language,Http. } String concat = "<".concat(routes.Application.getCollectionPage(id, version, null) .url()).concat(REL_DERIVEDFROM); - Result result = getPage(collection, + + String page = getPage(collection, locale.toLanguageTag().concat("/statements/collection-").concat(id).concat(".html"), locale.getLanguage(), null, req); - return result.withHeaders("Link", concat, HttpHeaders.CONTENT_LANGUAGE, locale.getLanguage()); + + int status = StringUtils.isBlank(language)?MOVED_PERMANENTLY:OK; + return status(status,page).withHeaders("Link", concat, HttpHeaders.CONTENT_LANGUAGE, locale.getLanguage()).as(MIME_TYPE_TEXT_HTML); } private Result notFoundPage(Request request) { @@ -275,7 +281,7 @@ private Result notAcceptablePage(Request req) { TemplateLoader loader = layoutProvider.getTemplateLoader(); loader.setPrefix(getDeployUrl(req)); try { - Logger.error("Request not acceptable : {} {} ",req.method(), req.uri().toString()); + Logger.error("Request not acceptable : {} {} ",req.method(), req.uri()); return status(406, loader.sourceAt("/en/406.html").content()).as(MIME_TYPE_TEXT_HTML); } catch (IOException e) { Logger.error(e.toString()); @@ -294,7 +300,8 @@ private Result getData(Model model, String mimeType) { return ok(result.toString()); } - private Result getPage(Model model, String templateFile, String language, HashMap parameters,Http.Request req) + private String getPage(Model model, String templateFile, String language, HashMap parameters, + Request req) throws IOException { Model localized = ModelFactory.createDefaultModel(); @@ -323,8 +330,8 @@ private Result getPage(Model model, String templateFile, String language, HashMa } catch (Exception e) { Logger.error(e.toString()); } - String apply = handlebars.compile(templateFile).apply(scope); - return ok(apply).as(MIME_TYPE_TEXT_HTML); + return handlebars.compile(templateFile).apply(scope); + } private Model getVocabModel(String version) { @@ -384,7 +391,18 @@ private static String getMimeTypeByExtension(String extension) { } private Locale getLocale(Http.Request request, String language) { + Locale[] requestedLocales = getRequestedLocales(request, language); + if (requestedLocales != null) { + for (Locale requestedLocale : requestedLocales) { + if (Arrays.asList(AVAILABLE_LOCALES).contains(requestedLocale)) { + return requestedLocale; + } + } + } + return AVAILABLE_LOCALES[0]; + } + private Locale[] getRequestedLocales(Request request, String language) { Locale[] requestedLocales; if (language != null) { @@ -392,18 +410,7 @@ private Locale getLocale(Http.Request request, String language) { } else { requestedLocales = getLocalesFromRequest(request); } - - Locale[] availableLocales = Arrays.stream(languages.get("available").toString().split(" +")) - .map(code -> Locale.forLanguageTag(code)).toArray(Locale[]::new); - - if (requestedLocales != null) { - for (Locale requestedLocale : requestedLocales) { - if (Arrays.asList(availableLocales).contains(requestedLocale)) { - return requestedLocale; - } - } - } - return availableLocales[0]; + return requestedLocales; } private Locale[] getLocalesFromRequest(Http.Request request) { @@ -492,6 +499,10 @@ private static List getUrlPatterns(List blackListedURLPatterns) return patternList; } + private static List generateAvailableLanguageList(String languages) { + return languages!=null ? Arrays.stream(languages.split(" +")).toList() : Collections.EMPTY_LIST; + } + private String getDeployUrl(Http.Request req) { if (configuration.underlying().getString("source.site.http") != null) { return configuration.underlying().getString("source.site.http"); From 005eb10fc9d8a0cba56a6a8475d8af5d128ac574 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Wed, 12 Feb 2025 14:39:14 +0100 Subject: [PATCH 63/65] Changes for language param validation --- app/controllers/Application.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index 5b6e888..1dbc143 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -403,14 +403,10 @@ private Locale getLocale(Http.Request request, String language) { } private Locale[] getRequestedLocales(Request request, String language) { - Locale[] requestedLocales; - if (language != null) { - requestedLocales = getLocalesByCode(language); - } else { - requestedLocales = getLocalesFromRequest(request); - } - return requestedLocales; + return getLocalesByCode(language); + } + return getLocalesFromRequest(request); } private Locale[] getLocalesFromRequest(Http.Request request) { From a59b3e1777ca9d677b7e1b345aa43a358977e660 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Thu, 13 Feb 2025 10:05:18 +0100 Subject: [PATCH 64/65] Changes for language param validation --- app/controllers/Application.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index 1dbc143..6c62c83 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -145,8 +145,7 @@ public Result getVocabPage(String version, String language,Http.Request request) String linkValue = "<".concat(routes.Application.getVocabPage(version, null).url()).concat( REL_DERIVEDFROM); String page = getPage(vocab, "/".concat(locale.toLanguageTag()).concat("/statements/vocab.html"), locale.getLanguage(), null,request); - int status = StringUtils.isBlank(language)?MOVED_PERMANENTLY:OK; - return status(status, page).withHeaders(HttpHeaders.CONTENT_LANGUAGE, locale.getLanguage(),"Link",linkValue).as(MIME_TYPE_TEXT_HTML); + return status(OK, page).withHeaders(HttpHeaders.CONTENT_LANGUAGE, locale.getLanguage(),"Link",linkValue).as(MIME_TYPE_TEXT_HTML); } public Result getStatement(String id, String version,Http.Request req) { @@ -193,8 +192,7 @@ public Result getStatementPage(String id, String version, String language,Http.R String page = getPage(rightsStatement, "/en/statement.hbs", locale.getLanguage(), parameters, req); - int status = StringUtils.isBlank(language)?MOVED_PERMANENTLY:OK; - return status(status,page).withHeaders("Content-Language", locale.getLanguage(),"Link", "<".concat(routes.Application.getStatementPage(id, version, null) + return status(OK,page).withHeaders("Content-Language", locale.getLanguage(),"Link", "<".concat(routes.Application.getStatementPage(id, version, null) .url()).concat(REL_DERIVEDFROM)).as(MIME_TYPE_TEXT_HTML); } @@ -262,8 +260,7 @@ public Result getCollectionPage(String id, String version, String language,Http. locale.toLanguageTag().concat("/statements/collection-").concat(id).concat(".html"), locale.getLanguage(), null, req); - int status = StringUtils.isBlank(language)?MOVED_PERMANENTLY:OK; - return status(status,page).withHeaders("Link", concat, HttpHeaders.CONTENT_LANGUAGE, locale.getLanguage()).as(MIME_TYPE_TEXT_HTML); + return status(OK,page).withHeaders("Link", concat, HttpHeaders.CONTENT_LANGUAGE, locale.getLanguage()).as(MIME_TYPE_TEXT_HTML); } private Result notFoundPage(Request request) { From 6aa7f1e97c8c2b3b27a758ff7992caa50326cf58 Mon Sep 17 00:00:00 2001 From: Shwetambara Nazare Date: Thu, 13 Feb 2025 11:11:11 +0100 Subject: [PATCH 65/65] Changes for language param validation --- app/controllers/Application.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/controllers/Application.java b/app/controllers/Application.java index 6c62c83..edb666f 100644 --- a/app/controllers/Application.java +++ b/app/controllers/Application.java @@ -85,7 +85,8 @@ private static Map generateExtentionsMap() { private static final Map sparqlQueries = generateValueMap(ConfigFactory.load().getConfig("queries")); private static final List languages = generateAvailableLanguageList(ConfigFactory.load().getString("languages.available")); - public static final Locale[] AVAILABLE_LOCALES = languages.stream().map(Locale::forLanguageTag).toArray(Locale[]::new); + + public static final Locale[] availableLocals = languages.stream().map(Locale::forLanguageTag).toArray(Locale[]::new); private static final List blackListedUrlsPatterns = getUrlPatterns(ConfigFactory.load().getStringList("blacklist.relatedURL")); @@ -391,12 +392,12 @@ private Locale getLocale(Http.Request request, String language) { Locale[] requestedLocales = getRequestedLocales(request, language); if (requestedLocales != null) { for (Locale requestedLocale : requestedLocales) { - if (Arrays.asList(AVAILABLE_LOCALES).contains(requestedLocale)) { + if (Arrays.asList(availableLocals).contains(requestedLocale)) { return requestedLocale; } } } - return AVAILABLE_LOCALES[0]; + return availableLocals[0]; } private Locale[] getRequestedLocales(Request request, String language) {