Ignore:
Timestamp:
09/09/11 06:23:36 (13 years ago)
Author:
sherbold
Message:
  • code documentation and formatting
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/web/WeblogParser.java

    r111 r171  
    1717import de.ugoe.cs.util.console.Console; 
    1818 
     19/** 
     20 * <p> 
     21 * Provides functionality to parse log files with web request. 
     22 * </p> 
     23 *  
     24 * @author Steffen Herbold 
     25 * @version 1.0 
     26 */ 
    1927public class WeblogParser { 
    20          
     28 
     29        /** 
     30         * <p> 
     31         * Timeout between two sessions in milliseconds. 
     32         * </p> 
     33         */ 
    2134        private long timeout; 
    22          
     35 
     36        /** 
     37         * <p> 
     38         * Minimal length of a session. All shorter sessions will be pruned. 
     39         * Default: 2 
     40         * </p> 
     41         */ 
    2342        private int minLength = 2; 
    24          
     43 
     44        /** 
     45         * <p> 
     46         * Collection of generated sequences. 
     47         * </p> 
     48         */ 
    2549        private List<List<WebEvent>> sequences; 
    26          
     50 
     51        /** 
     52         * <p> 
     53         * Name and path of the robot filter. 
     54         * </p> 
     55         */ 
    2756        private static final String ROBOTFILTERFILE = "misc/robotfilter.txt"; 
    28          
    29         private String robotRegex = ".*"; 
    30          
     57 
     58        /** 
     59         * <p> 
     60         * Field that contains a regular expression that matches all robots 
     61         * contained in {@link #ROBOTFILTERFILE}. 
     62         * </p> 
     63         */ 
     64        private String robotRegex = null; 
     65 
     66        /** 
     67         * <p> 
     68         * Constructor. Creates a new WeblogParser with a default timeout of 
     69         * 3,600,000 milliseconds (1 hour). 
     70         * </p> 
     71         */ 
    3172        public WeblogParser() { 
    32                 timeout = 3600000; // 1 hour session-timeout as default 
    33         } 
    34          
     73                this(3600000); 
     74        } 
     75 
     76        /** 
     77         * <p> 
     78         * Constructor. Creates a new WeblogParser. 
     79         * </p> 
     80         *  
     81         * @param timeout 
     82         *            session timeout 
     83         */ 
    3584        public WeblogParser(long timeout) { 
    3685                this.timeout = timeout; 
    3786        } 
    38          
     87 
     88        /** 
     89         * <p> 
     90         * Returns the generated event sequences. 
     91         * </p> 
     92         *  
     93         * @return generated event sequences 
     94         */ 
    3995        public List<List<WebEvent>> getSequences() { 
    40                 return sequences;  
    41         } 
    42          
     96                return sequences; 
     97        } 
     98 
     99        /** 
     100         * <p> 
     101         * Sets the session timeout. 
     102         * </p> 
     103         *  
     104         * @param timeout 
     105         *            new session timeout 
     106         */ 
    43107        public void setTimeout(long timeout) { 
    44108                this.timeout = timeout; 
    45109        } 
    46          
     110 
     111        /** 
     112         * <p> 
     113         * Sets the minimal length of a session. All sessions that contain less 
     114         * events will be pruned. 
     115         * </p> 
     116         *  
     117         * @param minLength 
     118         *            new minimal length 
     119         */ 
    47120        public void setMinLength(int minLength) { 
    48121                this.minLength = minLength; 
    49122        } 
    50          
    51         public void parseFile(String filename) throws IOException, FileNotFoundException, ParseException, URISyntaxException { 
     123 
     124        /** 
     125         * <p> 
     126         * Parses a web log file. 
     127         * </p> 
     128         *  
     129         * @param filename 
     130         *            name and path of the log file 
     131         * @throws IOException 
     132         *             thrown if there is a problem with reading the log file 
     133         * @throws FileNotFoundException 
     134         *             thrown if the log file is not found 
     135         * @throws ParseException 
     136         *             thrown the date format is invalid 
     137         * @throws URISyntaxException 
     138         *             thrown if the URI is invalid 
     139         */ 
     140        public void parseFile(String filename) throws IOException, 
     141                        FileNotFoundException, ParseException, URISyntaxException { 
    52142                String[] lines = FileTools.getLinesFromFile(filename); 
    53                  
     143 
    54144                Map<String, List<Integer>> cookieSessionMap = new HashMap<String, List<Integer>>(); 
    55145                int lastId = -1; 
    56                  
    57                 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     146 
     147                SimpleDateFormat dateFormat = new SimpleDateFormat( 
     148                                "yyyy-MM-dd HH:mm:ss"); 
    58149                loadRobotRegex(); 
    59                  
     150 
    60151                sequences = new ArrayList<List<WebEvent>>(); 
    61                  
    62                 for( String line : lines ) { 
    63                         String[] values = line.substring(1, line.length()-1).split("\" \""); 
    64                          
     152 
     153                for (String line : lines) { 
     154                        String[] values = line.substring(1, line.length() - 1).split( 
     155                                        "\" \""); 
     156 
    65157                        // use cookie as session identifier 
    66158                        int cookieStart = values[0].lastIndexOf('.'); 
    67                         String cookie = values[0].substring(cookieStart+1); 
     159                        String cookie = values[0].substring(cookieStart + 1); 
    68160                        String dateString = values[1]; 
    69161                        long timestamp = dateFormat.parse(dateString).getTime(); 
     
    71163                        // String ref = values[3]; // referer is not yet used! 
    72164                        String agent; 
    73                         if( values.length>4 ) { 
     165                        if (values.length > 4) { 
    74166                                agent = values[4]; 
    75167                        } else { 
    76168                                agent = "noagent"; 
    77169                        } 
    78                          
     170 
    79171                        List<String> postedVars = new ArrayList<String>(); 
    80                         if( values.length==6 ) { // post vars found 
    81                                 for( String postVar : values[5].trim().split(" ") ) { 
     172                        if (values.length == 6) { // post vars found 
     173                                for (String postVar : values[5].trim().split(" ")) { 
    82174                                        postedVars.add(postVar); 
    83175                                } 
    84176                        } 
    85                         if( !isRobot(agent) ) { 
     177                        if (!isRobot(agent)) { 
    86178                                URI uri = new URI(uriString); 
    87                                  
    88                                 String path = uri.getPath();                             
     179 
     180                                String path = uri.getPath(); 
    89181                                List<String> getVars = extractGetVarsFromUri(uri); 
    90                                  
    91                                 WebEvent event = new WebEvent(path, timestamp, postedVars, getVars); 
    92                                  
     182 
     183                                WebEvent event = new WebEvent(path, timestamp, postedVars, 
     184                                                getVars); 
     185 
    93186                                // find session and add event 
    94187                                List<Integer> sessionIds = cookieSessionMap.get(cookie); 
    95                                 if( sessionIds==null ) { 
     188                                if (sessionIds == null) { 
    96189                                        sessionIds = new ArrayList<Integer>(); 
    97190                                        // start new session 
     
    99192                                        cookieSessionMap.put(cookie, sessionIds); 
    100193                                        sequences.add(new LinkedList<WebEvent>()); 
    101                                 }  
    102                                 Integer lastSessionIndex = sessionIds.get(sessionIds.size()-1); 
     194                                } 
     195                                Integer lastSessionIndex = sessionIds 
     196                                                .get(sessionIds.size() - 1); 
    103197                                List<WebEvent> lastSession = sequences.get(lastSessionIndex); 
    104198                                long lastEventTime = timestamp; 
    105                                 if( !lastSession.isEmpty() ) { 
    106                                         lastEventTime = lastSession.get(lastSession.size()-1).getTimestamp(); 
    107                                 } 
    108                                 if( timestamp-lastEventTime>timeout ) { 
     199                                if (!lastSession.isEmpty()) { 
     200                                        lastEventTime = lastSession.get(lastSession.size() - 1) 
     201                                                        .getTimestamp(); 
     202                                } 
     203                                if (timestamp - lastEventTime > timeout) { 
    109204                                        sessionIds.add(++lastId); 
    110205                                        List<WebEvent> newSession = new LinkedList<WebEvent>(); 
     
    119214        } 
    120215 
     216        /** 
     217         * <p> 
     218         * Prunes sequences shorter than {@link #minLength}. 
     219         * </p> 
     220         */ 
    121221        private void pruneShortSequences() { 
    122                 Console.traceln(""+sequences.size()+ " user sequences found"); 
     222                Console.traceln("" + sequences.size() + " user sequences found"); 
    123223                // prune sequences shorter than min-length 
    124                 int i=0; 
    125                 while( i<sequences.size() ) { 
    126                         if( sequences.get(i).size()<minLength ) { 
     224                int i = 0; 
     225                while (i < sequences.size()) { 
     226                        if (sequences.get(i).size() < minLength) { 
    127227                                sequences.remove(i); 
    128228                        } else { 
     
    130230                        } 
    131231                } 
    132                 Console.traceln(""+sequences.size()+ " remaining after pruning of sequences shorter than " + minLength); 
    133         } 
    134          
     232                Console.traceln("" + sequences.size() 
     233                                + " remaining after pruning of sequences shorter than " 
     234                                + minLength); 
     235        } 
     236 
     237        /** 
     238         * <p> 
     239         * Reads {@link #ROBOTFILTERFILE} and creates a regular expression that 
     240         * matches all the robots defined in the file. The regular expression is 
     241         * stored in the field {@link #robotRegex}. 
     242         * </p> 
     243         *  
     244         * @throws IOException 
     245         *             thrown if there is a problem reading the robot filter 
     246         * @throws FileNotFoundException 
     247         *             thrown if the robot filter is not found 
     248         */ 
    135249        private void loadRobotRegex() throws IOException, FileNotFoundException { 
    136250                String[] lines = FileTools.getLinesFromFile(ROBOTFILTERFILE); 
    137251                StringBuilder regex = new StringBuilder(); 
    138                 for( int i=0; i<lines.length; i++ ) { 
    139                         regex.append("(.*"+lines[i]+".*)"); 
    140                         if( i!=lines.length-1 ) { 
     252                for (int i = 0; i < lines.length; i++) { 
     253                        regex.append("(.*" + lines[i] + ".*)"); 
     254                        if (i != lines.length - 1) { 
    141255                                regex.append("|"); 
    142256                        } 
     
    144258                robotRegex = regex.toString(); 
    145259        } 
    146          
     260 
     261        /** 
     262         * <p> 
     263         * Checks whether an agent is a robot. 
     264         * </p> 
     265         *  
     266         * @param agent 
     267         *            agent that is checked 
     268         * @return true, if the agent is a robot; false otherwise 
     269         */ 
    147270        private boolean isRobot(String agent) { 
    148271                return agent.matches(robotRegex); 
    149272        } 
    150          
     273 
     274        /** 
     275         * <p> 
     276         * Parses the URI and extracts the GET variables that have been passed. 
     277         * </p> 
     278         *  
     279         * @param uri 
     280         *            URI that is parsed 
     281         * @return a list with all GET variables 
     282         */ 
    151283        private List<String> extractGetVarsFromUri(URI uri) { 
    152284                List<String> getVars = new ArrayList<String>(); 
    153285                String query = uri.getQuery(); 
    154                 if( query!=null ) { 
     286                if (query != null) { 
    155287                        String[] paramPairs = query.split("&"); 
    156                         for( String paramPair : paramPairs ) { 
     288                        for (String paramPair : paramPairs) { 
    157289                                String[] paramSplit = paramPair.split("="); 
    158290                                getVars.add(paramSplit[0]); 
Note: See TracChangeset for help on using the changeset viewer.