http://gblyh.bokee.com/6107026.html
最近工作原因需要找开源的CVS的jar包,有eclipse的jar包,和netbean的jar包,我最后选择了netbean的jar包,听人说eclipse的也很好用,但google搜索的时候先入为主,所以就用了netbean的了。发现关于介绍这部分api的文档很少,连javadoc都没有,我把源码下下来,自己生成了javadoc,直接读源码才弄明白使用方法,由于缺乏官方文档的支持,民间的文档也不多,所以奉上此文,希望能对大家有些帮助。 1.到netbean的网站上下载netbean java cvs的jar包。
1.下载http://javacvs.netbeans.org/files/documents/51/640/org-netbeans-lib-cvsclient.jar。
2.把jar包加入到classpath。相信大家对cvs都是比较熟悉的了,架设cvsnt的步骤很简单,网上也有很多文章,我就不多赘述了
3.为了帮助理解,这里对这些类的使用方式做个简单介绍,下面就是具体的程序代码,稍后可以细看。netbean的cvs包里包含这样几个重要的类,Client,MessageEvent,多种Command对象。client对象是来负责连接cvs server,messageEvent是来接收cvs server 传回的信息,当cvs server做出response的时候,就会出发messageEvent事件。多种Command对象,一种对象对应一种cvs command,例如CommitCommand对应的就是cvs的Commit命令,然后命令后附带的参数通过设置此对象的类属性变量来实现。执行命令的时候将Command对象传入Client方法的executeCommand来执行这些命令。
4.这是一个自己封装的cvsclient对象,包含了比较常用的几个cvs命令,代码如下:
public class CVSClient {
/** Cvs clinet instance used to communicate with cvs server */
private Client cvsclient;
/** Cvs connect string */
private CVSRoot cvsroot;
/** Connection instance to keep connect with cvs server */
private Connection connection;
/** Global options to store the requied parameter for cvs server */
private GlobalOptions globalOptions;
/** The local path on ur local machine */
private String localPath;
/**
* Inner class extend CVSAdapter <br>
* <p>used to get and send message of the CVS server</p>
* */
class BasicListener extends CVSAdapter {
/**
* Stores a tagged line
*/
private final StringBuffer taggedLine = new StringBuffer();
/**
* Called when the server wants to send a message to be displayed to the
* user. The message is only for information purposes and clients can
* choose to ignore these messages if they wish.
*
* @param e
* the event
*/
public void messageSent(MessageEvent e) {
String line = e.getMessage();
PrintStream stream = e.isError() ? System.err : System.out;
if (e.isTagged()) {
String message = MessageEvent.parseTaggedMessage(taggedLine,
"Daniel Six");
// if we get back a non-null line, we have something
// to output. Otherwise, there is more to come and we
// should do nothing yet.
if (message != null) {
stream.println(message);
}
} else {
stream.println(line);
}
}
}
/**
* Default constructor allows to construct CVSRoot from Properties object.
* The names are exactly the same as the attribute names in this class.
*/
public CVSClient() {
}
/**
* Breaks the string representation of CVSClient into it's components:
*
* The valid format (from the cederqvist) is:
*
* :method:[[user][:password]@]hostname[:[port]]/path/to/repository
*
* e.g. :pserver;username=anonymous;hostname=localhost:/path/to/repository
*/
public CVSClient(String connectionString) {
cvsroot = CVSRoot.parse(connectionString);
}
/**
* Get the localPath
* @return localPath the local path to get project from the CVS server
* */
public String getLocalPath() {
return localPath;
}
/**
* Set the localPath
*
* */
public void setLocalPath(String localPath) {
this.localPath = localPath;
}
/**
* Parse the CVSROOT string into CVSRoot object.
*
* The valid format (from the cederqvist) is:
*
* :method:[[user][:password]@]hostname[:[port]]/path/to/repository
*
* e.g. :pserver;username=anonymous;hostname=localhost:/path/to/repository
*/
public void createConnection(String connectionString) {
cvsroot = CVSRoot.parse(connectionString);
}
/**
* Open connection to the cvs server <br>
*
* @return connection to cvs server
* @throws AuthenticationException
* @throws CommandAbortedException
*/
public Connection openConnection() throws AuthenticationException,
CommandAbortedException {
connection = ConnectionFactory.getConnection(cvsroot);
connection.open();
return connection;
}
/**
* Close connection to the cvs server <br>
* */
public void closeConnection() throws IOException{
connection.close();
}
/**
* <p>Excute cvs command</p>
*
* @param command to be excute by the cliet
* @throws AuthenticationException
* @throws CommandAbortedException
* @throws IOException
* @throws CommandException
*/
public void excute(Command command) throws AuthenticationException,
CommandAbortedException, IOException, CommandException {
cvsclient = new Client(connection, new StandardAdminHandler());
cvsclient.setLocalPath(localPath);
globalOptions = new GlobalOptions();
globalOptions.setCVSRoot("d:/client/java");
cvsclient.getEventManager().addCVSListener(new BasicListener());
//put the command to the console
System.out.println("***Command***"+command.getCVSCommand());
cvsclient.executeCommand(command, globalOptions);
}
/**
* <p>Called when need add files</p>
* @param files that indicate to be added
* @return command of add files
*/
public Command add(String[] files) {
AddCommand command = new AddCommand();
command.setBuilder(null);
for (int i = 0; i < files.length; i++) {
command.setFiles(new File[] { new File(files[i]) });
}
return command;
}
/**
* Called when need commit all files under the local path
* @return command command of commit files
*/
public Command commit() {
CommitCommand command = new CommitCommand();
command.setBuilder(null);
command.setForceCommit(true);
command.setRecursive(true);
return command;
}
/**
* Called when need commit files
* @param files need to be commit
* @return command command of commit files
* */
public Command commit(String[] files) {
CommitCommand command = new CommitCommand();
for (int i = 0; i < files.length; i++) {
command.setFiles(new File[] { new File(files[i])});
}
command.setBuilder(null);
command.setForceCommit(true);
command.setRecursive(true);
return command;
}
/**
* Called when need update the certain files
* @param files need to be update
* @return command command of update files and directoris
* */
public Command update(String[] files) {
UpdateCommand command = new UpdateCommand();
//fetch files from the array
for (int i = 0; i < files.length; i++) {
command.setFiles(new File[] { new File(files[i]) });
}
command.setBuilder(null);
command.setRecursive(true);
command.setBuildDirectories(true);
command.setPruneDirectories(true);
return command;
}
/**
* Called to show the history list since given date
* @param date Date of the history
*@return command command show history list
* */
public Command historysincedate(String date){
HistoryCommand command=new HistoryCommand();
//Format is yyyymmdd e.g 20070205
command.setSinceDate(date);
return command;
}
/**
*Called to show the history list since given version
*@param reversion reversion of the history
*@return command command show history list
**/
public Command historysincerRevision(String reversion){
//Init command
HistoryCommand command=new HistoryCommand();
//set parameters
command.setSinceRevision(reversion);
return command;
}
/**
* Called to show the different between two versions
* @param files the files to compare with
* @param revision1 one revision
* @param revision2 another revision
* @return
* */
public Command diffbyreveision(String[] files,String revision1,String revision2){
//Inite command
DiffCommand command=new DiffCommand();
//Set parameters
for(int i=0;i<files.length;i++){
command.setFiles(new File[]{new File(files[i])});
}
command.setRevision1(revision1);
command.setRevision2(revision2);
return command;
}
/**
* Show difference between of the file that with different date
* @param files an array of files path
* @param date1 one date
* @param date2 another date
* @return command command of show difference between files
* */
public Command diffbydate(String[] files,String date1,String date2){
//Init command
DiffCommand command=new DiffCommand();
//Set parameters
for(int i=0;i<files.length;i++){
command.setFiles(new File[]{new File(files[i])});
}
//Format is yyyymmdd e.g 20070205
command.setBeforeDate1(date1);
command.setBeforeDate2(date2);
return command;
}
/**
* Check out the module
* @param modulename name of the module that to be checked out
* @return command command of check out the module
* */
public Command checkout(String modulename){
//Init new command
CheckoutCommand command=new CheckoutCommand();
//Set paramaters
command.setModule(modulename);
command.setRecursive(true);
return command;
}
/**
* Check out the module
* @param modulename name of the module that to be checked out
* @return command command of check out the module
* */
public Command checkouttoOutput(String modulename){
//Init new command
CheckoutCommand command=new CheckoutCommand();
//Set paramaters
command.setModule(modulename);
command.setPipeToOutput(true);
command.setRecursive(true);
return command;
}
}
4.如下是一个小的demo来使用这个client类来执行cvs的客户端操作:
public class CVSDemo {
public static void main(String []args) throws AuthenticationException, IOException, CommandException{
/* <p>set the connection string of the cvs server</p>
* connect string provide protocol,hostname,user,password,repository
* e.g:":pserver:ibmuser:icmadmin@localhost:d:/root"
*/
CVSClient cvsclient=new CVSClient(":pserver:ibmuser:icmadmin@localhost:d:/root");
//open the connection
cvsclient.openConnection();
//set the local directory
cvsclient.setLocalPath("d:/client/");
/*Demo of excute command as follow*/
//add
//cvsclient.excute(cvsclient.add(new String[]{"D:/client/java/abc/abc.java"}));
//commit
//cvsclient.excute(cvsclient.commit(new String[]{"D:/client/java/abc/abc.java"}));
//check out
//cvsclient.excute(cvsclient.checkout("cvsroot"));
cvsclient.excute(cvsclient.checkouttoOutput("java"));
//update
//cvsclient.excute(cvsclient.update(new String[]{"D:/client/"}));
//diff
//cvsclient.excute(cvsclient.diffbyreveision(new String[]{"d:/client/java/abc/abc.java"}, "1.1", "1.2"));
//cvsclient.excute(cvsclient.diffbydate(new String[]{"D:/client/java/abc/abc.java"}, "20070206", "20070207"));
//history
//cvsclient.excute(cvsclient.historysincedate("20070201"));
//cvsclient.excute(cvsclient.historysincerRevision("1.1"));
cvsclient.closeConnection();
}
}