Changeset 171


Ignore:
Timestamp:
09/09/11 06:23:36 (13 years ago)
Author:
sherbold
Message:
  • code documentation and formatting
Location:
trunk/EventBenchConsole/src/de/ugoe/cs/eventbench
Files:
45 edited

Legend:

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

    r98 r171  
    1212import de.ugoe.cs.util.console.Console; 
    1313 
     14/** 
     15 * <p> 
     16 * This class provides the functionality to generate replay files from sequences 
     17 * if {@link ReplayableEvent}s. 
     18 * </p> 
     19 *  
     20 * @author Steffen Herbold 
     21 * @version 1.0 
     22 */ 
    1423public class ReplayGenerator { 
    15          
     24 
     25        /** 
     26         * <p> 
     27         * {@link IReplayDecorator} to be used. If this field is {@code null}, no 
     28         * decorator is used. Default: {@code null} 
     29         * </p> 
     30         */ 
    1631        private IReplayDecorator decorator = null; 
    17          
     32 
     33        /** 
     34         * <p> 
     35         * Id of the current session. The starting id is 1. 
     36         * </p> 
     37         */ 
    1838        int sessionId = 1; 
    19          
    20         public void createLogfileMultipleSessions(List<List<ReplayableEvent<?>>> sequences, String filename) { 
     39 
     40        /** 
     41         * <p> 
     42         * Creates a replay file that contains multiple event sequences. 
     43         * </p> 
     44         *  
     45         * @param sequences 
     46         *            collection of event sequences from which the sessions are 
     47         *            generated 
     48         * @param filename 
     49         *            name and path of the replay file 
     50         */ 
     51        public void createLogfileMultipleSessions( 
     52                        List<List<ReplayableEvent<?>>> sequences, String filename) { 
    2153                OutputStreamWriter writer = openReplayFile(filename); 
    22                 if( writer!=null ) {             
     54                if (writer != null) { 
    2355                        try { 
    2456                                decorator = sequences.get(0).get(0).getReplayDecorator(); 
    25                                 if( decorator!=null ) { 
     57                                if (decorator != null) { 
    2658                                        writer.write(decorator.getHeader()); 
    2759                                } 
    28                                 for( List<ReplayableEvent<?>> actions : sequences ) { 
     60                                for (List<ReplayableEvent<?>> actions : sequences) { 
    2961                                        writeSession(actions, writer); 
    3062                                } 
    31                                 if( decorator!=null ) { 
    32                                         writer.write(decorator.getFooter()); 
    33                                 } 
    34                                 decorator = null; 
    35                                 writer.close(); 
    36                         } catch (IOException e) { 
    37                                 Console.printerrln("Unable to write replay file " + filename); 
    38                         } 
    39                 } 
    40         } 
    41          
    42         public void createLogfileSingleSession(List<ReplayableEvent<?>> actions, String filename) { 
    43                 OutputStreamWriter writer = openReplayFile(filename); 
    44                 if( writer!=null ) {             
    45                         try { 
    46                                 actions.get(0).getReplayDecorator(); 
    47                                 if( decorator!=null ) { 
    48                                         writer.write(decorator.getHeader()); 
    49                                 } 
    50                                 writeSession(actions, writer); 
    51                                 if( decorator!=null ) { 
     63                                if (decorator != null) { 
    5264                                        writer.write(decorator.getFooter()); 
    5365                                } 
     
    6072        } 
    6173 
     74        /** 
     75         * <p> 
     76         * Creates a replay file that from a single event sequence. 
     77         * </p> 
     78         *  
     79         * @param actions 
     80         *            event sequence from which the sessions are generated 
     81         * @param filename 
     82         *            name and path of the replay file 
     83         */ 
     84        public void createLogfileSingleSession(List<ReplayableEvent<?>> actions, 
     85                        String filename) { 
     86                OutputStreamWriter writer = openReplayFile(filename); 
     87                if (writer != null) { 
     88                        try { 
     89                                actions.get(0).getReplayDecorator(); 
     90                                if (decorator != null) { 
     91                                        writer.write(decorator.getHeader()); 
     92                                } 
     93                                writeSession(actions, writer); 
     94                                if (decorator != null) { 
     95                                        writer.write(decorator.getFooter()); 
     96                                } 
     97                                decorator = null; 
     98                                writer.close(); 
     99                        } catch (IOException e) { 
     100                                Console.printerrln("Unable to write replay file " + filename); 
     101                        } 
     102                } 
     103        } 
     104 
     105        /** 
     106         * <p> 
     107         * Helper function that opens the replay file for writing. 
     108         * </p> 
     109         *  
     110         * @param filename 
     111         *            name and path of the replay file 
     112         * @return {@link OutputStreamWriter} that writes to the replay file 
     113         */ 
    62114        private OutputStreamWriter openReplayFile(String filename) { 
    63115                File file = new File(filename); 
     
    65117                try { 
    66118                        fileCreated = file.createNewFile(); 
    67                         if( !fileCreated ) { 
     119                        if (!fileCreated) { 
    68120                                Console.traceln("Created logfile " + filename); 
    69121                        } else { 
     
    76128                OutputStreamWriter writer = null; 
    77129                try { 
    78                         writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-16"); 
     130                        writer = new OutputStreamWriter(new FileOutputStream(file), 
     131                                        "UTF-16"); 
    79132                } catch (IOException e) { 
    80                         Console.printerrln("Unable to open file for writing (read-only file):" + filename); 
     133                        Console.printerrln("Unable to open file for writing (read-only file):" 
     134                                        + filename); 
    81135                        Console.printStacktrace(e); 
    82136                } 
    83137                return writer; 
    84138        } 
    85          
    86         private void writeSession(List<ReplayableEvent<?>> actions, OutputStreamWriter writer) 
    87                         throws IOException { 
    88                 if( decorator!=null ) { 
     139 
     140        /** 
     141         * <p> 
     142         * Helper function that adds an event sequence to the replay. 
     143         * </p> 
     144         *  
     145         * @param actions 
     146         *            event sequences to be added 
     147         * @param writer 
     148         *            {@link OutputStreamWriter} to which the replay is added 
     149         * @throws IOException 
     150         *             thrown if there is a problem writing to writer 
     151         */ 
     152        private void writeSession(List<ReplayableEvent<?>> actions, 
     153                        OutputStreamWriter writer) throws IOException { 
     154                if (decorator != null) { 
    89155                        writer.write(decorator.getSessionHeader(sessionId)); 
    90156                } 
    91                 for( ReplayableEvent<?> currentAction : actions ) { 
    92                          
    93                         List<? extends IReplayable> replayables = currentAction.getReplayMessages(); 
    94                         for( IReplayable replayble : replayables ) { 
    95                                 writer.write(replayble.getReplay()+StringTools.ENDLINE); 
     157                for (ReplayableEvent<?> currentAction : actions) { 
     158 
     159                        List<? extends IReplayable> replayables = currentAction 
     160                                        .getReplayMessages(); 
     161                        for (IReplayable replayble : replayables) { 
     162                                writer.write(replayble.getReplay() + StringTools.ENDLINE); 
    96163                                writer.flush(); 
    97164                        } 
    98165                } 
    99                 if( decorator!=null ) { 
     166                if (decorator != null) { 
    100167                        writer.write(decorator.getSessionFooter(sessionId)); 
    101168                } 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/Runner.java

    r112 r171  
    22 
    33import de.ugoe.cs.util.console.CommandExecuter; 
     4import de.ugoe.cs.util.console.Console; 
    45import de.ugoe.cs.util.console.TextConsole; 
    56 
     7/** 
     8 * <p> 
     9 * Start-up class of the application. 
     10 * </p> 
     11 * <p> 
     12 * It sets up and starts the {@link Console}. 
     13 * </p> 
     14 *  
     15 * @author Steffen Herbold 
     16 * @version 1.0 
     17 */ 
    618public class Runner { 
    719 
    820        /** 
     21         * <p> 
     22         * Main method of the application. 
     23         * </p> 
     24         *  
    925         * @param args 
     26         *            if parameters are defined, they are interpreted as commands 
     27         *            for the {@link Console} and executed before the user can use 
     28         *            the console; can be used to perform batch operations 
    1029         */ 
    1130        public static void main(String[] args) { 
    12                 CommandExecuter.getInstance().addCommandPackage("de.ugoe.cs.eventbench.commands"); 
    13                 CommandExecuter.getInstance().addCommandPackage("de.ugoe.cs.eventbench.windows.commands"); 
    14                 CommandExecuter.getInstance().addCommandPackage("de.ugoe.cs.eventbench.web.commands"); 
     31                CommandExecuter.getInstance().addCommandPackage( 
     32                                "de.ugoe.cs.eventbench.commands"); 
     33                CommandExecuter.getInstance().addCommandPackage( 
     34                                "de.ugoe.cs.eventbench.windows.commands"); 
     35                CommandExecuter.getInstance().addCommandPackage( 
     36                                "de.ugoe.cs.eventbench.web.commands"); 
    1537                TextConsole textConsole = new TextConsole(); 
    16                 if( args.length>=1 ) { 
    17                         for( String command : args ) { 
     38                if (args.length >= 1) { 
     39                        for (String command : args) { 
    1840                                CommandExecuter.getInstance().exec(command); 
    1941                        } 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDcalcCoverage.java

    r130 r171  
    1313import de.ugoe.cs.util.console.Console; 
    1414 
     15/** 
     16 * <p> 
     17 * Command to calculate the coverage of a test suite. 
     18 * </p> 
     19 *  
     20 * @author Steffen Herbold 
     21 * @version 1.0 
     22 */ 
    1523public class CMDcalcCoverage implements Command { 
    1624 
     25        /* 
     26         * (non-Javadoc) 
     27         *  
     28         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     29         */ 
    1730        @SuppressWarnings("unchecked") 
    1831        @Override 
    1932        public void run(List<Object> parameters) { 
    20                 String modelname;                
     33                String modelname; 
    2134                String[] sequenceNames; 
    2235                int minLength; 
     
    2841                        minLength = Integer.parseInt((String) parameters.get(2)); 
    2942                        maxLength = Integer.parseInt((String) parameters.get(3)); 
    30                         if( parameters.size()==5 ) { 
     43                        if (parameters.size() == 5) { 
    3144                                observedName = (String) parameters.get(1); 
    3245                        } 
    33                 } 
    34                 catch (Exception e) { 
     46                } catch (Exception e) { 
    3547                        throw new InvalidParameterException(); 
    3648                } 
    37                  
    38                 IStochasticProcess process = null;  
     49 
     50                IStochasticProcess process = null; 
    3951                Collection<List<? extends Event<?>>> observedSequences = null; 
    4052                Collection<List<? extends Event<?>>> sequences = null; 
    41                 Object dataObjectProcess = GlobalDataContainer.getInstance().getData(modelname); 
    42                 Object dataObjectObserved = GlobalDataContainer.getInstance().getData(observedName); 
    43                 if( dataObjectProcess==null ) { 
     53                Object dataObjectProcess = GlobalDataContainer.getInstance().getData( 
     54                                modelname); 
     55                Object dataObjectObserved = GlobalDataContainer.getInstance().getData( 
     56                                observedName); 
     57                if (dataObjectProcess == null) { 
    4458                        Console.printerrln("Model " + modelname + " not found in storage."); 
    4559                        return; 
    4660                } 
    47                 if( !(dataObjectProcess instanceof IStochasticProcess) ) { 
    48                         Console.printerrln("Object " + modelname + " not of type IStochasticProcess!"); 
     61                if (!(dataObjectProcess instanceof IStochasticProcess)) { 
     62                        Console.printerrln("Object " + modelname 
     63                                        + " not of type IStochasticProcess!"); 
    4964                        return; 
    5065                } 
    51                 if( dataObjectObserved==null ) { 
     66                if (dataObjectObserved == null) { 
    5267                        Console.printerrln("Observed sequences not found in storage."); 
    5368                        return; 
    5469                } 
    55                 if( !(dataObjectObserved instanceof Collection<?>) ) { 
     70                if (!(dataObjectObserved instanceof Collection<?>)) { 
    5671                        // weak instance check! 
    5772                        Console.printerrln("Object " + observedName + " not a Collection!"); 
     
    6075                process = (IStochasticProcess) dataObjectProcess; 
    6176                observedSequences = (Collection<List<? extends Event<?>>>) dataObjectObserved; 
    62                  
    63                  
     77 
    6478                Console.print("seqName"); 
    65                 for( int length=minLength ; length<=maxLength ; length++) { 
     79                for (int length = minLength; length <= maxLength; length++) { 
    6680                        Console.print(";numObs_" + length); 
    6781                        Console.print(";numCov_" + length); 
     
    7892                } 
    7993                Console.println(""); 
    80                 for( String sequenceName : sequenceNames ) { 
    81                         Object dataObjectSequences = GlobalDataContainer.getInstance().getData(sequenceName); 
    82                         if( dataObjectSequences==null ) { 
    83                                 Console.println("Sequences " + sequenceName + " not found in storage."); 
    84                         } 
    85                         else if( !(dataObjectSequences instanceof Collection<?>) ) { 
    86                                 // cannot really perform type check at runtime! this is an approximative substitute 
    87                                 Console.printerrln("Object " + sequenceName + "not of type Collection<?>!"); 
     94                for (String sequenceName : sequenceNames) { 
     95                        Object dataObjectSequences = GlobalDataContainer.getInstance() 
     96                                        .getData(sequenceName); 
     97                        if (dataObjectSequences == null) { 
     98                                Console.println("Sequences " + sequenceName 
     99                                                + " not found in storage."); 
     100                        } else if (!(dataObjectSequences instanceof Collection<?>)) { 
     101                                // cannot really perform type check at runtime! this is an 
     102                                // approximative substitute 
     103                                Console.printerrln("Object " + sequenceName 
     104                                                + "not of type Collection<?>!"); 
    88105                                return; 
    89106                        } 
    90107                        sequences = (Collection<List<? extends Event<?>>>) dataObjectSequences; 
    91108                        Console.print(sequenceName); 
    92                         for( int length=minLength ; length<=maxLength ; length++) { 
    93                                 CoverageCalculatorProcess covCalcProc = new CoverageCalculatorProcess(process, sequences, length); 
    94                                 CoverageCalculatorObserved covCalcObs = new CoverageCalculatorObserved(observedSequences, sequences, length); 
     109                        for (int length = minLength; length <= maxLength; length++) { 
     110                                CoverageCalculatorProcess covCalcProc = new CoverageCalculatorProcess( 
     111                                                process, sequences, length); 
     112                                CoverageCalculatorObserved covCalcObs = new CoverageCalculatorObserved( 
     113                                                observedSequences, sequences, length); 
    95114                                Console.print(";" + covCalcObs.getNumObserved()); 
    96115                                Console.print(";" + covCalcObs.getNumCovered()); 
     
    101120                                Console.print(";" + covCalcProc.getCoveragePossibleWeight()); 
    102121                                Console.print(";" + covCalcObs.getCoverageObserved()); 
    103                                 Console.print(";" + covCalcObs.getCoverageObservedWeigth(process)); 
     122                                Console.print(";" 
     123                                                + covCalcObs.getCoverageObservedWeigth(process)); 
    104124                                Console.print(";" + covCalcObs.getNewPercentage()); 
    105125                                Console.print(";" + covCalcObs.getCoveragePossibleNew(process)); 
    106                                 Console.print(";" + covCalcObs.getCoveragePossibleNewWeight(process)); 
     126                                Console.print(";" 
     127                                                + covCalcObs.getCoveragePossibleNewWeight(process)); 
    107128                        } 
    108129                        Console.println(""); 
     
    110131        } 
    111132 
     133        /* 
     134         * (non-Javadoc) 
     135         *  
     136         * @see de.ugoe.cs.util.console.Command#help() 
     137         */ 
    112138        @Override 
    113139        public void help() { 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDcalcEntropy.java

    r82 r171  
    88import de.ugoe.cs.util.console.Console; 
    99 
    10  
     10/** 
     11 * <p> 
     12 * Command to calculate the entropy of first-order Markov models. 
     13 * </p> 
     14 *  
     15 * @author Steffen Herbold 
     16 * @version 1.0 
     17 */ 
    1118public class CMDcalcEntropy implements Command { 
    1219 
     20        /* (non-Javadoc) 
     21         * @see de.ugoe.cs.util.console.Command#help() 
     22         */ 
    1323        @Override 
    1424        public void help() { 
     
    1626        } 
    1727 
     28        /* (non-Javadoc) 
     29         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     30         */ 
    1831        @Override 
    1932        public void run(List<Object> parameters) { 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDgenerateFixedLengthSequences.java

    r128 r171  
    1717import de.ugoe.cs.util.console.Console; 
    1818 
     19/** 
     20 * <p> 
     21 * Command to generate all sequences of a given length. 
     22 * </p> 
     23 *  
     24 * @author Steffen Herbold 
     25 * @version 1.0 
     26 */ 
    1927public class CMDgenerateFixedLengthSequences implements Command { 
    2028 
     29        /* 
     30         * (non-Javadoc) 
     31         *  
     32         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     33         */ 
    2134        @Override 
    2235        public void run(List<Object> parameters) { 
     
    3245                        minLength = Integer.parseInt((String) parameters.get(2)); 
    3346                        maxLength = Integer.parseInt((String) parameters.get(3)); 
    34                         if( parameters.size()>=5 ) { 
     47                        if (parameters.size() >= 5) { 
    3548                                all = Boolean.parseBoolean((String) parameters.get(4)); 
    3649                        } 
    37                         if( parameters.size()==6 ) { 
    38                                 numSequences = Integer.parseInt((String) parameters.get(5));  
     50                        if (parameters.size() == 6) { 
     51                                numSequences = Integer.parseInt((String) parameters.get(5)); 
    3952                        } 
    40                 } 
    41                 catch (Exception e) { 
     53                } catch (Exception e) { 
    4254                        throw new InvalidParameterException(); 
    4355                } 
    44                  
    45                 IStochasticProcess model = null;  
    46                 Object dataObject = GlobalDataContainer.getInstance().getData(modelname); 
    47                 if( dataObject==null ) { 
     56 
     57                IStochasticProcess model = null; 
     58                Object dataObject = GlobalDataContainer.getInstance() 
     59                                .getData(modelname); 
     60                if (dataObject == null) { 
    4861                        Console.println("Model " + modelname + " not found in storage."); 
    49                 } 
    50                 else if( !(dataObject instanceof IStochasticProcess) ) { 
     62                } else if (!(dataObject instanceof IStochasticProcess)) { 
    5163                        Console.println("Object " + modelname + " not of type MarkovModel!"); 
    5264                } else { 
    5365                        model = (IStochasticProcess) dataObject; 
    5466                        Collection<List<? extends Event<?>>> sequences = new LinkedHashSet<List<? extends Event<?>>>(); 
    55                         for( int length=minLength; length<=maxLength; length++ ) { 
    56                                 sequences.addAll(model.generateValidSequences(length+2)); 
     67                        for (int length = minLength; length <= maxLength; length++) { 
     68                                sequences.addAll(model.generateValidSequences(length + 2)); 
    5769                        } 
    5870                        Console.traceln("" + sequences.size() + " possible"); 
    59                         if( !all && numSequences<sequences.size() ) { 
    60                                 List<Double> probabilities = new ArrayList<Double>(sequences.size()); 
     71                        if (!all && numSequences < sequences.size()) { 
     72                                List<Double> probabilities = new ArrayList<Double>( 
     73                                                sequences.size()); 
    6174                                double probSum = 0.0; 
    62                                 for( List<? extends Event<?>> sequence : sequences ) { 
     75                                for (List<? extends Event<?>> sequence : sequences) { 
    6376                                        double prob = model.getProbability(sequence); 
    6477                                        probabilities.add(prob); 
     
    6780                                Set<Integer> drawnSequences = new HashSet<Integer>(numSequences); 
    6881                                Random r = new Random(); 
    69                                 while( drawnSequences.size()<numSequences ) { 
    70                                         double randVal = r.nextDouble()*probSum; 
     82                                while (drawnSequences.size() < numSequences) { 
     83                                        double randVal = r.nextDouble() * probSum; 
    7184                                        double sum = 0.0d; 
    7285                                        int index = -1; 
    73                                         while( sum<randVal ) { 
     86                                        while (sum < randVal) { 
    7487                                                index++; 
    7588                                                double currentProb = probabilities.get(index); 
    7689                                                sum += currentProb; 
    7790                                        } 
    78                                         if( !drawnSequences.contains(index) ) { 
     91                                        if (!drawnSequences.contains(index)) { 
    7992                                                drawnSequences.add(index); 
    8093                                                probSum -= probabilities.get(index); 
     
    8497                                Collection<List<? extends Event<?>>> retainedSequences = new LinkedList<List<? extends Event<?>>>(); 
    8598                                int index = 0; 
    86                                 for( List<? extends Event<?>> sequence : sequences) { 
    87                                         if( drawnSequences.contains(index) ) { 
     99                                for (List<? extends Event<?>> sequence : sequences) { 
     100                                        if (drawnSequences.contains(index)) { 
    88101                                                retainedSequences.add(sequence); 
    89102                                        } 
     
    92105                                sequences = retainedSequences; 
    93106                        } 
    94                         if( GlobalDataContainer.getInstance().addData(sequencesName, sequences) ) { 
    95                                 Console.traceln("Old data \"" + sequencesName + "\" overwritten"); 
     107                        if (GlobalDataContainer.getInstance().addData(sequencesName, 
     108                                        sequences)) { 
     109                                Console.traceln("Old data \"" + sequencesName 
     110                                                + "\" overwritten"); 
    96111                        } 
    97112                        Console.println("" + sequences.size() + " sequences generated"); 
     
    99114        } 
    100115 
     116        /* 
     117         * (non-Javadoc) 
     118         *  
     119         * @see de.ugoe.cs.util.console.Command#help() 
     120         */ 
    101121        @Override 
    102122        public void help() { 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDgenerateRandomReplay.java

    r18 r171  
    1212import de.ugoe.cs.util.console.Console; 
    1313 
     14/** 
     15 * <p> 
     16 * Command to create a replay file with randomly generated sessions. 
     17 * </p> 
     18 *  
     19 * @author Steffen Herbold 
     20 * @version 1.0 
     21 */ 
    1422public class CMDgenerateRandomReplay implements Command { 
    1523 
     24        /* 
     25         * (non-Javadoc) 
     26         *  
     27         * @see de.ugoe.cs.util.console.Command#help() 
     28         */ 
    1629        @Override 
    1730        public void help() { 
     
    1932        } 
    2033 
     34        /* 
     35         * (non-Javadoc) 
     36         *  
     37         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     38         */ 
    2139        @SuppressWarnings("unchecked") 
    2240        @Override 
     
    2846                        modelname = (String) parameters.get(0); 
    2947                        filename = (String) parameters.get(1); 
    30                         if( parameters.size()<3 ) { 
     48                        if (parameters.size() < 3) { 
    3149                                numSessions = Integer.parseInt((String) parameters.get(2)); 
    3250                        } 
    33                 } 
    34                 catch (Exception e) { 
     51                } catch (Exception e) { 
    3552                        throw new InvalidParameterException(); 
    3653                } 
    37                  
    38                 IStochasticProcess model = null;  
    39                 Object dataObject = GlobalDataContainer.getInstance().getData(modelname); 
    40                 if( dataObject==null ) { 
     54 
     55                IStochasticProcess model = null; 
     56                Object dataObject = GlobalDataContainer.getInstance() 
     57                                .getData(modelname); 
     58                if (dataObject == null) { 
    4159                        Console.println("Model " + modelname + " not found in storage."); 
    42                 } 
    43                 else if( !(dataObject instanceof IStochasticProcess) ) { 
     60                } else if (!(dataObject instanceof IStochasticProcess)) { 
    4461                        Console.println("Object " + modelname + " not of type MarkovModel!"); 
    4562                } else { 
     
    4764                        List<List<ReplayableEvent<?>>> sequences = new LinkedList<List<ReplayableEvent<?>>>(); 
    4865                        try { 
    49                                 for( int i=0 ; i<numSessions ; i++ ) { 
    50                                         sequences.add((List<ReplayableEvent<?>>) model.randomSequence()); 
     66                                for (int i = 0; i < numSessions; i++) { 
     67                                        sequences.add((List<ReplayableEvent<?>>) model 
     68                                                        .randomSequence()); 
    5169                                } 
    5270                        } catch (ClassCastException e) { 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDgenerateRandomSequences.java

    r121 r171  
    1212import de.ugoe.cs.util.console.Console; 
    1313 
     14/** 
     15 * <p>Command to generate random sessions.</p> 
     16 * @author Steffen Herbold 
     17 * @version 1.0 
     18 */ 
    1419public class CMDgenerateRandomSequences implements Command { 
    1520 
     21        /* (non-Javadoc) 
     22         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     23         */ 
    1624        @Override 
    1725        public void run(List<Object> parameters) { 
     
    6876        } 
    6977 
     78        /* (non-Javadoc) 
     79         * @see de.ugoe.cs.util.console.Command#help() 
     80         */ 
    7081        @Override 
    7182        public void help() { 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDgenerateReplayfile.java

    r98 r171  
    1111import de.ugoe.cs.util.console.Console; 
    1212 
     13/** 
     14 * <p>Command to create a replay file from stored sessions.</p> 
     15 * @author Steffen Herbold 
     16 * @version 1.0 
     17 */ 
    1318public class CMDgenerateReplayfile implements Command { 
    1419 
     20        /* (non-Javadoc) 
     21         * @see de.ugoe.cs.util.console.Command#help() 
     22         */ 
    1523        @Override 
    1624        public void help() { 
     
    1826        } 
    1927 
     28        /* (non-Javadoc) 
     29         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     30         */ 
    2031        @SuppressWarnings("unchecked") 
    2132        @Override 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDlistSymbols.java

    r130 r171  
    1010import de.ugoe.cs.util.console.Console; 
    1111 
     12/** 
     13 * <p> 
     14 * Command to list all events (symbols) known to a usage profile (stochastic 
     15 * process). 
     16 * </p> 
     17 *  
     18 * @author Steffen Herbold 
     19 * @version 1.0 
     20 */ 
    1221public class CMDlistSymbols implements Command { 
    1322 
     23        /* 
     24         * (non-Javadoc) 
     25         *  
     26         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     27         */ 
    1428        @Override 
    1529        public void run(List<Object> parameters) { 
     
    1832                try { 
    1933                        modelname = (String) parameters.get(0); 
    20                         if( parameters.size()==2 ) { 
     34                        if (parameters.size() == 2) { 
    2135                                sort = Boolean.parseBoolean((String) parameters.get(1)); 
    2236                        } 
     
    2438                        throw new InvalidParameterException(); 
    2539                } 
    26                  
    27                 IStochasticProcess model = null;  
    28                 Object dataObject = GlobalDataContainer.getInstance().getData(modelname); 
    29                 if( dataObject==null ) { 
     40 
     41                IStochasticProcess model = null; 
     42                Object dataObject = GlobalDataContainer.getInstance() 
     43                                .getData(modelname); 
     44                if (dataObject == null) { 
    3045                        Console.println("Model " + modelname + "not found in storage."); 
    31                 } 
    32                 else if( !(dataObject instanceof IStochasticProcess) ) { 
    33                         Console.println("Object " + modelname + " is not a stochastic process!"); 
     46                } else if (!(dataObject instanceof IStochasticProcess)) { 
     47                        Console.println("Object " + modelname 
     48                                        + " is not a stochastic process!"); 
    3449                } else { 
    3550                        model = (IStochasticProcess) dataObject; 
    3651                        String[] stateStrings = model.getSymbolStrings(); 
    37                         if( sort ) { 
     52                        if (sort) { 
    3853                                Arrays.sort(stateStrings); 
    3954                        } 
    40                         for( String stateString : stateStrings ) { 
     55                        for (String stateString : stateStrings) { 
    4156                                Console.println(stateString); 
    4257                        } 
     
    4459        } 
    4560 
     61        /* 
     62         * (non-Javadoc) 
     63         *  
     64         * @see de.ugoe.cs.util.console.Command#help() 
     65         */ 
    4666        @Override 
    4767        public void help() { 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDload.java

    r89 r171  
    77import java.util.List; 
    88 
     9import de.ugoe.cs.eventbench.data.GlobalDataContainer; 
    910import de.ugoe.cs.util.console.Command; 
    1011import de.ugoe.cs.util.console.Console; 
    1112 
     13/** 
     14 * <p> 
     15 * Command that loads a previously serialized {@link GlobalDataContainer}. 
     16 * </p> 
     17 *  
     18 * @author Steffen Herbold 
     19 * @version 1.0 
     20 */ 
    1221public class CMDload implements Command { 
    1322 
     23        /* 
     24         * (non-Javadoc) 
     25         *  
     26         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     27         */ 
    1428        @Override 
    1529        public void run(List<Object> parameters) { 
     
    3549        } 
    3650 
     51        /* 
     52         * (non-Javadoc) 
     53         *  
     54         * @see de.ugoe.cs.util.console.Command#help() 
     55         */ 
    3756        @Override 
    3857        public void help() { 
    3958                Console.println("Usage: loadObject <filename>"); 
    4059        } 
    41          
     60 
    4261} 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDloadObject.java

    r89 r171  
    1111import de.ugoe.cs.util.console.Console; 
    1212 
     13/** 
     14 * <p> 
     15 * Command to load a previously serialized object and store it in the 
     16 * {@link GlobalDataContainer}. 
     17 * </p> 
     18 *  
     19 * @author Steffen Herbold 
     20 * @version 1.0 
     21 */ 
    1322public class CMDloadObject implements Command { 
    1423 
     24        /* 
     25         * (non-Javadoc) 
     26         *  
     27         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     28         */ 
    1529        @Override 
    1630        public void run(List<Object> parameters) { 
     
    3751                        ex.printStackTrace(); 
    3852                } 
    39                 if( GlobalDataContainer.getInstance().addData(objectName, data ) ) { 
     53                if (GlobalDataContainer.getInstance().addData(objectName, data)) { 
    4054                        Console.traceln("Old data \"" + objectName + "\" overwritten"); 
    4155                } 
    4256        } 
    4357 
     58        /* 
     59         * (non-Javadoc) 
     60         *  
     61         * @see de.ugoe.cs.util.console.Command#help() 
     62         */ 
    4463        @Override 
    4564        public void help() { 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDmodelSize.java

    r131 r171  
    1 /** 
    2  *  
    3  */ 
    41package de.ugoe.cs.eventbench.commands; 
    52 
     
    1310 
    1411/** 
    15  * @author sherbold 
    16  * 
     12 * <p> 
     13 * Command that prints the size of a stochastic process to the console. 
     14 * </p> 
     15 *  
     16 * @author Steffen Herbold 
     17 * @version 1.0 
    1718 */ 
    1819public class CMDmodelSize implements Command { 
    1920 
    20         /* (non-Javadoc) 
     21        /* 
     22         * (non-Javadoc) 
     23         *  
    2124         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
    2225         */ 
     
    2932                        throw new InvalidParameterException(); 
    3033                } 
    31                  
    32                 Object dataObject = GlobalDataContainer.getInstance().getData(modelname); 
    33                 if( dataObject==null ) { 
     34 
     35                Object dataObject = GlobalDataContainer.getInstance() 
     36                                .getData(modelname); 
     37                if (dataObject == null) { 
    3438                        Console.printerrln("No model with name " + modelname + "found"); 
    3539                        return; 
    3640                } 
    37                 if( !(dataObject instanceof IStochasticProcess) ) { 
    38                         Console.printerrln("Object " + modelname + " not of type IStochasticProcess!"); 
     41                if (!(dataObject instanceof IStochasticProcess)) { 
     42                        Console.printerrln("Object " + modelname 
     43                                        + " not of type IStochasticProcess!"); 
    3944                        return; 
    4045                } 
    41                  
     46 
    4247                IStochasticProcess process = (IStochasticProcess) dataObject; 
    43                 Console.println("#symbols: " + process.getNumSymbols() + " ; #FOMstates " + process.getNumFOMStates()); 
     48                Console.println("#symbols: " + process.getNumSymbols() 
     49                                + " ; #FOMstates " + process.getNumFOMStates()); 
    4450        } 
    4551 
    46         /* (non-Javadoc) 
     52        /* 
     53         * (non-Javadoc) 
     54         *  
    4755         * @see de.ugoe.cs.util.console.Command#help() 
    4856         */ 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDprintDot.java

    r26 r171  
    99import de.ugoe.cs.util.console.Console; 
    1010 
     11/** 
     12 * <p> 
     13 * Command that prints a dot representation of a model (if supported) to the 
     14 * console. 
     15 * </p> 
     16 *  
     17 * @author Steffen Herbold 
     18 * @version 1.0 
     19 */ 
    1120public class CMDprintDot implements Command { 
    1221 
     22        /* 
     23         * (non-Javadoc) 
     24         *  
     25         * @see de.ugoe.cs.util.console.Command#help() 
     26         */ 
    1327        @Override 
    1428        public void help() { 
     
    1630        } 
    1731 
     32        /* 
     33         * (non-Javadoc) 
     34         *  
     35         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     36         */ 
    1837        @Override 
    1938        public void run(List<Object> parameters) { 
     
    2443                        throw new InvalidParameterException(); 
    2544                } 
    26                  
    27                 IDotCompatible model = null;  
    28                 Object dataObject = GlobalDataContainer.getInstance().getData(modelname); 
    29                 if( dataObject==null ) { 
     45 
     46                IDotCompatible model = null; 
     47                Object dataObject = GlobalDataContainer.getInstance() 
     48                                .getData(modelname); 
     49                if (dataObject == null) { 
    3050                        Console.println("Model " + modelname + "not found in storage."); 
    31                 } 
    32                 else if( !(dataObject instanceof IDotCompatible) ) { 
    33                         Console.println("Object " + modelname + " does not implement IDotCompatible!"); 
     51                } else if (!(dataObject instanceof IDotCompatible)) { 
     52                        Console.println("Object " + modelname 
     53                                        + " does not implement IDotCompatible!"); 
    3454                } else { 
    3555                        model = (IDotCompatible) dataObject; 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDprintRandomSession.java

    r18 r171  
    1010import de.ugoe.cs.util.console.Console; 
    1111 
     12/** 
     13 * <p> 
     14 * Command that prints a randomly generated sessions of events to the console. 
     15 * </p> 
     16 *  
     17 * @author Steffen Herbold 
     18 * @version 1.0 
     19 */ 
    1220public class CMDprintRandomSession implements Command { 
    1321 
     22        /* 
     23         * (non-Javadoc) 
     24         *  
     25         * @see de.ugoe.cs.util.console.Command#help() 
     26         */ 
    1427        @Override 
    1528        public void help() { 
     
    1730        } 
    1831 
     32        /* 
     33         * (non-Javadoc) 
     34         *  
     35         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     36         */ 
    1937        @Override 
    2038        public void run(List<Object> parameters) { 
     
    2240                try { 
    2341                        modelname = (String) parameters.get(0); 
    24                 } 
    25                 catch (Exception e) { 
     42                } catch (Exception e) { 
    2643                        throw new InvalidParameterException(); 
    2744                } 
    28                  
    29                 IStochasticProcess model = null;  
    30                 Object dataObject = GlobalDataContainer.getInstance().getData(modelname); 
    31                 if( dataObject==null ) { 
     45 
     46                IStochasticProcess model = null; 
     47                Object dataObject = GlobalDataContainer.getInstance() 
     48                                .getData(modelname); 
     49                if (dataObject == null) { 
    3250                        Console.println("Model " + modelname + " not found in storage."); 
    33                 } 
    34                 else if( !(dataObject instanceof IStochasticProcess) ) { 
     51                } else if (!(dataObject instanceof IStochasticProcess)) { 
    3552                        Console.println("Object " + modelname + " not of type MarkovModel!"); 
    3653                } else { 
    3754                        model = (IStochasticProcess) dataObject; 
    38                         for( Event<?> event : model.randomSequence() ) { 
     55                        for (Event<?> event : model.randomSequence()) { 
    3956                                Console.println(event.toString()); 
    4057                        } 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDprintTrieDot.java

    r31 r171  
    55 
    66import de.ugoe.cs.eventbench.data.GlobalDataContainer; 
     7import de.ugoe.cs.eventbench.models.Trie; 
    78import de.ugoe.cs.eventbench.models.TrieBasedModel; 
    89import de.ugoe.cs.util.console.Command; 
    910import de.ugoe.cs.util.console.Console; 
    1011 
     12/** 
     13 * <p> 
     14 * Command that prints the {@link Trie} of a {@link TrieBasedModel} as dot to 
     15 * the console. 
     16 * </p> 
     17 *  
     18 * @author Steffen Herbold 
     19 * @version 
     20 */ 
    1121public class CMDprintTrieDot implements Command { 
    12          
     22 
     23        /* 
     24         * (non-Javadoc) 
     25         *  
     26         * @see de.ugoe.cs.util.console.Command#help() 
     27         */ 
    1328        @Override 
    1429        public void help() { 
     
    1631        } 
    1732 
     33        /* 
     34         * (non-Javadoc) 
     35         *  
     36         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     37         */ 
    1838        @Override 
    1939        public void run(List<Object> parameters) { 
     
    2444                        throw new InvalidParameterException(); 
    2545                } 
    26                  
    27                 TrieBasedModel model = null;  
    28                 Object dataObject = GlobalDataContainer.getInstance().getData(modelname); 
    29                 if( dataObject==null ) { 
     46 
     47                TrieBasedModel model = null; 
     48                Object dataObject = GlobalDataContainer.getInstance() 
     49                                .getData(modelname); 
     50                if (dataObject == null) { 
    3051                        Console.println("Model " + modelname + "not found in storage."); 
    31                 } 
    32                 else if( !(dataObject instanceof TrieBasedModel) ) { 
     52                } else if (!(dataObject instanceof TrieBasedModel)) { 
    3353                        Console.println("Object " + modelname + " is not a TrieBasedModel!"); 
    3454                } else { 
     
    3757                } 
    3858        } 
    39          
     59 
    4060} 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDsave.java

    r88 r171  
    1111import de.ugoe.cs.util.console.Console; 
    1212 
     13/** 
     14 * <p> 
     15 * Command to save the {@link GlobalDataContainer} through serialization. 
     16 * </p> 
     17 *  
     18 * @author Steffen Herbold 
     19 * @version 1.0 
     20 */ 
    1321public class CMDsave implements Command { 
    1422 
     23        /* 
     24         * (non-Javadoc) 
     25         *  
     26         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     27         */ 
    1528        @Override 
    1629        public void run(List<Object> parameters) { 
     
    1831                try { 
    1932                        filename = (String) parameters.get(0); 
    20                 } 
    21                 catch (Exception e) { 
     33                } catch (Exception e) { 
    2234                        throw new InvalidParameterException(); 
    2335                } 
    24                  
    25                  
     36 
    2637                FileOutputStream fos = null; 
    2738                ObjectOutputStream out = null; 
     
    3647        } 
    3748 
     49        /* 
     50         * (non-Javadoc) 
     51         *  
     52         * @see de.ugoe.cs.util.console.Command#help() 
     53         */ 
    3854        @Override 
    3955        public void help() { 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDsaveObject.java

    r90 r171  
    1111import de.ugoe.cs.util.console.Console; 
    1212 
     13/** 
     14 * <p> 
     15 * Command that saves an object contained in the {@link GlobalDataContainer} 
     16 * through serialization. 
     17 * </p> 
     18 *  
     19 * @author Steffen Herbold 
     20 * @version 
     21 */ 
    1322public class CMDsaveObject implements Command { 
    1423 
     24        /* 
     25         * (non-Javadoc) 
     26         *  
     27         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     28         */ 
    1529        @Override 
    1630        public void run(List<Object> parameters) { 
     
    2034                        filename = (String) parameters.get(0); 
    2135                        objectName = (String) parameters.get(1); 
    22                 } 
    23                 catch (Exception e) { 
     36                } catch (Exception e) { 
    2437                        throw new InvalidParameterException(); 
    2538                } 
    26                  
    27                 Object dataObject = GlobalDataContainer.getInstance().getData(objectName); 
    28                 if( dataObject==null ) { 
     39 
     40                Object dataObject = GlobalDataContainer.getInstance().getData( 
     41                                objectName); 
     42                if (dataObject == null) { 
    2943                        Console.println("Object " + objectName + " not found in storage."); 
    3044                } 
    31                  
     45 
    3246                FileOutputStream fos = null; 
    3347                ObjectOutputStream out = null; 
     
    4256        } 
    4357 
     58        /* 
     59         * (non-Javadoc) 
     60         *  
     61         * @see de.ugoe.cs.util.console.Command#help() 
     62         */ 
    4463        @Override 
    4564        public void help() { 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDsequenceStatistics.java

    r113 r171  
    1111import de.ugoe.cs.util.console.Console; 
    1212 
     13/** 
     14 * <p> 
     15 * Command to print basic statistical information about stored sequences, e.g., 
     16 * how many there are of which lenght. 
     17 * </p> 
     18 *  
     19 * @author Steffen Herbold 
     20 * @version 1.0 
     21 */ 
    1322public class CMDsequenceStatistics implements Command { 
    1423 
     24        /* 
     25         * (non-Javadoc) 
     26         *  
     27         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     28         */ 
    1529        @SuppressWarnings("unchecked") 
    1630        @Override 
    1731        public void run(List<Object> parameters) { 
    1832                String sequencesName = "sequences"; 
    19                 if( parameters.size()==1 ) { 
     33                if (parameters.size() == 1) { 
    2034                        sequencesName = (String) parameters.get(0); 
    2135                } 
    22                  
    23                  
     36 
    2437                List<List<Event<?>>> sequences = null; 
    25                 Object dataObject = GlobalDataContainer.getInstance().getData(sequencesName); 
    26                          
     38                Object dataObject = GlobalDataContainer.getInstance().getData( 
     39                                sequencesName); 
     40 
    2741                try { 
    2842                        sequences = (List<List<Event<?>>>) dataObject; 
    2943                        Console.traceln("Number of Sequences: " + sequences.size()); 
    30                         SortedMap<Integer,Integer> lengthMap = new TreeMap<Integer, Integer>(); 
    31                         for( List<Event<?>> sequence : sequences ) { 
     44                        SortedMap<Integer, Integer> lengthMap = new TreeMap<Integer, Integer>(); 
     45                        for (List<Event<?>> sequence : sequences) { 
    3246                                Integer currentSize = sequence.size(); 
    33                                 if( lengthMap.containsKey(currentSize) ) { 
    34                                         lengthMap.put(currentSize, lengthMap.get(currentSize)+1); 
     47                                if (lengthMap.containsKey(currentSize)) { 
     48                                        lengthMap.put(currentSize, lengthMap.get(currentSize) + 1); 
    3549                                } else { 
    3650                                        lengthMap.put(currentSize, 1); 
    3751                                } 
    3852                        } 
    39                         for( Entry<Integer, Integer> entry : lengthMap.entrySet() ) { 
    40                                 Console.traceln("Of length " + entry.getKey() + ": " + entry.getValue()); 
     53                        for (Entry<Integer, Integer> entry : lengthMap.entrySet()) { 
     54                                Console.traceln("Of length " + entry.getKey() + ": " 
     55                                                + entry.getValue()); 
    4156                        } 
    42                          
    43                 } 
    44                 catch(ClassCastException e) { 
     57 
     58                } catch (ClassCastException e) { 
    4559                        Console.println("Sequences not found"); 
    4660                } 
    4761        } 
    4862 
     63        /* 
     64         * (non-Javadoc) 
     65         *  
     66         * @see de.ugoe.cs.util.console.Command#help() 
     67         */ 
    4968        @Override 
    5069        public void help() { 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDshowMarkovModel.java

    r18 r171  
    2323import edu.uci.ics.jung.visualization.renderers.Renderer.VertexLabel.Position; 
    2424 
     25/** 
     26 * <p> 
     27 * Command that visualizes first-order Markov models. 
     28 * </p> 
     29 *  
     30 * @author Steffen Herbold 
     31 * @version 1.0 
     32 */ 
    2533public class CMDshowMarkovModel implements Command { 
    2634 
     35        /* 
     36         * (non-Javadoc) 
     37         *  
     38         * @see de.ugoe.cs.util.console.Command#help() 
     39         */ 
    2740        @Override 
    2841        public void help() { 
     
    3043        } 
    3144 
     45        /* 
     46         * (non-Javadoc) 
     47         *  
     48         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     49         */ 
    3250        @Override 
    3351        public void run(List<Object> parameters) { 
     
    3654                try { 
    3755                        modelname = (String) parameters.get(0); 
    38                         if( parameters.size()==2 ) { 
    39                                 showNodeNames = Boolean.parseBoolean((String) parameters.get(1)); 
     56                        if (parameters.size() == 2) { 
     57                                showNodeNames = Boolean 
     58                                                .parseBoolean((String) parameters.get(1)); 
    4059                        } 
    4160                } catch (Exception e) { 
    4261                        throw new InvalidParameterException(); 
    4362                } 
    44                  
    45                 Object dataObject = GlobalDataContainer.getInstance().getData(modelname); 
    46                 if( dataObject==null ) { 
     63 
     64                Object dataObject = GlobalDataContainer.getInstance() 
     65                                .getData(modelname); 
     66                if (dataObject == null) { 
    4767                        Console.printerrln("No model with name " + modelname + "found"); 
    4868                } else { 
    4969                        FirstOrderMarkovModel mm = (FirstOrderMarkovModel) dataObject; 
    50                          
     70 
    5171                        Graph<String, MarkovEdge> graph = mm.getGraph(); 
    52                         Layout<String, MarkovEdge> layout = new ISOMLayout<String, MarkovEdge>(graph); 
    53                         layout.setSize(new Dimension(1000,800)); // sets the initial size of the space 
    54                         // The BasicVisualizationServer<V,E> is parameterized by the edge types 
    55                         BasicVisualizationServer<String,MarkovEdge> vv = 
    56                         new BasicVisualizationServer<String,MarkovEdge>(layout); 
    57                         vv.setPreferredSize(new Dimension(1100,850)); //Sets the viewing area size 
     72                        Layout<String, MarkovEdge> layout = new ISOMLayout<String, MarkovEdge>( 
     73                                        graph); 
     74                        layout.setSize(new Dimension(1000, 800)); // sets the initial size 
     75                                                                                                                // of the space 
     76                        // The BasicVisualizationServer<V,E> is parameterized by the edge 
     77                        // types 
     78                        BasicVisualizationServer<String, MarkovEdge> vv = new BasicVisualizationServer<String, MarkovEdge>( 
     79                                        layout); 
     80                        vv.setPreferredSize(new Dimension(1100, 850)); // Sets the viewing 
     81                                                                                                                        // area size 
    5882 
    59                         if( showNodeNames ) { 
     83                        if (showNodeNames) { 
    6084                                final Rectangle rect = new Rectangle(240, 20); 
    61                                  
    62                                 Transformer<String, Shape> vertexShapeTransformer = 
    63                                         new Transformer<String, Shape>() { 
    64                                                 public Shape transform(String s) { 
    65                                                         return rect; 
    66                                                 } 
     85 
     86                                Transformer<String, Shape> vertexShapeTransformer = new Transformer<String, Shape>() { 
     87                                        public Shape transform(String s) { 
     88                                                return rect; 
     89                                        } 
    6790                                }; 
    68                                 vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR); 
    69                                 vv.getRenderContext().setVertexShapeTransformer(vertexShapeTransformer); 
    70                                 vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<String>()); 
     91                                vv.getRenderer().getVertexLabelRenderer() 
     92                                                .setPosition(Position.CNTR); 
     93                                vv.getRenderContext().setVertexShapeTransformer( 
     94                                                vertexShapeTransformer); 
     95                                vv.getRenderContext().setVertexLabelTransformer( 
     96                                                new ToStringLabeller<String>()); 
    7197                        } 
    72                          
    73                         vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller<MarkovEdge>()); 
    74                          
     98 
     99                        vv.getRenderContext().setEdgeLabelTransformer( 
     100                                        new ToStringLabeller<MarkovEdge>()); 
     101 
    75102                        JFrame frame = new JFrame("Markov Model"); 
    76103                        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDshowTrie.java

    r24 r171  
    1212 
    1313import de.ugoe.cs.eventbench.data.GlobalDataContainer; 
     14import de.ugoe.cs.eventbench.models.Trie; 
    1415import de.ugoe.cs.eventbench.models.Trie.Edge; 
    1516import de.ugoe.cs.eventbench.models.Trie.TrieVertex; 
     
    2425import edu.uci.ics.jung.visualization.renderers.Renderer.VertexLabel.Position; 
    2526 
     27/** 
     28 * <p> 
     29 * Command that visualizes the {@link Trie} of a {@link TrieBasedModel}. 
     30 * </p> 
     31 *  
     32 * @author Steffen Herbold 
     33 * @version 1.0 
     34 */ 
    2635public class CMDshowTrie implements Command { 
    2736 
     37        /* 
     38         * (non-Javadoc) 
     39         *  
     40         * @see de.ugoe.cs.util.console.Command#help() 
     41         */ 
    2842        @Override 
    2943        public void help() { 
    3044                Console.println("Usage: showTrie <modelName>"); 
    3145        } 
    32          
     46 
     47        /* 
     48         * (non-Javadoc) 
     49         *  
     50         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     51         */ 
    3352        @Override 
    3453        public void run(List<Object> parameters) { 
     
    3958                        throw new InvalidParameterException(); 
    4059                } 
    41                  
    42                 Object dataObject = GlobalDataContainer.getInstance().getData(modelname); 
    43                 if( dataObject==null ) { 
     60 
     61                Object dataObject = GlobalDataContainer.getInstance() 
     62                                .getData(modelname); 
     63                if (dataObject == null) { 
    4464                        Console.printerrln("No model with name " + modelname + "found"); 
    4565                } else { 
    4666                        TrieBasedModel model = (TrieBasedModel) dataObject; 
    4767                        Tree<TrieVertex, Edge> graph = model.getTrieGraph(); 
    48                         Layout<TrieVertex, Edge> layout = new TreeLayout<TrieVertex, Edge>(graph, 60); 
    49                         // The BasicVisualizationServer<V,E> is parameterized by the edge types 
    50                         BasicVisualizationServer<TrieVertex,Edge> vv = 
    51                         new BasicVisualizationServer<TrieVertex,Edge>(layout); 
    52                         vv.setPreferredSize(new Dimension(1100,850)); //Sets the viewing area size 
    53                          
    54                          
     68                        Layout<TrieVertex, Edge> layout = new TreeLayout<TrieVertex, Edge>( 
     69                                        graph, 60); 
     70                        // The BasicVisualizationServer<V,E> is parameterized by the edge 
     71                        // types 
     72                        BasicVisualizationServer<TrieVertex, Edge> vv = new BasicVisualizationServer<TrieVertex, Edge>( 
     73                                        layout); 
     74                        vv.setPreferredSize(new Dimension(1100, 850)); // Sets the viewing 
     75                                                                                                                        // area size 
     76 
    5577                        final Rectangle rect = new Rectangle(40, 20); 
    56                                  
    57                         Transformer<TrieVertex, Shape> vertexShapeTransformer = 
    58                                 new Transformer<TrieVertex, Shape>() { 
    59                                         public Shape transform(TrieVertex s) { 
    60                                                 return rect; 
    61                                         } 
     78 
     79                        Transformer<TrieVertex, Shape> vertexShapeTransformer = new Transformer<TrieVertex, Shape>() { 
     80                                public Shape transform(TrieVertex s) { 
     81                                        return rect; 
     82                                } 
    6283                        }; 
    63                         vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR); 
    64                         vv.getRenderContext().setVertexShapeTransformer(vertexShapeTransformer); 
    65                         vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<TrieVertex>()); 
    66                          
     84                        vv.getRenderer().getVertexLabelRenderer() 
     85                                        .setPosition(Position.CNTR); 
     86                        vv.getRenderContext().setVertexShapeTransformer( 
     87                                        vertexShapeTransformer); 
     88                        vv.getRenderContext().setVertexLabelTransformer( 
     89                                        new ToStringLabeller<TrieVertex>()); 
     90 
    6791                        JFrame frame = new JFrame("Trie"); 
    6892                        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     
    7397        } 
    7498 
    75  
    76  
    7799} 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDtrainDFA.java

    r96 r171  
    1111import de.ugoe.cs.util.console.Console; 
    1212 
     13/** 
     14 * <p> 
     15 * Command to train a Deterministic Finite Automaton (DFA). 
     16 * </p> 
     17 *  
     18 * @author Steffen Herbold 
     19 * @version 1.0 
     20 */ 
    1321public class CMDtrainDFA implements Command { 
    1422 
     23        /* 
     24         * (non-Javadoc) 
     25         *  
     26         * @see de.ugoe.cs.util.console.Command#help() 
     27         */ 
    1528        @Override 
    1629        public void help() { 
     
    1831        } 
    1932 
     33        /* 
     34         * (non-Javadoc) 
     35         *  
     36         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     37         */ 
    2038        @SuppressWarnings("unchecked") 
    2139        @Override 
     
    2745                        throw new InvalidParameterException(); 
    2846                } 
    29                  
     47 
    3048                List<List<Event<?>>> sequences = null; 
    31                 Object dataObject = GlobalDataContainer.getInstance().getData("sequences"); 
    32                          
     49                Object dataObject = GlobalDataContainer.getInstance().getData( 
     50                                "sequences"); 
     51 
    3352                try { 
    3453                        sequences = (List<List<Event<?>>>) dataObject; 
    35                         if( sequences.size()>0 ) { 
    36                                 if( sequences.get(0).get(0) instanceof Event ) { 
    37                                         DeterministicFiniteAutomaton model =  new DeterministicFiniteAutomaton(new Random()); 
     54                        if (sequences.size() > 0) { 
     55                                if (sequences.get(0).get(0) instanceof Event) { 
     56                                        DeterministicFiniteAutomaton model = new DeterministicFiniteAutomaton( 
     57                                                        new Random()); 
    3858                                        model.train(sequences); 
    39                                         if( GlobalDataContainer.getInstance().addData(modelname, model) ) { 
    40                                                 Console.traceln("Old data \"" + modelname + "\" overwritten"); 
     59                                        if (GlobalDataContainer.getInstance().addData(modelname, 
     60                                                        model)) { 
     61                                                Console.traceln("Old data \"" + modelname 
     62                                                                + "\" overwritten"); 
    4163                                        } 
    4264                                } else { 
     
    4567                                } 
    4668                        } 
    47                 } 
    48                 catch(ClassCastException e) { 
     69                } catch (ClassCastException e) { 
    4970                        Console.println("Sequences need to be loaded first using parseXML"); 
    5071                } 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDtrainMarkovModel.java

    r116 r171  
    11package de.ugoe.cs.eventbench.commands; 
    2  
    32 
    43import java.security.InvalidParameterException; 
     
    1312import de.ugoe.cs.util.console.Console; 
    1413 
     14/** 
     15 * <p> 
     16 * Command to train first-order and high-order Markov models. 
     17 * </p> 
     18 *  
     19 * @author Steffen Herbold 
     20 * @version 1.0 
     21 */ 
    1522public class CMDtrainMarkovModel implements Command { 
    1623 
     24        /* 
     25         * (non-Javadoc) 
     26         *  
     27         * @see de.ugoe.cs.util.console.Command#help() 
     28         */ 
    1729        @Override 
    1830        public void help() { 
     
    2032        } 
    2133 
     34        /* 
     35         * (non-Javadoc) 
     36         *  
     37         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     38         */ 
    2239        @SuppressWarnings("unchecked") 
    2340        @Override 
     
    2744                try { 
    2845                        modelname = (String) parameters.get(0); 
    29                         if( parameters.size()==2 ) { 
     46                        if (parameters.size() == 2) { 
    3047                                order = Integer.parseInt((String) parameters.get(1)); 
    3148                        } 
     
    3350                        throw new InvalidParameterException(); 
    3451                } 
    35                  
     52 
    3653                List<List<Event<?>>> sequences = null; 
    37                 Object dataObject = GlobalDataContainer.getInstance().getData("sequences"); 
    38                          
     54                Object dataObject = GlobalDataContainer.getInstance().getData( 
     55                                "sequences"); 
     56 
    3957                try { 
    4058                        sequences = (List<List<Event<?>>>) dataObject; 
    41                         if( sequences.size()>0 ) { 
    42                                 if( sequences.get(0).get(0) instanceof Event ) { 
     59                        if (sequences.size() > 0) { 
     60                                if (sequences.get(0).get(0) instanceof Event) { 
    4361                                        HighOrderMarkovModel model; 
    44                                         if( order==1 ) { 
     62                                        if (order == 1) { 
    4563                                                model = new FirstOrderMarkovModel(new Random()); 
    4664                                        } else { 
     
    4866                                        } 
    4967                                        model.train(sequences); 
    50                                         if( GlobalDataContainer.getInstance().addData(modelname, model) ) { 
    51                                                 Console.traceln("Old data \"" + modelname + "\" overwritten"); 
     68                                        if (GlobalDataContainer.getInstance().addData(modelname, 
     69                                                        model)) { 
     70                                                Console.traceln("Old data \"" + modelname 
     71                                                                + "\" overwritten"); 
    5272                                        } 
    5373                                } else { 
     
    5676                                } 
    5777                        } 
    58                 } 
    59                 catch(ClassCastException e) { 
     78                } catch (ClassCastException e) { 
    6079                        Console.println("Sequences need to be loaded first using parseXML"); 
    6180                } 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/commands/CMDtrainPPM.java

    r116 r171  
    1111import de.ugoe.cs.util.console.Console; 
    1212 
     13/** 
     14 * <p> 
     15 * Command that trains Prediction by Partial Match (PPM) models. 
     16 * </p> 
     17 *  
     18 * @author Steffen Herbold 
     19 * @version 1.0 
     20 */ 
    1321public class CMDtrainPPM implements Command { 
    1422 
     23        /* 
     24         * (non-Javadoc) 
     25         *  
     26         * @see de.ugoe.cs.util.console.Command#help() 
     27         */ 
    1528        @Override 
    1629        public void help() { 
     
    1831        } 
    1932 
     33        /* 
     34         * (non-Javadoc) 
     35         *  
     36         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     37         */ 
    2038        @SuppressWarnings("unchecked") 
    2139        @Override 
     
    2947                        probEscape = Double.parseDouble((String) parameters.get(1)); 
    3048                        maxOrder = Integer.parseInt((String) parameters.get(2)); 
    31                         if( parameters.size()==4 ) { 
     49                        if (parameters.size() == 4) { 
    3250                                minOrder = Integer.parseInt((String) parameters.get(3)); 
    3351                        } 
     
    3553                        throw new InvalidParameterException(); 
    3654                } 
    37                  
     55 
    3856                List<List<Event<?>>> sequences = null; 
    39                 Object dataObject = GlobalDataContainer.getInstance().getData("sequences"); 
    40                          
     57                Object dataObject = GlobalDataContainer.getInstance().getData( 
     58                                "sequences"); 
     59 
    4160                try { 
    4261                        sequences = (List<List<Event<?>>>) dataObject; 
    43                         if( sequences.size()>0 ) { 
    44                                 if( sequences.get(0).get(0) instanceof Event ) { 
    45                                         PredictionByPartialMatch model = new PredictionByPartialMatch(maxOrder, minOrder, new Random(), probEscape); 
     62                        if (sequences.size() > 0) { 
     63                                if (sequences.get(0).get(0) instanceof Event) { 
     64                                        PredictionByPartialMatch model = new PredictionByPartialMatch( 
     65                                                        maxOrder, minOrder, new Random(), probEscape); 
    4666                                        model.train(sequences); 
    47                                         if( GlobalDataContainer.getInstance().addData(modelname, model) ) { 
    48                                                 Console.traceln("Old data \"" + modelname + "\" overwritten"); 
    49                                         }                                        
     67                                        if (GlobalDataContainer.getInstance().addData(modelname, 
     68                                                        model)) { 
     69                                                Console.traceln("Old data \"" + modelname 
     70                                                                + "\" overwritten"); 
     71                                        } 
    5072                                } else { 
    5173                                        Console.traceln("Illegal use of \"sequences\" parameter in the GlobalDataContainer."); 
     
    5375                                } 
    5476                        } 
    55                 } 
    56                 catch(ClassCastException e) { 
     77                } catch (ClassCastException e) { 
    5778                        Console.println("Sequences need to be loaded first using parseXML"); 
    5879                } 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/data/GlobalDataContainer.java

    r88 r171  
    88import java.util.Map; 
    99 
     10/** 
     11 * <p> 
     12 * This data structure can be used by the commands to store any {@link Object}. 
     13 * The data is stored in a key-value map, with strings as keys. 
     14 * </p> 
     15 * <p> 
     16 * This class is implemented as a singleton, as more than one data container 
     17 * does not serves no purpose. 
     18 * </p> 
     19 *  
     20 * @author Steffen Herbold 
     21 * @version 1.0 
     22 */ 
    1023public class GlobalDataContainer implements Serializable { 
    11          
     24 
    1225        /** 
     26         * <p> 
    1327         * Id for object serialization. 
     28         * </p> 
    1429         */ 
    1530        private static final long serialVersionUID = 1L; 
    1631 
     32        /** 
     33         * <p> 
     34         * Instance of the {@link GlobalDataContainer} (implemented as singleton). 
     35         * </p> 
     36         */ 
    1737        transient private static GlobalDataContainer theInstance = null; 
    18          
     38 
     39        /** 
     40         * <p> 
     41         * Internal storage of the data. 
     42         * </p> 
     43         */ 
    1944        private Map<String, Object> dataObjects; 
    20          
     45 
     46        /** 
     47         * <p> 
     48         * Returns the instance of the container. If it does not yet exist, the data 
     49         * container is created. 
     50         * </p> 
     51         *  
     52         * @return instance of the container 
     53         */ 
    2154        public static GlobalDataContainer getInstance() { 
    22                 if( theInstance==null ) { 
     55                if (theInstance == null) { 
    2356                        theInstance = new GlobalDataContainer(); 
    2457                } 
    2558                return theInstance; 
    2659        } 
    27          
     60 
     61        /** 
     62         * <p> 
     63         * Manual serialization of the object. Necessary to guarantee the singleton 
     64         * property. 
     65         * </p> 
     66         *  
     67         * @param s 
     68         *            output stream for the serialization 
     69         * @throws IOException 
     70         *             thrown if there is problem writing to the output stream 
     71         */ 
    2872        private void writeObject(ObjectOutputStream s) throws IOException { 
    2973                s.defaultWriteObject(); 
    3074                s.writeObject(dataObjects); 
    3175        } 
    32          
     76 
     77        /** 
     78         * <p> 
     79         * Manual de-serialization of the object. Necessary to guarantee the 
     80         * singleton property. 
     81         *  
     82         * @param s 
     83         *            input stream for the de-serialization 
     84         * @throws IOException 
     85         *             thrown if there is problem reading from the input stream 
     86         * @throws ClassNotFoundException 
     87         *             thrown if there is a problem reading from the input stream 
     88         */ 
    3389        @SuppressWarnings("unchecked") 
    34         private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { 
     90        private void readObject(ObjectInputStream s) throws IOException, 
     91                        ClassNotFoundException { 
    3592                s.defaultReadObject(); 
    36                 if( theInstance==null ) { 
     93                if (theInstance == null) { 
    3794                        theInstance = new GlobalDataContainer(); 
    3895                } 
    3996                theInstance.dataObjects = (Map<String, Object>) s.readObject(); 
    4097        } 
    41          
     98 
     99        /** 
     100         * <p> 
     101         * Manual de-serialization to guarantee the singleton property. 
     102         * </p> 
     103         *  
     104         * @return instance of the container 
     105         */ 
    42106        private Object readResolve() { 
    43107                return theInstance; 
    44108        } 
    45          
     109 
     110        /** 
     111         * <p> 
     112         * Constructor. Creates a new GlobalDataContainer. Private to guarantee the 
     113         * singleton property. 
     114         * </p> 
     115         */ 
    46116        private GlobalDataContainer() { 
    47117                dataObjects = new HashMap<String, Object>(); 
    48118        } 
    49          
     119 
     120        /** 
     121         * <p> 
     122         * Adds data to the container. 
     123         * </p> 
     124         *  
     125         * @param key 
     126         *            key that identifies the data 
     127         * @param data 
     128         *            data that is stored 
     129         * @return true, if an old entry was overwritten; false otherwise 
     130         */ 
    50131        public boolean addData(String key, Object data) { 
    51132                Object previousEntry = dataObjects.put(key, data); 
    52                 return previousEntry!=null; 
     133                return previousEntry != null; 
    53134        } 
    54          
     135 
     136        /** 
     137         * <p> 
     138         * Removes data from the container. 
     139         * </p> 
     140         *  
     141         * @param key 
     142         *            key of the data to be removed 
     143         * @return true, if the object was removed; false if it was not present 
     144         */ 
    55145        public boolean removeData(String key) { 
    56146                Object previousEntry = dataObjects.remove(key); 
    57                 return previousEntry==null; 
     147                return previousEntry != null; 
    58148        } 
    59          
     149 
     150        /** 
     151         * <p> 
     152         * Returns the data associated with a key or {@code null} if no data is 
     153         * stored for the key. 
     154         * </p> 
     155         *  
     156         * @param key 
     157         *            key whose data is returned 
     158         * @return data associated with the key; {@code null} if no data is 
     159         *         available 
     160         */ 
    60161        public Object getData(String key) { 
    61162                return dataObjects.get(key); 
    62163        } 
    63          
     164 
     165        /** 
     166         * <p> 
     167         * Resets the data container, i.e., deletes all its contents. 
     168         * </p> 
     169         */ 
    64170        public void reset() { 
    65171                dataObjects = new HashMap<String, Object>(); 
  • 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]); 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/web/commands/CMDloadSessionsFromClickstream.java

    r111 r171  
    1313import de.ugoe.cs.util.console.Console; 
    1414 
     15/** 
     16 * <p> 
     17 * Command to load sessions from a web log. 
     18 * </p> 
     19 * @author Steffen Herbold 
     20 * @version 1.0 
     21 */ 
    1522public class CMDloadSessionsFromClickstream implements Command { 
    1623 
     24        /* (non-Javadoc) 
     25         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     26         */ 
    1727        @Override 
    1828        public void run(List<Object> parameters) { 
     
    5262        } 
    5363         
     64        /* (non-Javadoc) 
     65         * @see de.ugoe.cs.util.console.Command#help() 
     66         */ 
    5467        @Override 
    5568        public void help() { 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/web/data/WebEvent.java

    r111 r171  
    55import de.ugoe.cs.eventbench.data.ReplayableEvent; 
    66 
     7/** 
     8 * <p> 
     9 * This class defines web events (of PHP-based web applications). 
     10 * </p> 
     11 *  
     12 * @author Steffen Herbold 
     13 * @version 1.0 
     14 *  
     15 */ 
    716public class WebEvent extends ReplayableEvent<WebRequest> { 
    817 
     
    1322         */ 
    1423        private static final long serialVersionUID = 1L; 
    15          
     24 
     25        /** 
     26         * Timestamp of the event. 
     27         */ 
    1628        private final long timestamp; 
    17                  
    18          
    19         private final static String makeType(String path, List<String> postVars, List<String> getVars) { 
     29 
     30        /** 
     31         * <p> 
     32         * Helper method that generates the type of the event based on the of the 
     33         * URI, the POST variables, and the GET variables. 
     34         * </p> 
     35         *  
     36         * @param path 
     37         *            path of the URI of the event 
     38         * @param postVars 
     39         *            POST variables send with the event 
     40         * @param getVars 
     41         *            GET variables send with the event 
     42         * @return type of the event 
     43         */ 
     44        private final static String makeType(String path, List<String> postVars, 
     45                        List<String> getVars) { 
    2046                String type = path; 
    21                 if( getVars!=null && !getVars.isEmpty() ) { 
    22                         type += "+GET"+getVars.toString().replace(" ", ""); 
     47                if (getVars != null && !getVars.isEmpty()) { 
     48                        type += "+GET" + getVars.toString().replace(" ", ""); 
    2349                } 
    24                 if( postVars!=null && !postVars.isEmpty() ) { 
    25                         type += "+POST"+postVars.toString().replace(" ", ""); 
     50                if (postVars != null && !postVars.isEmpty()) { 
     51                        type += "+POST" + postVars.toString().replace(" ", ""); 
    2652                } 
    2753                return type; 
    2854        } 
    29          
    30         public WebEvent(String path, long timestamp, List<String> postVars, List<String> getVars) { 
     55 
     56        /** 
     57         * <p> 
     58         * Constructor. Creates a new WebEvent. 
     59         * </p> 
     60         *  
     61         * @param path 
     62         *            path of the URI 
     63         * @param timestamp 
     64         *            timestamp of when the event took place 
     65         * @param postVars 
     66         *            POST variables send with the event 
     67         * @param getVars 
     68         *            GET variables send with the event 
     69         */ 
     70        public WebEvent(String path, long timestamp, List<String> postVars, 
     71                        List<String> getVars) { 
    3172                super(makeType(path, postVars, getVars)); 
    3273                this.timestamp = timestamp; 
    3374                addReplayEvent(new WebRequest(path, postVars, getVars)); 
    3475        } 
    35          
     76 
     77        /** 
     78         * <p> 
     79         * Returns the timestamp of the event. 
     80         * </p> 
     81         *  
     82         * @return timestamp of th event 
     83         */ 
    3684        public long getTimestamp() { 
    3785                return timestamp; 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/web/data/WebRequest.java

    r111 r171  
    66import de.ugoe.cs.eventbench.data.IReplayable; 
    77 
     8/** 
     9 * <p> 
     10 * Contains all information related to a web request, i.e., the path, the POST 
     11 * variables and the GET variables. 
     12 * </p> 
     13 *  
     14 * @author Steffen Herbold 
     15 * @version 1.0 
     16 */ 
    817public class WebRequest implements IReplayable { 
    918 
    1019        /** 
     20         * <p> 
    1121         * Id for object serialization. 
     22         * </p> 
    1223         */ 
    1324        private static final long serialVersionUID = 1L; 
    1425 
     26        /** 
     27         * <p> 
     28         * POST variables of the web request. 
     29         * </p> 
     30         */ 
    1531        List<String> postVars; 
     32 
     33        /** 
     34         * <p> 
     35         * GET variables of the web request. 
     36         * </p> 
     37         */ 
    1638        List<String> getVars; 
    17          
     39 
     40        /** 
     41         * <p> 
     42         * URI of the web request. 
     43         * </p> 
     44         */ 
    1845        String targetUri; 
    19          
     46 
     47        /** 
     48         * <p> 
     49         * Constructor. Creates a new WebRequest. 
     50         * </p> 
     51         *  
     52         * @param uri 
     53         *            URI of the request 
     54         * @param postVars 
     55         *            POST variables of the request 
     56         * @param getVars 
     57         *            GET variables of the request 
     58         */ 
    2059        public WebRequest(String uri, List<String> postVars, List<String> getVars) { 
    2160                targetUri = uri; 
     
    2362                this.getVars = new ArrayList<String>(getVars); 
    2463        } 
    25          
     64 
     65        /* 
     66         * (non-Javadoc) 
     67         *  
     68         * @see de.ugoe.cs.eventbench.data.IReplayable#getReplay() 
     69         */ 
    2670        @Override 
    2771        public String getReplay() { 
     
    3074        } 
    3175 
     76        /* 
     77         * (non-Javadoc) 
     78         *  
     79         * @see de.ugoe.cs.eventbench.data.IReplayable#getTarget() 
     80         */ 
    3281        @Override 
    3382        public String getTarget() { 
     
    3584                return null; 
    3685        } 
    37          
     86 
     87        /** 
     88         * <p> 
     89         * Two {@link WebRequest}s are equal, if their {@link #targetUri}, 
     90         * {@link #postVars}, and {@link #getVars} are equal. 
     91         * </p> 
     92         *  
     93         * @see java.lang.Object#equals(java.lang.Object) 
     94         */ 
    3895        @Override 
    3996        public boolean equals(Object other) { 
    40                 if( this==other ) { 
     97                if (this == other) { 
    4198                        return true; 
    4299                } 
    43                 if( other instanceof WebRequest ) { 
    44                         return targetUri.equals(((WebRequest) other).targetUri) && postVars.equals(((WebRequest) other).postVars); 
     100                if (other instanceof WebRequest) { 
     101                        return targetUri.equals(((WebRequest) other).targetUri) 
     102                                        && postVars.equals(((WebRequest) other).postVars) 
     103                                        && getVars.equals(((WebRequest) other).getVars); 
    45104                } 
    46105                return false; 
    47106        } 
    48          
     107 
     108        /* 
     109         * (non-Javadoc) 
     110         *  
     111         * @see java.lang.Object#hashCode() 
     112         */ 
    49113        @Override 
    50114        public int hashCode() { 
     
    54118                hash = multiplier * hash + targetUri.hashCode(); 
    55119                hash = multiplier * hash + postVars.hashCode(); 
     120                hash = multiplier * hash + getVars.hashCode(); 
    56121 
    57122                return hash; 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/windows/EventGenerator.java

    r141 r171  
    1717import org.jdom.input.SAXBuilder; 
    1818 
     19import de.ugoe.cs.eventbench.data.Event; 
    1920import de.ugoe.cs.eventbench.windows.data.WindowTree; 
    2021import de.ugoe.cs.eventbench.windows.data.WindowTreeNode; 
     
    2425/** 
    2526 * <p> 
    26  * Translates sequences of windows messages into events that can be used by the 
    27  * Logalyzer core libraries for usage analysis. 
     27 * Translates sequences of windows messages into {@link WindowsEvent}s that can 
     28 * be used by the EventBench core libraries. 
    2829 * </p> 
    2930 *  
    3031 * @author Steffen Herbold 
    31  *  
     32 * @version 1.0 
    3233 */ 
    3334public class EventGenerator { 
     
    214215        } 
    215216 
    216         private boolean createSequenceLParam( 
    217                         List<WindowsMessage> generatedMessageSeq, boolean msgsGenerated, 
    218                         int constMsgType, Element termElement) 
    219                         throws NoSuchElementException { 
    220                 Iterator<WindowsMessage> seqIterator = generatedMessageSeq.iterator(); 
    221                 if (termElement.getName().equals("seqValue")) { 
    222                         String obj = termElement.getAttributeValue("seqObj"); 
    223                         List<WindowsMessage> seqVar = getStoredSeqVariable(obj); 
    224                         if (msgsGenerated && seqVar.size() != generatedMessageSeq.size()) { 
    225                                 throw new InvalidParameterException( 
    226                                                 "Failure generating replay sequence for rule " 
    227                                                                 + currentRuleName 
    228                                                                 + ": One or more of the sequence variables used to generate a sequence have different lenghts."); 
    229                         } 
    230                         for (WindowsMessage msg : seqVar) { 
    231                                 WindowsMessage currentSeqMsg = getCurrentSeqMsg( 
    232                                                 generatedMessageSeq, msgsGenerated, constMsgType, 
    233                                                 seqIterator); 
    234                                 String paramValueStr = msg.getParameter(termElement 
    235                                                 .getAttributeValue("param")); 
    236                                 int paramValue = 0; 
    237                                 try { 
    238                                         paramValue = Integer.parseInt(paramValueStr); 
    239                                         currentSeqMsg.setLPARAM(paramValue); 
    240                                 } catch (NumberFormatException e) { 
    241                                         currentSeqMsg.setLPARAMasWindowDesc(paramValueStr); 
    242                                 } 
    243                         } 
    244                         if (seqIterator.hasNext()) { 
    245                                 // the first seq-var has a different number of elements than the 
    246                                 // current one 
    247                                 throw new NoSuchElementException(); 
    248                         } 
    249                         msgsGenerated = true; 
    250                 } else { // const value 
    251                         int paramValue = Integer.parseInt(getTermValue(null, termElement)); 
    252                         while (seqIterator.hasNext()) { 
    253                                 seqIterator.next().setLPARAM(paramValue); 
    254                         } 
    255                 } 
    256                 return msgsGenerated; 
    257         } 
    258  
    259         private boolean createSequenceTarget( 
    260                         List<WindowsMessage> generatedMessageSeq, boolean msgsGenerated, 
    261                         int constMsgType, Element termElement) 
    262                         throws NoSuchElementException { 
    263                 Iterator<WindowsMessage> seqIterator = generatedMessageSeq.iterator(); 
    264                 if (termElement.getName().equals("seqValue")) { 
    265                         String obj = termElement.getAttributeValue("seqObj"); 
    266                         List<WindowsMessage> seqVar = getStoredSeqVariable(obj); 
    267                         if (msgsGenerated && seqVar.size() != generatedMessageSeq.size()) { 
    268                                 throw new InvalidParameterException( 
    269                                                 "Failure generating replay sequence for rule " 
    270                                                                 + currentRuleName 
    271                                                                 + ": One or more of the sequence variables used to generate a sequence have different lenghts."); 
    272                         } 
    273                         for (WindowsMessage msg : seqVar) { 
    274                                 WindowsMessage currentSeqMsg = getCurrentSeqMsg( 
    275                                                 generatedMessageSeq, msgsGenerated, constMsgType, 
    276                                                 seqIterator); 
    277                                 String targetString = msg.getParameter(termElement 
    278                                                 .getAttributeValue("param")); 
    279                                 currentSeqMsg.setXmlWindowDescription(targetString); 
    280                         } 
    281                         msgsGenerated = true; 
    282                 } else { // const value 
    283                         throw new AssertionError("target must be a sequence variable!"); 
     217        // //////////////////////////////////////////////////////////// 
     218        // Helper functions for matching of events, i.e., msg-nodes // 
     219        // //////////////////////////////////////////////////////////// 
     220 
     221        /** 
     222         * <p> 
     223         * Handles msg-nodes where multiple is not true, i.e., not a sequences. 
     224         * </p> 
     225         *  
     226         * @param messageElement 
     227         *            {@link Element} representing the msg-node 
     228         * @return true, if a match is found; false otherwise 
     229         */ 
     230        private boolean matchSingleMessage(Element messageElement) { 
     231                boolean isMatch = false; 
     232                WindowsMessage currentMessage = null; 
     233 
     234                int type = Integer.parseInt(messageElement.getAttributeValue("type")); 
     235 
     236                while (!isMatch && sequenceIterator.hasNext()) { 
    284237                        /* 
    285                          * If target would not be a variable, the message-elements could not 
    286                          * yet be created and the whole sequence might be broken. If this is 
    287                          * to be changed, createSequenceLParam and createSequenceWParam need 
    288                          * to be addepted, too. 
     238                         * traverses the messages from the current position forward till a 
     239                         * message with the correct type is found 
    289240                         */ 
    290                 } 
    291                 return msgsGenerated; 
    292         } 
    293  
    294         private boolean createSequenceWParam( 
    295                         List<WindowsMessage> generatedMessageSeq, boolean msgsGenerated, 
    296                         int constMsgType, Element termElement) 
    297                         throws NoSuchElementException { 
    298                 Iterator<WindowsMessage> seqIterator = generatedMessageSeq.iterator(); 
    299                 if (termElement.getName().equals("seqValue")) { 
    300                         String obj = termElement.getAttributeValue("seqObj"); 
    301                         List<WindowsMessage> seqVar = getStoredSeqVariable(obj); 
    302                         if (msgsGenerated && seqVar.size() != generatedMessageSeq.size()) { 
    303                                 throw new InvalidParameterException( 
    304                                                 "Failure generating replay sequence for rule " 
    305                                                                 + currentRuleName 
    306                                                                 + ": One or more of the sequence variables used to generate a sequence have different lenghts."); 
    307                         } 
    308                         for (WindowsMessage msg : seqVar) { 
    309                                 WindowsMessage currentSeqMsg = getCurrentSeqMsg( 
    310                                                 generatedMessageSeq, msgsGenerated, constMsgType, 
    311                                                 seqIterator); 
    312                                 String paramValueStr = msg.getParameter(termElement 
    313                                                 .getAttributeValue("param")); 
    314                                 int paramValue = 0; 
    315                                 try { 
    316                                         paramValue = Integer.parseInt(paramValueStr); 
    317                                         currentSeqMsg.setWPARAM(paramValue); 
    318                                 } catch (NumberFormatException e) { 
    319                                         currentSeqMsg.setWPARAMasWindowDesc(paramValueStr); 
    320                                 } 
    321                         } 
    322                         if (seqIterator.hasNext()) { 
    323                                 // the first seq-var has a different number of elements than the 
    324                                 // current one 
    325                                 throw new NoSuchElementException(); 
    326                         } 
    327                         msgsGenerated = true; 
    328                 } else { // const value 
    329                         int paramValue = Integer.parseInt(getTermValue(null, termElement)); 
    330                         while (seqIterator.hasNext()) { 
    331                                 seqIterator.next().setWPARAM(paramValue); 
    332                         } 
    333                 } 
    334                 return msgsGenerated; 
    335         } 
    336  
     241                        currentMessage = sequenceIterator.next(); 
     242                        if (type == currentMessage.getType()) { 
     243                                // message with the correct type found 
     244                                // eval child nodes for further matching/storing 
     245                                isMatch = evalEqualRestrictions(currentMessage, messageElement); 
     246 
     247                                // in case the message is a match, eval storage children 
     248                                if (isMatch) { 
     249                                        handleStorage(messageElement, currentMessage); 
     250                                        currentToken.setTarget(currentMessage 
     251                                                        .getXmlWindowDescription()); 
     252                                        currentToken 
     253                                                        .setTargetShort(currentMessage.getParentNames()); 
     254                                } 
     255                        } 
     256                } 
     257 
     258                return isMatch; 
     259        } 
     260 
     261        /** 
     262         * <p> 
     263         * Handles msg-nodes where multiple is true, i.e., sequences. Requires 
     264         * knowledge about the next msg-node to determine the end of the sequence. 
     265         * </p> 
     266         *  
     267         * @param messageElement 
     268         *            {@link Element} representing the msg-node 
     269         * @param nextMessageElement 
     270         *            {@link Element} representing the next msg-node; {@code null} 
     271         *            if the current node is the last one 
     272         * @return true, if a sequence is matched; false otherwise 
     273         */ 
     274        private boolean matchMultipleMessages(Element messageElement, 
     275                        Element nextMessageElement) { 
     276                boolean isMatch = false; 
     277                boolean isCurrentMatch = false; 
     278                boolean nextMatchFound = false; 
     279                WindowsMessage currentMessage = null; 
     280                WindowsMessage nextMessage = null; 
     281 
     282                int type = Integer.parseInt(messageElement.getAttributeValue("type")); 
     283 
     284                int nextType = -1; 
     285                if (nextMessageElement != null) { 
     286                        nextType = Integer.parseInt(nextMessageElement 
     287                                        .getAttributeValue("type")); 
     288                } 
     289 
     290                while (!nextMatchFound && sequenceIterator.hasNext()) { 
     291                        currentMessage = sequenceIterator.next(); 
     292                        if (type == currentMessage.getType()) { 
     293                                isCurrentMatch = evalEqualRestrictions(currentMessage, 
     294                                                messageElement); 
     295                                isMatch = isMatch || isCurrentMatch; 
     296 
     297                                if (isCurrentMatch) { 
     298                                        handleStorage(messageElement, currentMessage); 
     299                                        currentToken.setTarget(currentMessage 
     300                                                        .getXmlWindowDescription()); 
     301                                        currentToken 
     302                                                        .setTargetShort(currentMessage.getParentNames()); 
     303                                } 
     304                        } 
     305                        if (nextMessageElement != null && isMatch) { 
     306                                // peek next message to check if the sequence ends and the next 
     307                                // match is found 
     308                                if (!sequenceIterator.hasNext()) { 
     309                                        return false; // sequence is over, but not all messages are 
     310                                                                        // found 
     311                                } 
     312                                nextMessage = sequenceIterator.next(); 
     313                                sequenceIterator.previous(); 
     314 
     315                                if (nextType == nextMessage.getType()) { 
     316                                        nextMatchFound = evalEqualRestrictions(nextMessage, 
     317                                                        nextMessageElement); 
     318                                } 
     319 
     320                        } 
     321                } 
     322 
     323                return isMatch; 
     324        } 
     325 
     326        /** 
     327         * <p> 
     328         * Handles equals-nodes. 
     329         * </p> 
     330         *  
     331         * @param currentMessage 
     332         *            {@link Element} representing the msg-node the equals-node 
     333         *            belongs to 
     334         * @param messageElement 
     335         *            {@link Element} representing the equals-node to be evaluated 
     336         * @return true, if constraint is fulfilled; false otherwise 
     337         */ 
    337338        @SuppressWarnings("unchecked") 
    338339        private boolean evalEqualRestrictions(WindowsMessage currentMessage, 
     
    354355                                "equalsSeq", rulesNamespace)) { 
    355356                        List<Element> termElements = childElement.getChildren(); 
    356                         List<String> values1 = getTermValueSeq(currentMessage, 
    357                                         termElements.get(0)); 
    358                         List<String> values2 = getTermValueSeq(currentMessage, 
    359                                         termElements.get(0)); 
     357                        List<String> values1 = getTermValueSeq(termElements.get(0)); 
     358                        List<String> values2 = getTermValueSeq(termElements.get(0)); 
    360359                        if (values1 == null || values2 == null) { 
    361360                                isMatch = false; 
     
    367366        } 
    368367 
     368        /** 
     369         * <p> 
     370         * Handles store-nodes and storeSeq-nodes. 
     371         * </p> 
     372         *  
     373         * @param messageElement 
     374         *            {@link Element} representing the msg-node that is currently 
     375         *            being evaluated 
     376         * @param currentMessage 
     377         *            current message in the message sequence that is matched; this 
     378         *            is the message that is stored 
     379         */ 
     380        @SuppressWarnings("unchecked") 
     381        private void handleStorage(Element messageElement, 
     382                        WindowsMessage currentMessage) { 
     383                for (Element childElement : (List<Element>) messageElement.getChildren( 
     384                                "store", rulesNamespace)) { 
     385                        String identifier = childElement.getAttributeValue("var"); 
     386                        messageStorage.put(identifier, currentMessage); 
     387                        resolveHwnd(currentMessage, childElement); 
     388                } 
     389                for (Element childElement : (List<Element>) messageElement.getChildren( 
     390                                "storeSeq", rulesNamespace)) { 
     391                        String identifier = childElement.getAttributeValue("varSeq"); 
     392                        Object tmp = messageStorage.get(identifier); 
     393                        List<WindowsMessage> storedSequence; 
     394                        if (tmp == null || tmp instanceof WindowsMessage) { 
     395                                storedSequence = new LinkedList<WindowsMessage>(); 
     396                                storedSequence.add(currentMessage); 
     397                                messageStorage.put(identifier, storedSequence); 
     398                        } else if (tmp instanceof List<?>) { 
     399                                storedSequence = (List<WindowsMessage>) tmp; 
     400                                storedSequence.add(currentMessage); 
     401                                messageStorage.put(identifier, storedSequence); 
     402                        } 
     403                        resolveHwnd(currentMessage, childElement); 
     404                } 
     405        } 
     406 
     407        /** 
     408         * <p> 
     409         * Resolves a parameter that contains a HWND of a message to the target 
     410         * string of the HWND and stores it. 
     411         * </p> 
     412         *  
     413         * @param currentMessage 
     414         *            message whose HWND is resolved 
     415         * @param childElement 
     416         *            child element of the store node that represents the resolve 
     417         */ 
     418        @SuppressWarnings("unchecked") 
     419        private void resolveHwnd(WindowsMessage currentMessage, Element childElement) { 
     420                List<Element> resolveElements = childElement.getChildren("resolveHwnd", 
     421                                rulesNamespace); 
     422                for (Element resolveElement : resolveElements) { 
     423                        String param = resolveElement.getAttributeValue("param"); 
     424                        String storeParam = resolveElement.getAttributeValue("storeParam"); 
     425                        int paramHwnd = Integer 
     426                                        .parseInt(currentMessage.getParameter(param)); 
     427                        WindowTreeNode node = WindowTree.getInstance().find(paramHwnd); 
     428                        if (node != null) { 
     429                                currentMessage.addParameter(storeParam, 
     430                                                node.xmlRepresentation()); 
     431                        } 
     432                } 
     433        } 
     434 
     435        // ///////////////////////////////////////////////////// 
     436        // Helper functions for generating the replay, i.e., 
     437        // parsing of genMsg und genMsgSeq-nodes 
     438        // ///////////////////////////////////////////////////// 
     439 
     440        /** 
     441         * <p> 
     442         * Handles genMsg-nodes and adds the replay to the {@link Event} that is 
     443         * generated. 
     444         * </p> 
     445         *  
     446         * @param genMsgElement 
     447         *            {@link Element} representing the genMsg-node 
     448         */ 
    369449        @SuppressWarnings("unchecked") 
    370450        private void generateReplayMessage(Element genMsgElement) { 
     
    396476                                        String paramValueStr = getTermValue(null, termElement); 
    397477                                        long paramValue = 0; 
    398                                         Element loword = genMsgChild.getChild("LOWORD", rulesNamespace); 
    399                                         if( loword!=null ) { 
     478                                        Element loword = genMsgChild.getChild("LOWORD", 
     479                                                        rulesNamespace); 
     480                                        if (loword != null) { 
    400481                                                paramValue = loHiWord(genMsgChild); 
    401482                                                generatedMessage.setLPARAM(paramValue); 
     
    405486                                                        generatedMessage.setLPARAM(paramValue); 
    406487                                                } catch (NumberFormatException e) { 
    407                                                         generatedMessage.setLPARAMasWindowDesc(paramValueStr); 
     488                                                        generatedMessage 
     489                                                                        .setLPARAMasWindowDesc(paramValueStr); 
    408490                                                } 
    409491                                        } 
     
    411493                                        String paramValueStr = getTermValue(null, termElement); 
    412494                                        long paramValue = 0; 
    413                                         Element loword = genMsgChild.getChild("LOWORD", rulesNamespace); 
    414                                         if( loword!=null ) { 
     495                                        Element loword = genMsgChild.getChild("LOWORD", 
     496                                                        rulesNamespace); 
     497                                        if (loword != null) { 
    415498                                                paramValue = loHiWord(genMsgChild); 
    416499                                                generatedMessage.setWPARAM(paramValue); 
     
    420503                                                        generatedMessage.setWPARAM(paramValue); 
    421504                                                } catch (NumberFormatException e) { 
    422                                                         generatedMessage.setWPARAMasWindowDesc(paramValueStr); 
     505                                                        generatedMessage 
     506                                                                        .setWPARAMasWindowDesc(paramValueStr); 
    423507                                                } 
    424508                                        } 
     
    436520        } 
    437521 
     522        /** 
     523         * Handles genMsgSeq-nodes and adds the replay to the {@link Event} that is 
     524         * generated.</p> 
     525         *  
     526         * @param genMsgElement 
     527         *            {@link Element} representing the genMsgSeq-node. 
     528         */ 
    438529        @SuppressWarnings("unchecked") 
    439530        private void generateReplaySequence(Element genMsgElement) { 
     
    479570        } 
    480571 
     572        /** 
     573         * <p> 
     574         * Creates the targets for replay sequences generated with genMsgSeq-nodes. 
     575         * </p> 
     576         *  
     577         * @param generatedMessageSeq 
     578         *            list of the messages that is being generated 
     579         * @param msgsGenerated 
     580         *            boolean stating if the list of messages is already generated 
     581         *            or if the generation has to be handles by this method 
     582         * @param constMsgType 
     583         *            a constant message type that is used for message generation, 
     584         *            in case the list of message is generated by this method 
     585         * @param termElement 
     586         *            {@link Element} representing the term-node describing the 
     587         *            target 
     588         * @return true, if the list of message is generated after calling this 
     589         *         method; false otherwise 
     590         * @throws NoSuchElementException 
     591         *             thrown if the seqVar referred to in the termElement contains 
     592         *             a different number of messages than is contained in 
     593         *             messageSeq 
     594         */ 
     595        private boolean createSequenceTarget( 
     596                        List<WindowsMessage> generatedMessageSeq, boolean msgsGenerated, 
     597                        int constMsgType, Element termElement) 
     598                        throws NoSuchElementException { 
     599                Iterator<WindowsMessage> seqIterator = generatedMessageSeq.iterator(); 
     600                if (termElement.getName().equals("seqValue")) { 
     601                        String obj = termElement.getAttributeValue("seqObj"); 
     602                        List<WindowsMessage> seqVar = getStoredSeqVariable(obj); 
     603                        if (msgsGenerated && seqVar.size() != generatedMessageSeq.size()) { 
     604                                throw new InvalidParameterException( 
     605                                                "Failure generating replay sequence for rule " 
     606                                                                + currentRuleName 
     607                                                                + ": One or more of the sequence variables used to generate a sequence have different lenghts."); 
     608                        } 
     609                        for (WindowsMessage msg : seqVar) { 
     610                                WindowsMessage currentSeqMsg = getCurrentSeqMsg( 
     611                                                generatedMessageSeq, msgsGenerated, constMsgType, 
     612                                                seqIterator); 
     613                                String targetString = msg.getParameter(termElement 
     614                                                .getAttributeValue("param")); 
     615                                currentSeqMsg.setXmlWindowDescription(targetString); 
     616                        } 
     617                        msgsGenerated = true; 
     618                } else { // const value 
     619                        throw new AssertionError("target must be a sequence variable!"); 
     620                        /* 
     621                         * If target would not be a variable, the message-elements could not 
     622                         * yet be created and the whole sequence might be broken. If this is 
     623                         * to be changed, createSequenceLParam and createSequenceWParam need 
     624                         * to be addepted, too. 
     625                         */ 
     626                } 
     627                return msgsGenerated; 
     628        } 
     629 
     630        /** 
     631         * <p> 
     632         * Creates the LPARAMs for replay sequences generated with genMsgSeq-nodes. 
     633         * </p> 
     634         *  
     635         * @param generatedMessageSeq 
     636         *            list of the messages that is being generated 
     637         * @param msgsGenerated 
     638         *            boolean stating if the list of messages is already generated 
     639         *            or if the generation has to be handles by this method 
     640         * @param constMsgType 
     641         *            a constant message type that is used for message generation, 
     642         *            in case the list of message is generated by this method 
     643         * @param termElement 
     644         *            {@link Element} representing the term-node describing the 
     645         *            LPARAM 
     646         * @return true, if the list of message is generated after calling this 
     647         *         method; false otherwise 
     648         * @throws NoSuchElementException 
     649         *             thrown if the seqVar referred to in the termElement contains 
     650         *             a different number of messages than is contained in 
     651         *             messageSeq 
     652         */ 
     653        private boolean createSequenceLParam( 
     654                        List<WindowsMessage> generatedMessageSeq, boolean msgsGenerated, 
     655                        int constMsgType, Element termElement) 
     656                        throws NoSuchElementException { 
     657                Iterator<WindowsMessage> seqIterator = generatedMessageSeq.iterator(); 
     658                if (termElement.getName().equals("seqValue")) { 
     659                        String obj = termElement.getAttributeValue("seqObj"); 
     660                        List<WindowsMessage> seqVar = getStoredSeqVariable(obj); 
     661                        if (msgsGenerated && seqVar.size() != generatedMessageSeq.size()) { 
     662                                throw new InvalidParameterException( 
     663                                                "Failure generating replay sequence for rule " 
     664                                                                + currentRuleName 
     665                                                                + ": One or more of the sequence variables used to generate a sequence have different lenghts."); 
     666                        } 
     667                        for (WindowsMessage msg : seqVar) { 
     668                                WindowsMessage currentSeqMsg = getCurrentSeqMsg( 
     669                                                generatedMessageSeq, msgsGenerated, constMsgType, 
     670                                                seqIterator); 
     671                                String paramValueStr = msg.getParameter(termElement 
     672                                                .getAttributeValue("param")); 
     673                                int paramValue = 0; 
     674                                try { 
     675                                        paramValue = Integer.parseInt(paramValueStr); 
     676                                        currentSeqMsg.setLPARAM(paramValue); 
     677                                } catch (NumberFormatException e) { 
     678                                        currentSeqMsg.setLPARAMasWindowDesc(paramValueStr); 
     679                                } 
     680                        } 
     681                        if (seqIterator.hasNext()) { 
     682                                // the first seq-var has a different number of elements than the 
     683                                // current one 
     684                                throw new NoSuchElementException(); 
     685                        } 
     686                        msgsGenerated = true; 
     687                } else { // const value 
     688                        int paramValue = Integer.parseInt(getTermValue(null, termElement)); 
     689                        while (seqIterator.hasNext()) { 
     690                                seqIterator.next().setLPARAM(paramValue); 
     691                        } 
     692                } 
     693                return msgsGenerated; 
     694        } 
     695 
     696        /** 
     697         * <p> 
     698         * Creates the WPARAMs for replay sequences generated with genMsgSeq-nodes. 
     699         * </p> 
     700         *  
     701         * @param generatedMessageSeq 
     702         *            list of the messages that is being generated 
     703         * @param msgsGenerated 
     704         *            boolean stating if the list of messages is already generated 
     705         *            or if the generation has to be handles by this method 
     706         * @param constMsgType 
     707         *            a constant message type that is used for message generation, 
     708         *            in case the list of message is generated by this method 
     709         * @param termElement 
     710         *            {@link Element} representing the term-node describing the 
     711         *            WPARAM 
     712         * @return true, if the list of message is generated after calling this 
     713         *         method; false otherwise 
     714         * @throws NoSuchElementException 
     715         *             thrown if the seqVar referred to in the termElement contains 
     716         *             a different number of messages than is contained in 
     717         *             messageSeq 
     718         */ 
     719        private boolean createSequenceWParam( 
     720                        List<WindowsMessage> generatedMessageSeq, boolean msgsGenerated, 
     721                        int constMsgType, Element termElement) 
     722                        throws NoSuchElementException { 
     723                Iterator<WindowsMessage> seqIterator = generatedMessageSeq.iterator(); 
     724                if (termElement.getName().equals("seqValue")) { 
     725                        String obj = termElement.getAttributeValue("seqObj"); 
     726                        List<WindowsMessage> seqVar = getStoredSeqVariable(obj); 
     727                        if (msgsGenerated && seqVar.size() != generatedMessageSeq.size()) { 
     728                                throw new InvalidParameterException( 
     729                                                "Failure generating replay sequence for rule " 
     730                                                                + currentRuleName 
     731                                                                + ": One or more of the sequence variables used to generate a sequence have different lenghts."); 
     732                        } 
     733                        for (WindowsMessage msg : seqVar) { 
     734                                WindowsMessage currentSeqMsg = getCurrentSeqMsg( 
     735                                                generatedMessageSeq, msgsGenerated, constMsgType, 
     736                                                seqIterator); 
     737                                String paramValueStr = msg.getParameter(termElement 
     738                                                .getAttributeValue("param")); 
     739                                int paramValue = 0; 
     740                                try { 
     741                                        paramValue = Integer.parseInt(paramValueStr); 
     742                                        currentSeqMsg.setWPARAM(paramValue); 
     743                                } catch (NumberFormatException e) { 
     744                                        currentSeqMsg.setWPARAMasWindowDesc(paramValueStr); 
     745                                } 
     746                        } 
     747                        if (seqIterator.hasNext()) { 
     748                                // the first seq-var has a different number of elements than the 
     749                                // current one 
     750                                throw new NoSuchElementException(); 
     751                        } 
     752                        msgsGenerated = true; 
     753                } else { // const value 
     754                        int paramValue = Integer.parseInt(getTermValue(null, termElement)); 
     755                        while (seqIterator.hasNext()) { 
     756                                seqIterator.next().setWPARAM(paramValue); 
     757                        } 
     758                } 
     759                return msgsGenerated; 
     760        } 
     761 
     762        /** 
     763         * <p> 
     764         * If a message sequence is already generated, i.e., msgsGenerated is true, 
     765         * the seqIterator is used to iterate through these messages and return the 
     766         * current one. If the message sequence is not yet generated, i.e., 
     767         * msgsGenerated is false, the message sequence is generated on the fly 
     768         * during each call of this message and the newly generated messages are 
     769         * returned. 
     770         * </p> 
     771         *  
     772         * @param generatedMessageSeq 
     773         *            message sequence 
     774         * @param msgsGenerated 
     775         *            indicates if generatedMessageSeq is already generated or has 
     776         *            to be generated on the fly by this method 
     777         * @param constMsgType 
     778         *            type of the message to be used for message generation 
     779         * @param seqIterator 
     780         *            iterates through an already generated message sequence; must 
     781         *            not be {@code null}, if msgsGenerated is true 
     782         * @return current message 
     783         */ 
    481784        private WindowsMessage getCurrentSeqMsg( 
    482785                        List<WindowsMessage> generatedMessageSeq, boolean msgsGenerated, 
     
    492795        } 
    493796 
     797        // //////////////////////////// 
     798        // General helper functions // 
     799        // //////////////////////////// 
     800 
     801        /** 
     802         * <p> 
     803         * Retrieves a message from the storage for, e.g., comparison or replay. 
     804         * "this" is used to refer to the current message. 
     805         * </p> 
     806         *  
     807         * @param currentMessage 
     808         *            current message during the parsing; passed to handle "this" 
     809         * @param obj 
     810         *            object identifier in the storage 
     811         * @return message retrieved from the storage 
     812         * @throws InvalidParameterException 
     813         *             thrown in case of invalid uses of "this" or if no message 
     814         *             with the identifier obj is found in the storage 
     815         */ 
    494816        private WindowsMessage getStoredMessageVariable( 
    495817                        WindowsMessage currentMessage, String obj) 
     
    518840        } 
    519841 
     842        /** 
     843         * <p> 
     844         * Retrieves a stored message sequence from the storage. 
     845         * </p> 
     846         *  
     847         * @param obj 
     848         *            object identifier in the storage 
     849         * @return message sequence retrieved from the storage 
     850         * @throws InvalidParameterException 
     851         *             thrown if no message sequences with the identifier obj is 
     852         *             found in the storage 
     853         */ 
    520854        @SuppressWarnings("unchecked") 
    521855        private List<WindowsMessage> getStoredSeqVariable(String obj) 
     
    533867        } 
    534868 
     869        /** 
     870         * <p> 
     871         * Handles term-nodes and returns the value of the described term. 
     872         * </p> 
     873         *  
     874         * @param currentMessage 
     875         *            current message during the parsing; required to resolve 
     876         *            references to "this" in a term 
     877         * @param termElement 
     878         *            {@link Element} representing the term node 
     879         * @return value of the term or {@code null} of the term node could not be 
     880         *         evaluated 
     881         */ 
    535882        private String getTermValue(WindowsMessage currentMessage, 
    536883                        Element termElement) { 
     
    560907                                        String target = varMessage.getXmlWindowDescription(); 
    561908                                        int index = target.lastIndexOf("<"); 
    562                                         if( index==0 ) { 
     909                                        if (index == 0) { 
    563910                                                Console.println("Trying to adress parent of top-level window! Replay probably invalid!"); 
    564911                                        } 
     
    583930        } 
    584931 
    585         private List<String> getTermValueSeq(WindowsMessage currentMessage, 
    586                         Element termElement) { 
     932        /** 
     933         * <p> 
     934         * Handles term-nodes contained by equalSeq nodes. 
     935         * </p> 
     936         *  
     937         * @param termElement 
     938         *            {@link Element} representing the term-node 
     939         * @return list of values of the term 
     940         */ 
     941        private List<String> getTermValueSeq(Element termElement) { 
    587942                List<String> values = new LinkedList<String>(); 
    588943                if (termElement.getName().equals("seqValue")) { 
     
    600955        } 
    601956 
    602         @SuppressWarnings("unchecked") 
    603         private void handleStorage(Element messageElement, 
    604                         WindowsMessage currentMessage) { 
    605                 for (Element childElement : (List<Element>) messageElement.getChildren( 
    606                                 "store", rulesNamespace)) { 
    607                         String identifier = childElement.getAttributeValue("var"); 
    608                         messageStorage.put(identifier, currentMessage); 
    609                         resolveHwnd(currentMessage, childElement); 
    610                 } 
    611                 for (Element childElement : (List<Element>) messageElement.getChildren( 
    612                                 "storeSeq", rulesNamespace)) { 
    613                         String identifier = childElement.getAttributeValue("varSeq"); 
    614                         Object tmp = messageStorage.get(identifier); 
    615                         List<WindowsMessage> storedSequence; 
    616                         if (tmp == null || tmp instanceof WindowsMessage) { 
    617                                 storedSequence = new LinkedList<WindowsMessage>(); 
    618                                 storedSequence.add(currentMessage); 
    619                                 messageStorage.put(identifier, storedSequence); 
    620                         } else if (tmp instanceof List<?>) { 
    621                                 storedSequence = (List<WindowsMessage>) tmp; 
    622                                 storedSequence.add(currentMessage); 
    623                                 messageStorage.put(identifier, storedSequence); 
    624                         } 
    625                         resolveHwnd(currentMessage, childElement); 
    626                 } 
    627         } 
    628  
    629         private boolean matchMultipleMessages(Element messageElement, 
    630                         Element nextMessageElement) { 
    631                 boolean isMatch = false; 
    632                 boolean isCurrentMatch = false; 
    633                 boolean nextMatchFound = false; 
    634                 WindowsMessage currentMessage = null; 
    635                 WindowsMessage nextMessage = null; 
    636  
    637                 int type = Integer.parseInt(messageElement.getAttributeValue("type")); 
    638  
    639                 int nextType = -1; 
    640                 if (nextMessageElement != null) { 
    641                         nextType = Integer.parseInt(nextMessageElement 
    642                                         .getAttributeValue("type")); 
    643                 } 
    644  
    645                 while (!nextMatchFound && sequenceIterator.hasNext()) { 
    646                         currentMessage = sequenceIterator.next(); 
    647                         if (type == currentMessage.getType()) { 
    648                                 isCurrentMatch = evalEqualRestrictions(currentMessage, 
    649                                                 messageElement); 
    650                                 isMatch = isMatch || isCurrentMatch; 
    651  
    652                                 if (isCurrentMatch) { 
    653                                         handleStorage(messageElement, currentMessage); 
    654                                         currentToken.setTarget(currentMessage 
    655                                                         .getXmlWindowDescription()); 
    656                                         currentToken 
    657                                                         .setTargetShort(currentMessage.getParentNames()); 
    658                                 } 
    659                         } 
    660                         if (nextMessageElement != null && isMatch) { 
    661                                 // peek next message to check if the sequence ends and the next 
    662                                 // match is found 
    663                                 if (!sequenceIterator.hasNext()) { 
    664                                         return false; // sequence is over, but not all messages are 
    665                                                                         // found 
    666                                 } 
    667                                 nextMessage = sequenceIterator.next(); 
    668                                 sequenceIterator.previous(); 
    669  
    670                                 if (nextType == nextMessage.getType()) { 
    671                                         nextMatchFound = evalEqualRestrictions(nextMessage, 
    672                                                         nextMessageElement); 
    673                                 } 
    674  
    675                         } 
    676                 } 
    677  
    678                 return isMatch; 
    679         } 
    680  
    681         private boolean matchSingleMessage(Element messageElement) { 
    682                 boolean isMatch = false; 
    683                 WindowsMessage currentMessage = null; 
    684  
    685                 int type = Integer.parseInt(messageElement.getAttributeValue("type")); 
    686  
    687                 while (!isMatch && sequenceIterator.hasNext()) { 
    688                         // traverses the messages from the current position forward till a 
    689                         // message with the correct type is found 
    690                         currentMessage = sequenceIterator.next(); 
    691                         if (type == currentMessage.getType()) { 
    692                                 // message with the correct type found 
    693                                 // eval child nodes for further matching/storing 
    694                                 isMatch = evalEqualRestrictions(currentMessage, messageElement); 
    695  
    696                                 // in case the message is a match, eval storage children 
    697                                 if (isMatch) { 
    698                                         handleStorage(messageElement, currentMessage); 
    699                                         currentToken.setTarget(currentMessage 
    700                                                         .getXmlWindowDescription()); 
    701                                         currentToken 
    702                                                         .setTargetShort(currentMessage.getParentNames()); 
    703                                 } 
    704                         } 
    705                 } 
    706  
    707                 return isMatch; 
    708         } 
    709  
    710         @SuppressWarnings("unchecked") 
    711         private void resolveHwnd(WindowsMessage currentMessage, Element childElement) { 
    712                 List<Element> resolveElements = childElement.getChildren("resolveHwnd", 
    713                                 rulesNamespace); 
    714                 for (Element resolveElement : resolveElements) { 
    715                         String param = resolveElement.getAttributeValue("param"); 
    716                         String storeParam = resolveElement.getAttributeValue("storeParam"); 
    717                         int paramHwnd = Integer 
    718                                         .parseInt(currentMessage.getParameter(param)); 
    719                         WindowTreeNode node = WindowTree.getInstance().find(paramHwnd); 
    720                         if (node != null) { 
    721                                 currentMessage.addParameter(storeParam, 
    722                                                 node.xmlRepresentation()); 
    723                         } 
    724                 } 
    725         } 
    726          
     957        /** 
     958         * <p> 
     959         * Handles LOWORD and HIWORD child nodes of LPARAM and WPARAM nodes. The 
     960         * returned value is the LPARAM/WPARAM value based on the LOWORD and HIWORD. 
     961         * </p> 
     962         *  
     963         * @param param 
     964         *            {@link Element} representing the LPARAM/WPARAM node 
     965         * @return value of the LPARAM/WPARAM 
     966         */ 
    727967        private long loHiWord(Element param) { 
    728968                Element loword = param.getChild("LOWORD", rulesNamespace); 
    729969                Element hiword = param.getChild("HIWORD", rulesNamespace); 
    730                 String lowordStr = getTermValue(null, (Element) loword.getChildren().get(0)); 
    731                 String hiwordStr = getTermValue(null, (Element) hiword.getChildren().get(0)); 
    732                 return MAKEPARAM(Short.parseShort(lowordStr), Short.parseShort(hiwordStr)); 
    733         } 
    734          
     970                String lowordStr = getTermValue(null, (Element) loword.getChildren() 
     971                                .get(0)); 
     972                String hiwordStr = getTermValue(null, (Element) hiword.getChildren() 
     973                                .get(0)); 
     974                return MAKEPARAM(Short.parseShort(lowordStr), 
     975                                Short.parseShort(hiwordStr)); 
     976        } 
     977 
     978        /** 
     979         * <p> 
     980         * Takes to short integers and combines them into the high and low order 
     981         * bits of an integer. 
     982         * </p> 
     983         *  
     984         * @param loword 
     985         *            low word 
     986         * @param hiword 
     987         *            high word 
     988         * @return combined integer 
     989         */ 
    735990        private static int MAKEPARAM(short loword, short hiword) { 
    736                 return loword| ((int) hiword) << Short.SIZE; 
     991                return loword | ((int) hiword) << Short.SIZE; 
    737992        } 
    738993 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/windows/HandlerCreate.java

    r156 r171  
    33import de.ugoe.cs.eventbench.windows.data.WindowTree; 
    44 
     5/** 
     6 * <p> 
     7 * Message handler for {@code WM_CREATE} messages. The handler maintains the 
     8 * {@link WindowTree}. 
     9 * </p> 
     10 *  
     11 * @author Steffen Herbold 
     12 * @version 1.0 
     13 */ 
    514public class HandlerCreate extends MessageHandler { 
    615 
     16        /** 
     17         * <p> 
     18         * Constructor. Creates a new HandlerCreate. 
     19         * </p> 
     20         */ 
    721        public HandlerCreate() { 
    822                super(); 
    923        } 
    1024 
     25        /** 
     26         * <p> 
     27         * Name of the created window. 
     28         * </p> 
     29         */ 
    1130        private String windowName; 
     31 
     32        /** 
     33         * <p> 
     34         * HWND of the created window. 
     35         * </p> 
     36         */ 
    1237        private int hwnd; 
     38 
     39        /** 
     40         * <p> 
     41         * HWND of the created window's parent. 
     42         * </p> 
     43         */ 
    1344        private int parentHwnd; 
     45 
     46        /** 
     47         * <p> 
     48         * Resource Id of the created window. 
     49         * </p> 
     50         */ 
    1451        private int resourceId; 
     52 
     53        /** 
     54         * <p> 
     55         * Window class of the created window. 
     56         * </p> 
     57         */ 
    1558        private String className; 
     59 
     60        /** 
     61         * <p> 
     62         * Modality of the created window. 
     63         * </p> 
     64         */ 
    1665        private boolean isModal; 
    17          
     66 
     67        /* 
     68         * (non-Javadoc) 
     69         *  
     70         * @see de.ugoe.cs.eventbench.windows.MessageHandler#onEndElement() 
     71         */ 
    1872        @Override 
    1973        public void onEndElement() { 
    20                 if( hwnd!=0 ) { 
    21                         WindowTree.getInstance().add(parentHwnd, hwnd, windowName, resourceId, className, isModal); 
     74                if (hwnd != 0) { 
     75                        WindowTree.getInstance().add(parentHwnd, hwnd, windowName, 
     76                                        resourceId, className, isModal); 
    2277                } 
    2378        } 
    2479 
     80        /* 
     81         * (non-Javadoc) 
     82         *  
     83         * @see 
     84         * de.ugoe.cs.eventbench.windows.MessageHandler#onParameter(java.lang.String 
     85         * , java.lang.String) 
     86         */ 
    2587        @Override 
    2688        public void onParameter(String name, String value) { 
    27                 if( name.equals("window.hwnd") ) { 
     89                if (name.equals("window.hwnd")) { 
    2890                        hwnd = Integer.parseInt(value); 
    29                 } 
    30                 else if( name.equals("window.name") ) { 
     91                } else if (name.equals("window.name")) { 
    3192                        windowName = value; 
    32                 } 
    33                 else if( name.equals("window.parent.hwnd") ) { 
     93                } else if (name.equals("window.parent.hwnd")) { 
    3494                        parentHwnd = Integer.parseInt(value); 
    35                 } 
    36                 else if( name.equals("window.resourceId") ) { 
     95                } else if (name.equals("window.resourceId")) { 
    3796                        resourceId = Integer.parseInt(value); 
    38                 } 
    39                 else if( name.equals("window.class") ) { 
    40                         if( value.startsWith("Afx:") ) { 
     97                } else if (name.equals("window.class")) { 
     98                        if (value.startsWith("Afx:")) { 
    4199                                className = "Afx:"; 
    42100                        } else { 
    43101                                className = value; 
    44102                        } 
    45                 } 
    46                 else if( name.equals("window.ismodal") ) { 
    47                         if( value.equals("true") || value.equals("1") ) { 
     103                } else if (name.equals("window.ismodal")) { 
     104                        if (value.equals("true") || value.equals("1")) { 
    48105                                isModal = true; 
    49106                        } 
     
    51108        } 
    52109 
     110        /* 
     111         * (non-Javadoc) 
     112         *  
     113         * @see de.ugoe.cs.eventbench.windows.MessageHandler#onStartElement() 
     114         */ 
    53115        @Override 
    54116        public void onStartElement() { 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/windows/HandlerDestroy.java

    r75 r171  
    33import de.ugoe.cs.eventbench.windows.data.WindowTree; 
    44 
     5/** 
     6 * <p> 
     7 * Handler for {@code WM_DESTROY} message. The handler maintains the 
     8 * {@link WindowTree}. 
     9 * </p> 
     10 *  
     11 * @author Steffen Herbold 
     12 * @version 1.0 
     13 */ 
    514public class HandlerDestroy extends MessageHandler { 
    615 
     16        /** 
     17         * <p> 
     18         * Constructor. Creates a new HandlerDestroy. 
     19         * </p> 
     20         */ 
    721        public HandlerDestroy() { 
    822                super(); 
    923        } 
    1024 
     25        /** 
     26         * <p> 
     27         * HWND of the window that is destroyed. 
     28         * </p> 
     29         */ 
    1130        private int hwnd; 
    12          
     31 
     32        /* 
     33         * (non-Javadoc) 
     34         *  
     35         * @see de.ugoe.cs.eventbench.windows.MessageHandler#onEndElement() 
     36         */ 
    1337        @Override 
    1438        public void onEndElement() { 
    15                 if( hwnd!=0 ) { 
     39                if (hwnd != 0) { 
    1640                        WindowTree.getInstance().remove(hwnd); 
    1741                } 
    1842        } 
    1943 
     44        /* 
     45         * (non-Javadoc) 
     46         *  
     47         * @see 
     48         * de.ugoe.cs.eventbench.windows.MessageHandler#onParameter(java.lang.String 
     49         * , java.lang.String) 
     50         */ 
    2051        @Override 
    2152        public void onParameter(String name, String value) { 
    22                 if( name.equals("window.hwnd") ) { 
     53                if (name.equals("window.hwnd")) { 
    2354                        hwnd = Integer.parseInt(value); 
    2455                } 
    2556        } 
    2657 
     58        /* 
     59         * (non-Javadoc) 
     60         *  
     61         * @see de.ugoe.cs.eventbench.windows.MessageHandler#onStartElement() 
     62         */ 
    2763        @Override 
    2864        public void onStartElement() { 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/windows/HandlerSetText.java

    r75 r171  
    44import de.ugoe.cs.eventbench.windows.data.WindowTreeNode; 
    55 
     6/** 
     7 * <p> 
     8 * Handles {@code WM_SETTEXT} messages. Handler maintains the {@link WindowTree}. 
     9 * </p> 
     10 *  
     11 * @author Steffen Herbold 
     12 * @version 1.0 
     13 */ 
    614public class HandlerSetText extends MessageHandler { 
    715 
     16        /** 
     17         * <p> 
     18         * Constructor. Creates a new HanderSetText. 
     19         * </p> 
     20         */ 
    821        public HandlerSetText() { 
    922                super(); 
    1023        } 
    1124 
     25        /** 
     26         * <p> 
     27         * New name of the window. 
     28         * </p> 
     29         */ 
    1230        private String windowName; 
     31 
     32        /** 
     33         * <p> 
     34         * HWND of the window. 
     35         * </p> 
     36         */ 
    1337        private int hwnd; 
    1438 
     39        /* 
     40         * (non-Javadoc) 
     41         *  
     42         * @see de.ugoe.cs.eventbench.windows.MessageHandler#onEndElement() 
     43         */ 
    1544        @Override 
    1645        public void onEndElement() { 
     
    2150        } 
    2251 
     52        /* 
     53         * (non-Javadoc) 
     54         *  
     55         * @see 
     56         * de.ugoe.cs.eventbench.windows.MessageHandler#onParameter(java.lang.String 
     57         * , java.lang.String) 
     58         */ 
    2359        @Override 
    2460        public void onParameter(String name, String value) { 
     
    3066        } 
    3167 
     68        /* 
     69         * (non-Javadoc) 
     70         *  
     71         * @see de.ugoe.cs.eventbench.windows.MessageHandler#onStartElement() 
     72         */ 
    3273        @Override 
    3374        public void onStartElement() { 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/windows/LogParser.java

    r77 r171  
    2828import de.ugoe.cs.util.console.Console; 
    2929 
     30/** 
     31 * <p> 
     32 * This class provides functionality to parse XML log files generated by the 
     33 * MFCUsageMonitor of EventBench. The result of parsing a file is a collection 
     34 * of event sequences. It uses the {@link SequenceSplitter} and the 
     35 * {@link EventGenerator} as well as custom defined {@link MessageHandler} for 
     36 * the parsing. 
     37 * </p> 
     38 *  
     39 * @author Steffen Herbold 
     40 * @version 1.0 
     41 */ 
    3042public class LogParser extends DefaultHandler { 
    31          
     43 
     44        /** 
     45         * <p> 
     46         * If a custom message handler is used, this field contains its handle. 
     47         * Otherwise this field is {@code null}. 
     48         * </p> 
     49         */ 
    3250        private MessageHandler currentHandler; 
    33          
     51 
     52        /** 
     53         * <p> 
     54         * Handle to the message that is currently parsed. 
     55         * </p> 
     56         */ 
    3457        private WindowsMessage currentMessage; 
    35          
     58 
     59        /** 
     60         * <p> 
     61         * {@link SequenceSplitter} instance used by the {@link LogParser}. 
     62         * </p> 
     63         */ 
    3664        private SequenceSplitter sequenceSplitter; 
    37          
     65 
     66        /** 
     67         * <p> 
     68         * Collection of event sequences that is contained in the log file, which is 
     69         * parsed. 
     70         * </p> 
     71         */ 
    3872        private List<List<WindowsEvent>> sequences; 
    39          
     73 
     74        /** 
     75         * <p> 
     76         * Debugging variable that allows the analysis which message type occurs how 
     77         * often in the log file. Can be used to enhance the message filter. 
     78         * </p> 
     79         */ 
    4080        private SortedMap<Integer, Integer> typeCounter; 
    41          
     81 
     82        /** 
     83         * <p> 
     84         * Debugging variable that enables the counting of the occurrences of each 
     85         * message. Used in combination with {@link #typeCounter}. 
     86         * </p> 
     87         */ 
    4288        private boolean countMessageOccurences; 
    43          
     89 
     90        /** 
     91         * <p> 
     92         * Constructor. Creates a new LogParser that does not count message 
     93         * occurrences. 
     94         * </p> 
     95         */ 
    4496        public LogParser() { 
    4597                this(false); 
    4698        } 
    47          
     99 
     100        /** 
     101         * <p> 
     102         * Constructor. Creates a new LogParser. 
     103         * </p> 
     104         *  
     105         * @param countMessageOccurences 
     106         *            if true, the occurrences of each message type in the log is 
     107         *            counted. 
     108         */ 
    48109        public LogParser(boolean countMessageOccurences) { 
    49110                sequenceSplitter = new SequenceSplitter(); 
     
    51112                currentHandler = null; 
    52113                this.countMessageOccurences = countMessageOccurences; 
    53                 if( countMessageOccurences) { 
     114                if (countMessageOccurences) { 
    54115                        typeCounter = new TreeMap<Integer, Integer>(); 
    55116                } 
    56                  
    57         } 
    58          
     117 
     118        } 
     119 
     120        /** 
     121         * <p> 
     122         * Returns the collection of event sequences that is obtained from parsing 
     123         * log files. 
     124         * </p> 
     125         *  
     126         * @return collection of event sequences 
     127         */ 
    59128        public List<List<WindowsEvent>> getSequences() { 
    60129                return sequences; 
    61130        } 
    62          
     131 
     132        /* 
     133         * (non-Javadoc) 
     134         *  
     135         * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, 
     136         * java.lang.String, java.lang.String, org.xml.sax.Attributes) 
     137         */ 
    63138        @Override 
    64         public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { 
    65                 if( qName.equals("session") ) { 
     139        public void startElement(String uri, String localName, String qName, 
     140                        Attributes atts) throws SAXException { 
     141                if (qName.equals("session")) { 
    66142                        Console.traceln("start of session"); 
    67143                        sequenceSplitter = new SequenceSplitter(); 
    68                 } 
    69                 else if( qName.equals("msg") ) { 
     144                } else if (qName.equals("msg")) { 
    70145                        String msgType = atts.getValue("type"); 
    71146                        int msgInt = -1; 
    72147                        try { 
    73148                                msgInt = Integer.parseInt(msgType); 
    74                                  
    75                                 if( countMessageOccurences ) { 
     149 
     150                                if (countMessageOccurences) { 
    76151                                        Integer currentCount = typeCounter.get(msgInt); 
    77                                         if( currentCount==null ) { 
     152                                        if (currentCount == null) { 
    78153                                                typeCounter.put(msgInt, 1); 
    79154                                        } else { 
    80                                                 typeCounter.put(msgInt, currentCount+1); 
     155                                                typeCounter.put(msgInt, currentCount + 1); 
    81156                                        } 
    82157                                } 
    83                                  
    84                                 if( msgInt==MessageDefs.WM_CREATE ) { 
     158 
     159                                if (msgInt == MessageDefs.WM_CREATE) { 
    85160                                        currentHandler = new HandlerCreate(); 
    86161                                        currentHandler.onStartElement(); 
    87                                 } 
    88                                 else if( msgInt==MessageDefs.WM_DESTROY ) { 
     162                                } else if (msgInt == MessageDefs.WM_DESTROY) { 
    89163                                        currentHandler = new HandlerDestroy(); 
    90164                                        currentHandler.onStartElement(); 
    91                                 } 
    92                                 else if( msgInt==MessageDefs.WM_SETTEXT ) { 
     165                                } else if (msgInt == MessageDefs.WM_SETTEXT) { 
    93166                                        currentHandler = new HandlerSetText(); 
    94167                                        currentHandler.onStartElement(); 
     
    96169                                        currentMessage = new WindowsMessage(msgInt); 
    97170                                } 
    98                         } catch(NumberFormatException e) { 
     171                        } catch (NumberFormatException e) { 
    99172                                Console.printerrln("Invalid message type: type not a number"); 
    100173                                e.printStackTrace(); 
    101174                        } 
    102                 } 
    103                 else if( qName.equals("param") ) { 
    104                         if( currentHandler!=null ) { 
    105                                 currentHandler.onParameter(atts.getValue("name"), atts.getValue("value")); 
     175                } else if (qName.equals("param")) { 
     176                        if (currentHandler != null) { 
     177                                currentHandler.onParameter(atts.getValue("name"), 
     178                                                atts.getValue("value")); 
    106179                        } else { 
    107                                 currentMessage.addParameter(atts.getValue("name"), atts.getValue("value")); 
    108                         } 
    109                 } 
    110         } 
    111          
     180                                currentMessage.addParameter(atts.getValue("name"), 
     181                                                atts.getValue("value")); 
     182                        } 
     183                } 
     184        } 
     185 
     186        /* 
     187         * (non-Javadoc) 
     188         *  
     189         * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, 
     190         * java.lang.String, java.lang.String) 
     191         */ 
    112192        @Override 
    113         public void endElement(String uri, String localName, String qName) throws SAXException { 
    114                 if( qName.equals("msg") ) { 
    115                         if( currentHandler!=null ) { 
     193        public void endElement(String uri, String localName, String qName) 
     194                        throws SAXException { 
     195                if (qName.equals("msg")) { 
     196                        if (currentHandler != null) { 
    116197                                currentHandler.onEndElement(); 
    117198                                currentHandler = null; 
     
    121202                                        sequenceSplitter.addMessage(currentMessage); 
    122203                                } catch (InvalidParameterException e) { 
    123                                         Console.traceln(e.getMessage() + " WindowsMessage " + currentMessage + " ignored."); 
    124                                 }                                
    125                         } 
    126                 } 
    127                 else if(qName.equals("session")) { 
     204                                        Console.traceln(e.getMessage() + " WindowsMessage " 
     205                                                        + currentMessage + " ignored."); 
     206                                } 
     207                        } 
     208                } else if (qName.equals("session")) { 
    128209                        sequenceSplitter.endSession(); 
    129210                        sequences.add(sequenceSplitter.getSequence()); 
     
    131212                } 
    132213        } 
    133          
     214 
     215        /** 
     216         * <p> 
     217         * Parses a given log file and adds its contents to the collection of event 
     218         * sequences. 
     219         * </p> 
     220         *  
     221         * @param filename 
     222         *            name and path of the log file 
     223         */ 
    134224        public void parseFile(String filename) { 
    135                 if( filename==null ) { 
     225                if (filename == null) { 
    136226                        throw new InvalidParameterException("filename must not be null"); 
    137227                } 
    138                  
     228 
    139229                SAXParserFactory spf = SAXParserFactory.newInstance(); 
    140230                spf.setValidating(true); 
    141                  
     231 
    142232                SAXParser saxParser = null; 
    143233                InputSource inputSource = null; 
    144234                try { 
    145235                        saxParser = spf.newSAXParser(); 
    146                         inputSource = new InputSource(new InputStreamReader(new FileInputStream(filename), "UTF-16")); 
     236                        inputSource = new InputSource(new InputStreamReader( 
     237                                        new FileInputStream(filename), "UTF-16")); 
    147238                } catch (UnsupportedEncodingException e) { 
    148239                        e.printStackTrace(); 
     
    154245                        e.printStackTrace(); 
    155246                } 
    156                 if( inputSource!=null ) { 
    157                 inputSource.setSystemId("file://" + new File(filename).getAbsolutePath()); 
    158                 try { 
    159                         if( saxParser==null) { 
    160                                 throw new RuntimeException("SAXParser creation failed"); 
    161                         } 
     247                if (inputSource != null) { 
     248                        inputSource.setSystemId("file://" 
     249                                        + new File(filename).getAbsolutePath()); 
     250                        try { 
     251                                if (saxParser == null) { 
     252                                        throw new RuntimeException("SAXParser creation failed"); 
     253                                } 
    162254                                saxParser.parse(inputSource, this); 
    163                 } catch (SAXParseException e) { 
    164                         Console.printerrln("Failure parsing file in line " + e.getLineNumber() + ", column " + e.getColumnNumber() +"."); 
    165                         e.printStackTrace(); 
     255                        } catch (SAXParseException e) { 
     256                                Console.printerrln("Failure parsing file in line " 
     257                                                + e.getLineNumber() + ", column " + e.getColumnNumber() 
     258                                                + "."); 
     259                                e.printStackTrace(); 
    166260                        } catch (SAXException e) { 
    167261                                e.printStackTrace(); 
     
    170264                        } 
    171265                } 
    172                 if( countMessageOccurences ) { 
     266                if (countMessageOccurences) { 
    173267                        Console.println("Message statistics:"); 
    174                         Console.println(typeCounter.toString().replace(" ", StringTools.ENDLINE).replaceAll("[\\{\\}]","")); 
     268                        Console.println(typeCounter.toString() 
     269                                        .replace(" ", StringTools.ENDLINE) 
     270                                        .replaceAll("[\\{\\}]", "")); 
    175271                } 
    176272        } 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/windows/LogPreprocessor.java

    r75 r171  
    1313import de.ugoe.cs.util.console.Console; 
    1414 
     15/** 
     16 * <p> 
     17 * Pre-processes log files generated by the EventBench's MFCUsageMonitor. It 
     18 * decodes Base64 encoding into UTF-16. It removes all lines of the log file, 
     19 * that do not start with the prefix "UL:", end everything before the prefix and 
     20 * the prefix itself. 
     21 * </p> 
     22 *  
     23 * @author Steffen Herbold 
     24 * @version 1.0 
     25 */ 
    1526public class LogPreprocessor { 
    16          
     27 
     28        /** 
     29         * <p> 
     30         * Internal flag that monitors whether there is an open session-node in the 
     31         * XML file to ensure that there is a closing session-node for each opening 
     32         * session node and, thereby, ensure that the XML file is well formed. 
     33         * </p> 
     34         */ 
    1735        private boolean sessionOpen = false; 
     36 
     37        /** 
     38         * <p> 
     39         * Internal flag that monitors whether a message node is longer than one 
     40         * line, as the prefix handling is different in this case. 
     41         * </p> 
     42         */ 
    1843        private boolean msgIncomplete = false; 
    19          
     44 
     45        /** 
     46         * <p> 
     47         * Flag that marks whether the log file is Base64 encoded. 
     48         * </p> 
     49         */ 
    2050        private boolean base64; 
    21          
     51 
     52        /** 
     53         * <p> 
     54         * Constructor. Creates a new LogPreprocessor that does not decode Base64. 
     55         * </p> 
     56         */ 
    2257        public LogPreprocessor() { 
    2358                this(false); 
    2459        } 
    25          
     60 
     61        /** 
     62         * <p> 
     63         * Constructor. Creates a new LogPreprocessor. 
     64         * </p> 
     65         *  
     66         * @param base64 
     67         *            if true, Base64 will be decoded. 
     68         */ 
    2669        public LogPreprocessor(boolean base64) { 
    2770                this.base64 = base64; 
    2871        } 
    29          
    30         public void convertToXml(String source, String target) throws IOException, FileNotFoundException { 
    31                 OutputStreamWriter targetFile = new OutputStreamWriter(new FileOutputStream(target), "UTF-16"); 
    32                 targetFile.write("<?xml version=\"1.0\" encoding=\"UTF-16\"?>" + StringTools.ENDLINE); 
     72 
     73        /** 
     74         * <p> 
     75         * Pre-processes a single log file. 
     76         * </p> 
     77         *  
     78         * @param source 
     79         *            name and path of the source file 
     80         * @param target 
     81         *            name and path of the target file 
     82         * @throws IOException 
     83         *             thrown if there is a problem with reading from or writing to 
     84         *             the source, respectively target file 
     85         * @throws FileNotFoundException 
     86         *             thrown if the source file is not found 
     87         */ 
     88        public void convertToXml(String source, String target) throws IOException, 
     89                        FileNotFoundException { 
     90                OutputStreamWriter targetFile = new OutputStreamWriter( 
     91                                new FileOutputStream(target), "UTF-16"); 
     92                targetFile.write("<?xml version=\"1.0\" encoding=\"UTF-16\"?>" 
     93                                + StringTools.ENDLINE); 
    3394                targetFile.write("<log>" + StringTools.ENDLINE); 
    3495                processFile(source, targetFile); 
    35                 if( sessionOpen ) { 
     96                if (sessionOpen) { 
    3697                        targetFile.write(" </session>" + StringTools.ENDLINE); 
    3798                } 
     
    39100                targetFile.close(); 
    40101        } 
    41          
    42          
    43         public void convertDirToXml(String path, String target) throws IOException, FileNotFoundException { 
    44                 OutputStreamWriter targetFile = new OutputStreamWriter(new FileOutputStream(target), "UTF-16"); 
    45                 targetFile.write("<?xml version=\"1.0\" encoding=\"UTF-16\"?>" + StringTools.ENDLINE); 
     102 
     103        /** 
     104         * <p> 
     105         * Pre-processes all files in a given source folder. 
     106         * </p> 
     107         *  
     108         * @param source 
     109         *            path of the source folder 
     110         * @param target 
     111         *            name and path of the target file 
     112         * @throws IOException 
     113         *             thrown if there is a problem with reading from or writing to 
     114         *             the source, respectively target file 
     115         * @throws FileNotFoundException 
     116         *             thrown if the source file is not found 
     117         */ 
     118        public void convertDirToXml(String path, String target) throws IOException, 
     119                        FileNotFoundException { 
     120                OutputStreamWriter targetFile = new OutputStreamWriter( 
     121                                new FileOutputStream(target), "UTF-16"); 
     122                targetFile.write("<?xml version=\"1.0\" encoding=\"UTF-16\"?>" 
     123                                + StringTools.ENDLINE); 
    46124                targetFile.write("<log>" + StringTools.ENDLINE); 
    47125                File folder = new File(path); 
    48                 if( !folder.isDirectory() ) { 
     126                if (!folder.isDirectory()) { 
    49127                        throw new IOException(path + " is not a directory"); 
    50128                } 
    51129                String absolutPath = folder.getAbsolutePath(); 
    52                 for( String filename : folder.list() ) { 
     130                for (String filename : folder.list()) { 
    53131                        String source = absolutPath + "/" + filename; 
    54132                        Console.traceln("Processing file: " + source); 
    55133                        processFile(source, targetFile); 
    56134                } 
    57                  
    58                 if( sessionOpen ) { 
     135 
     136                if (sessionOpen) { 
    59137                        targetFile.write(" </session>" + StringTools.ENDLINE); 
    60138                } 
     
    63141        } 
    64142 
     143        /** 
     144         * <p> 
     145         * Internal function that pre-processes a log file. 
     146         * </p> 
     147         *  
     148         * @param source 
     149         *            name and path of the source file 
     150         * @param target 
     151         *            name and path of the target file 
     152         * @throws IOException 
     153         *             thrown if there is a problem with reading from or writing to 
     154         *             the source, respectively target file 
     155         * @throws FileNotFoundException 
     156         *             thrown if the source file is not found 
     157         */ 
    65158        private void processFile(String source, OutputStreamWriter targetFile) 
    66159                        throws FileNotFoundException, IOException { 
     
    68161                String incompleteLine = ""; 
    69162                // Open source and read line by line 
    70                 for( String currentLine : lines ) { 
    71                         if( currentLine.contains("UL: <session>")) { 
    72                                 if( sessionOpen) { 
     163                for (String currentLine : lines) { 
     164                        if (currentLine.contains("UL: <session>")) { 
     165                                if (sessionOpen) { 
    73166                                        targetFile.write(" </session>" + StringTools.ENDLINE); 
    74167                                        targetFile.write(" <session>" + StringTools.ENDLINE); 
     
    77170                                        sessionOpen = true; 
    78171                                } 
    79                         } else if( currentLine.contains("UL: </session>")) { 
    80                                 if( sessionOpen) { 
     172                        } else if (currentLine.contains("UL: </session>")) { 
     173                                if (sessionOpen) { 
    81174                                        targetFile.write(" </session>" + StringTools.ENDLINE); 
    82175                                        sessionOpen = false; 
    83176                                } 
    84                         } else if( msgIncomplete || currentLine.contains("UL: ")) { 
    85                                  
     177                        } else if (msgIncomplete || currentLine.contains("UL: ")) { 
     178 
    86179                                String currentContent; 
    87180                                String actualLine; 
    88                                 if( msgIncomplete ) { 
     181                                if (msgIncomplete) { 
    89182                                        actualLine = currentLine; 
    90183                                } else { 
     
    92185                                        actualLine = splitResult[1]; 
    93186                                } 
    94                                 if( base64 ) { 
     187                                if (base64) { 
    95188                                        Base64 decoder = new Base64(); 
    96189                                        byte[] decoded = decoder.decode(actualLine); 
    97190                                        currentContent = new String(decoded, "UTF-16LE"); 
    98                                         currentContent = currentContent.substring(0, currentContent.length()-1); 
     191                                        currentContent = currentContent.substring(0, 
     192                                                        currentContent.length() - 1); 
    99193                                } else { 
    100194                                        currentContent = actualLine; 
    101195                                } 
    102                                 if( msgIncomplete ) { 
     196                                if (msgIncomplete) { 
    103197                                        incompleteLine += currentContent; 
    104                                         if( incompleteLine.contains("</msg>") ) { 
     198                                        if (incompleteLine.contains("</msg>")) { 
    105199                                                msgIncomplete = false; 
    106200                                                targetFile.write(incompleteLine + StringTools.ENDLINE); 
     
    108202                                        } 
    109203                                } else { 
    110                                         if( currentContent.contains("<msg") && sessionOpen ) { 
    111                                                 if( currentContent.contains("</msg>") ) { 
    112                                                         targetFile.write("  " + currentContent + StringTools.ENDLINE); 
     204                                        if (currentContent.contains("<msg") && sessionOpen) { 
     205                                                if (currentContent.contains("</msg>")) { 
     206                                                        targetFile.write("  " + currentContent 
     207                                                                        + StringTools.ENDLINE); 
    113208                                                } else { 
    114209                                                        msgIncomplete = true; 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/windows/MFCReplayDecorator.java

    r98 r171  
    44import de.ugoe.cs.util.StringTools; 
    55 
     6/** 
     7 * <p> 
     8 * {@link IReplayDecorator} for replay generated for EventBench's MFCReplay tool. 
     9 * </p> 
     10 *  
     11 * @author Steffen Herbold 
     12 * @version 1.0 
     13 */ 
    614public class MFCReplayDecorator implements IReplayDecorator { 
    715 
    816        /** 
     17         * <p> 
    918         * Id for object serialization. 
     19         * </p> 
    1020         */ 
    1121        private static final long serialVersionUID = 1L; 
    12          
     22 
     23        /** 
     24         * <p> 
     25         * The instance of the {@link MFCReplayDecorator} (implemented as 
     26         * singleton). 
     27         * </p> 
     28         */ 
    1329        transient private static MFCReplayDecorator theInstance; 
    14          
    15         private MFCReplayDecorator() {}; 
    16          
     30 
     31        /** 
     32         * <p> 
     33         * Constructor. Private to guarantee that only one instance of the replay 
     34         * generator exists. 
     35         * </p> 
     36         */ 
     37        private MFCReplayDecorator() { 
     38        }; 
     39 
     40        /** 
     41         * <p> 
     42         * Returns the instance of the MFCReplayDecorator. 
     43         * </p> 
     44         *  
     45         * @return instance of the MFCReplayDecorator. 
     46         */ 
    1747        public static MFCReplayDecorator getInstance() { 
    18                 if( theInstance==null ) { 
     48                if (theInstance == null) { 
    1949                        theInstance = new MFCReplayDecorator(); 
    2050                } 
    2151                return theInstance; 
    2252        } 
    23          
     53 
     54        /* 
     55         * (non-Javadoc) 
     56         *  
     57         * @see de.ugoe.cs.eventbench.IReplayDecorator#getHeader() 
     58         */ 
    2459        @Override 
    2560        public String getHeader() { 
    26                 return "<?xml version=\"1.0\" encoding=\"UTF-16\"?>" + StringTools.ENDLINE + 
    27                           "<log>" + StringTools.ENDLINE; 
    28                  
     61                return "<?xml version=\"1.0\" encoding=\"UTF-16\"?>" 
     62                                + StringTools.ENDLINE + "<log>" + StringTools.ENDLINE; 
     63 
    2964        } 
    3065 
     66        /* 
     67         * (non-Javadoc) 
     68         *  
     69         * @see de.ugoe.cs.eventbench.IReplayDecorator#getFooter() 
     70         */ 
    3171        @Override 
    3272        public String getFooter() { 
     
    3474        } 
    3575 
     76        /* 
     77         * (non-Javadoc) 
     78         *  
     79         * @see de.ugoe.cs.eventbench.IReplayDecorator#getSessionHeader(int) 
     80         */ 
    3681        @Override 
    3782        public String getSessionHeader(int sessionId) { 
    38                 return " <session id=\""+sessionId+"\">" + StringTools.ENDLINE; 
     83                return " <session id=\"" + sessionId + "\">" + StringTools.ENDLINE; 
    3984        } 
    4085 
     86        /* 
     87         * (non-Javadoc) 
     88         *  
     89         * @see de.ugoe.cs.eventbench.IReplayDecorator#getSessionFooter(int) 
     90         */ 
    4191        @Override 
    4292        public String getSessionFooter(int sessionId) { 
    4393                return " </session>" + StringTools.ENDLINE; 
    4494        } 
    45          
    4695 
    4796} 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/windows/MessageDefs.java

    r76 r171  
    11package de.ugoe.cs.eventbench.windows; 
    22 
     3/** 
     4 * <p> 
     5 * Contains definitions of windows message codes, such that they can be used 
     6 * internally by their name and not their integer value, to improve the 
     7 * readability of the source code. 
     8 * </p> 
     9 *  
     10 * @author Steffen Herbold 
     11 * @version 1.0 
     12 */ 
    313public interface MessageDefs { 
    4          
     14 
    515        public static final int WM_NULL = 0; 
    616        public static final int WM_CREATE = 1; 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/windows/MessageHandler.java

    r75 r171  
    11package de.ugoe.cs.eventbench.windows; 
    22 
     3/** 
     4 * <p> 
     5 * Base class to define custom message handlers, for messages that shall be 
     6 * handled differently during the parsing of usage logs. It provides dummy 
     7 * implementations for all required methods, such that implementations can only 
     8 * overwrite the parts they actually require and ignore the rest. 
     9 * </p> 
     10 *  
     11 * @author Steffen Herbold 
     12 * @version 1.0 
     13 */ 
     14public class MessageHandler { 
    315 
    4 public class MessageHandler { 
    5                  
    6         protected MessageHandler() {} 
    7          
    8         public void onStartElement() {} 
    9         public void onParameter(String name, String value) {} 
    10         public void onEndElement() {} 
     16        /** 
     17         * <p> 
     18         * Constructor. Protected to prohibit initialization of the base class 
     19         * itself. 
     20         * </p> 
     21         */ 
     22        protected MessageHandler() { 
     23        } 
     24 
     25        /** 
     26         * <p> 
     27         * Called in the startElement() method of the {@link LogParser} when a 
     28         * msg-node begins. 
     29         * </p> 
     30         */ 
     31        public void onStartElement() { 
     32        } 
     33 
     34        /** 
     35         * <p> 
     36         * Called by the {@link LogParser} to handle param-nodes. 
     37         * </p> 
     38         *  
     39         * @param name 
     40         *            name (type) of the parameter 
     41         * @param value 
     42         *            value of the parameter 
     43         */ 
     44        public void onParameter(String name, String value) { 
     45        } 
     46 
     47        /** 
     48         * <p> 
     49         * Called in the endElement() method of {@link LogParser} when a msg-node 
     50         * ends. 
     51         * </p> 
     52         */ 
     53        public void onEndElement() { 
     54        } 
    1155} 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/windows/SequenceSplitter.java

    r77 r171  
    44import java.util.List; 
    55 
     6import de.ugoe.cs.eventbench.data.Event; 
    67import de.ugoe.cs.eventbench.windows.data.WindowsMessage; 
    78import de.ugoe.cs.util.console.Console; 
    89 
     10/** 
     11 * <p> 
     12 * Responsible to split sequences into subsequences, such that each subsequences 
     13 * contains exactly one event. 
     14 * </p> 
     15 *  
     16 * @author Steffen Herbold 
     17 * @version 1.0 
     18 */ 
    919public class SequenceSplitter { 
    1020 
     21        /** 
     22         * <p> 
     23         * Contains the current subsequence. 
     24         * </p> 
     25         */ 
    1126        private List<WindowsMessage> currentSequence; 
    12          
     27 
     28        /** 
     29         * <p> 
     30         * Number of messages in the current sequences, that signal that a key or 
     31         * mouse button has been pressed down to which not yet a message has been 
     32         * found, that signals that the button has been released. 
     33         * </p> 
     34         */ 
    1335        private int openDowns; 
    14          
     36 
     37        /** 
     38         * <p> 
     39         * Internal flag that signals if {@link #currentSequence} needs to be 
     40         * initialized. 
     41         * </p> 
     42         */ 
    1543        private boolean initMessages; 
    16          
     44 
     45        /** 
     46         * <p> 
     47         * The {@link EventGenerator} used to convert the subsequences into 
     48         * {@link Event}s 
     49         * </p> 
     50         */ 
    1751        private EventGenerator tokenGenerator; 
    18          
     52 
     53        /** 
     54         * <p> 
     55         * The event sequence generated. 
     56         * </p> 
     57         */ 
    1958        private List<WindowsEvent> actionSequence; 
    20          
     59 
     60        /** 
     61         * <p> 
     62         * Constructor. Creates a new SequenceSplitter. 
     63         * </p> 
     64         */ 
    2165        public SequenceSplitter() { 
    2266                currentSequence = new LinkedList<WindowsMessage>(); 
     
    2670                actionSequence = new LinkedList<WindowsEvent>(); 
    2771        } 
    28          
     72 
     73        /** 
     74         * <p> 
     75         * Called by the {@link LogParser} every time a message is parsed. 
     76         * </p> 
     77         *  
     78         * @param msg 
     79         *            message to be added 
     80         */ 
    2981        public void addMessage(WindowsMessage msg) { 
    30                 if( startOfSequence(msg) ) { 
    31                         if( !initMessages ) { 
    32                                 WindowsEvent currentAction = tokenGenerator.generateEvent(currentSequence); 
    33                                 if( currentAction!=null ) { 
     82                if (startOfSequence(msg)) { 
     83                        if (!initMessages) { 
     84                                WindowsEvent currentAction = tokenGenerator 
     85                                                .generateEvent(currentSequence); 
     86                                if (currentAction != null) { 
    3487                                        actionSequence.add(currentAction); 
    3588                                } 
    36                                 if( isKeyMessage(msg.getType()) && openDowns>0 ) { 
     89                                if (isKeyMessage(msg.getType()) && openDowns > 0) { 
    3790                                        Console.traceln("Key message found with open down mouse messages - will probabably result in a faulty sequence."); 
    3891                                } 
     
    4194                        } 
    4295                        currentSequence = new LinkedList<WindowsMessage>(); 
    43                 }  
    44                 if( isUpMessage(msg.getType()) ) { 
    45                         if( openDowns>0 ) {  
     96                } 
     97                if (isUpMessage(msg.getType())) { 
     98                        if (openDowns > 0) { 
    4699                                openDowns--; 
    47100                        } 
     
    49102                currentSequence.add(msg); 
    50103        } 
    51          
     104 
     105        /** 
     106         * <p> 
     107         * Returns the event sequence generated from the message that have been 
     108         * added. 
     109         * </p> 
     110         *  
     111         * @return generated event sequence 
     112         */ 
    52113        public List<WindowsEvent> getSequence() { 
    53114                return actionSequence; 
    54115        } 
    55          
     116 
     117        /** 
     118         * <p> 
     119         * Called when a session in the log file is finished, i.e., a closing 
     120         * session-node is found. 
     121         * </p> 
     122         */ 
    56123        public void endSession() { 
    57                 WindowsEvent currentAction = tokenGenerator.generateEvent(currentSequence); 
    58                 if( currentAction!=null ) { 
     124                WindowsEvent currentAction = tokenGenerator 
     125                                .generateEvent(currentSequence); 
     126                if (currentAction != null) { 
    59127                        actionSequence.add(currentAction); 
    60128                } 
    61129        } 
    62130 
     131        /** 
     132         * <p> 
     133         * Checks if the message starts a new subsequence and returns the result. 
     134         * </p> 
     135         *  
     136         * @param msg 
     137         *            message that is checked 
     138         * @return true, if a new subsequence begins 
     139         */ 
    63140        private boolean startOfSequence(WindowsMessage msg) { 
    64141                boolean isStart = false; 
    65142                int msgType = msg.getType(); 
    66                 if( isKeyMessage(msgType) ) { 
     143                if (isKeyMessage(msgType)) { 
    67144                        isStart = true; 
    68145                } 
    69                 if( isDownMessage(msgType) ) { 
     146                if (isDownMessage(msgType)) { 
    70147                        openDowns++; 
    71                         if( openDowns==1 ) { 
     148                        if (openDowns == 1) { 
    72149                                isStart = true; 
    73150                        } 
    74151                } 
    75                 if( isDblclkMessage(msgType) ) { 
     152                if (isDblclkMessage(msgType)) { 
    76153                        openDowns++; 
    77154                } 
     
    79156        } 
    80157 
     158        /** 
     159         * <p> 
     160         * Checks if the type of a message is generated is a keyboard interaction. 
     161         * </p> 
     162         *  
     163         * @param msgType 
     164         *            type of the message 
     165         * @return true if it is a keyboard interaction; false otherwise 
     166         */ 
    81167        private boolean isKeyMessage(int msgType) { 
    82168                boolean isKeyMsg = false; 
    83169                switch (msgType) { 
    84                         case MessageDefs.WM_KEYDOWN: 
    85                         case MessageDefs.WM_KEYUP: 
    86                         case MessageDefs.WM_SYSKEYDOWN: 
    87                         case MessageDefs.WM_SYSKEYUP: 
    88                                 isKeyMsg = true; 
    89                                 break; 
    90                         default: 
    91                                         break; 
     170                case MessageDefs.WM_KEYDOWN: 
     171                case MessageDefs.WM_KEYUP: 
     172                case MessageDefs.WM_SYSKEYDOWN: 
     173                case MessageDefs.WM_SYSKEYUP: 
     174                        isKeyMsg = true; 
     175                        break; 
     176                default: 
     177                        break; 
    92178                } 
    93179                return isKeyMsg; 
    94180        } 
    95          
     181 
     182        /** 
     183         * <p> 
     184         * Checks if the type of a message indicates that the mouse has been pressed 
     185         * down. 
     186         * </p> 
     187         *  
     188         * @param msgType 
     189         *            type of the message 
     190         * @return true if it is mouse-down message; false otherwise 
     191         */ 
    96192        private boolean isDownMessage(int msgType) { 
    97193                boolean isDownMsg = false; 
    98194                switch (msgType) { 
    99                         case MessageDefs.WM_LBUTTONDOWN: 
    100                         case MessageDefs.WM_RBUTTONDOWN: 
    101                         case MessageDefs.WM_MBUTTONDOWN: 
    102                         case MessageDefs.WM_XBUTTONDOWN: 
    103                         case MessageDefs.WM_NCLBUTTONDOWN: 
    104                         case MessageDefs.WM_NCRBUTTONDOWN: 
    105                         case MessageDefs.WM_NCMBUTTONDOWN: 
    106                         case MessageDefs.WM_NCXBUTTONDOWN: 
    107                                 isDownMsg = true; 
    108                                 break; 
    109                         default: 
    110                                 break; 
     195                case MessageDefs.WM_LBUTTONDOWN: 
     196                case MessageDefs.WM_RBUTTONDOWN: 
     197                case MessageDefs.WM_MBUTTONDOWN: 
     198                case MessageDefs.WM_XBUTTONDOWN: 
     199                case MessageDefs.WM_NCLBUTTONDOWN: 
     200                case MessageDefs.WM_NCRBUTTONDOWN: 
     201                case MessageDefs.WM_NCMBUTTONDOWN: 
     202                case MessageDefs.WM_NCXBUTTONDOWN: 
     203                        isDownMsg = true; 
     204                        break; 
     205                default: 
     206                        break; 
    111207                } 
    112208                return isDownMsg; 
    113209        } 
    114210 
     211        /** 
     212         * <p> 
     213         * Checks if the type of a message indicates that a double click has been 
     214         * performed. 
     215         * </p> 
     216         *  
     217         * @param msgType 
     218         *            type of the message 
     219         * @return true if it is a double click message; false otherwise 
     220         */ 
    115221        private boolean isDblclkMessage(int msgType) { 
    116222                boolean isDblclkMsg = false; 
    117223                switch (msgType) { 
    118                         case MessageDefs.WM_LBUTTONDBLCLK: 
    119                         case MessageDefs.WM_RBUTTONDBLCLK: 
    120                         case MessageDefs.WM_MBUTTONDBLCLK: 
    121                         case MessageDefs.WM_XBUTTONDBLCLK: 
    122                         case MessageDefs.WM_NCLBUTTONDBLCLK: 
    123                         case MessageDefs.WM_NCRBUTTONDBLCLK: 
    124                         case MessageDefs.WM_NCMBUTTONDBLCLK: 
    125                         case MessageDefs.WM_NCXBUTTONDBLCLK: 
    126                                 isDblclkMsg = true; 
    127                                 break; 
    128                         default: 
    129                                 break; 
     224                case MessageDefs.WM_LBUTTONDBLCLK: 
     225                case MessageDefs.WM_RBUTTONDBLCLK: 
     226                case MessageDefs.WM_MBUTTONDBLCLK: 
     227                case MessageDefs.WM_XBUTTONDBLCLK: 
     228                case MessageDefs.WM_NCLBUTTONDBLCLK: 
     229                case MessageDefs.WM_NCRBUTTONDBLCLK: 
     230                case MessageDefs.WM_NCMBUTTONDBLCLK: 
     231                case MessageDefs.WM_NCXBUTTONDBLCLK: 
     232                        isDblclkMsg = true; 
     233                        break; 
     234                default: 
     235                        break; 
    130236                } 
    131237                return isDblclkMsg; 
    132238        } 
    133          
     239 
     240        /** 
     241         * <p> 
     242         * Checks if the type of a message indicates that the mouse has been 
     243         * released. 
     244         * </p> 
     245         *  
     246         * @param msgType 
     247         *            type of the message 
     248         * @return true if it is mouse-up message; false otherwise 
     249         */ 
    134250        private boolean isUpMessage(int msgType) { 
    135251                boolean isUpMsg = false; 
    136252                switch (msgType) { 
    137                         case MessageDefs.WM_LBUTTONUP: 
    138                         case MessageDefs.WM_RBUTTONUP: 
    139                         case MessageDefs.WM_MBUTTONUP: 
    140                         case MessageDefs.WM_XBUTTONUP: 
    141                         case MessageDefs.WM_NCLBUTTONUP: 
    142                         case MessageDefs.WM_NCRBUTTONUP: 
    143                         case MessageDefs.WM_NCMBUTTONUP: 
    144                         case MessageDefs.WM_NCXBUTTONUP: 
    145                                 isUpMsg = true; 
    146                                 break; 
    147                         default: 
    148                                 break; 
     253                case MessageDefs.WM_LBUTTONUP: 
     254                case MessageDefs.WM_RBUTTONUP: 
     255                case MessageDefs.WM_MBUTTONUP: 
     256                case MessageDefs.WM_XBUTTONUP: 
     257                case MessageDefs.WM_NCLBUTTONUP: 
     258                case MessageDefs.WM_NCRBUTTONUP: 
     259                case MessageDefs.WM_NCMBUTTONUP: 
     260                case MessageDefs.WM_NCXBUTTONUP: 
     261                        isUpMsg = true; 
     262                        break; 
     263                default: 
     264                        break; 
    149265                } 
    150266                return isUpMsg; 
    151267        } 
    152          
     268 
    153269} 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/windows/WindowsEvent.java

    r87 r171  
    44import de.ugoe.cs.eventbench.windows.data.WindowsMessage; 
    55 
    6  
    7 // convenience class 
     6/** 
     7 * <p> 
     8 * Convenience class for working with Windows MFC events. 
     9 * </p> 
     10 *  
     11 * @author Steffen Herbold 
     12 * @version 1.0 
     13 */ 
    814public class WindowsEvent extends ReplayableEvent<WindowsMessage> { 
    915 
    1016        /** 
     17         * <p> 
    1118         * Id for object serialization. 
     19         * </p> 
    1220         */ 
    1321        private static final long serialVersionUID = 1L; 
    1422 
     23        /** 
     24         * <p> 
     25         * Constructor. Creates a new WindowEvent. 
     26         * </p> 
     27         *  
     28         * @see de.ugoe.cs.eventbench.data.Event#Event(String) 
     29         * @param type 
     30         *            type of the event. 
     31         */ 
    1532        public WindowsEvent(String type) { 
    1633                super(type); 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/windows/commands/CMDconvertDirToXml.java

    r52 r171  
    1010import de.ugoe.cs.util.console.Console; 
    1111 
     12/** 
     13 * <p> 
     14 * Command to pre-process all files in a folder. 
     15 * </p> 
     16 *  
     17 * @author Steffen Herbold 
     18 * @version 1.0 
     19 */ 
    1220public class CMDconvertDirToXml implements Command { 
    1321 
     22        /* 
     23         * (non-Javadoc) 
     24         *  
     25         * @see de.ugoe.cs.util.console.Command#help() 
     26         */ 
    1427        @Override 
    1528        public void help() { 
     
    1730        } 
    1831 
     32        /* 
     33         * (non-Javadoc) 
     34         *  
     35         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     36         */ 
    1937        @Override 
    2038        public void run(List<Object> parameters) { 
    21                 if( parameters.size() < 2 ) { 
     39                if (parameters.size() < 2) { 
    2240                        throw new InvalidParameterException(); 
    2341                } 
     
    2543                String target = (String) parameters.get(1); 
    2644                boolean base64 = false; 
    27                 if( parameters.size() == 3 ) { 
     45                if (parameters.size() == 3) { 
    2846                        base64 = Boolean.parseBoolean((String) parameters.get(2)); 
    2947                } 
    30                  
     48 
    3149                try { 
    3250                        new LogPreprocessor(base64).convertDirToXml(path, target); 
     
    3654                        Console.println(e.getMessage()); 
    3755                } 
    38                  
     56 
    3957        } 
    4058 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/windows/commands/CMDconvertToXml.java

    r52 r171  
    1010import de.ugoe.cs.util.console.Console; 
    1111 
     12/** 
     13 * <p> 
     14 * Command to pre-process a single file. 
     15 * </p> 
     16 *  
     17 * @author Steffen Herbold 
     18 * @version 1.0 
     19 */ 
    1220public class CMDconvertToXml implements Command { 
    1321 
     22        /* 
     23         * (non-Javadoc) 
     24         *  
     25         * @see de.ugoe.cs.util.console.Command#help() 
     26         */ 
    1427        @Override 
    1528        public void help() { 
     
    1730        } 
    1831 
     32        /* 
     33         * (non-Javadoc) 
     34         *  
     35         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     36         */ 
    1937        @Override 
    2038        public void run(List<Object> parameters) { 
    21                 if( parameters.size() < 2 ) { 
     39                if (parameters.size() < 2) { 
    2240                        throw new InvalidParameterException(); 
    2341                } 
     
    2543                String target = (String) parameters.get(1); 
    2644                boolean base64 = false; 
    27                 if( parameters.size() == 3 ) { 
     45                if (parameters.size() == 3) { 
    2846                        base64 = Boolean.parseBoolean((String) parameters.get(2)); 
    2947                } 
    30                  
     48 
    3149                try { 
    3250                        new LogPreprocessor(base64).convertToXml(source, target); 
     
    3654                        Console.println(e.getMessage()); 
    3755                } 
    38                  
     56 
    3957        } 
    4058 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/windows/commands/CMDparseXML.java

    r84 r171  
    1010import de.ugoe.cs.util.console.Console; 
    1111 
     12/** 
     13 * <p> 
     14 * Command to parse an XML file with sessions monitored by EventBench's 
     15 * MFCUsageMonitor. 
     16 * </p> 
     17 *  
     18 * @author Steffen Herbold 
     19 * @version 1.0 
     20 */ 
    1221public class CMDparseXML implements Command { 
    1322 
     23        /* (non-Javadoc) 
     24         * @see de.ugoe.cs.util.console.Command#help() 
     25         */ 
    1426        @Override 
    1527        public void help() { 
     
    1729        } 
    1830 
     31        /* (non-Javadoc) 
     32         * @see de.ugoe.cs.util.console.Command#run(java.util.List) 
     33         */ 
    1934        @Override 
    2035        public void run(List<Object> parameters) { 
    2136                String filename; 
    2237                boolean countMessageOccurences = false; 
    23                  
     38 
    2439                try { 
    2540                        filename = (String) parameters.get(0); 
    26                         if( parameters.size()==2 ) { 
    27                                 countMessageOccurences = Boolean.parseBoolean((String) parameters.get(1)); 
     41                        if (parameters.size() == 2) { 
     42                                countMessageOccurences = Boolean 
     43                                                .parseBoolean((String) parameters.get(1)); 
    2844                        } 
    2945                } catch (Exception e) { 
    3046                        throw new InvalidParameterException(); 
    3147                } 
    32                  
     48 
    3349                LogParser parser = new LogParser(countMessageOccurences); 
    3450                parser.parseFile(filename); 
    35                  
     51 
    3652                List<List<WindowsEvent>> sequences = parser.getSequences(); 
    37                  
    38                 if( GlobalDataContainer.getInstance().addData("sequences", sequences ) ) { 
     53 
     54                if (GlobalDataContainer.getInstance().addData("sequences", sequences)) { 
    3955                        Console.traceln("Old data \"" + "sequences" + "\" overwritten"); 
    40                 }        
     56                } 
    4157        } 
    4258 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/windows/data/WindowTree.java

    r157 r171  
    2828 *  
    2929 * @author Steffen Herbold 
     30 * @version 1.0 
    3031 */ 
    3132public class WindowTree { 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/windows/data/WindowTreeNode.java

    r52 r171  
    1818 *  
    1919 * @author Steffen Herbold 
     20 * @version 1.0 
    2021 */ 
    2122public class WindowTreeNode { 
     
    6970         */ 
    7071        private List<WindowTreeNode> children; 
    71          
     72 
    7273        /** 
    7374         * <p> 
     
    263264                        xmlString = parent.xmlRepresentation(); 
    264265                } 
    265                 xmlString += "<window name=\"" + StringTools.xmlEntityReplacement(windowName) + "\" class=\"" 
    266                                 + StringTools.xmlEntityReplacement(className) + "\" resourceId=\"" + resourceId + "\" isModal=\"" 
    267                                 + isModal + "\"/>"; 
     266                xmlString += "<window name=\"" 
     267                                + StringTools.xmlEntityReplacement(windowName) + "\" class=\"" 
     268                                + StringTools.xmlEntityReplacement(className) 
     269                                + "\" resourceId=\"" + resourceId + "\" isModal=\"" + isModal 
     270                                + "\"/>"; 
    268271                return xmlString; 
    269272        } 
    270          
     273 
     274        /** 
     275         * <p> 
     276         * Returns the names of the parents and itself separated by dots, e.g., 
     277         * "GrandParent.Parent.windowName" 
     278         * </p> 
     279         *  
     280         * @return names of the parents separated by dots 
     281         */ 
    271282        public String getParentNames() { 
    272283                String parentNames = ""; 
    273                 if (parent != null ) { 
    274                         parentNames = parent.getParentNames()+"."; 
     284                if (parent != null) { 
     285                        parentNames = parent.getParentNames() + "."; 
    275286                } 
    276287                parentNames += windowName; 
  • trunk/EventBenchConsole/src/de/ugoe/cs/eventbench/windows/data/WindowsMessage.java

    r141 r171  
    88import de.ugoe.cs.util.StringTools; 
    99 
     10/** 
     11 * <p> 
     12 * Contains all informations about a windows message, i.e., all parameters that 
     13 * are read when a windows message is parsed as well as its target, hwnd, etc. 
     14 * </p> 
     15 *  
     16 * @author Steffen Herbold 
     17 * @version 1.0 
     18 *  
     19 */ 
    1020public class WindowsMessage implements IReplayable { 
    11         /** 
    12          * Id for object serialization.  
     21 
     22        /** 
     23         * <p> 
     24         * Id for object serialization. 
     25         * </p> 
    1326         */ 
    1427        private static final long serialVersionUID = 1L; 
    15          
     28 
     29        /** 
     30         * <p> 
     31         * Type of the message. 
     32         * </p> 
     33         */ 
    1634        final int type; 
     35 
     36        /** 
     37         * <p> 
     38         * Window class of the message target. Default: "" 
     39         * </p> 
     40         */ 
    1741        private String windowClass = ""; 
     42 
     43        /** 
     44         * <p> 
     45         * Resource Id of the message target. Default: 0 
     46         * </p> 
     47         */ 
    1848        private int resourceId = 0; 
     49 
     50        /** 
     51         * <p> 
     52         * XML representation of the message target. 
     53         * </p> 
     54         */ 
    1955        private String xmlWindowDescription = ""; 
     56 
     57        /** 
     58         * <p> 
     59         * String that contains the names of all parent widgets and itself, separated by dots, 
     60         * e.g., "GrandParent.Parent.self". 
     61         * </p> 
     62         */ 
    2063        private String parentNames = null; 
     64 
     65        /** 
     66         * <p> 
     67         * String that contains the window class of the parent widget. 
     68         * </p> 
     69         */ 
    2170        private String parentClass = null; 
    2271 
     72        /** 
     73         * <p> 
     74         * LPARAM of the message. Default: 0 
     75         * </p> 
     76         */ 
    2377        private long LPARAM = 0; 
     78 
     79        /** 
     80         * <p> 
     81         * WPARAM of the message. Default: 0 
     82         * </p> 
     83         */ 
    2484        private long WPARAM = 0; 
    2585 
     86        /** 
     87         * <p> 
     88         * If the LPARAM contains a HWND, this string stores the target of the HWND. 
     89         * </p> 
     90         */ 
    2691        private String LPARAMasWindowDesc = null; 
     92 
     93        /** 
     94         * <p> 
     95         * If the WPARAM contains a HWND, this string stores the target of the HWND. 
     96         * </p> 
     97         */ 
    2798        private String WPARAMasWindowDesc = null; 
    2899 
     100        /** 
     101         * <p> 
     102         * Delay after sending the messages during a replay. Default: 0 
     103         * </p> 
     104         */ 
    29105        private int delay = 0; 
    30          
     106 
     107        /** 
     108         * <p> 
     109         * A map of all parameters, associated with the message, created during the 
     110         * parsing of messages from the logs {@code param}-nodes. 
     111         * </p> 
     112         */ 
    31113        private Map<String, String> params = new HashMap<String, String>(); 
    32114 
     115        /** 
     116         * <p> 
     117         * Constructor. Creates a new message with a given message type. 
     118         * </p> 
     119         *  
     120         * @param type 
     121         *            type of the message 
     122         */ 
    33123        public WindowsMessage(int type) { 
    34124                this.type = type; 
    35125        } 
    36126 
     127        /** 
     128         * <p> 
     129         * Adds a parameter to the message. 
     130         * </p> 
     131         *  
     132         * @param type 
     133         *            type descriptor of the parameter 
     134         * @param value 
     135         *            value of the parameter 
     136         */ 
    37137        public void addParameter(String type, String value) { 
    38138                params.put(type, value); 
     
    44144        } 
    45145 
     146        /** 
     147         * <p> 
     148         * Returns the type of the message. 
     149         * </p> 
     150         *  
     151         * @return type of the message 
     152         */ 
    46153        public int getType() { 
    47154                return type; 
    48155        } 
    49156 
     157        /** 
     158         * <p> 
     159         * Returns the value of a parameter, given its type. If the parameter is not 
     160         * found, {@code null} is returned. 
     161         * </p> 
     162         *  
     163         * @param type 
     164         *            type of the parameter 
     165         * @return value of the parameter 
     166         */ 
    50167        public String getParameter(String type) { 
    51168                return params.get(type); 
    52169        } 
    53170 
     171        /** 
     172         * <p> 
     173         * Returns the window class of the message target. 
     174         * </p> 
     175         *  
     176         * @return window class of the message target 
     177         */ 
    54178        public String getWindowClass() { 
    55179                return windowClass; 
    56180        } 
    57181 
     182        /** 
     183         * <p> 
     184         * Returns the HWND the message is addressed to. 
     185         * </p> 
     186         *  
     187         * @return HWND the message is addressed to 
     188         */ 
    58189        public int getHwnd() { 
    59190                int hwnd = -1; 
     
    67198        } 
    68199 
     200        /** 
     201         * <p> 
     202         * Returns the resource Id of the message target. 
     203         * </p> 
     204         *  
     205         * @return resource Id of the message target 
     206         */ 
    69207        public int getWindowResourceId() { 
    70208                return resourceId; 
    71209        } 
    72210 
     211        /** 
     212         * <p> 
     213         * Two {@link WindowsMessage} are equal, if their {@link #type}, 
     214         * {@link #xmlWindowDescription}, and {@link #params} are equal. 
     215         * </p> 
     216         *  
     217         * @see java.lang.Object#equals(java.lang.Object) 
     218         */ 
    73219        @Override 
    74220        public boolean equals(Object other) { 
    75                 if( other==this) { 
     221                if (other == this) { 
    76222                        return true; 
    77223                } 
     
    86232        } 
    87233 
     234        /* 
     235         * (non-Javadoc) 
     236         *  
     237         * @see java.lang.Object#hashCode() 
     238         */ 
    88239        @Override 
    89240        public int hashCode() { 
     
    98249        } 
    99250 
     251        /** 
     252         * <p> 
     253         * Returns a string representation of the message of the form 
     254         * "msg[target=HWND;type=TYPE]". 
     255         * </p> 
     256         *  
     257         * @see java.lang.Object#toString() 
     258         */ 
    100259        @Override 
    101260        public String toString() { 
     
    104263        } 
    105264 
     265        /** 
     266         * <p> 
     267         * Retrieves the target string of a message from a given {@link WindowTree} 
     268         * through looking up the HWND the message is addressed to in the window 
     269         * tree. 
     270         * </p> 
     271         *  
     272         * @param windowTree 
     273         *            {@link WindowTree} from which the target is extracted 
     274         * @throws InvalidParameterException 
     275         *             thrown if HWND is not contained in windowTree 
     276         */ 
    106277        public void setTarget(WindowTree windowTree) 
    107278                        throws InvalidParameterException { 
     
    117288                        parentNames = node.getParentNames(); 
    118289                        WindowTreeNode parent = node.getParent(); 
    119                         if( parent==null ) { 
     290                        if (parent == null) { 
    120291                                parentClass = ""; 
    121292                        } else { 
     
    125296        } 
    126297 
     298        /** 
     299         * <p> 
     300         * Sets the LPARAM of a message. 
     301         * </p> 
     302         *  
     303         * @param paramValue 
     304         *            value of the LPARAM 
     305         */ 
    127306        public void setLPARAM(long paramValue) { 
    128307                LPARAM = paramValue; 
    129308        } 
    130309 
     310        /** 
     311         * <p> 
     312         * Sets the WPARAM of a message. 
     313         * </p> 
     314         *  
     315         * @param paramValue 
     316         *            value of the WPARAM 
     317         */ 
    131318        public void setWPARAM(long paramValue) { 
    132319                WPARAM = paramValue; 
    133320        } 
    134321 
     322        /** 
     323         * <p> 
     324         * Returns the LPARAM of a message. 
     325         * </p> 
     326         *  
     327         * @return LPARAM of the message 
     328         */ 
    135329        public long getLPARAM() { 
    136330                return LPARAM; 
    137331        } 
    138332 
     333        /** 
     334         * <p> 
     335         * Returns the WPARAM of a message. 
     336         * </p> 
     337         *  
     338         * @return WPARAM of the message 
     339         */ 
    139340        public long getWPARAM() { 
    140341                return WPARAM; 
    141342        } 
    142343 
     344        /** 
     345         * <p> 
     346         * If the LPARAM contains a HWND, this function can be used to set a target 
     347         * string to identify the HWND at run-time. 
     348         * </p> 
     349         *  
     350         * @param windowDesc 
     351         *            target string 
     352         */ 
    143353        public void setLPARAMasWindowDesc(String windowDesc) { 
    144354                LPARAMasWindowDesc = windowDesc; 
    145355        } 
    146356 
     357        /** 
     358         * <p> 
     359         * If the WPARAM contains a HWND, this function can be used to set a target 
     360         * string to identify the HWND at run-time. 
     361         * </p> 
     362         *  
     363         * @param windowDesc 
     364         *            target string 
     365         */ 
    147366        public void setWPARAMasWindowDesc(String windowDesc) { 
    148367                WPARAMasWindowDesc = windowDesc; 
    149368        } 
    150369 
     370        /** 
     371         * <p> 
     372         * If the LPARAM contains a HWND and the target string for the HWND is set, 
     373         * this function returns the target string. Otherwise, {@code null} is 
     374         * returned. 
     375         * </p> 
     376         *  
     377         * @return target string if available; {@code null} otherwise 
     378         */ 
    151379        public String getLPARAMasWindowDesc() { 
    152380                return LPARAMasWindowDesc; 
    153381        } 
    154382 
     383        /** 
     384         * <p> 
     385         * If the WPARAM contains a HWND and the target string for the HWND is set, 
     386         * this function returns the target string. Otherwise, {@code null} is 
     387         * returned. 
     388         * </p> 
     389         *  
     390         * @return target string if available; {@code null} otherwise 
     391         */ 
    155392        public String getWPARAMasWindowDesc() { 
    156393                return WPARAMasWindowDesc; 
    157394        } 
    158395 
     396        /** 
     397         * <p> 
     398         * Returns the target string of the message. 
     399         * </p> 
     400         *  
     401         * @return target string of the message 
     402         */ 
    159403        public String getXmlWindowDescription() { 
    160404                return xmlWindowDescription; 
    161405        } 
    162406 
     407        /** 
     408         * <p> 
     409         * Sets the target string manually. 
     410         * </p> 
     411         *  
     412         * @param xmlWindowDescription 
     413         *            target string 
     414         */ 
    163415        public void setXmlWindowDescription(String xmlWindowDescription) { 
    164416                this.xmlWindowDescription = xmlWindowDescription; 
    165417        } 
    166418 
     419        /** 
     420         * <p> 
     421         * Returns the delay after this message during replays. 
     422         * </p> 
     423         *  
     424         * @return delay after this message 
     425         */ 
    167426        public int getDelay() { 
    168427                return delay; 
    169428        } 
    170429 
     430        /** 
     431         * <p> 
     432         * Sets the delay after this message during replays. 
     433         * </p> 
     434         *  
     435         * @param delay 
     436         *            delay after this message 
     437         */ 
    171438        public void setDelay(int delay) { 
    172439                this.delay = delay; 
    173440        } 
    174441 
     442        /** 
     443         * <p> 
     444         * Returns the parent names separated by dots, e.g., "GrandParent.Parent". 
     445         * </p> 
     446         *  
     447         * @return names of the parents 
     448         */ 
    175449        public String getParentNames() { 
    176450                return parentNames; 
    177451        } 
    178          
     452 
     453        /** 
     454         * <p> 
     455         * Returns the window class of the parent. 
     456         * </p> 
     457         *  
     458         * @return window classes of the parents 
     459         */ 
    179460        public String getParentClass() { 
    180461                return parentClass; 
    181462        } 
    182463 
     464        /** 
     465         * <p> 
     466         * Returns the number of parameters stored together with this message. 
     467         * </p> 
     468         *  
     469         * @return 
     470         */ 
    183471        public int getNumParams() { 
    184472                return params.size(); 
    185473        } 
    186          
     474 
     475        /* 
     476         * (non-Javadoc) 
     477         *  
     478         * @see de.ugoe.cs.eventbench.data.IReplayable#getReplay() 
     479         */ 
     480        @Override 
    187481        public String getReplay() { 
    188482                StringBuilder currentMsgStr = new StringBuilder(400); 
    189                 currentMsgStr.append("  <msg type=\""+type+"\" "); 
    190                 currentMsgStr.append("LPARAM=\""+LPARAM+"\" "); 
    191                 currentMsgStr.append("WPARAM=\""+WPARAM+"\" "); 
    192                 currentMsgStr.append("delay=\""+delay+"\">"); 
    193                 if( LPARAMasWindowDesc!=null ) { 
     483                currentMsgStr.append("  <msg type=\"" + type + "\" "); 
     484                currentMsgStr.append("LPARAM=\"" + LPARAM + "\" "); 
     485                currentMsgStr.append("WPARAM=\"" + WPARAM + "\" "); 
     486                currentMsgStr.append("delay=\"" + delay + "\">"); 
     487                if (LPARAMasWindowDesc != null) { 
    194488                        currentMsgStr.append(StringTools.ENDLINE); 
    195489                        currentMsgStr.append("   <LPARAM>"); 
     
    198492                        currentMsgStr.append(StringTools.ENDLINE); 
    199493                        currentMsgStr.append("</LPARAM>"); 
    200                 }  
    201                 if( WPARAMasWindowDesc!=null ) { 
     494                } 
     495                if (WPARAMasWindowDesc != null) { 
    202496                        currentMsgStr.append(StringTools.ENDLINE); 
    203497                        currentMsgStr.append("   <WPARAM>"); 
     
    214508                return currentMsgStr.toString(); 
    215509        } 
    216          
     510 
     511        /* 
     512         * (non-Javadoc) 
     513         *  
     514         * @see de.ugoe.cs.eventbench.data.IReplayable#getTarget() 
     515         */ 
     516        @Override 
    217517        public String getTarget() { 
    218518                return xmlWindowDescription; 
Note: See TracChangeset for help on using the changeset viewer.