summaryrefslogtreecommitdiff
path: root/src/main/java/com/mesalab/ua/analyser/impl/AndroidAnalyser.java
blob: fbb8cd3e0a3788723ef00ef1029831aa8f3c0774 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package com.mesalab.ua.analyser.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.mesalab.ua.analyser.enums.RegexFeatureEnum;
import com.mesalab.ua.analyser.enums.UserInfo;
import com.mesalab.ua.dao.QueryMariaDb;
import com.mesalab.ua.dao.impl.QueryMariaDbImpl;
import org.mariadb.jdbc.MariaDbStatement;

/**
 * android类设备分析
 * @author yjy
 * @version 1.0
 * @date 2020/11/15 12:20 下午
 */
public class AndroidAnalyser {
    private UserInfo userInfo;
    private MariaDbStatement connStatement;
    private QueryMariaDb queryMariaDb = new QueryMariaDbImpl();

    public AndroidAnalyser(MariaDbStatement connStatement, UserInfo userInfo){
        this.userInfo = userInfo;
        this.connStatement = connStatement;
    }

    public UserInfo getTriples(){
        List<String> tripleInDatabase;
        List<String> tripleInRegex;
        List<List<String>> tripleList = this.userInfo.getTerminalList();

        //筛选androidUA
        List<String> uaList = selectAndroidUa(this.userInfo.getUaList());
        if (uaList.size()==0){
            return this.userInfo;
        }

        for (String ua : uaList) {
            tripleInDatabase = queryMariaDb.getTriple(this.connStatement, ua);
            if (tripleInDatabase.size() > 0) {
                if (!(tripleList.contains(tripleInDatabase))){
                    tripleList.add(tripleInDatabase);
                }
            } else { //不进行重复解析
                tripleInRegex = parseAndroidUa(ua);
                if ((tripleInRegex != null) && !(tripleList.contains(tripleInRegex))){
                    tripleList.add(tripleInRegex);
                }
            }
        }
        this.userInfo.setTerminalList(tripleList);
        this.userInfo.update();

        return this.userInfo;
    }

    private List<String> selectAndroidUa(List<String> uaList){
        List<String>selectedUaList = new ArrayList<>();

        Pattern android = Pattern.compile(RegexFeatureEnum.TERMINAL_CAT_ANDROID_FEATURE.getCode());

        for (String ua : uaList) {
            if (android.matcher(ua).find()){
                selectedUaList.add(ua);
            }
        }
        return selectedUaList;
    }

    private List<String> parseAndroidUa(String ua){
        List<String> androidTerminal = Arrays.asList(new String[3]);
        String dePattern = "; [a-zA-Z0-9\\s]+/";
        String versionPattern = "; U; [a-zA-Z0-9\\s\\.]+;";
        Pattern de = Pattern.compile(dePattern);
        Pattern version = Pattern.compile(versionPattern);
        Matcher matcher1 = de.matcher(ua);
        Matcher matcher2 = version.matcher(ua);

        if (matcher1.find() && matcher2.find()) {
            // os
            String tmp = matcher2.group(0);
            androidTerminal.set(0, tmp.substring(5, tmp.length()-1));
            // TODO browser
            androidTerminal.set(1, null);
            // device
            tmp = matcher1.group(0);
            androidTerminal.set(2, tmp.substring(2, tmp.length() - 1));
        } else {
            return null;
        }
        return androidTerminal;
    }




}