/**
   * Load and return the Session associated with the specified session identifier from this Store,
   * without removing it. If there is no such stored Session, return <code>null</code>.
   *
   * @param id Session identifier of the session to load
   * @exception ClassNotFoundException if a deserialization error occurs
   * @exception IOException if an input/output error occurs
   */
  @Override
  public Session load(String id) throws ClassNotFoundException, IOException {

    // Open an input stream to the specified pathname, if any
    File file = file(id);
    if (file == null) {
      return (null);
    }

    if (!file.exists()) {
      return (null);
    }
    if (manager.getContext().getLogger().isDebugEnabled()) {
      manager
          .getContext()
          .getLogger()
          .debug(sm.getString(getStoreName() + ".loading", id, file.getAbsolutePath()));
    }

    ObjectInputStream ois = null;
    Loader loader = null;
    ClassLoader classLoader = null;
    ClassLoader oldThreadContextCL = Thread.currentThread().getContextClassLoader();
    try (FileInputStream fis = new FileInputStream(file.getAbsolutePath());
        BufferedInputStream bis = new BufferedInputStream(fis)) {
      Context context = manager.getContext();
      if (context != null) loader = context.getLoader();
      if (loader != null) classLoader = loader.getClassLoader();
      if (classLoader != null) {
        Thread.currentThread().setContextClassLoader(classLoader);
        ois = new CustomObjectInputStream(bis, classLoader);
      } else {
        ois = new ObjectInputStream(bis);
      }

      StandardSession session = (StandardSession) manager.createEmptySession();
      session.readObjectData(ois);
      session.setManager(manager);
      return (session);
    } catch (FileNotFoundException e) {
      if (manager.getContext().getLogger().isDebugEnabled())
        manager.getContext().getLogger().debug("No persisted data file found");
      return (null);
    } finally {
      if (ois != null) {
        // Close the input stream
        try {
          ois.close();
        } catch (IOException f) {
          // Ignore
        }
      }
      Thread.currentThread().setContextClassLoader(oldThreadContextCL);
    }
  }
  /**
   * Load any currently active sessions that were previously unloaded to the appropriate persistence
   * mechanism, if any. If persistence is not supported, this method returns without doing anything.
   *
   * @exception ClassNotFoundException if a serialized class cannot be found during the reload
   * @exception IOException if an input/output error occurs
   */
  public void load() throws ClassNotFoundException, IOException {

    if (debug >= 1) log("Start: Loading persisted sessions");

    // Initialize our internal data structures
    recycled.clear();
    sessions.clear();

    // Open an input stream to the specified pathname, if any
    File file = file();
    if (file == null) return;
    if (debug >= 1) log(sm.getString("standardManager.loading", pathname));
    FileInputStream fis = null;
    ObjectInputStream ois = null;
    Loader loader = null;
    ClassLoader classLoader = null;
    try {
      fis = new FileInputStream(file.getAbsolutePath());
      BufferedInputStream bis = new BufferedInputStream(fis);
      if (container != null) loader = container.getLoader();
      if (loader != null) classLoader = loader.getClassLoader();
      if (classLoader != null) {
        if (debug >= 1) log("Creating custom object input stream for class loader " + classLoader);
        ois = new CustomObjectInputStream(bis, classLoader);
      } else {
        if (debug >= 1) log("Creating standard object input stream");
        ois = new ObjectInputStream(bis);
      }
    } catch (FileNotFoundException e) {
      if (debug >= 1) log("No persisted data file found");
      return;
    } catch (IOException e) {
      log(sm.getString("standardManager.loading.ioe", e), e);
      if (ois != null) {
        try {
          ois.close();
        } catch (IOException f) {;
        }
        ois = null;
      }
      throw e;
    }

    // Load the previously unloaded active sessions
    synchronized (sessions) {
      try {
        Integer count = (Integer) ois.readObject();
        int n = count.intValue();
        if (debug >= 1) log("Loading " + n + " persisted sessions");
        for (int i = 0; i < n; i++) {
          StandardSession session = new StandardSession(this);
          session.readObjectData(ois);
          session.setManager(this);
          sessions.put(session.getId(), session);
          session.activate();
        }
      } catch (ClassNotFoundException e) {
        log(sm.getString("standardManager.loading.cnfe", e), e);
        if (ois != null) {
          try {
            ois.close();
          } catch (IOException f) {;
          }
          ois = null;
        }
        throw e;
      } catch (IOException e) {
        log(sm.getString("standardManager.loading.ioe", e), e);
        if (ois != null) {
          try {
            ois.close();
          } catch (IOException f) {;
          }
          ois = null;
        }
        throw e;
      } finally {
        // Close the input stream
        try {
          if (ois != null) ois.close();
        } catch (IOException f) {
          // ignored
        }

        // Delete the persistent storage file
        if (file != null && file.exists()) file.delete();
      }
    }

    if (debug >= 1) log("Finish: Loading persisted sessions");
  }
  /**
   * Load the Session associated with the id <code>id</code>. If no such session is found <code>null
   * </code> is returned.
   *
   * @param id a value of type <code>String</code>
   * @return the stored <code>Session</code>
   * @exception ClassNotFoundException if an error occurs
   * @exception IOException if an input/output error occurred
   */
  public Session load(String id) throws ClassNotFoundException, IOException {
    ResultSet rst = null;
    StandardSession _session = null;
    Loader loader = null;
    ClassLoader classLoader = null;
    ObjectInputStream ois = null;
    BufferedInputStream bis = null;
    Container container = manager.getContainer();
    String loadSql =
        "SELECT "
            + sessionIdCol
            + ", "
            + sessionDataCol
            + " FROM "
            + sessionTable
            + " WHERE "
            + sessionIdCol
            + " = ? AND "
            + sessionAppCol
            + " = ?";

    synchronized (this) {
      Connection _conn = getConnection();
      if (_conn == null) {
        return (null);
      }

      try {
        if (preparedLoadSql == null) {
          preparedLoadSql = _conn.prepareStatement(loadSql);
        }

        preparedLoadSql.setString(1, id);
        preparedLoadSql.setString(2, getName());
        rst = preparedLoadSql.executeQuery();
        if (rst.next()) {
          bis = new BufferedInputStream(rst.getBinaryStream(2));

          if (container != null) {
            loader = container.getLoader();
          }
          if (loader != null) {
            classLoader = loader.getClassLoader();
          }
          if (classLoader != null) {
            ois = new CustomObjectInputStream(bis, classLoader);
          } else {
            ois = new ObjectInputStream(bis);
          }

          if (debug > 0) {
            log(sm.getString(getStoreName() + ".loading", id, sessionTable));
          }

          _session = (StandardSession) manager.createEmptySession();
          _session.readObjectData(ois);
          _session.setManager(manager);

        } else if (debug > 0) {
          log(getStoreName() + ": No persisted data object found");
        }
      } catch (SQLException e) {
        log(sm.getString(getStoreName() + ".SQLException", e));
      } finally {
        try {
          if (rst != null) {
            rst.close();
          }
        } catch (SQLException e) {;
        }
        if (ois != null) {
          try {
            ois.close();
          } catch (IOException e) {;
          }
        }
        release(_conn);
      }
    }

    return (_session);
  }