/* * Copyright (C) 2003-2012 eXo Platform SAS. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.exoplatform.platform.portlet.juzu.branding; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; import java.util.Map; import javax.inject.Inject; import juzu.Path; import juzu.PropertyType; import juzu.Resource; import juzu.Response; import juzu.View; import juzu.request.HttpContext; import juzu.template.Template; import org.apache.commons.fileupload.FileItem; import org.apache.commons.lang.StringUtils; import org.exoplatform.commons.api.settings.SettingService; import org.exoplatform.commons.api.settings.SettingValue; import org.exoplatform.commons.api.settings.data.Context; import org.exoplatform.commons.api.settings.data.Scope; import org.exoplatform.commons.juzu.ajax.Ajax; import org.exoplatform.container.ExoContainerContext; import org.exoplatform.platform.portlet.juzu.branding.models.BrandingDataStorageService; import org.exoplatform.portal.config.UserACL; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.security.ConversationState; import org.json.JSONException; import org.json.JSONObject; /** * Created by The eXo Platform SAS Author : Nguyen Viet Bang * bangnv@exoplatform.com Jan 28, 2013 */ public class BrandingController { private static final Log LOG = ExoLogger.getExoLogger(BrandingController.class); public static String BAR_NAVIGATION_STYLE_KEY = "bar_navigation_style"; public static String fileName; public static String style = ""; @Inject @Path("index.gtmpl") Template index; @Inject SettingService settingService; @Inject BrandingDataStorageService dataStorageService; /** * method save() records an image in BrandingDataStorageService * * @param httpContext * @param file * @return Response.Content * @throws IOException */ @Resource public Response.Content uploadFile(HttpContext httpContext, FileItem file, String browser) throws IOException { if (browser != null && browser.equals("html5")) { if (file != null && file.getContentType().contains("png")) { dataStorageService.saveLogoPreview(file); } JSONObject result = new JSONObject(); try { result.put("logoUrl", getLogoUrl(httpContext, false)); } catch (JSONException ex) { if (LOG.isErrorEnabled()) { LOG.error("Can not put logoUrl value", ex); } } return Response.ok(result.toString()).with(PropertyType.MIME_TYPE, "application/json"); } else { if (file != null && file.getContentType().contains("png")) { dataStorageService.saveLogoPreview(file); return Response.ok(getLogoUrl(httpContext, false)); } else { return Response.ok("false"); } } } /** * The controller method index() is the name of the default method that Juzu * will call. set localization and put into parameters * * @param httpContext * @return Response */ @View public Response index(HttpContext httpContext) { Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("urlUploadFile", BrandingController_.uploadFile(null)); parameters.put("imageUrl", getLogoUrl(httpContext, true)); return index.ok(parameters); } /** * verify if the url of logo is available return true if exist, otherwise * return false * * @param logoUrl * @return boolean */ public boolean isExiste(String logoUrl) { int code; try { URL u = new URL(logoUrl); HttpURLConnection huc = (HttpURLConnection) u.openConnection(); huc.setRequestMethod("GET"); // OR huc.setRequestMethod ("HEAD"); huc.connect(); code = huc.getResponseCode(); } catch (Exception e) { return false; } return code == 200; } /** * this method will be invoked when the user click on save * * @param style style of navigation bar * @param isChangeLogo to know if the logo will be update from logo preview * @return */ @Ajax @Resource public Response.Content save(String style, String isChangeLogo, HttpContext httpContext) { if (isAdmin()) { if (isChangeLogo != null && Boolean.valueOf(isChangeLogo)) { dataStorageService.saveLogo(); } if (StringUtils.isNotEmpty(style)) { settingService.set(Context.GLOBAL, Scope.GLOBAL, BAR_NAVIGATION_STYLE_KEY, SettingValue.create(style)); } return getResource(httpContext); } else { LOG.info("Cannot save branding due to insufficient permission."); } JSONObject result = new JSONObject(); try { result.put("error", "1"); } catch (JSONException ex) { if (LOG.isErrorEnabled()) { LOG.error("Can not put error value", ex); } } return Response.ok(result.toString()).with(PropertyType.MIME_TYPE, "application/json"); } /** * get logo URL to String * * @param httpContext * @return String */ public String getLogoUrl(HttpContext httpContext, boolean isRealLogo) { String portalName = ExoContainerContext.getCurrentContainer() .getContext() .getPortalContainerName(); String logoFolderUrl = httpContext.getScheme() + "://" + httpContext.getServerName() + ":" + httpContext.getServerPort() + "/" + portalName + "/rest/jcr/repository/collaboration/Application%20Data/logos/"; String logoUrl = null; if (isRealLogo) { logoUrl = logoFolderUrl + BrandingDataStorageService.logo_name + "?" + System.currentTimeMillis(); } else { logoUrl = logoFolderUrl + BrandingDataStorageService.logo_preview_name + "?" + System.currentTimeMillis(); } if (!isExiste(logoUrl)) { logoUrl = "/eXoSkin/skin/images/themes/default/platform/skin/ToolbarContainer/HomeIcon.png"; } return logoUrl; } /** * return the object data contains the url of logo and the bar navigation * * @param httpContext * @return Resource */ @Ajax @Resource public Response.Content getResource(HttpContext httpContext) { JSONObject json = new JSONObject(); String style = "Dark"; if (settingService.get(Context.GLOBAL, Scope.GLOBAL, BAR_NAVIGATION_STYLE_KEY) != null) { style = (String) settingService.get(Context.GLOBAL, Scope.GLOBAL, BAR_NAVIGATION_STYLE_KEY) .getValue(); } try { json.put("error", "0"); json.put("style", style); json.put("logoUrl", getLogoUrl(httpContext, true)); } catch (JSONException ex) { if (LOG.isErrorEnabled()) { LOG.error("Can not put json value", ex); } } return Response.ok(json.toString()).with(PropertyType.MIME_TYPE, "application/json"); } private boolean isAdmin() { try { UserACL userACL = (UserACL) ExoContainerContext.getCurrentContainer() .getComponentInstanceOfType(UserACL.class); if (userACL == null) return false; ConversationState state = ConversationState.getCurrent(); if (state == null) return false; String userId = state.getIdentity().getUserId(); if (userId == null) return false; if (userId.equalsIgnoreCase(userACL.getSuperUser()) ) { return true; } return state.getIdentity().isMemberOf(userACL.getAdminGroups()); } catch (Exception e) { return false; } } }