svn纯java客户端SVNKit学习整理(转)

http://www.iteye.com/topic/688217

http://blog.csdn.net/feiren127/article/details/7551782

把svnkit.jar添加到项目中,用于实现svn功能。 把jackson-all-1.6.2.jar添加到项目中,用于显示树列表。把javaee.ar添加到项目中。

新建一个类(SVNUtil.class)实现svn功能

private String svnRoot;

private String userName;

private String password;

private SVNRepository repository;

/***

* 构造方法

@param svnRoot

*             svn根目录

*/

public SVNUtil(String svnRoot) {

this.svnRoot=svnRoot;

}

/***

* 构造方法

@param svnRoot

*             svn根目录

@param userName

*             登录用户名

@param password

*             登录密码

*/

public SVNUtil(String svnRoot, String userName, String password) {

this.svnRoot=svnRoot;

this.userName=userName;

this.password=password;

}

/***

* 通过不同的协议初始化版本库

*/

private static void setupLibrary() {

// 对于使用http://和https://

DAVRepositoryFactory.setup();

//对于使用svn:/ /和svn+xxx:/ /

SVNRepositoryFactoryImpl.setup();

//对于使用file://

FSRepositoryFactory.setup();

}

每次连接库都进行登陆验证

/***

* 登录验证

@return

*/

public boolean login(){

setupLibrary();

try{

//创建库连接

repository=SVNRepositoryFactory.create(SVNURL.parseURIEncoded(this.svnRoot));

//身份验证

ISVNAuthenticationManager authManager = SVNWCUtil

.createDefaultAuthenticationManager(this.userName,

this.password);

//创建身份验证管理器

repository.setAuthenticationManager(authManager);

return true;

catch(SVNException svne){

svne.printStackTrace();

return false;

}

}

下面的方法实现查询给定路径下的条目列表功能

/***

*

@param path

@return 查询给定路径下的条目列表

@throws SVNException

*/

@SuppressWarnings("rawtypes")

public List<SVN> listEntries(String path)

throws SVNException {

Collection entries = repository.getDir(path, -1, null,

(Collection) null);

Iterator iterator = entries.iterator();

List<SVN> svns = new ArrayList<SVN>();

while (iterator.hasNext()) {

SVNDirEntry entry = (SVNDirEntry) iterator.next();

SVN svn = new SVN();

svn.setCommitMessage(entry.getCommitMessage());

svn.setDate(entry.getDate());

svn.setKind(entry.getKind().toString());

svn.setName(entry.getName());

svn.setRepositoryRoot(entry.getRepositoryRoot().toString());

svn.setRevision(entry.getRevision());

svn.setSize(entry.getSize()/1024);

svn.setUrl(path.equals("") ? "/"+entry.getName() : path +"/"+entry.getName());

svn.setAuthor(entry.getAuthor());

svn.setState(svn.getKind() == "file"?null:"closed");

svns.add(svn);

}

新建一个SVNServlet

添加一个方法用于把java对象转换为json字符串

/**

* 将java对象转换为json字符串

*

@param obj

*            :可以为map,list,javaBean等

@return json字符串

@createTime 2010-11-23 下午07:42:58

*/

public static String object2Json(Object obj) {

try {

StringWriter sw = new StringWriter();

JsonGenerator gen = new JsonFactory().createJsonGenerator(sw);

mapper.writeValue(gen, obj);

gen.close();

return sw.toString();

catch (Exception e) {

e.printStackTrace();

}

return null;

}

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

this.doPost(request, response);

}

protected void doPost(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

Object svns = null;

request.setCharacterEncoding("UTF-8");

response.setCharacterEncoding("UTF-8");

String path = request.getParameter("pid");

String url = "svn://localhost/svndemo1";

String usrName = "usrName";

String password = "password";

if (path == null) {

path = "";

}

path = new String(path.getBytes("ISO-8859-1"),"UTF-8");

String type = request.getParameter("type");

PrintWriter out = response.getWriter();

try {

SVNUtil svnUtil = new SVNUtil(url, usrName, password);

if (svnUtil.login()) {

/*用于查询历史记录

if ("history".equals(type)) {

List<SVN> svnl = svnUtil.getHistory(path);

HashMap<String, Object> sv = new HashMap<String, Object>();

sv.put("total", svnl.size());

sv.put("rows", svnl);

svns = sv;

else {*/

svns = svnUtil.listEntries(path);

//}

//把java对象转换成json字符串

String json = SVNServlet.object2Json(svns);

out.print(json);

else {

System.out.println("验证失败");

}

catch (SVNException ex) {

ex.printStackTrace();

}

out.flush();

out.close();

}

新建一个index.jsp用户显示版本数列表,页面显示我使用了jquery-easyui模板

<%@ page language="java" contentType="text/html; charset=utf-8"

pageEncoding="utf-8"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme() + "://"

+ request.getServerName() + ":" + request.getServerPort()

+ path + "/";

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<base href="<%=basePath%>">

<title>SVN</title>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<meta http-equiv="pragma" content="no-cache">

<meta http-equiv="cache-control" content="no-cache">

<meta http-equiv="expires" content="0">

<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

<meta http-equiv="description" content="This is my page">

<link rel="stylesheet" type="text/css"

href="plugs/themes/default/easyui.css">

<link rel="stylesheet" type="text/css" href="plugs/themes/icon.css">

<script type="text/javascript" src="plugs/jquery-1.4.2.min.js"></script>

<script type="text/javascript" src="plugs/jquery.easyui.min.js"></script>

<script type="text/javascript">

$(function() {

$(‘#test‘).treegrid({

title : ‘SVN列表‘,

nowrap : false,

rownumbers : true,

collapsible : false,

url : ‘svn?pid=‘,

idField : ‘url‘,

treeField : ‘url‘,

frozenColumns : [ [ {

title : ‘路径‘,

field : ‘url‘,

width : 350,

formatter : function(value) {

return ‘<span style="color:red">‘ + decodeURI(value.substr(value.lastIndexOf("/"))) + ‘</span>‘;

}

} ] ],

columns : [ [ {

field : ‘name‘,

title : ‘名称‘,

width : 120

}, {

field : ‘size‘,

title : ‘文件大小(KB)‘,

width : 80,

rowspan : 2

}, {

field : ‘revision‘,

title : ‘版本号‘,

width : 80,

rowspan : 2

}, {

field : ‘author‘,

title : ‘作者‘,

width : 100,

rowspan : 2

}, {

field : ‘date‘,

title : ‘修改日期‘,

width : 130,

rowspan : 2

}, {

field : ‘commitMessage‘,

title : ‘注释‘,

width : 150,

rowspan : 2

}, {

field : ‘kind‘,

title : ‘操作‘,

width : 120,

align : ‘center‘,

rowspan : 2,

formatter : function(value) {

return value==‘file‘ ? ‘<a onclick="download()" style="cursor: pointer;color:red">下载</a><a onclick="viewHistory()" style="margin-left:5px; cursor: pointer;color:red">历史版本</a>‘ : ‘‘;

}

}] ],

onBeforeExpand : function(row, param) {

$(this).treegrid(‘options‘).url = ‘svn?pid=‘+encodeURI(decodeURI(row.url));

}

});

});

function download(){

setTimeout(function(){

var node = $(‘#test‘).treegrid(‘getSelected‘);

if(node !=null)

window.open("download?url="+encodeURI(decodeURI(node.url))+"&size="+node.size+"&name="+encodeURI(decodeURI(node.name))+"&revision="+node.revision);

},200);

}

function viewHistory(){

setTimeout(function(){

var node = $(‘#test‘).treegrid(‘getSelected‘);

if(node != null) {

window.open("history.jsp?uri="+encodeURI(decodeURI(node.url)),"_blank","height=400,width=700,status=yes,toolbar=no,menubar=no,location=no");

}

}, 200);

}

</script>

</head>

<body>

<table id="test"></table>

</body>

</html>

时间: 2024-10-26 19:48:43

svn纯java客户端SVNKit学习整理(转)的相关文章

java中反射学习整理

转载请注明:http://blog.csdn.net/j903829182/article/details/38405735 反射主要是指程序可以访问,检测和修改它本身的状态或行为的一种能力. java中反射是一种强大的工具,它能够创建灵活的代码,这些代码可以在运行时装载,无须在组件之间进行链接.反射允许在编写与执行时,使程序能够接入到jvm中的类的内部信息,而不是源代码中选定的类协作的代码.这使反射成为构建灵活应用代码的主要工具.需要注意的是,如果使用不当,反射的成本会很高. package

java工具类学习整理——集合

好久没有总结一些东西了,同时集合部分的知识点也学习的比较早了,但是从来没有抽时间去研究和学习,今天正好有时间就总结一下map常用的遍历方法: package runningwhile; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class Hashmaptest { public static void main(String[] args) { Map<String,Str

Java设计模式(学习整理)---迭代模式

设计模式之Adapter(适配器) 1.定义: 将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份. 2.为何使用? 我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是:修改各自类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改各自的接口. 怎么办? 使用Adapter,在这两种接口之间创建一个混合接口(混血儿). 3.如何使用? 实现Adapter方式,其实"think in Java"的&

java密码学学习整理--对称加密(着重描述3des)

1.对称加密要点 对称加密算法的核心是加密和解密操作使用同一套密钥.加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要.因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题. 2.des(参考自:http://baike.baidu.com/view/878529.htm?from_id=210508&type=syn&fromtitle=DES&fr=aladdin) DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位(每组的

SVNKit学习——wiki+简介(一)

这篇文章是参考SVNKit官网在wiki的文档,做了个人的理解~ 首先抛出一个疑问,Subversion是做什么的,SVNKit又是用来干什么的? 相信一般工作过的同学都用过或了解过svn,不了解的同学可以到官网看下,这里不作为本文重点. 需要理解的概念: 仓库(Repository):是一个特殊的结构,记录文件版本管理的状态. 工作副本(Working Copy):本地从仓库检出的文件. 修订版(Revision):用于记录仓库数据的变更状态,初始化版本为0,每执行一次操作版本号+1,每执行一

SVNKit学习——wiki+简介(二)

这篇文章是参考SVNKit官网在wiki的文档,做了个人的理解~ 首先抛出一个疑问,Subversion是做什么的,SVNKit又是用来干什么的? 相信一般工作过的同学都用过或了解过svn,不了解的同学可以到官网看下,这里不作为本文重点. 需要理解的概念: 仓库(Repository):是一个特殊的结构,记录文件版本管理的状态. 工作副本(Working Copy):本地从仓库检出的文件. 修订版(Revision):用于记录仓库数据的变更状态,初始化版本为0,每执行一次操作版本号+1,每执行一

揭秘java大数据学习路线图

很多的同学在学习JavaEE的路上都过得的是坎坷,可以说是夜以继日的敲代码在学习,却发现自己是事倍功半,有的时候遇到一个bug真的很难受,无限互联java大数据培训专家为大家整理了一篇很值得大家去借鉴的学习路线图文章,希望大家在学习的路上一能帆风顺! 一.Java的核心 这就是学习Java的基础,掌握程度的深与浅甚至直接影响后面的整个学习进程. Java的核心主要包括了几个部分: 一. java大数据学习路线图 1.初级的有语法基础.面向对象思想. 学习任何一门语言语法都是必须的,因为Java的

HttpClient学习整理

HttpClient简介 HttpClient 功能介绍     1. 读取网页(HTTP/HTTPS)内容     2.使用POST方式提交数据(httpClient3)     3. 处理页面重定向     4. 模拟登录开心网     5. 提交XML格式参数     6. 访问启用认证的页面     7. 多线程模式下使用httpclient httpClient完整封装 HttpClient简介 HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Ja

Android必备:Android Socket编程的了解与学习整理

看这里:Android必备:Android Socket编程的了解与学习整理 最近学习Android的过程中,由于项目.业务等因素影响,服务端通过Socket进行通信,于是开始学习Socket编程,之前的开发中,很少涉及此 方面的知识学习,本篇就来简单的整理一下,通过Android客户端进行Socket登录的demo,来进行Adnroid Socket编程的学习. 在开始学习之前,先来了解一下Socket,以下内容来自百度百科: 通常也称作"套接字",用于描述IP地址和端口,是一个通信