博客统计信息

用户名:mtiger2k
文章数:10
评论数:21
访问量:34625
无忧币:20
博客积分:692
博客等级:2
注册日期:2006-12-18

我的技术圈(1)

更多>>
基于Roller的围棋博客平台
2007-03-12 14:47:52
标签:博客 休闲 职场
本文介绍了如何基于开源博客系统Roller建立围棋博客系统[url]http://www.weiqihome.com/[/url]
 
Roller([url]http://rollerweblogger.org/project/[/url])是一个功能强大的开源博客系统。目前基于Struts1.2框架,登录认证基于Acegi。采用Xinha作为编辑器。
 
1. 目前Roller访问Mysql数据库是基于JNDI,这对于使用虚拟主机的用户不大方便,因为这需要服务器配置。我发现该系统有两个地方需要配置数据库连接:一是hibernate.cfg.xml,一是security.xml。而对前者,如果JNDI找不到,Roller会根据roller.properties中的JDBC的配置建立数据库连接。但是对Acegi来说,它配置成只能通过JNDI来访问。为了让Acegi使用与前者一致的数据库连接,需要自己扩展Acegi的认证功能。
 
这是原来的配置:
    <bean id="jdbcAuthenticationDao" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
        <property name="dataSource">
            <bean class="org.springframework.jndi.JndiObjectFactoryBean">
                <property name="jndiName" value="java:comp/env/jdbc/rollerdb"/>
            </bean>
        </property>
        <property name="usersByUsernameQuery">
            <value>SELECT username,passphrase,isenabled FROM rolleruser WHERE username = ?</value>
        </property>
        <property name="authoritiesByUsernameQuery">
            <value>SELECT username,rolename FROM userrole WHERE username = ?</value>
        </property>
    </bean>
 
我们需要做的是重定义这个Bean,让它基于前者的数据库连接,于是有了下面这个类:
package org.apache.roller.acegi;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.acegisecurity.GrantedAuthority;
import org.acegisecurity.GrantedAuthorityImpl;
import org.acegisecurity.userdetails.User;
import org.acegisecurity.userdetails.UserDetails;
import org.acegisecurity.userdetails.UserDetailsService;
import org.acegisecurity.userdetails.UsernameNotFoundException;
import org.apache.roller.RollerException;
import org.apache.roller.business.RollerFactory;
import org.apache.roller.business.UserManager;
import org.apache.roller.pojos.RoleData;
import org.apache.roller.pojos.UserData;
import org.springframework.dao.DataAccessException;
public class RollerUserDetailsService implements UserDetailsService {
 
 public UserDetails loadUserByUsername(String username)
  throws UsernameNotFoundException, DataAccessException {
  UserManager userMgr = RollerFactory.getRoller().getUserManager();
  try {
   UserData userData = userMgr.getUserByUserName(username);
   List dbAuths = new ArrayList();
   for (Iterator iter = userData.getRoles().iterator(); iter.hasNext();) {
    RoleData roleData = (RoleData)iter.next();
    dbAuths.add(new GrantedAuthorityImpl(roleData.getRole()));
   }
   if (dbAuths.size() == 0) {
             throw new UsernameNotFoundException("User has no GrantedAuthority");
         }
         GrantedAuthority[] arrayAuths = (GrantedAuthority[]) dbAuths.toArray(new GrantedAuthority[dbAuths.size()]);
         return new User(userData.getUserName(), userData.getPassword(), userData.getEnabled().booleanValue(), true, true, true, arrayAuths);
  } catch (RollerException e) {
   throw new UsernameNotFoundException("User not found");
  }
 }
 
}
其Bean定义如下:
<bean id="rollerUserDetailsService" class="org.apache.roller.acegi.RollerUserDetailsService"/>
 
这样只需要在roller.properties文件中定义数据库连接,而不用配置JNDI。
 
2. 改进xinha编辑器,加入独特的棋谱编辑插件
为了能在日志中加入棋谱编辑功能,我基于Xinha实现了自己开发的独特的棋谱编辑插件。基于这个插件,你可以随时新建、修改棋谱。
 
3. 显示棋谱
Roller基于Velocity模板显示日志,为了显示棋谱需要使用Javascript,所以我更新了themes目录下的basic/_day.vm文件。
加入如下代码:
<script type="text/javascript">
  var arr = document.getElementsByClassName("sgf");
  for(var i = 0; i<arr.length; i++) {
 var element = arr[i];
 var bdId = "board"+i;
 //new Insertion.After(element, "<div id='" + bdId + "'></div>");
 var board = new Board();
 replaceIt(element, board);
  }
</script>
 
分享至
更多
一键收藏,随时查看,分享好友!
0人
了这篇文章
类别:ajax技术圈()┆阅读()┆评论() ┆ 推送到技术圈返回首页

文章评论

 
2007-03-14 14:04:05
看起来不错的

2007-04-17 16:11:24
不是吧 你围棋博客系统 是roller4.0的版本???
我晕啊
你下的roller是的是几点几的版本
如果是3.0的话
我能请教你点问题吗?
我的QQ是48376382
邮箱是p48376382@126.com

2007-04-18 15:19:35
你有msn吗?我的msn是:mtiger2k@hotmail.com。
我是从Roller网站下载最新的源代码,自己生成一个版本的。

 

发表评论            

【技术门诊】专家解析:软考重点难点及应试技巧
昵  称:
登录  快速注册
验证码:

请点击后输入验证码博客过2级,无需填写验证码

内  容: