public static Session createSession(String workspaceName) throws RepositoryException {

    if (workspaceName == null) {
      workspaceName = JCRFactory.WORKSPACE_NAME;
    }

    if (!PropsValues.JCR_WRAP_SESSION) {
      JCRFactory jcrFactory = getJCRFactory();

      return jcrFactory.createSession(workspaceName);
    }

    Map<String, Session> sessions = _sessions.get();

    Session session = sessions.get(workspaceName);

    if (session != null) {
      return session;
    }

    JCRFactory jcrFactory = getJCRFactory();

    Session jcrSession = jcrFactory.createSession(workspaceName);

    JCRSessionInvocationHandler jcrSessionInvocationHandler =
        new JCRSessionInvocationHandler(jcrSession);

    Object sessionProxy =
        ProxyUtil.newProxyInstance(
            ClassLoaderUtil.getPortalClassLoader(),
            new Class<?>[] {Map.class, Session.class},
            jcrSessionInvocationHandler);

    FinalizeManager.register(
        sessionProxy, jcrSessionInvocationHandler, FinalizeManager.PHANTOM_REFERENCE_FACTORY);

    session = (Session) sessionProxy;

    sessions.put(workspaceName, session);

    return session;
  }
  public static void prepare() throws RepositoryException {
    JCRFactory jcrFactory = getJCRFactory();

    jcrFactory.prepare();
  }
  public static void initialize() throws RepositoryException {
    JCRFactory jcrFactory = getJCRFactory();

    jcrFactory.initialize();
  }
  public static void shutdown() {
    JCRFactory jcrFactory = getJCRFactory();

    jcrFactory.shutdown();
  }