• svn hooks 增加数据库数据校验


    业务需求:

      小乌龟提交java文件时如果该java文件中存在StrUtil.getText("");则拿到里面的数据,使用该数据查数据库如果数据库不存在该数据则不让用户提交svn

    windows系统下

      1:在svn服务端中找到对应项目的hooks

           

      2:写pre-commit.bat

    @echo off
    set export LANG=zh_CN.UTF-8
    setlocal
    set Repos=%1
    set TXN=%2
    set SCM=admin
    set CUR=%~dp0
    rem 输出路径 预先存放数据库驱动包、conf.properties文件
    set outdir=D:hdcnmultlang_svnout
    set tmpfile=
    for /f %%k in ('java -classpath ".;C:/Repositories/springboot/hooks" CheckString "uuid"') do set tmpfile=%%k
    for /f "tokens=1-2 delims= " %%i in ('svnlook changed -t "%TXN%" "%Repos%"') do (
        svnlook cat -t "%TXN%" "%Repos%" "%%j" >%outdir%\%tmpfile%
        for /f %%y in ('java -cp ".;C:/Repositories/springboot/hooks;D:/hdcn/multlang_svn/out/ojdbc8.jar" CheckString "%%i" "%outdir%\%tmpfile%" "%%j" "%outdir%"') do (
            echo file:"%%j" "no found [%%y] in t_sys_language" 1>&2
            goto err
        )
    )
    del %outdir%\%tmpfile%
    goto right
    
    :err
    del %outdir%\%tmpfile%
    exit 1
    
    :right
    exit 0

      3:写java类CheckString 供bat调用

    import java.io.*;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.*;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class CheckString {
        private final static String varregex = ""(.*?)"";
        private final static String javaregex = "StrUtil\s*.\s*getText\s*\(\s*"(.*?)"\s*\)";
        Properties properties = null;
        Connection connection = null;
    
        private String dbdriver;
        private String dburl;
        private String dbuser;
        private String dbpasswd;
        private String logfile;
        private String curdir;
        public static void main(String[] args) {
            CheckString svnLang = new CheckString();
            if (args[0].equalsIgnoreCase("uuid")) {
                System.out.println(svnLang.getRandFileName());
                return;
            }
            svnLang.setCurdir(args[3]);
            try { 
                svnLang.loadConf();
                svnLang.vaildLang(args[0], args[1], args[2]);
                svnLang.writeLog("success");
            } catch (Exception e) {
                StringWriter sw = new StringWriter();
                PrintWriter pw = new PrintWriter(sw);
                e.printStackTrace(pw);
                svnLang.writeLog(sw.toString());
                pw.close();
            }
       }
    
       public boolean vaildLang(String ope, String textfile, String svnfile) throws Exception {
           //只有新增和修改的数据才需要校验 U修改  A新增
           if (!("U".equalsIgnoreCase(ope) || "A".equalsIgnoreCase(ope))) {
               return true;
           }
           List<String> langKey = new ArrayList<>();
           String extname = getFileExt(svnfile);
           if ("java".equalsIgnoreCase(extname)) {
               String textcontext = txt2String(textfile);
               langKey.addAll(regularJava(textcontext));
           } else {
               return true;
           }
           if (langKey.size() <= 0) { 
               return true;
           }
           try {
               for (String key: langKey) {
                   if (!hasLang(key)) {
                       System.out.println(key);
                       return false;
                   }
               }
           } finally {
               closeDb();
           }
           return true;
       }
        
       private void connDb() throws Exception {
           Class.forName(dbdriver);
           connection = DriverManager.getConnection(dburl, dbuser, dbpasswd);
       }
    
       private void closeDb() throws Exception {
           if (connection != null) {
               connection.close();
           }
       }
    
       private boolean hasLang(String msgname) throws Exception {
           if (connection == null) {
               connDb();
           }
           String sql = "select count(1) as cou from t_language where msgname=? ";
           PreparedStatement pstmt = connection.prepareStatement(sql);
           pstmt.setString(1, msgname);
           ResultSet rst = pstmt.executeQuery();
           rst.next();
           Long cou = rst.getLong("cou");
           if (cou > 0) {
               return true;
           }
           return false;
       }
    
       private static String txt2String(String filename) throws Exception {
           File file = new File(filename);
           StringBuilder result = new StringBuilder();
           InputStreamReader read = new InputStreamReader(new FileInputStream(file),"UTF-8");  
           BufferedReader br = new BufferedReader(read);
           try {
               String s;
               while ((s = br.readLine()) != null) {
                   result.append(System.lineSeparator() + s);
               }
           } finally {
               br.close();
           }
           return result.toString();
       }
    
       private List<String> regularJava(String text) {
           return regular(text, javaregex);
       }
    
       private List<String> regular(String text, String regex) {
           List<String> rt = new ArrayList<>();
           Pattern p=Pattern.compile(regex);
           Matcher m=p.matcher(text);
           while(m.find()){
               String gs = m.group();
               String v = getVarLang(gs);
               if (v != null) {
                   rt.add(v);
               }
           }
           return rt;
       }
    
       private String getVarLang(String text) {
           Pattern p=Pattern.compile(varregex);
           Matcher m=p.matcher(text);
           while(m.find()){
               String gs = m.group();
               gs = gs.substring(1, gs.length()-1);
               return gs;
           }
           return null;
       }
    
       private String getFileExt(String filename) {
           String extname = filename.substring(filename.lastIndexOf(".") + 1);
           return extname;
       }
    
       public String getRandFileName() {
           UUID uuid = UUID.randomUUID();
           return uuid.toString().replace("-", "")+".txt";
       }
    
       private void loadConf() throws Exception {
           if (properties == null) {
               properties = new Properties();
               properties.load(new FileInputStream(this.curdir+ System.getProperty("file.separator")+ "conf.properties"));
               Enumeration<?> enum1 = properties.propertyNames();
               while(enum1.hasMoreElements()) {
                   String strKey = (String) enum1.nextElement();
                   String strValue = properties.getProperty(strKey);
                   if ("db_driver".equalsIgnoreCase(strKey)) {
                       this.dbdriver = strValue;
                   } else if ("db_url".equalsIgnoreCase(strKey)) {
                       this.dburl = strValue;
                   } else if ("db_username".equalsIgnoreCase(strKey)) {
                       this.dbuser = strValue;
                   } else if ("db_password".equalsIgnoreCase(strKey)) {
                       this.dbpasswd = strValue;
                   }
               }
           }
       }
       public void writeLog(String txt) {
           FileWriter fw = null;
           PrintWriter pw = null;
           try {
               File file = new File(this.logfile);
               fw = new FileWriter(file, true);
               pw = new PrintWriter(fw);
               pw.write(txt);
               pw.write("
    ");
               pw.flush();
               pw.close();
           } catch (Exception e) {
               e.printStackTrace();
           } finally {
               if (fw != null) {
                   try {
                       fw.close();
                   } catch (Exception e) {
                       e.printStackTrace();
                   }
               }
               if (pw != null) {
                   try {
                       pw.close();
                   } catch (Exception e) {
                       e.printStackTrace();
                   }
               }
           }
    
       }
       public void setCurdir(String dir) {
           this.curdir = dir;
           this.logfile = this.curdir + System.getProperty("file.separator") + "log.log";
       }
    }

      4:将checkString编译的.class文件、pre-commit.bat 放到hooks路径底下

      5:小乌龟测试提交

    FAQ

     bat 容易出现乱码问题

    java 回写到bat中乱码问题(这边是读取文件指定编码格式)

  • 相关阅读:
    Yahoo! 35条网站性能优化建议
    常见排序
    文件上传于拖拽
    离线web存储
    【前端学习】【jQuery选择器】
    【前端学习】【CSS选择器】
    【疯狂Java讲义学习笔记】【流程控制与数组】
    【疯狂Java讲义学习笔记】【数据类型与运算符】
    【疯狂Java学习笔记】【理解面向对象】
    【疯狂Java学习笔记】【第一章:Java语言概述】
  • 原文地址:https://www.cnblogs.com/zhangjiangbin/p/12924742.html
Copyright © 2020-2023  润新知