dyerac  
          dyerac In Java
          公告

          日歷
          <2006年10月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234
          統(tǒng)計
          • 隨筆 - 36
          • 文章 - 10
          • 評論 - 94
          • 引用 - 0

          導(dǎo)航

          常用鏈接

          留言簿(5)

          隨筆分類(49)

          隨筆檔案(36)

          文章分類(11)

          文章檔案(10)

          相冊

          dyerac

          搜索

          •  

          積分與排名

          • 積分 - 79320
          • 排名 - 706

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

           
          ?? 最近在嘗試做一個類似sourceforge的開源社區(qū),因此需要為項目申請者提供遠程SVN的配置。這里列出自己的代碼和心得,一是為了與大家相互交流,更重要的是為了讓各位提提意見,看看還需要什么內(nèi)容。
          現(xiàn)在提供的功能有:
          ?? 為項目創(chuàng)建svn倉庫,修改svn賬戶密碼,修改svn權(quán)限配置等。
          ?? 大家覺得還需要什么呢?

          代碼如下:
          ? 首先定義一個異常:
          package?commandLineTest;

          class?SvnException?extends?Exception?{
          ????
          public?SvnException(String?s)?{
          ????????
          super(s);
          ????}

          }


          下面是對svn的操作:
          package?commandLineTest;

          import?java.io.BufferedReader;
          import?java.io.BufferedWriter;
          import?java.io.File;
          import?java.io.FileNotFoundException;
          import?java.io.FileReader;
          import?java.io.FileWriter;
          import?java.io.IOException;
          import?java.io.InputStreamReader;

          public?class?SvnCommander?{

          ????
          private?String?svn_home?=?"K:/subversion-repository/";

          ????
          /**
          ?????*?為指定項目在服務(wù)器創(chuàng)建svn倉庫,當用戶選擇開通svn服務(wù)時,這個方法將被調(diào)用為用戶的項目創(chuàng)建svn倉庫
          ?????*?
          ?????*?
          @param?project
          ?????*????????????需要創(chuàng)建svn倉庫的項目的名稱
          ?????*?
          @throws?SvnException
          ?????*?????????????當創(chuàng)建失敗時將拋出錯誤
          ?????
          */

          ????
          public?void?createRepository(String?project)?throws?SvnException?{
          ????????
          try?{
          ????????????Process?p?
          =?new?ProcessBuilder("svnadmin",?"create",?svn_home
          ????????????????????
          +?project).start();
          ????????????StringBuffer?buffer?
          =?new?StringBuffer();
          ????????????String?tmp;
          ????????????
          //?BufferedReader?reader=new?BufferedReader(new
          ????????????
          //?InputStreamReader(p.getInputStream()));
          ????????????
          //?while((tmp=reader.readLine())!=null)
          ????????????
          //?buffer.append(tmp);
          ????????????
          //?System.out.println(buffer.toString());
          ????????????
          //?buffer=new?StringBuffer();
          ????????????BufferedReader?reader?=?new?BufferedReader(new?InputStreamReader(p
          ????????????????????.getErrorStream()));
          ????????????
          while?((tmp?=?reader.readLine())?!=?null)
          ????????????????buffer.append(tmp);
          ????????????
          //?System.err.println(buffer.toString());
          ????????????if?(buffer.length()?>?0)
          ????????????????
          throw?new?SvnException(buffer.toString());
          ????????????initSvnServer(project);
          ????????????initAuthz(project);
          ????????}
          ?catch?(IOException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????e.printStackTrace();
          ????????}


          ????}


          ????
          /**
          ?????*?用于修改svn倉庫的svnserve.conf配置文件,這個方法將在
          @link?createRepository(String?name)
          ?????*?中被自動調(diào)用,不建議被其他類調(diào)用
          ?????*?
          ?????*?
          @param?project
          ?????*????????????svn倉庫對應(yīng)的項目名稱
          ?????*?
          @throws?SvnException
          ?????*?????????????當用戶所在的項目并沒有開通svn服務(wù),或者修改svnserve.conf文件出現(xiàn)io錯誤時將拋出SvnException
          ?????
          */

          ????
          public?void?initSvnServer(String?project)?throws?SvnException?{
          ????????File?svnserve?
          =?new?File(svn_home?+?project?+?"/conf/svnserve.conf");
          ????????
          try?{
          ????????????BufferedReader?reader?
          =?new?BufferedReader(new?FileReader(svnserve));
          ????????????StringBuffer?buffer?
          =?new?StringBuffer();
          ????????????String?tmp;
          ????????????
          while?((tmp?=?reader.readLine())?!=?null)
          ????????????????buffer.append(tmp?
          +?"\n");
          ????????????reader.close();
          ????????????
          int?index?=?buffer.indexOf("#?anon");
          ????????????buffer.delete(index,?index?
          +?2);
          ????????????index?
          =?buffer.indexOf("#?auth");
          ????????????buffer.delete(index,?index?
          +?2);
          ????????????index?
          =?buffer.indexOf("#?pass");
          ????????????buffer.delete(index,?index?
          +?2);
          ????????????index?
          =?buffer.indexOf("#?auth");
          ????????????buffer.delete(index,?index?
          +?2);
          ????????????BufferedWriter?writer?
          =?new?BufferedWriter(new?FileWriter(svnserve));
          ????????????writer.write(buffer.toString());
          ????????????writer.close();
          ????????}
          ?catch?(FileNotFoundException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????throw?new?SvnException("SvnException:?配置文件svnserve.conf未找到:?"
          ????????????????????
          +?e.toString());
          ????????}
          ?catch?(IOException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????throw?new?SvnException("SvnException:?配置文件svnserve.conf的io操作出現(xiàn)問題:?"
          ????????????????????
          +?e.toString());
          ????????}

          ????}


          ????
          /**
          ?????*?為用戶設(shè)置svn帳戶的密碼,
          ?????*?該方法將修改項目倉庫的passwd文件,如果該用戶帳戶已存在于passwd文件中,將修改其密碼信息;如果不存在,則會在passwd添加新的記錄
          ?????*?
          ?????*?
          @param?project
          ?????*????????????用戶所在的項目名稱
          ?????*?
          @param?name
          ?????*????????????用戶帳戶名稱
          ?????*?
          @param?key
          ?????*????????????用戶密碼
          ?????*?
          @throws?SvnException
          ?????*?????????????當用戶所在的項目并沒有開通svn服務(wù),或者修改passwd文件出現(xiàn)io錯誤時將拋出SvnException
          ?????
          */

          ????
          public?void?setPassword(String?project,?String?name,?String?key)
          ????????????
          throws?SvnException?{
          ????????File?file?
          =?new?File(svn_home?+?project);
          ????????
          if?(!file.exists())
          ????????????
          throw?new?SvnException("SvnException:?該項目還未開通svn服務(wù)");
          ????????File?passwd?
          =?new?File(svn_home?+?project?+?"/conf/passwd");
          ????????
          try?{
          ????????????BufferedReader?reader?
          =?new?BufferedReader(new?FileReader(passwd));
          ????????????StringBuffer?buffer?
          =?new?StringBuffer();
          ????????????String?tmp;
          ????????????
          while?((tmp?=?reader.readLine())?!=?null)
          ????????????????buffer.append(tmp?
          +?"\n");
          ????????????reader.close();
          ????????????
          int?index?=?buffer.indexOf(name?+?"?=?");
          ????????????
          if?(index?!=?-1)?{
          ????????????????
          int?line_end?=?buffer.indexOf("\n",?index);
          ????????????????
          if?(line_end?==?-1)
          ????????????????????line_end?
          =?buffer.length();
          ????????????????buffer.replace(index?
          +?name.length()?+?3,?line_end,?key);
          ????????????}
          ?else?{
          ????????????????buffer.append(name?
          +?"?=?"?+?key);
          ????????????}

          ????????????BufferedWriter?writer?
          =?new?BufferedWriter(new?FileWriter(passwd));
          ????????????writer.write(buffer.toString());
          ????????????writer.close();
          ????????}
          ?catch?(FileNotFoundException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????throw?new?SvnException("SvnException:?配置文件passwd未找到:?"
          ????????????????????
          +?e.toString());
          ????????}
          ?catch?(IOException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????throw?new?SvnException("SvnException:?配置文件passwd的io操作出現(xiàn)問題:?"
          ????????????????????
          +?e.toString());
          ????????}

          ????}


          ????
          private?void?initAuthz(String?project)?throws?SvnException?{
          ????????File?template?
          =?new?File("authz_template.txt");
          ????????File?authz?
          =?new?File(svn_home?+?project?+?"/conf/authz");
          ????????
          try?{
          ????????????BufferedReader?reader?
          =?new?BufferedReader(new?FileReader(template));
          ????????????BufferedWriter?writer?
          =?new?BufferedWriter(new?FileWriter(authz));
          ????????????String?tmp;
          ????????????
          while?((tmp?=?reader.readLine())?!=?null)
          ????????????????writer.write(tmp);
          ????????????reader.close();
          ????????????writer.close();
          ????????}
          ?catch?(FileNotFoundException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????throw?new?SvnException("SvnException:?配置文件passwd未找到:?"
          ????????????????????
          +?e.toString());
          ????????}
          ?catch?(IOException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????throw?new?SvnException("SvnException:?配置文件passwd的io操作出現(xiàn)問題:?"
          ????????????????????
          +?e.toString());
          ????????}

          ????}


          ????
          /**
          ?????*?用于設(shè)置各個用戶對svn的使用權(quán)限
          ?????*?
          ?????*?
          @param?project
          ?????*????????????對應(yīng)的項目名稱
          ?????*?
          @param?path
          ?????*????????????權(quán)限對應(yīng)的文件夾,該參數(shù)應(yīng)該采取"/foo/bar"的形式,不然設(shè)置結(jié)果將不起作用
          ?????*?
          @param?name
          ?????*????????????用戶名稱,全部用戶應(yīng)該使用"*"來表示
          ?????*?
          @param?right
          ?????*????????????權(quán)限,為"r"或者"rw"兩種形式
          ?????
          */

          ????
          public?void?setAuthz(String?project,?String?path,?String?name,?String?right)
          ????????????
          throws?SvnException?{
          ????????File?passwd?
          =?new?File(svn_home?+?project?+?"/conf/authz");
          ????????
          try?{
          ????????????BufferedReader?reader?
          =?new?BufferedReader(new?FileReader(passwd));
          ????????????StringBuffer?buffer?
          =?new?StringBuffer();
          ????????????String?tmp;
          ????????????
          while?((tmp?=?reader.readLine())?!=?null)
          ????????????????buffer.append(tmp?
          +?"\n");
          ????????????reader.close();
          ????????????
          int?begin?=?buffer.indexOf("["?+?project?+?":"?+?path?+?"]");
          ????????????System.err.println(begin);
          ????????????
          if?(begin?!=?-1)?{
          ????????????????
          int?end?=?buffer.indexOf("["?+?project,?begin+1);
          ????????????????System.err.println(end);
          ????????????????
          if?(end?==?-1)
          ????????????????????end?
          =?buffer.length();
          ????????????????
          int?index?=?buffer.indexOf(name,?begin);
          ????????????????System.err.println(index);
          ????????????????
          if?(index?<?end?&&?index?!=?-1)?{
          ????????????????????
          int?line_end?=?buffer.indexOf("\n",?index);
          ????????????????????
          if?(line_end?==?-1)
          ????????????????????????line_end?
          =?buffer.length();
          ????????????????????buffer.replace(index?
          +?name.length()?+?3,?line_end,?right);
          ????????????????}
          ?else?{
          ????????????????????
          int?line_end?=?buffer.indexOf("\n",?begin);
          ????????????????????
          if?(line_end?==?-1)
          ????????????????????????line_end?
          =?buffer.length();
          ????????????????????buffer.insert(line_end?
          +?1,?name?+?"?=?"?+?right?+?"\n");
          ????????????????}

          ????????????}
          ?else?{
          ??????????????buffer.append(
          "["?+?project?+?":"?+?path?+?"]\n");
          ??????????????buffer.append(name?
          +?"?=?"?+?right?+?"\n");
          ????????????}

          ????????????BufferedWriter?writer?
          =?new?BufferedWriter(new?FileWriter(passwd));
          ????????????writer.write(buffer.toString());
          ????????????writer.close();
          ????????}
          ?catch?(FileNotFoundException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????throw?new?SvnException("SvnException:?配置文件authz未找到:?"
          ????????????????????
          +?e.toString());
          ????????}
          ?catch?(IOException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????throw?new?SvnException("SvnException:?配置文件authz的io操作出現(xiàn)問題:?"
          ????????????????????
          +?e.toString());
          ????????}

          ????}


          ????
          /**
          ?????*?
          @param?args
          ?????
          */

          ????
          public?static?void?main(String[]?args)?{
          ????????
          //?TODO?Auto-generated?method?stub
          ????????SvnCommander?s?=?new?SvnCommander();
          //????????try?{
          //????????????s.createRepository("lala");
          //????????}?catch?(SvnException?e)?{
          //????????????//?TODO?Auto-generated?catch?block
          //????????????System.err.print(e.toString());
          //????????}
          //?????????try?{
          //?????????s.setPassword("lala",?"td",?"12344321");
          //?????????}?catch?(SvnException?e)?{
          //?????????//?TODO?Auto-generated?catch?block
          //?????????System.err.print(e.toString());
          //?????????}
          ????????try?{
          ????????????s.setAuthz(
          "lala","/","haha","rw");
          ????????}
          ?catch?(SvnException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????System.err.print(e.toString());
          ????????}

          ????}

          }


          創(chuàng)建svn倉庫是通過調(diào)用
          Process p = new ProcessBuilder("svnadmin", "create", svn_home
          ?????+ project).start();
          進行的。同時捕捉系統(tǒng)的返回查看是否有異常
          BufferedReader reader = new BufferedReader(new InputStreamReader(p
          ?????.getErrorStream()));
          ???while ((tmp = reader.readLine()) != null)
          ????buffer.append(tmp);
          ???// System.err.println(buffer.toString());
          ???if (buffer.length() > 0)
          ????throw new SvnException(buffer.toString());

          而對密碼和權(quán)限的修改是通過對svn默認的passwd以及authz文件進行文本操作。
          另外既然是b/s模式當然有顯示的頁面,礙于篇幅就不詳述咯
          最后,有兩個問題還想請問各位:

          1.對文本的操作難道只能讀入內(nèi)存修改后重新寫入嗎?有沒有比較高效的方法呢?

          2.還需要什么額外的功能?因為svn的一些基本操作(如導(dǎo)入導(dǎo)出)其實通過svn客戶端訪問svn地址就可以了
          posted on 2006-10-21 22:30 dyerac in java... 閱讀(2830) 評論(4)  編輯  收藏 所屬分類: 原創(chuàng)文章JavaSE
          評論:
          • # re: B/S實現(xiàn)遠程配置SVN  robinz-hbifts Posted @ 2006-10-22 00:30
            "對文本的操作..."
            對于普通的文本,只能這么做.沒有別的比較好的辦法.

            如果只是讀,可以讀一部分,再讀另一部分.
            如果要寫,就比較麻煩了~

            如果可能,可以考慮用M$的 復(fù)合文檔, 像Doc一樣的.  回復(fù)  更多評論   

          • # re: B/S實現(xiàn)遠程配置SVN  HD Posted @ 2006-10-22 20:36
            應(yīng)該把apache結(jié)合起來做。 :)
            svnd必必竟不是終級解決之道。  回復(fù)  更多評論   

          • # re: B/S實現(xiàn)遠程配置SVN  dyerac in java... Posted @ 2006-10-22 22:39
            @HD
            什么意思?不是很懂誒  回復(fù)  更多評論   

          • # re: B/S實現(xiàn)遠程配置SVN  Raymond Posted @ 2006-12-17 00:10
            結(jié)合數(shù)據(jù)庫,只寫,不讀  回復(fù)  更多評論   

           
          Copyright © dyerac in java... Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 奉化市| 丘北县| 普兰店市| 铜川市| 冷水江市| 区。| 武城县| 竹溪县| 上犹县| 含山县| 上栗县| 敖汉旗| 正镶白旗| 同心县| 绵竹市| 平和县| 东城区| 安塞县| 同仁县| 禹城市| 策勒县| 岳阳市| 松桃| 周口市| 莎车县| 福鼎市| 香格里拉县| 克拉玛依市| 秦皇岛市| 胶州市| 景洪市| 华亭县| 辽宁省| 蒙城县| 武汉市| 仁怀市| 盈江县| 萨嘎县| 巫溪县| 长垣县| 徐汇区|