基于Roller的围棋博客平台

本文介绍了如何基于开源博客系统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>
 
体验: [url]http://www.weiqihome.com/yygo/entry/my_first_qipu[/url]

你可能感兴趣的:(职场,博客,休闲)