From 24763c22179b7b655e05cb2deb1f95c13fa7e8d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sami=20M=C3=A4kinen?= Date: Tue, 22 Aug 2023 15:10:39 +0300 Subject: [PATCH 1/3] Fix null handling, optString() returns empty string by default for missing value --- .../fi/nls/oskari/view/modifier/ViewModifier.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/service-control/src/main/java/fi/nls/oskari/view/modifier/ViewModifier.java b/service-control/src/main/java/fi/nls/oskari/view/modifier/ViewModifier.java index 895c9af6f..79b075511 100755 --- a/service-control/src/main/java/fi/nls/oskari/view/modifier/ViewModifier.java +++ b/service-control/src/main/java/fi/nls/oskari/view/modifier/ViewModifier.java @@ -179,14 +179,17 @@ public boolean isBundlePresent(final JSONArray startupSeq, final String bundleid * @return Set of bundles listed in the startupsequence */ public Set getBundleIds(final JSONArray startupSeq) { - final Set bundles = new HashSet(); + final Set bundles = new HashSet<>(); if(startupSeq == null) { return bundles; } for (int i = 0; i < startupSeq.length(); i++) { - final JSONObject bundle = (JSONObject) startupSeq.opt(i); - final String startupBundleid = bundle.optString("bundlename"); - if(startupBundleid != null) { + JSONObject bundle = startupSeq.optJSONObject(i); + if (bundle == null) { + continue; + } + final String startupBundleid = bundle.optString("bundlename", null); + if (startupBundleid != null) { bundles.add(startupBundleid); } } From 58fcd0d3211484e7d21d493780f5e1b4f5bebdf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sami=20M=C3=A4kinen?= Date: Tue, 22 Aug 2023 15:49:11 +0300 Subject: [PATCH 2/3] Remove unnecessary code --- .../java/fi/nls/oskari/control/view/GetAppSetupHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/control-base/src/main/java/fi/nls/oskari/control/view/GetAppSetupHandler.java b/control-base/src/main/java/fi/nls/oskari/control/view/GetAppSetupHandler.java index 605435995..1612c0362 100755 --- a/control-base/src/main/java/fi/nls/oskari/control/view/GetAppSetupHandler.java +++ b/control-base/src/main/java/fi/nls/oskari/control/view/GetAppSetupHandler.java @@ -82,14 +82,14 @@ public void init() { final String[] dynamicBundles = PropertyUtil.getCommaSeparatedList("actionhandler.GetAppSetup.dynamic.bundles"); // Get roles for each dynamic bundle and retrieve bundles from db. Store bundles in map. - Map requestedBundles = new HashMap(); + Map requestedBundles = new HashMap<>(); for(String bundleId : dynamicBundles) { final String[] rolesForBundle = PropertyUtil.getCommaSeparatedList("actionhandler.GetAppSetup.dynamic.bundle." + bundleId + ".roles"); for(String roleName : rolesForBundle) { if(!bundlesForRole.containsKey(roleName)) { - bundlesForRole.put(roleName, new ArrayList()); + bundlesForRole.put(roleName, new ArrayList<>()); } List list = bundlesForRole.get(roleName); From 2c6a6b367aa061ddefc3453f9a9761878dc39905 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sami=20M=C3=A4kinen?= Date: Tue, 22 Aug 2023 15:49:37 +0300 Subject: [PATCH 3/3] Add param handler for 'mobile=true' --- .../modifier/param/MobileParamHandler.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 control-base/src/main/java/fi/nls/oskari/control/view/modifier/param/MobileParamHandler.java diff --git a/control-base/src/main/java/fi/nls/oskari/control/view/modifier/param/MobileParamHandler.java b/control-base/src/main/java/fi/nls/oskari/control/view/modifier/param/MobileParamHandler.java new file mode 100644 index 000000000..25102ba62 --- /dev/null +++ b/control-base/src/main/java/fi/nls/oskari/control/view/modifier/param/MobileParamHandler.java @@ -0,0 +1,89 @@ +package fi.nls.oskari.control.view.modifier.param; + +import fi.nls.oskari.annotation.OskariViewModifier; +import fi.nls.oskari.domain.map.view.Bundle; +import fi.nls.oskari.domain.map.view.ViewTypes; +import fi.nls.oskari.util.JSONHelper; +import fi.nls.oskari.util.PropertyUtil; +import fi.nls.oskari.view.modifier.ModifierException; +import fi.nls.oskari.view.modifier.ModifierParams; +import fi.nls.oskari.view.modifier.ParamHandler; +import org.json.JSONArray; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +/** + * Configure bundles that should be removed from appsetup for mobile clients. + * Configure comma-separated bundle ids in oskari-ext.properties with: + * actionhandler.GetAppSetup.desktopOnly.bundles = publisher2, analyse, statsgrid, mydata, userguide, myplaces3, printout, myplacesimport, feedbackService, coordinatetransformation + * actionhandler.GetAppSetup.mobileOnly.bundles = mobileuserguide + */ +@OskariViewModifier("mobile") +public class MobileParamHandler extends ParamHandler { + + private String[] desktopBundles = null; + private String[] mobileBundles = null; + + + public void init() { + super.init(); + desktopBundles = PropertyUtil.getCommaSeparatedList("actionhandler.GetAppSetup.desktopOnly.bundles"); + mobileBundles = PropertyUtil.getCommaSeparatedList("actionhandler.GetAppSetup.mobileOnly.bundles"); + } + + public boolean handleParam(final ModifierParams params) throws ModifierException { + if (params.getParamValue() == null) { + return false; + } + if (ViewTypes.PUBLISHED.equals(params.getView().getType())) { + // don't modify embedded maps + return false; + } + + boolean isMobile = params.getParamValue().equalsIgnoreCase("true"); + if (!isMobile) { + // only modify when client requests mobile version + return false; + } + List bundleIds = getBundleIdsAsList(params.getStartupSequence()); + // remove bundles that are not supported in mobile mode + for (String bundleId : desktopBundles) { + int index = bundleIds.indexOf(bundleId); + if (index != -1) { + // bundle is included -> drop it for mobile users + // drop bundle from startup and index list + params.getStartupSequence().remove(index); + bundleIds.remove(index); + } + } + // add bundles for mobile client, this can be used to inject lighter replacements for desktop bundles + for (String bundleId : mobileBundles) { + if (!bundleIds.contains(bundleId)) { + params.getStartupSequence().put(getBundleForStartupSeq(bundleId)); + } + } + return false; + } + + private JSONObject getBundleForStartupSeq(String bundleid) { + Bundle b = new Bundle(); + b.setName(bundleid); + return JSONHelper.createJSONObject(b.getStartup()); + } + + private List getBundleIdsAsList(JSONArray startupSequence) { + List list = new ArrayList<>(startupSequence.length()); + for(int i = 0; i < startupSequence.length(); ++i) { + JSONObject item = startupSequence.optJSONObject(i); + if (item == null) { + list.add(null); + } + else { + list.add(item.optString("bundlename")); + } + } + return list; + } +}