基于Roller的围棋博客平台
本文介绍了如何基于开源博客系统Roller建立围棋博客系统http://www.weiqihome.com/。
Roller(http://rollerweblogger.org/project/)是一个功能强大的开源博客系统。目前基于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> |


mtiger2k
博客统计信息
热门文章
最新评论
友情链接