/*
* Copyright (C) 2013-2016 Stichting Akvo (Akvo Foundation)
*
* This file is part of Akvo FLOW.
*
* Akvo FLOW is free software: you can redistribute it and modify it under the terms of
* the GNU Affero General Public License (AGPL) as published by the Free Software Foundation,
* either version 3 of the License or any later version.
*
* Akvo FLOW is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Affero General Public License included below for more details.
*
* The full license text can also be seen at <http://www.gnu.org/licenses/agpl.html>.
*/
package org.waterforpeople.mapping.app.web;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.akvo.flow.locale.UIStrings;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.waterforpeople.mapping.app.web.rest.security.AppRole;
import com.gallatinsystems.common.util.PropertyUtil;
import com.gallatinsystems.user.dao.UserDao;
import com.gallatinsystems.user.domain.User;
import com.google.appengine.api.users.UserServiceFactory;
import com.google.appengine.api.utils.SystemProperty;
public class EnvServlet extends HttpServlet {
private static final long serialVersionUID = 7830536065252808839L;
private static final Logger log = Logger.getLogger(EnvServlet.class
.getName());
private static final ArrayList<String> properties = new ArrayList<String>();
static {
properties.add("photo_url_root");
properties.add("imageroot");
properties.add("flowServices");
properties.add("surveyuploadurl");
properties.add("showStatisticsFeature");
properties.add("showMonitoringFeature");
properties.add("mandatoryQuestionID");
properties.add("showExternalSourcesFeature");
properties.add("appId");
properties.add("mapsProvider");
properties.add("googleMapsRegionBias");
properties.add("cartodbHost");
properties.add("hereMapsAppId");
properties.add("hereMapsAppCode");
properties.add("enableDataApproval");
properties.add("extraMapboxTileLayerMapId");
properties.add("extraMapboxTileLayerAccessToken");
properties.add("extraMapboxTileLayerLabel");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
final VelocityEngine engine = new VelocityEngine();
engine.setProperty("runtime.log.logsystem.class",
"org.apache.velocity.runtime.log.NullLogChute");
try {
engine.init();
} catch (Exception e) {
log.log(Level.SEVERE, "Could not initialize velocity", e);
}
Template t = null;
try {
t = engine.getTemplate("Env.vm");
} catch (Exception e) {
log.log(Level.SEVERE, "Could not get the template `CurrentUser`", e);
return;
}
final VelocityContext context = new VelocityContext();
final Map<String, String> props = PropertyUtil
.getPropertiesMap(properties);
// if the showStatisticsFeature is not present in appengine-web.xml, we want it to be false.
if (props.get("showStatisticsFeature") == null) {
props.put("showStatisticsFeature", "false");
}
if (props.get("showMonitoringFeature") == null) {
props.put("showMonitoringFeature", "false");
}
if (props.get("mandatoryQuestionID") == null) {
props.put("mandatoryQuestionID", "false");
}
if (props.get("showExternalSourcesFeature") == null) {
props.put("showExternalSourcesFeature", "false");
}
if (props.get("enableDataApproval") == null) {
props.put("enableDataApproval", "false");
}
if (props.get("googleMapsRegionBias") == null) {
props.put("googleMapsRegionBias", "");
}
if (props.get("extraMapboxTileLayerMapId") == null) {
props.put("extraMapboxTileLayerMapId", "");
}
if (props.get("extraMapboxTileLayerAccessToken") == null) {
props.put("extraMapboxTileLayerAccessToken", "");
}
if (props.get("extraMapboxTileLayerLabel") == null) {
props.put("extraMapboxTileLayerLabel", "");
}
props.put("appId", SystemProperty.applicationId.get());
// load language configuration and strings if present
addLocale(props);
final InputStream uiStringsFileStream = this.getClass().getResourceAsStream(
"/locale/ui-strings.properties");
InputStream localeStringsFileStream = null;
if (props.get("locale") != null && !"en".equalsIgnoreCase(props.get("locale"))) {
localeStringsFileStream = this.getClass().getResourceAsStream(
"/locale/" + props.get("locale") + ".properties");
}
context.put("localeStrings",
UIStrings.getStrings(uiStringsFileStream, localeStringsFileStream));
context.put("env", props);
final List<Map<String, String>> roles = new ArrayList<Map<String, String>>();
for (AppRole r : AppRole.values()) {
if (r.getLevel() < 10) {
continue; // don't expose NEW_USER, nor SUPER_USER
}
Map<String, String> role = new HashMap<String, String>();
role.put("value", String.valueOf(r.getLevel()));
role.put("label", "_" + r.toString());
roles.add(role);
}
context.put("roles", roles);
final StringWriter writer = new StringWriter();
t.merge(context, writer);
resp.setContentType("application/javascript;charset=UTF-8");
final PrintWriter pw = resp.getWriter();
pw.println(writer.toString());
pw.close();
}
/**
* Check for the current user locale configuration and set it
*
* @param props
*/
private void addLocale(Map<String, String> props) {
final com.google.appengine.api.users.User currentGoogleUser = UserServiceFactory
.getUserService().getCurrentUser();
if (currentGoogleUser != null && currentGoogleUser.getEmail() != null) {
final User currentUser = new UserDao().findUserByEmail(currentGoogleUser.getEmail());
final String locale = currentUser.getLanguage();
if (locale != null) {
props.put("locale", locale);
} else {
props.put("locale", "en");
}
}
}
}