~codescore-dev/codescore/version-1.0

« back to all changes in this revision

Viewing changes to doc/java_doc/src-html/net/codescore/exe/DiffExecutor.html

  • Committer: Adam Cornett
  • Date: 2008-03-17 15:08:45 UTC
  • Revision ID: adam.cornett@gmail.com-20080317150845-u96dd3go8d5c1gej
Javadoc updates post-refactoring

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<HTML>
 
2
<BODY BGCOLOR="white">
 
3
<PRE>
 
4
<FONT color="green">001</FONT>    /*<a name="line.1"></a>
 
5
<FONT color="green">002</FONT>     * Copyright (C) 2008 Adam Cornett This program is free software; you can<a name="line.2"></a>
 
6
<FONT color="green">003</FONT>     * redistribute it and/or modify it under the terms of the GNU General Public<a name="line.3"></a>
 
7
<FONT color="green">004</FONT>     * License as published by the Free Software Foundation; either version 3 of the<a name="line.4"></a>
 
8
<FONT color="green">005</FONT>     * License, or (at your option) any later version. This program is distributed<a name="line.5"></a>
 
9
<FONT color="green">006</FONT>     * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even<a name="line.6"></a>
 
10
<FONT color="green">007</FONT>     * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.<a name="line.7"></a>
 
11
<FONT color="green">008</FONT>     * See the GNU General Public License for more details. You should have received<a name="line.8"></a>
 
12
<FONT color="green">009</FONT>     * a copy of the GNU General Public License along with this program; if not, see<a name="line.9"></a>
 
13
<FONT color="green">010</FONT>     * &lt;http://www.gnu.org/licenses&gt;.<a name="line.10"></a>
 
14
<FONT color="green">011</FONT>     */<a name="line.11"></a>
 
15
<FONT color="green">012</FONT>    <a name="line.12"></a>
 
16
<FONT color="green">013</FONT>    package net.codescore.exe;<a name="line.13"></a>
 
17
<FONT color="green">014</FONT>    <a name="line.14"></a>
 
18
<FONT color="green">015</FONT>    import java.io.IOException;<a name="line.15"></a>
 
19
<FONT color="green">016</FONT>    <a name="line.16"></a>
 
20
<FONT color="green">017</FONT>    import org.apache.commons.logging.Log;<a name="line.17"></a>
 
21
<FONT color="green">018</FONT>    import org.apache.commons.logging.LogFactory;<a name="line.18"></a>
 
22
<FONT color="green">019</FONT>    <a name="line.19"></a>
 
23
<FONT color="green">020</FONT>    import net.codescore.dbo.Submission;<a name="line.20"></a>
 
24
<FONT color="green">021</FONT>    import net.codescore.dbo.TeamSubmission;<a name="line.21"></a>
 
25
<FONT color="green">022</FONT>    <a name="line.22"></a>
 
26
<FONT color="green">023</FONT>    /**<a name="line.23"></a>
 
27
<FONT color="green">024</FONT>     * Executes a diff comparison on the standard output of a submission. This class<a name="line.24"></a>
 
28
<FONT color="green">025</FONT>     * expects that the diff executable is on the path.<a name="line.25"></a>
 
29
<FONT color="green">026</FONT>     * <a name="line.26"></a>
 
30
<FONT color="green">027</FONT>     * @author Adam Cornett<a name="line.27"></a>
 
31
<FONT color="green">028</FONT>     */<a name="line.28"></a>
 
32
<FONT color="green">029</FONT>    public class DiffExecutor {<a name="line.29"></a>
 
33
<FONT color="green">030</FONT>            private Log log = LogFactory.getLog(Grader.class);<a name="line.30"></a>
 
34
<FONT color="green">031</FONT>            private ProcessBuilder pb;<a name="line.31"></a>
 
35
<FONT color="green">032</FONT>            private boolean sideBySide = false;<a name="line.32"></a>
 
36
<FONT color="green">033</FONT>            private final Submission sub;<a name="line.33"></a>
 
37
<FONT color="green">034</FONT>    <a name="line.34"></a>
 
38
<FONT color="green">035</FONT>            public DiffExecutor(final Submission s) {<a name="line.35"></a>
 
39
<FONT color="green">036</FONT>                    sub = s;<a name="line.36"></a>
 
40
<FONT color="green">037</FONT>            }<a name="line.37"></a>
 
41
<FONT color="green">038</FONT>    <a name="line.38"></a>
 
42
<FONT color="green">039</FONT>            /**<a name="line.39"></a>
 
43
<FONT color="green">040</FONT>             * Get the output of diff.&lt;/br&gt; Makes this call: &lt;/br&gt;&lt;code&gt;<a name="line.40"></a>
 
44
<FONT color="green">041</FONT>             * diff {@link TeamSubmission#getExpectedStdOutFile()} {@link TeamSubmission#getExecuteStdOutFile()}<a name="line.41"></a>
 
45
<FONT color="green">042</FONT>             * &lt;/code&gt;<a name="line.42"></a>
 
46
<FONT color="green">043</FONT>             * <a name="line.43"></a>
 
47
<FONT color="green">044</FONT>             * @return<a name="line.44"></a>
 
48
<FONT color="green">045</FONT>             * @throws InterruptedException<a name="line.45"></a>
 
49
<FONT color="green">046</FONT>             * @throws IOException<a name="line.46"></a>
 
50
<FONT color="green">047</FONT>             */<a name="line.47"></a>
 
51
<FONT color="green">048</FONT>            public String getDiff() throws InterruptedException, IOException {<a name="line.48"></a>
 
52
<FONT color="green">049</FONT>                    initPB();<a name="line.49"></a>
 
53
<FONT color="green">050</FONT>                    log.debug("Starting diff execution");<a name="line.50"></a>
 
54
<FONT color="green">051</FONT>                    final StringBuffer diff = new StringBuffer();<a name="line.51"></a>
 
55
<FONT color="green">052</FONT>                    final Process dExe = pb.start();<a name="line.52"></a>
 
56
<FONT color="green">053</FONT>                    int b = dExe.getInputStream().read();<a name="line.53"></a>
 
57
<FONT color="green">054</FONT>                    for (; b != -1; b = dExe.getInputStream().read())<a name="line.54"></a>
 
58
<FONT color="green">055</FONT>                            diff.append((char) b);<a name="line.55"></a>
 
59
<FONT color="green">056</FONT>                    dExe.getErrorStream().close();<a name="line.56"></a>
 
60
<FONT color="green">057</FONT>                    dExe.getInputStream().close();<a name="line.57"></a>
 
61
<FONT color="green">058</FONT>                    dExe.getOutputStream().close();<a name="line.58"></a>
 
62
<FONT color="green">059</FONT>                    final int rv = dExe.waitFor();<a name="line.59"></a>
 
63
<FONT color="green">060</FONT>                    if (rv &gt; 1)<a name="line.60"></a>
 
64
<FONT color="green">061</FONT>                            throw new RuntimeException("Diff did not exit normally:" + rv);<a name="line.61"></a>
 
65
<FONT color="green">062</FONT>                    return diff.toString();<a name="line.62"></a>
 
66
<FONT color="green">063</FONT>            }<a name="line.63"></a>
 
67
<FONT color="green">064</FONT>    <a name="line.64"></a>
 
68
<FONT color="green">065</FONT>            public boolean isSideBySide() {<a name="line.65"></a>
 
69
<FONT color="green">066</FONT>                    return sideBySide;<a name="line.66"></a>
 
70
<FONT color="green">067</FONT>            }<a name="line.67"></a>
 
71
<FONT color="green">068</FONT>    <a name="line.68"></a>
 
72
<FONT color="green">069</FONT>            public void setSideBySide(final boolean sideBySide) {<a name="line.69"></a>
 
73
<FONT color="green">070</FONT>                    this.sideBySide = sideBySide;<a name="line.70"></a>
 
74
<FONT color="green">071</FONT>            }<a name="line.71"></a>
 
75
<FONT color="green">072</FONT>    <a name="line.72"></a>
 
76
<FONT color="green">073</FONT>            private void initPB() {<a name="line.73"></a>
 
77
<FONT color="green">074</FONT>                    pb = new ProcessBuilder();<a name="line.74"></a>
 
78
<FONT color="green">075</FONT>                    pb.directory(sub.getTempDir());<a name="line.75"></a>
 
79
<FONT color="green">076</FONT>                    String executeStdOut, expectedStdOut;<a name="line.76"></a>
 
80
<FONT color="green">077</FONT>                    executeStdOut = sub.getExpectedStdOutFile().getName();<a name="line.77"></a>
 
81
<FONT color="green">078</FONT>                    expectedStdOut = sub.getExecuteStdOutFile().getName();<a name="line.78"></a>
 
82
<FONT color="green">079</FONT>                    if (sideBySide)<a name="line.79"></a>
 
83
<FONT color="green">080</FONT>                            pb.command("diff", "-y", "--strip-trailing-cr", expectedStdOut,<a name="line.80"></a>
 
84
<FONT color="green">081</FONT>                                    executeStdOut);<a name="line.81"></a>
 
85
<FONT color="green">082</FONT>                    else<a name="line.82"></a>
 
86
<FONT color="green">083</FONT>                            pb.command("diff", "--strip-trailing-cr", expectedStdOut,<a name="line.83"></a>
 
87
<FONT color="green">084</FONT>                                    executeStdOut);<a name="line.84"></a>
 
88
<FONT color="green">085</FONT>                    StringBuilder sb = new StringBuilder();<a name="line.85"></a>
 
89
<FONT color="green">086</FONT>                    for (String s : pb.command())<a name="line.86"></a>
 
90
<FONT color="green">087</FONT>                            sb.append(s + " ");<a name="line.87"></a>
 
91
<FONT color="green">088</FONT>                    log.debug("Initalized diff with command:" + sb.toString());<a name="line.88"></a>
 
92
<FONT color="green">089</FONT>            }<a name="line.89"></a>
 
93
<FONT color="green">090</FONT>    }<a name="line.90"></a>
 
94
 
 
95
 
 
96
 
 
97
 
 
98
 
 
99
 
 
100
 
 
101
 
 
102
 
 
103
 
 
104
 
 
105
 
 
106
 
 
107
 
 
108
 
 
109
 
 
110
 
 
111
 
 
112
 
 
113
 
 
114
 
 
115
 
 
116
 
 
117
 
 
118
 
 
119
 
 
120
 
 
121
 
 
122
 
 
123
 
 
124
 
 
125
 
 
126
 
 
127
 
 
128
 
 
129
 
 
130
 
 
131
 
 
132
 
 
133
 
 
134
 
 
135
 
 
136
 
 
137
 
 
138
 
 
139
 
 
140
 
 
141
 
 
142
 
 
143
 
 
144
 
 
145
 
 
146
 
 
147
 
 
148
 
 
149
 
 
150
 
 
151
 
 
152
 
 
153
 
 
154
</PRE>
 
155
</BODY>
 
156
</HTML>