/* * 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.datastore; import java.io.File; import java.io.IOException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.json.JSONArray; import org.json.JSONObject; import org.apache.hadoop.chukwa.conf.ChukwaConfiguration; import org.apache.hadoop.chukwa.hicc.HiccWebServer; import org.apache.hadoop.chukwa.rest.bean.ViewBean; import org.apache.hadoop.chukwa.util.ExceptionUtil; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; import org.apache.hadoop.fs.FSDataOutputStream; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; public class ViewStore { private String vid = null; private String uid = null; private ViewBean view = null; private static Log log = LogFactory.getLog(ViewStore.class); private static Configuration config = new Configuration(); private static ChukwaConfiguration chukwaConf = new ChukwaConfiguration(); private static String viewPath = config.get("fs.default.name")+File.separator+chukwaConf.get("chukwa.data.dir")+File.separator+"hicc"+File.separator+"views"; private static String publicViewPath = viewPath+File.separator+"public"; private static String usersViewPath = viewPath+File.separator+"users"; private static String PUBLIC = "public".intern(); private static String PRIVATE = "private".intern(); public ViewStore() throws IllegalAccessException { ViewStore.config = HiccWebServer.getConfig(); } public ViewStore(String uid, String vid) throws IllegalAccessException { this.uid=uid; this.vid=vid; load(uid, vid); } public void load(String uid, String vid) throws IllegalAccessException { StringBuilder vp = new StringBuilder(); vp.append(usersViewPath); vp.append(File.separator); vp.append(uid); vp.append(File.separator); vp.append(vid); vp.append(".view"); Path viewFile = new Path(vp.toString()); try { FileSystem fs = FileSystem.get(config); if(!fs.exists(viewFile)) { StringBuilder pubPath = new StringBuilder(); pubPath.append(publicViewPath); pubPath.append(File.separator); pubPath.append(vid); pubPath.append(".view"); viewFile = new Path(pubPath.toString()); } if(fs.exists(viewFile)) { FileStatus[] fstatus = fs.listStatus(viewFile); long size = fstatus[0].getLen(); FSDataInputStream viewStream = fs.open(viewFile); byte[] buffer = new byte[(int)size]; viewStream.readFully(buffer); viewStream.close(); try { view = new ViewBean(new JSONObject(new String(buffer))); view.update(); } catch (Exception e) { log.error(ExceptionUtil.getStackTrace(e)); throw new IllegalAccessException("Unable to access view: "+vid); } } } catch (IOException ex) { log.error(ExceptionUtil.getStackTrace(ex)); } } public String getMessage() { return view.toString(); } public ViewBean get() throws IllegalAccessException { if(view==null) { load(uid, vid); } if(view==null) { // Display global default view if user default view does not exist. try { load(null, vid); } catch(Exception e) { log.error(ExceptionUtil.getStackTrace(e)); view = null; } } return view; } public void set(ViewBean view) throws IllegalAccessException { try { if (this.view == null || (this.view.getOwner().intern() == view.getOwner().intern())) { if(this.view!=null) { delete(); } StringBuilder viewPath = new StringBuilder(); if(view.getPermissionType().intern()==PUBLIC) { viewPath.append(publicViewPath); } else { viewPath.append(usersViewPath); viewPath.append(File.separator); viewPath.append(uid); } viewPath.append(File.separator); viewPath.append(view.getName()); viewPath.append(".view"); Path viewFile = new Path(viewPath.toString()); try { FileSystem fs = FileSystem.get(config); FSDataOutputStream out = fs.create(viewFile,true); out.write(view.deserialize().toString().getBytes()); out.close(); } catch (IOException ex) { log.error(ExceptionUtil.getStackTrace(ex)); } this.view = view; } else { if(view.getPermissionType().intern()==PUBLIC) { throw new IllegalAccessException("Unable to save public view, duplicated view exists."); } else { throw new IllegalAccessException("Unable to save user view."); } } } catch (Exception e) { log.error(ExceptionUtil.getStackTrace(e)); throw new IllegalAccessException("Unable to access user view."); } } public void delete() throws IllegalAccessException { try { if(this.view==null) { get(); } if (this.view!=null) { StringBuilder viewPath = new StringBuilder(); if(view.getPermissionType().intern()==PUBLIC) { viewPath.append(publicViewPath); } else { viewPath.append(usersViewPath); viewPath.append(File.separator); viewPath.append(uid); } viewPath.append(File.separator); viewPath.append(view.getName()); viewPath.append(".view"); Path viewFile = new Path(viewPath.toString()); try { FileSystem fs = FileSystem.get(config); fs.delete(viewFile, true); } catch (IOException ex) { log.error(ExceptionUtil.getStackTrace(ex)); } } else { throw new IllegalAccessException("Unable to delete user view, view does not exist."); } } catch (Exception e) { log.error(ExceptionUtil.getStackTrace(e)); throw new IllegalAccessException("Unable to access user view."); } } public static JSONArray list(String uid) throws IllegalAccessException { StringBuilder viewPath = new StringBuilder(); viewPath.append(usersViewPath); viewPath.append(File.separator); viewPath.append(uid); String[] pathList = new String[2]; pathList[0]=viewPath.toString(); pathList[1]=publicViewPath; JSONArray list = new JSONArray(); for(String path : pathList) { Path viewFile = new Path(path); try { FileSystem fs = FileSystem.get(config); FileStatus[] fstatus = fs.listStatus(viewFile); if(fstatus!=null) { for(int i=0;i<fstatus.length;i++) { long size = fstatus[i].getLen(); FSDataInputStream viewStream = fs.open(fstatus[i].getPath()); byte[] buffer = new byte[(int)size]; viewStream.readFully(buffer); viewStream.close(); try { ViewBean view = new ViewBean(new JSONObject(new String(buffer))); JSONObject json = new JSONObject(); json.put("name", view.getName()); json.put("type", view.getPermissionType()); json.put("owner", view.getOwner()); if(uid.intern()==view.getOwner().intern()) { json.put("editable","true"); } else { json.put("editable","false"); } list.put(json); } catch (Exception e) { log.error(ExceptionUtil.getStackTrace(e)); } } } } catch (IOException ex) { log.error(ExceptionUtil.getStackTrace(ex)); throw new IllegalAccessException("Unable to access user view."); } } return list; } }