OpenCms文件导入过程初探

OpenCms文件导入过程初探

OpenCms的安装过程中有一个文件导入的过程。由于工作原因,本人对这个导入过程做了点研究。有点收获写出来和大家共享。

在系统中安装过程是通过run_import.jsp文件(该文件位于sourcpath1/opencms_src_5.0.1/opencms/web/ocsetup)触发的。在该页中她使用了

<frameset rows="100%,*">

    <frame src="display_import.jsp" name="display">

    <frame src="about:blank" name="data">

</frameset>

这样的结构来完成导入和显示的功能。看到namedisplay很容易猜想他是用来向用户显示处理结果的,name data frame肯定是用来处理文件导入的了。这只是猜想,具体如何还有待证实。下面我们就去看看display_import.jsp这个文件。

display_import.jsp服务端基本没有什么处理,客户端的处理倒是不少。这一句<body <% if(setupOk){ out.print("οnlοad='enable();'");} %>>倒是很重要。我们先来看看enable()这个函数。

/* indicates if the document has been loaded */

function enable()   {

            enabled = true;

            parent.data.location.href="data_import.jsp";

            document.forms[0].info.value = message;

  }

在这个函数中有parent.data.location.href="data_import.jsp";这一句。他把name data framelocation.href设为"data_import.jsp"。从文件名来看应该是由该文件处理文件的导入工作。到底是不是,我们进去看看。

data_import.jsp页面中除了有个com.opencms.boot.CmsSetupsession范围的JavaBean外还有一个com.opencms.boot.CmsSetupThreadsession范围的JavaBean。那么这个CmsSetupThread到底是什么玩意。去看源码吧!

 

package com.opencms.boot;

 

import java.io.File;

import java.io.IOException;

import java.io.PipedOutputStream;

import java.io.PrintStream;

 

// CmsSetupThread是一个线程。

public class CmsSetupThread extends Thread {

 

       public void run() {

 

        /* save the original out and err stream */

        m_tempOut = System.out;

        m_tempErr = System.err;

 

        /* redirect the streams */

        System.setOut(new PrintStream(m_pipedOut));

        System.setErr(new PrintStream(m_pipedOut));

 

        /* start the logging thread */

        m_lt.start();

 

        /* start importing the workplace */

        CmsMain.startSetup(basePath + "WEB-INF/ocsetup/cmssetup.txt", basePath + "WEB-INF/");

 

        /* stop the logging thread */

        try {

            sleep(1000);

            m_lt.stopThread();

            m_pipedOut.close();

        }

        catch (InterruptedException e)  {

            m_lt.stopThread();

            e.printStackTrace(m_tempErr);

        }

        catch (IOException e)  {

            m_lt.stopThread();

            e.printStackTrace(m_tempErr);

        }

 

        /* restore to the old streams */

        System.setOut(m_tempOut);

        System.setErr(m_tempErr);

 

    }

…… ……

}

从上面的代码中的public void run() 方法中可以看出系统的确用该类来处理文件导入的工作。主要分为一下几个步骤来完成。这里就验证了我们前面namedisplayframe向用户显示处理结果的,name data frame来处理文件导入的猜想。。

1、 备份系统的标准输出和系统的错误输出

m_tempOut = System.out;

m_tempErr = System.err;

2、 将系统输出重新定向到一个PipedOutputStream实例(instance

System.setOut(new PrintStream(m_pipedOut));

System.setErr(new PrintStream(m_pipedOut));

这样一来说有的系统输出都会定向到m_pipedOut到这个对象上来了。要显示处理信息只需要处理是用System.out.println()之类方法打印出来。在前面读取m_pipedOut就可以了。是不是这样实现还有待证实。

3、 启动 CmsSetupLoggingThread  线程;

4、 开始导入工作。有代码为证

/* start importing the workplace */

CmsMain.startSetup(basePath + "WEB-INF/ocsetup/cmssetup.txt", basePath + "WEB-INF/");

5、 停止CmsSetupLoggingThread 线程。

6、 还原系统的标准输出和系统的错误输出。

下面就是还不清楚CmsSetupLoggingThread到底是什么玩意。通过查看源码可以发现他就是用来收集CmsSetupThread线程的处理信息的。并且就是通过PipedOutputStream来完成这两个线程的通信。这一点可以从他的构造函数知道。

    public CmsSetupLoggingThread(PipedOutputStream pipedOut)  {

        messages = new Vector();

        m_stopThread = false;

        try {

            m_pipedIn = new PipedInputStream();

            m_pipedIn.connect(pipedOut);

            m_LineReader = new LineNumberReader(new BufferedReader(new InputStreamReader(m_pipedIn)));

        }

        catch (Exception e) {

            messages.addElement(e.toString());

        }

    }

 

为了方便jsp页面方便的得到这些信息CmsSetupLoggingThread还特地提供了一个private static Vector messages;和静态的getMessages()方法来处理他。这一点在data_import.jsp中的

messages = com.netmarch.infopub.pubServletCon.LogginThread.getMessages();语句可以得到验证。最后messages通过

<script language="Javascript">

              var output = new Array();

              <%         for(int i = 0; i < (size-offset) ;i++)    {

                                   out.println("output[" + i + "] = /"" + messages.elementAt(i+offset).toString() + "/";");

                            }                  

                    

              %>

              function send()     {

                     parent.display.start(output);

              }

             

       </script>传到客户端。完成了处理信息的显示。

我写的是我的知道的,我还很菜。欢迎高手指出我的错误。我的Emailjetgeng@hotmail.com 谢谢。

 

1cms的源码在http://www.opencms.org/opencms/en/download/opencms.html处下载。Sourcpath是你下载OpenCms 5.0.1 Source Distribution解压后的目录。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值