blob: 4d7ae98d502d14ea090245a694ad9a103b398331 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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.apache.hadoop.chukwa.hicc;
import java.io.*;
import java.nio.charset.Charset;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.chukwa.util.XssFilter;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import org.apache.hadoop.chukwa.util.ExceptionUtil;
public class Workspace extends HttpServlet {
public static final long serialVersionUID = 101L;
private static final Log log = LogFactory.getLog(Workspace.class);
private String path = System.getenv("CHUKWA_DATA_DIR");
private JSONObject hash = new JSONObject();
transient private XssFilter xf;
@Override
protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
xf = new XssFilter(request);
response.setContentType("text/plain");
String method = xf.getParameter("method");
if (method.equals("get_views_list")) {
getViewsList(request, response);
}
if (method.equals("get_view")) {
getView(request, response);
}
if (method.equals("save_view")) {
saveView(request, response);
}
if (method.equals("change_view_info")) {
changeViewInfo(request, response);
}
if (method.equals("get_widget_list")) {
getWidgetList(request, response);
}
if (method.equals("clone_view")) {
cloneView(request, response);
}
if (method.equals("delete_view")) {
deleteView(request, response);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
doGet(request, response);
}
static public String getContents(File aFile) {
// ...checks on aFile are elided
StringBuffer contents = new StringBuffer();
try {
// use buffering, reading one line at a time
// FileReader always assumes default encoding is OK!
BufferedReader input = new BufferedReader(new InputStreamReader(new FileInputStream(aFile.getAbsolutePath()), Charset.forName("UTF-8")));
try {
String line = null; // not declared within while loop
/*
* readLine is a bit quirky : it returns the content of a line MINUS the
* newline. it returns null only for the END of the stream. it returns
* an empty String if two newlines appear in a row.
*/
while ((line = input.readLine()) != null) {
contents.append(line);
contents.append(System.getProperty("line.separator"));
}
} finally {
input.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
return contents.toString();
}
public void setContents(String fName, String buffer) {
try {
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fName), Charset.forName("UTF-8")));
out.write(buffer);
out.close();
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
public void cloneView(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
PrintWriter out = response.getWriter();
String name = xf.getParameter("name");
String template = xf.getParameter("clone_name");
File aFile = new File(path + "/views/" + template);
String config = getContents(aFile);
int i = 0;
boolean check = true;
while (check) {
String tmpName = name;
if (i > 0) {
tmpName = name + i;
}
File checkFile = new File(path + "/views/" + tmpName + ".view");
check = checkFile.exists();
if (!check) {
name = tmpName;
}
i = i + 1;
}
setContents(path + "/views/" + name + ".view", config);
File deleteCache = new File(path + "/views/workspace_view_list.cache");
if(!deleteCache.delete()) {
log.warn("Can not delete "+path + "/views/workspace_view_list.cache");
}
genViewCache(path + "/views");
aFile = new File(path + "/views/workspace_view_list.cache");
String viewsCache = getContents(aFile);
out.println(viewsCache);
}
public void deleteView(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
String name = xf.getParameter("name");
File aFile = new File(path + "/views/" + name + ".view");
if(!aFile.delete()) {
log.warn("Can not delete " + path + "/views/" + name + ".view");
}
File deleteCache = new File(path + "/views/workspace_view_list.cache");
if(!deleteCache.delete()) {
log.warn("Can not delete "+path + "/views/workspace_view_list.cache");
}
genViewCache(path + "/views");
}
public void getViewsList(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
PrintWriter out = response.getWriter();
genViewCache(path + "/views");
File aFile = new File(path + "/views/workspace_view_list.cache");
String viewsCache = getContents(aFile);
out.println(viewsCache);
}
public void getView(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
PrintWriter out = response.getWriter();
String id = xf.getParameter("id");
genViewCache(path + "/views");
File aFile = new File(path + "/views/" + id + ".view");
String view = getContents(aFile);
out.println(view);
}
public void changeViewInfo(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
PrintWriter out = response.getWriter();
String id = xf.getParameter("name");
String config = request.getParameter("config");
try {
JSONObject jt = (JSONObject) JSONValue.parse(config);
File aFile = new File(path + "/views/" + id + ".view");
String original = getContents(aFile);
JSONObject updateObject = (JSONObject) JSONValue.parse(original);
updateObject.put("description", jt.get("description"));
setContents(path + "/views/" + id + ".view", updateObject.toString());
if (!rename(id, jt.get("description").toString())) {
throw new Exception("Rename view file failed");
}
File deleteCache = new File(path + "/views/workspace_view_list.cache");
if(!deleteCache.delete()) {
log.warn("Can not delete "+path + "/views/workspace_view_list.cache");
}
genViewCache(path + "/views");
out.println("Workspace is stored successfully.");
} catch (Exception e) {
out.println("Workspace store failed.");
}
}
public void saveView(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
PrintWriter out = response.getWriter();
String id = xf.getParameter("name");
String config = request.getParameter("config");
setContents(path + "/views/" + id + ".view", config);
out.println("Workspace is stored successfully.");
}
public void getWidgetList(HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
PrintWriter out = response.getWriter();
genWidgetCache(path + "/descriptors");
File aFile = new File(path + "/descriptors/workspace_plugin.cache");
String viewsCache = getContents(aFile);
out.println(viewsCache);
}
private void genViewCache(String source) {
File cacheFile = new File(source + "/workspace_view_list.cache");
if (!cacheFile.exists()) {
File dir = new File(source);
File[] filesWanted = dir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".view");
}
});
if(filesWanted!=null) {
JSONObject[] cacheGroup = new JSONObject[filesWanted.length];
for (int i = 0; i < filesWanted.length; i++) {
String buffer = getContents(filesWanted[i]);
try {
JSONObject jt = (JSONObject) JSONValue.parse(buffer);
String fn = filesWanted[i].getName();
jt.put("key", fn.substring(0, (fn.length() - 5)));
cacheGroup[i] = jt;
} catch (Exception e) {
log.debug(ExceptionUtil.getStackTrace(e));
}
}
String viewList = convertObjectsToViewList(cacheGroup);
setContents(source + "/workspace_view_list.cache", viewList);
}
}
}
public String convertObjectsToViewList(JSONObject[] objArray) {
JSONArray jsonArr = new JSONArray();
JSONObject permission = new JSONObject();
JSONObject user = new JSONObject();
try {
permission.put("read", 1);
permission.put("modify", 1);
user.put("all", permission);
} catch (Exception e) {
System.err.println("JSON Exception: " + e.getMessage());
}
for (int i = 0; i < objArray.length; i++) {
try {
JSONObject jsonObj = new JSONObject();
jsonObj.put("key", objArray[i].get("key"));
jsonObj.put("description", objArray[i].get("description"));
jsonObj.put("owner", "");
jsonObj.put("permission", user);
jsonArr.add(jsonObj);
} catch (Exception e) {
System.err.println("JSON Exception: " + e.getMessage());
}
}
return jsonArr.toString();
}
private void genWidgetCache(String source) {
File cacheFile = new File(source + "/workspace_plugin.cache");
File cacheDir = new File(source);
if (!cacheFile.exists()
|| cacheFile.lastModified() < cacheDir.lastModified()) {
File dir = new File(source);
File[] filesWanted = dir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".descriptor");
}
});
if(filesWanted!=null) {
JSONObject[] cacheGroup = new JSONObject[filesWanted.length];
for (int i = 0; i < filesWanted.length; i++) {
String buffer = getContents(filesWanted[i]);
try {
JSONObject jt = (JSONObject) JSONValue.parse(buffer);
cacheGroup[i] = jt;
} catch (Exception e) {
log.debug(ExceptionUtil.getStackTrace(e));
}
}
String widgetList = convertObjectsToWidgetList(cacheGroup);
setContents(source + "/workspace_plugin.cache", widgetList);
}
}
}
public String convertObjectsToWidgetList(JSONObject[] objArray) {
JSONObject jsonObj = new JSONObject();
JSONArray jsonArr = new JSONArray();
for (int i = 0; i < objArray.length; i++) {
jsonArr.add(objArray[i]);
}
try {
jsonObj.put("detail", jsonArr);
} catch (Exception e) {
System.err.println("JSON Exception: " + e.getMessage());
}
for (int i = 0; i < objArray.length; i++) {
try {
String[] categoriesArray = objArray[i].get("categories").toString()
.split(",");
hash = addToHash(hash, categoriesArray, objArray[i]);
} catch (Exception e) {
System.err.println("JSON Exception: " + e.getMessage());
}
}
try {
jsonObj.put("children", hash);
} catch (Exception e) {
System.err.println("JSON Exception: " + e.getMessage());
}
return jsonObj.toString();
}
public JSONObject addToHash(JSONObject hash, String[] categoriesArray,
JSONObject obj) {
JSONObject subHash = hash;
for (int i = 0; i < categoriesArray.length; i++) {
String id = categoriesArray[i];
if (i >= categoriesArray.length - 1) {
try {
subHash.put("leaf:" + obj.get("title"), obj.get("id"));
} catch (Exception e) {
System.err.println("JSON Exception: " + e.getMessage());
}
} else {
try {
subHash = (JSONObject) subHash.get("node:" + id);
} catch (Exception e) {
try {
JSONObject tmpHash = new JSONObject();
subHash.put("node:" + id, tmpHash);
subHash = tmpHash;
} catch (Exception ex) {
log.debug(ExceptionUtil.getStackTrace(e));
}
}
}
}
return hash;
}
private boolean rename(String id, String desc) {
try {
File view = new File(path + "/views/" + id + ".view");
File newFile = new File(path + File.separator + "views" + File.separator
+ desc + ".view");
if(!view.renameTo(newFile)) {
log.warn("Can not rename " + path + "/views/" + id + ".view to " +
path + File.separator + "views" + File.separator + desc + ".view");
}
} catch (Exception e) {
return false;
}
return true;
}
}