Azkaban的Web Server源碼探究系列14:建立Project

建立的圖爲:java

經過抓包,能夠分析出 路徑爲: 瀏覽器

POST /manager HTTP/1.1

因此,須要分析session

root.addServlet(new ServletHolder(new ProjectManagerServlet()), "/manager");ide

分析ProjectManagerServletspa

=================================================================================code

1)initserver

 @Overrideip

  public void init(ServletConfig config) throws ServletException {get

    super.init(config);qt

 

    AzkabanWebServer server = (AzkabanWebServer) getApplication();

    projectManager = server.getProjectManager();

    executorManager = server.getExecutorManager();

    scheduleManager = server.getScheduleManager();

    userManager = server.getUserManager();

    lockdownCreateProjects =

        server.getServerProps().getBoolean(LOCKDOWN_CREATE_PROJECTS_KEY, false);

    if (lockdownCreateProjects) {

      logger.info("Creation of projects is locked down");

    }

 

    downloadBufferSize =

        server.getServerProps().getInt(PROJECT_DOWNLOAD_BUFFER_SIZE_IN_BYTES,

            8192);

 

    logger.info("downloadBufferSize: " + downloadBufferSize);

  }

比較簡單,就很少說了。

2)doPost

  @Override

  protected void handlePost(HttpServletRequest req, HttpServletResponse resp,

      Session session) throws ServletException, IOException {

  //從這裏開始

    if (hasParam(req, "action")) {

      String action = getParam(req, "action");

      if (action.equals("create")) {//若是是建立Project

        handleCreate(req, resp, session);

      }

    }

  }

下面就須要去看handleCreate的代碼。。。

========================================================================

 private synchronized Project createNewProject(Connection connection,

      String name, String description, User creator)

      throws ProjectManagerException {

    QueryRunner runner = new QueryRunner();

    ProjectResultHandler handler = new ProjectResultHandler();

 

    //查看是否存在

    try {

      List<Project> project =

          runner

              .query(connection,

                  ProjectResultHandler.SELECT_ACTIVE_PROJECT_BY_NAME, handler,

                  name);

      if (!project.isEmpty()) {

        throw new ProjectManagerException("Active project with name " + name

            + " already exists in db.");

      }

    } catch (SQLException e) {

      logger.error(e);

      throw new ProjectManagerException(

          "Checking for existing project failed. " + name, e);

    }

    //執行插入語句

    final String INSERT_PROJECT =

        "INSERT INTO projects ( name, active, modified_time, create_time, version, last_modified_by, description, enc_type, settings_blob) values (?,?,?,?,?,?,?,?,?)";

    // Insert project

    try {

      long time = System.currentTimeMillis();

      int i =

          runner.update(connection, INSERT_PROJECT, name, true, time, time,

              null, creator.getUserId(), description,

              defaultEncodingType.getNumVal(), null);

      if (i == 0) {

        throw new ProjectManagerException("No projects have been inserted.");

      }

      connection.commit();

 

    } catch (SQLException e) {

      logger.error(INSERT_PROJECT + " failed.");

      try {

        connection.rollback();

      } catch (SQLException e1) {

        e1.printStackTrace();

      }

      throw new ProjectManagerException(

          "Insert project for existing project failed. " + name, e);

    }

    //順利插入

    // Do another query to grab and return the project.

    Project project = null;

    try {

      List<Project> projects =

          runner

              .query(connection,

                  ProjectResultHandler.SELECT_ACTIVE_PROJECT_BY_NAME, handler,

                  name);

      if (projects.isEmpty()) {

        throw new ProjectManagerException("No active project with name " + name

            + " exists in db.");

      } else if (projects.size() > 1) {

        throw new ProjectManagerException("More than one active project "

            + name);

      }

 

      project = projects.get(0);

    } catch (SQLException e) {

      logger.error(e);

      throw new ProjectManagerException(

          "Checking for existing project failed. " + name, e);

    }

    //返回

    return project;

  }


固然,最後作了一個event 跟蹤,

而後再返回給瀏覽器如下內容:

1032224350@qtp-808228639-2[1] print response

 response = "{"path":"manager?project=adf","action":"redirect","status":"success"}"

搞定!

相關文章
相關標籤/搜索