Package net.ameba.cassandra.web.controller

Source Code of net.ameba.cassandra.web.controller.KeyspaceController

package net.ameba.cassandra.web.controller;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.ameba.cassandra.web.service.CassandraClientProvider;

import org.apache.cassandra.thrift.Cassandra.Client;
import org.apache.cassandra.thrift.CfDef;
import org.apache.cassandra.thrift.KsDef;
import org.apache.cassandra.thrift.TokenRange;
import org.apache.thrift.TException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

/**
* {@link KeyspaceController} supports functions to manage keyspaces.
*/
@Controller
public class KeyspaceController extends AbstractBaseController {
 
  @Autowired
  private CassandraClientProvider clientProvider;
 
  @RequestMapping("/keyspaces")
  public String listKeyspaces(
      @RequestParam("keyspace") String activeKeyspace,
      @RequestParam("columnFamily") String activeColumnFamily,
      ModelMap model) throws Exception {
   
    try {
      Client client = clientProvider.getThriftClient();
      if (client != null) {
        //Collections.sort(keyspaceSet);
        model.addAttribute("keyspaces", client.describe_keyspaces());
       
        // Get list of column families from active keyspace.
        if (activeKeyspace.length() > 0) {
          KsDef ksdef = client.describe_keyspace(activeKeyspace);
          List<CfDef> cfList = new ArrayList<CfDef>(ksdef.getCf_defs());
          Collections.sort(cfList);
          model.addAttribute("columnFamilies", cfList);
        }
       
      } else {
        model.addAttribute("keyspaces", new ArrayList<KsDef>());
      }
    } catch (TException ex) {
      model.addAttribute("keyspaces", new ArrayList<KsDef>());
    }
   
    model.addAttribute("activeKeyspace", activeKeyspace);
    model.addAttribute("activeColumnFamily", activeColumnFamily);
   
    return "/keyspace_list";
  }
 
  @RequestMapping(value="/keyspace/{name}/", method=RequestMethod.GET)
  public String describeKeyspace(
      @PathVariable("name") String keyspaceName,
      ModelMap model) throws Exception {
   
    Client client = clientProvider.getThriftClient();
   
    // Getting keyspace information
    KsDef ksDef = client.describe_keyspace(keyspaceName);
    model.put("keyspace", ksDef);
    model.put("keyspaceName", keyspaceName);
   
    // Check the system keyspace
    boolean isSystem = cassandraService.isSystemKeyspace(keyspaceName);
    if (isSystem) {
      model.put("system", true);
    } else {
      List<TokenRange> tokenRange = client.describe_ring(keyspaceName);
      Collections.sort(tokenRange);
      model.put("tokenRanges", tokenRange);
    }
   
    return "/keyspace";
  }
 
  @RequestMapping(value="/keyspace/create", method=RequestMethod.GET)
  public String createKeyspace(ModelMap model) {
    return "/keyspace_create";
  }
 
  @RequestMapping(value="/keyspace/create", method=RequestMethod.POST)
  public String createKeyspaceExecute(
      @RequestParam("name") String name,
      @RequestParam("replicationFactor") int replicationFactor,
      @RequestParam("strategy") String strategy,
      ModelMap model
      ) throws Exception {
   
    Client client = clientProvider.getThriftClient();
   
    name = name.trim();
    if (name.length() == 0) {
      throw new IllegalArgumentException("Name must not be empty");
    }
   
    String strategyClass = null;
    if (strategy.equals("Simple")) {
      strategyClass ="org.apache.cassandra.locator SimpleStrategy";
    } else if (strategy.equals("NetworkTopology")) {
      strategyClass = "org.apache.cassandra.locator NetworkTopologyStrategy";
    } else if (strategy.equals("OldNetworkTopology")) {
      strategyClass = "org.apache.cassandra.locator.OldNetworkTopologyStrategy";
    }
   
    KsDef ksDef = new KsDef(name, strategyClass, new ArrayList<CfDef>());
    Map<String, String> strategyOptions = new HashMap<String, String>();
    strategyOptions.put("replication_factor", String.valueOf(replicationFactor));
    ksDef.setStrategy_options(strategyOptions);
    client.system_add_keyspace(ksDef);
   
    model.clear();
    return "redirect:/keyspace/" + name + "/";
  }

  @RequestMapping(value="/keyspace/{name}/rename", method=RequestMethod.GET)
  public String renameKeyspace(
      @PathVariable("name") String keyspaceName,
      ModelMap model) {
    model.addAttribute("name", keyspaceName);
    return "/keyspace_rename";
  }
 
  @RequestMapping(value="/keyspace/{name}/rename", method=RequestMethod.POST)
  public String renameKeyspaceExecute(
      @PathVariable("name") String originalName,
      @RequestParam("name") String name,
      ModelMap model
      ) throws Exception {
    throw new UnsupportedOperationException("rename keyspace no longer supported");
  }

  @RequestMapping(value="/keyspace/{name}/drop", method=RequestMethod.GET)
  public String dropKeyspace(
      @PathVariable("name") String keyspaceName,
      ModelMap model) {
    model.addAttribute("name", keyspaceName);
    return "/keyspace_drop";
  }
 
  @RequestMapping(value="/keyspace/{name}/drop", method=RequestMethod.POST)
  public String dropKeyspaceExecute(
      @PathVariable("name") String keyspaceName,
      ModelMap model
      ) throws Exception {
   
    Client client = clientProvider.getThriftClient();

    client.set_keyspace(keyspaceName);;
    client.system_drop_keyspace(keyspaceName);
   
    model.clear();
    return "redirect:/";
  }

}
TOP

Related Classes of net.ameba.cassandra.web.controller.KeyspaceController

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.