Java tutorial
/* * Copyright (c) 2005-2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. licenses this file to you under the Apache License, * Version 2.0 (the "License"); you may not use this file except * in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.wso2.carbon.apimgt.hostobjects; import org.apache.commons.io.IOUtils; import org.jaggeryjs.hostobjects.file.FileHostObject; import org.wso2.carbon.apimgt.api.APIManagementException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jaggeryjs.scriptengine.exceptions.ScriptException; import org.mozilla.javascript.Context; import org.mozilla.javascript.Function; import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.ScriptableObject; import java.io.*; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import org.apache.commons.io.FilenameUtils; public class TenantManagerHostObject extends ScriptableObject { private static final Log log = LogFactory.getLog(TenantManagerHostObject.class); //using a set for file extensions white list since it will be faster to search private static final Set<String> EXTENTION_WHITELIST = new HashSet<String>( Arrays.asList(new String[] { "css", "jpg", "png", "gif", "svg", "ttf", "html", "js" })); public static String getStoreTenantThemesPath() { return "repository" + File.separator + "deployment" + File.separator + "server" + File.separator + "jaggeryapps" + File.separator + "store" + File.separator + "site" + File.separator + "tenant_themes" + File.separator; } @Override public String getClassName() { return "APIManager"; } public static Scriptable jsConstructor(Context cx, Object[] args, Function ctorObj, boolean inNewExpr) throws ScriptException { return new TenantManagerHostObject(); } private static void handleException(String msg) throws APIManagementException { log.error(msg); throw new APIManagementException(msg); } private static void handleException(String msg, Throwable t) throws APIManagementException { log.error(msg, t); throw new APIManagementException(msg, t); } public static boolean jsFunction_addTenantTheme(Context cx, Scriptable thisObj, Object[] args, Function funObj) throws APIManagementException { if (args == null || args.length != 2) { handleException("Invalid input parameters for addTenantTheme"); } FileHostObject uploadFile = null; String tenant = null; try { uploadFile = (FileHostObject) args[0]; tenant = (String) args[1]; } catch (ClassCastException ce) { handleException("Invalid input parameters for addTenantTheme"); } //extract the zip file to store directory deployTenantTheme(uploadFile, tenant); return true; } //would be nice to have zip4j private static void deployTenantTheme(FileHostObject themeFile, String tenant) throws APIManagementException { ZipInputStream zis = null; byte[] buffer = new byte[1024]; String outputFolder = TenantManagerHostObject.getStoreTenantThemesPath() + tenant; InputStream zipInputStream = null; try { zipInputStream = themeFile.getInputStream(); } catch (ScriptException e) { handleException("Error occurred while deploying tenant theme file", e); } try { //create output directory if it is not exists File folder = new File(outputFolder); if (!folder.exists()) { if (!folder.mkdirs()) { handleException("Unable to create tenant theme directory"); } } //get the zip file content zis = new ZipInputStream(zipInputStream); //get the zipped file list entry ZipEntry ze = zis.getNextEntry(); String ext = null; while (ze != null) { String fileName = ze.getName(); File newFile = new File(outputFolder + File.separator + fileName); if (ze.isDirectory()) { if (!newFile.exists()) { boolean status = newFile.mkdir(); if (status) { //todo handle exception } } } else { ext = FilenameUtils.getExtension(ze.getName()); if (TenantManagerHostObject.EXTENTION_WHITELIST.contains(ext)) { //create all non exists folders //else you will hit FileNotFoundException for compressed folder new File(newFile.getParent()).mkdirs(); FileOutputStream fos = new FileOutputStream(newFile); int len; while ((len = zis.read(buffer)) > 0) { fos.write(buffer, 0, len); } fos.close(); } else { log.warn("Unsupported file is uploaded with tenant theme by " + tenant + " : file name : " + ze.getName()); } } ze = zis.getNextEntry(); } zis.closeEntry(); zis.close(); } catch (IOException ex) { handleException("Failed to deploy tenant theme", ex); //todo remove if the tenant theme directory is created. } finally { IOUtils.closeQuietly(zis); IOUtils.closeQuietly(zipInputStream); } } }