Package org.apache.hadoop.chukwa.datastore

Source Code of org.apache.hadoop.chukwa.datastore.ViewStore

/*
* 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;
  }
}
          
TOP

Related Classes of org.apache.hadoop.chukwa.datastore.ViewStore

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.