<!DOCTYPE html>
<html lang='en'>
<head>
<title>project_enumerations_controller.rb « controllers « app - redmine.git - Mirror of redmine code source: https://github.com/redmine/redmine</title>
<meta name='generator' content='cgit v1.2.3'/>
<meta name='robots' content='index, nofollow'/>
<link rel='stylesheet' type='text/css' href='/cgit.css'/>
<link rel='shortcut icon' href='/favicon.ico'/>
<link rel='alternate' title='Atom feed' href='https://source.dussan.org/redmine.git/atom/app/controllers/project_enumerations_controller.rb?h=3.0.1' type='application/atom+xml'/>
</head>
<body>
<div id='cgit'><table id='header'>
<tr>
<td class='logo' rowspan='2'><a href='/'><img src='/cgit.png' alt='cgit logo'/></a></td>
<td class='main'><a href='/'>index</a> : <a href='/redmine.git/'>redmine.git</a></td><td class='form'><form method='get'>
<select name='h' onchange='this.form.submit();'>
<option value='0.6-stable'>0.6-stable</option>
<option value='0.7-stable'>0.7-stable</option>
<option value='0.8-stable'>0.8-stable</option>
<option value='0.9-stable'>0.9-stable</option>
<option value='1.0-stable'>1.0-stable</option>
<option value='1.1-stable'>1.1-stable</option>
<option value='1.2-stable'>1.2-stable</option>
<option value='1.3-stable'>1.3-stable</option>
<option value='1.4-stable'>1.4-stable</option>
<option value='2.0-stable'>2.0-stable</option>
<option value='2.1-stable'>2.1-stable</option>
<option value='2.2-stable'>2.2-stable</option>
<option value='2.3-stable'>2.3-stable</option>
<option value='2.4-stable'>2.4-stable</option>
<option value='2.5-stable'>2.5-stable</option>
<option value='2.6-stable'>2.6-stable</option>
<option value='3.0-stable'>3.0-stable</option>
<option value='3.1-stable'>3.1-stable</option>
<option value='3.2-stable'>3.2-stable</option>
<option value='3.3-stable'>3.3-stable</option>
<option value='3.4-stable'>3.4-stable</option>
<option value='4.0-stable'>4.0-stable</option>
<option value='4.1-stable'>4.1-stable</option>
<option value='4.2-stable'>4.2-stable</option>
<option value='5.0-stable'>5.0-stable</option>
<option value='5.1-stable'>5.1-stable</option>
<option value='6.0-stable'>6.0-stable</option>
<option value='integration-to-svn-stable-1.0'>integration-to-svn-stable-1.0</option>
<option value='integration-to-svn-trunk'>integration-to-svn-trunk</option>
<option value='master'>master</option>
<option value='nbc'>nbc</option>
<option value='plugin-hooks'>plugin-hooks</option>
<option value='swistak'>swistak</option>
<option value='work'>work</option>
</select> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'>Mirror of redmine code source: https://github.com/redmine/redmine</td><td class='sub right'>www-data</td></tr></table>
<table class='tabs'><tr><td>
<a href='/redmine.git/?h=3.0.1'>summary</a><a href='/redmine.git/refs/?h=3.0.1'>refs</a><a href='/redmine.git/log/app/controllers/project_enumerations_controller.rb?h=3.0.1'>log</a><a class='active' href='/redmine.git/tree/app/controllers/project_enumerations_controller.rb?h=3.0.1'>tree</a><a href='/redmine.git/commit/app/controllers/project_enumerations_controller.rb?h=3.0.1'>commit</a><a href='/redmine.git/diff/app/controllers/project_enumerations_controller.rb?h=3.0.1'>diff</a><a href='/redmine.git/stats/app/controllers/project_enumerations_controller.rb?h=3.0.1'>stats</a></td><td class='form'><form class='right' method='get' action='/redmine.git/log/app/controllers/project_enumerations_controller.rb'>
<input type='hidden' name='h' value='3.0.1'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/redmine.git/tree/?h=3.0.1'>root</a>/<a href='/redmine.git/tree/app?h=3.0.1'>app</a>/<a href='/redmine.git/tree/app/controllers?h=3.0.1'>controllers</a>/<a href='/redmine.git/tree/app/controllers/project_enumerations_controller.rb?h=3.0.1'>project_enumerations_controller.rb</a></div><div class='content'>blob: c3d2da9282bfbdcda797ebbbeba17cf70877d163 (<a href='/redmine.git/plain/app/controllers/project_enumerations_controller.rb?h=3.0.1'>plain</a>)
<table summary='blob content' class='blob'>
<tr><td class='linenumbers'><pre><a id='n1' href='#n1'>1</a>
<a id='n2' href='#n2'>2</a>
<a id='n3' href='#n3'>3</a>
<a id='n4' href='#n4'>4</a>
<a id='n5' href='#n5'>5</a>
<a id='n6' href='#n6'>6</a>
<a id='n7' href='#n7'>7</a>
<a id='n8' href='#n8'>8</a>
<a id='n9' href='#n9'>9</a>
<a id='n10' href='#n10'>10</a>
<a id='n11' href='#n11'>11</a>
<a id='n12' href='#n12'>12</a>
<a id='n13' href='#n13'>13</a>
<a id='n14' href='#n14'>14</a>
<a id='n15' href='#n15'>15</a>
<a id='n16' href='#n16'>16</a>
<a id='n17' href='#n17'>17</a>
<a id='n18' href='#n18'>18</a>
<a id='n19' href='#n19'>19</a>
<a id='n20' href='#n20'>20</a>
<a id='n21' href='#n21'>21</a>
<a id='n22' href='#n22'>22</a>
<a id='n23' href='#n23'>23</a>
<a id='n24' href='#n24'>24</a>
<a id='n25' href='#n25'>25</a>
<a id='n26' href='#n26'>26</a>
<a id='n27' href='#n27'>27</a>
<a id='n28' href='#n28'>28</a>
<a id='n29' href='#n29'>29</a>
<a id='n30' href='#n30'>30</a>
<a id='n31' href='#n31'>31</a>
<a id='n32' href='#n32'>32</a>
<a id='n33' href='#n33'>33</a>
<a id='n34' href='#n34'>34</a>
<a id='n35' href='#n35'>35</a>
<a id='n36' href='#n36'>36</a>
<a id='n37' href='#n37'>37</a>
<a id='n38' href='#n38'>38</a>
<a id='n39' href='#n39'>39</a>
<a id='n40' href='#n40'>40</a>
<a id='n41' href='#n41'>41</a>
<a id='n42' href='#n42'>42</a>
</pre></td>
<td class='lines'><pre><code><style>pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */</style><div class="highlight"><pre><span></span><span class="c1"># Redmine - project management software</span>
<span class="c1"># Copyright (C) 2006-2015  Jean-Philippe Lang</span>
<span class="c1">#</span>
<span class="c1"># This program is free software; you can redistribute it and/or</span>
<span class="c1"># modify it under the terms of the GNU General Public License</span>
<span class="c1"># as published by the Free Software Foundation; either version 2</span>
<span class="c1"># of the License, or (at your option) any later version.</span>
<span class="c1">#</span>
<span class="c1"># This program is distributed in the hope that it will be useful,</span>
<span class="c1"># but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<span class="c1"># MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<span class="c1"># GNU General Public License for more details.</span>
<span class="c1">#</span>
<span class="c1"># You should have received a copy of the GNU General Public License</span>
<span class="c1"># along with this program; if not, write to the Free Software</span>
<span class="c1"># Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.</span>

<span class="k">class</span><span class="w"> </span><span class="nc">ProjectEnumerationsController</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="no">ApplicationController</span>
<span class="w">  </span><span class="n">before_filter</span><span class="w"> </span><span class="ss">:find_project_by_project_id</span>
<span class="w">  </span><span class="n">before_filter</span><span class="w"> </span><span class="ss">:authorize</span>

<span class="w">  </span><span class="k">def</span><span class="w"> </span><span class="nf">update</span>
<span class="w">    </span><span class="k">if</span><span class="w"> </span><span class="n">params</span><span class="o">[</span><span class="ss">:enumerations</span><span class="o">]</span>
<span class="w">      </span><span class="no">Project</span><span class="o">.</span><span class="n">transaction</span><span class="w"> </span><span class="k">do</span>
<span class="w">        </span><span class="n">params</span><span class="o">[</span><span class="ss">:enumerations</span><span class="o">].</span><span class="n">each</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="nb">id</span><span class="p">,</span><span class="w"> </span><span class="n">activity</span><span class="o">|</span>
<span class="w">          </span><span class="vi">@project</span><span class="o">.</span><span class="n">update_or_create_time_entry_activity</span><span class="p">(</span><span class="nb">id</span><span class="p">,</span><span class="w"> </span><span class="n">activity</span><span class="p">)</span>
<span class="w">        </span><span class="k">end</span>
<span class="w">      </span><span class="k">end</span>
<span class="w">      </span><span class="n">flash</span><span class="o">[</span><span class="ss">:notice</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">l</span><span class="p">(</span><span class="ss">:notice_successful_update</span><span class="p">)</span>
<span class="w">    </span><span class="k">end</span>

<span class="w">    </span><span class="n">redirect_to</span><span class="w"> </span><span class="n">settings_project_path</span><span class="p">(</span><span class="vi">@project</span><span class="p">,</span><span class="w"> </span><span class="ss">:tab</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;activities&#39;</span><span class="p">)</span>
<span class="w">  </span><span class="k">end</span>

<span class="w">  </span><span class="k">def</span><span class="w"> </span><span class="nf">destroy</span>
<span class="w">    </span><span class="vi">@project</span><span class="o">.</span><span class="n">time_entry_activities</span><span class="o">.</span><span class="n">each</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="o">|</span><span class="n">time_entry_activity</span><span class="o">|</span>
<span class="w">      </span><span class="n">time_entry_activity</span><span class="o">.</span><span class="n">destroy</span><span class="p">(</span><span class="n">time_entry_activity</span><span class="o">.</span><span class="n">parent</span><span class="p">)</span>
<span class="w">    </span><span class="k">end</span>
<span class="w">    </span><span class="n">flash</span><span class="o">[</span><span class="ss">:notice</span><span class="o">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">l</span><span class="p">(</span><span class="ss">:notice_successful_update</span><span class="p">)</span>
<span class="w">    </span><span class="n">redirect_to</span><span class="w"> </span><span class="n">settings_project_path</span><span class="p">(</span><span class="vi">@project</span><span class="p">,</span><span class="w"> </span><span class="ss">:tab</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s1">&#39;activities&#39;</span><span class="p">)</span>
<span class="w">  </span><span class="k">end</span>
<span class="k">end</span>
</pre></div>
r the License.</span>
<span class="cm"> */</span>
<span class="kn">package</span><span class="w"> </span><span class="nn">com.gitblit.servlet</span><span class="p">;</span>

<span class="kn">import</span><span class="w"> </span><span class="nn">java.io.ByteArrayOutputStream</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.io.File</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.io.FileInputStream</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.io.IOException</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.io.InputStream</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">java.io.OutputStream</span><span class="p">;</span>

<span class="kn">import</span><span class="w"> </span><span class="nn">com.google.inject.Inject</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">com.google.inject.Singleton</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">javax.servlet.ServletException</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">javax.servlet.http.HttpServlet</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">javax.servlet.http.HttpServletRequest</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">javax.servlet.http.HttpServletResponse</span><span class="p">;</span>

<span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.commons.compress.archivers.tar.TarArchiveEntry</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.commons.compress.archivers.tar.TarArchiveOutputStream</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.commons.compress.archivers.zip.ZipArchiveEntry</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.commons.compress.compressors.CompressorOutputStream</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.commons.compress.compressors.CompressorStreamFactory</span><span class="p">;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">org.eclipse.jgit.lib.FileMode</span><span class="p">;</span>

<span class="kn">import</span><span class="w"> </span><span class="nn">com.gitblit.manager.IRuntimeManager</span><span class="p">;</span>

<span class="cm">/**</span>
<span class="cm"> * Handles requests for the Barnum pt (patchset tool).</span>
<span class="cm"> *</span>
<span class="cm"> * The user-agent determines the content and compression format.</span>
<span class="cm"> *</span>
<span class="cm"> * @author James Moger</span>
<span class="cm"> *</span>
<span class="cm"> */</span>
<span class="nd">@Singleton</span>
<span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">PtServlet</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">HttpServlet</span><span class="w"> </span><span class="p">{</span>

<span class="w">	</span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="n">serialVersionUID</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1L</span><span class="p">;</span>

<span class="w">	</span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="n">lastModified</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">currentTimeMillis</span><span class="p">();</span>

<span class="w">	</span><span class="kd">private</span><span class="w"> </span><span class="n">IRuntimeManager</span><span class="w"> </span><span class="n">runtimeManager</span><span class="p">;</span>

<span class="w">	</span><span class="nd">@Inject</span>
<span class="w">	</span><span class="kd">public</span><span class="w"> </span><span class="nf">PtServlet</span><span class="p">(</span><span class="n">IRuntimeManager</span><span class="w"> </span><span class="n">runtimeManager</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="k">this</span><span class="p">.</span><span class="na">runtimeManager</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">runtimeManager</span><span class="p">;</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="nd">@Override</span>
<span class="w">	</span><span class="kd">protected</span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="nf">getLastModified</span><span class="p">(</span><span class="n">HttpServletRequest</span><span class="w"> </span><span class="n">req</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="n">File</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">runtimeManager</span><span class="p">.</span><span class="na">getFileOrFolder</span><span class="p">(</span><span class="s">&quot;tickets.pt&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;${baseFolder}/pt.py&quot;</span><span class="p">);</span>
<span class="w">		</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">file</span><span class="p">.</span><span class="na">exists</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="n">Math</span><span class="p">.</span><span class="na">max</span><span class="p">(</span><span class="n">lastModified</span><span class="p">,</span><span class="w"> </span><span class="n">file</span><span class="p">.</span><span class="na">lastModified</span><span class="p">());</span>
<span class="w">		</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="n">lastModified</span><span class="p">;</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="nd">@Override</span>
<span class="w">	</span><span class="kd">protected</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">doGet</span><span class="p">(</span><span class="n">HttpServletRequest</span><span class="w"> </span><span class="n">request</span><span class="p">,</span><span class="w"> </span><span class="n">HttpServletResponse</span><span class="w"> </span><span class="n">response</span><span class="p">)</span>
<span class="w">			</span><span class="kd">throws</span><span class="w"> </span><span class="n">ServletException</span><span class="p">,</span><span class="w"> </span><span class="n">IOException</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">response</span><span class="p">.</span><span class="na">setContentType</span><span class="p">(</span><span class="s">&quot;application/octet-stream&quot;</span><span class="p">);</span>
<span class="w">			</span><span class="n">response</span><span class="p">.</span><span class="na">setDateHeader</span><span class="p">(</span><span class="s">&quot;Last-Modified&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">lastModified</span><span class="p">);</span>
<span class="w">			</span><span class="n">response</span><span class="p">.</span><span class="na">setHeader</span><span class="p">(</span><span class="s">&quot;Cache-Control&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;none&quot;</span><span class="p">);</span>
<span class="w">			</span><span class="n">response</span><span class="p">.</span><span class="na">setHeader</span><span class="p">(</span><span class="s">&quot;Pragma&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;no-cache&quot;</span><span class="p">);</span>
<span class="w">			</span><span class="n">response</span><span class="p">.</span><span class="na">setDateHeader</span><span class="p">(</span><span class="s">&quot;Expires&quot;</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span>

<span class="w">			</span><span class="kt">boolean</span><span class="w"> </span><span class="n">windows</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">false</span><span class="p">;</span>
<span class="w">			</span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">String</span><span class="w"> </span><span class="n">useragent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">request</span><span class="p">.</span><span class="na">getHeader</span><span class="p">(</span><span class="s">&quot;user-agent&quot;</span><span class="p">).</span><span class="na">toString</span><span class="p">();</span>
<span class="w">				</span><span class="n">windows</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">useragent</span><span class="p">.</span><span class="na">toLowerCase</span><span class="p">().</span><span class="na">contains</span><span class="p">(</span><span class="s">&quot;windows&quot;</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">Exception</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="p">}</span>

<span class="w">			</span><span class="kt">byte</span><span class="o">[]</span><span class="w"> </span><span class="n">pyBytes</span><span class="p">;</span>
<span class="w">			</span><span class="n">File</span><span class="w"> </span><span class="n">file</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">runtimeManager</span><span class="p">.</span><span class="na">getFileOrFolder</span><span class="p">(</span><span class="s">&quot;tickets.pt&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;${baseFolder}/pt.py&quot;</span><span class="p">);</span>
<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">file</span><span class="p">.</span><span class="na">exists</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="c1">// custom script</span>
<span class="w">				</span><span class="n">pyBytes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">readAll</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">FileInputStream</span><span class="p">(</span><span class="n">file</span><span class="p">));</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="c1">// default script</span>
<span class="w">				</span><span class="n">pyBytes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">readAll</span><span class="p">(</span><span class="n">getClass</span><span class="p">().</span><span class="na">getResourceAsStream</span><span class="p">(</span><span class="s">&quot;/pt.py&quot;</span><span class="p">));</span>
<span class="w">			</span><span class="p">}</span>

<span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">windows</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="c1">// windows: download zip file with pt.py and pt.cmd</span>
<span class="w">				</span><span class="n">response</span><span class="p">.</span><span class="na">setHeader</span><span class="p">(</span><span class="s">&quot;Content-Disposition&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;attachment; filename=\&quot;pt.zip\&quot;&quot;</span><span class="p">);</span>

<span class="w">				</span><span class="n">OutputStream</span><span class="w"> </span><span class="n">os</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">response</span><span class="p">.</span><span class="na">getOutputStream</span><span class="p">();</span>
<span class="w">				</span><span class="n">ZipArchiveOutputStream</span><span class="w"> </span><span class="n">zos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">ZipArchiveOutputStream</span><span class="p">(</span><span class="n">os</span><span class="p">);</span>

<span class="w">				</span><span class="c1">// add the Python script</span>
<span class="w">				</span><span class="n">ZipArchiveEntry</span><span class="w"> </span><span class="n">pyEntry</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">ZipArchiveEntry</span><span class="p">(</span><span class="s">&quot;pt.py&quot;</span><span class="p">);</span>
<span class="w">				</span><span class="n">pyEntry</span><span class="p">.</span><span class="na">setSize</span><span class="p">(</span><span class="n">pyBytes</span><span class="p">.</span><span class="na">length</span><span class="p">);</span>
<span class="w">				</span><span class="n">pyEntry</span><span class="p">.</span><span class="na">setUnixMode</span><span class="p">(</span><span class="n">FileMode</span><span class="p">.</span><span class="na">EXECUTABLE_FILE</span><span class="p">.</span><span class="na">getBits</span><span class="p">());</span>
<span class="w">				</span><span class="n">pyEntry</span><span class="p">.</span><span class="na">setTime</span><span class="p">(</span><span class="n">lastModified</span><span class="p">);</span>
<span class="w">				</span><span class="n">zos</span><span class="p">.</span><span class="na">putArchiveEntry</span><span class="p">(</span><span class="n">pyEntry</span><span class="p">);</span>
<span class="w">				</span><span class="n">zos</span><span class="p">.</span><span class="na">write</span><span class="p">(</span><span class="n">pyBytes</span><span class="p">);</span>
<span class="w">				</span><span class="n">zos</span><span class="p">.</span><span class="na">closeArchiveEntry</span><span class="p">();</span>

<span class="w">				</span><span class="c1">// add a Python launch cmd file</span>
<span class="w">				</span><span class="kt">byte</span><span class="w"> </span><span class="o">[]</span><span class="w"> </span><span class="n">cmdBytes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">readAll</span><span class="p">(</span><span class="n">getClass</span><span class="p">().</span><span class="na">getResourceAsStream</span><span class="p">(</span><span class="s">&quot;/pt.cmd&quot;</span><span class="p">));</span>
<span class="w">				</span><span class="n">ZipArchiveEntry</span><span class="w"> </span><span class="n">cmdEntry</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">ZipArchiveEntry</span><span class="p">(</span><span class="s">&quot;pt.cmd&quot;</span><span class="p">);</span>
<span class="w">				</span><span class="n">cmdEntry</span><span class="p">.</span><span class="na">setSize</span><span class="p">(</span><span class="n">cmdBytes</span><span class="p">.</span><span class="na">length</span><span class="p">);</span>
<span class="w">				</span><span class="n">cmdEntry</span><span class="p">.</span><span class="na">setUnixMode</span><span class="p">(</span><span class="n">FileMode</span><span class="p">.</span><span class="na">REGULAR_FILE</span><span class="p">.</span><span class="na">getBits</span><span class="p">());</span>
<span class="w">				</span><span class="n">cmdEntry</span><span class="p">.</span><span class="na">setTime</span><span class="p">(</span><span class="n">lastModified</span><span class="p">);</span>
<span class="w">				</span><span class="n">zos</span><span class="p">.</span><span class="na">putArchiveEntry</span><span class="p">(</span><span class="n">cmdEntry</span><span class="p">);</span>
<span class="w">				</span><span class="n">zos</span><span class="p">.</span><span class="na">write</span><span class="p">(</span><span class="n">cmdBytes</span><span class="p">);</span>
<span class="w">				</span><span class="n">zos</span><span class="p">.</span><span class="na">closeArchiveEntry</span><span class="p">();</span>

<span class="w">				</span><span class="c1">// add a brief readme</span>
<span class="w">				</span><span class="kt">byte</span><span class="w"> </span><span class="o">[]</span><span class="w"> </span><span class="n">txtBytes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">readAll</span><span class="p">(</span><span class="n">getClass</span><span class="p">().</span><span class="na">getResourceAsStream</span><span class="p">(</span><span class="s">&quot;/pt.txt&quot;</span><span class="p">));</span>
<span class="w">				</span><span class="n">ZipArchiveEntry</span><span class="w"> </span><span class="n">txtEntry</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">ZipArchiveEntry</span><span class="p">(</span><span class="s">&quot;readme.txt&quot;</span><span class="p">);</span>
<span class="w">				</span><span class="n">txtEntry</span><span class="p">.</span><span class="na">setSize</span><span class="p">(</span><span class="n">txtBytes</span><span class="p">.</span><span class="na">length</span><span class="p">);</span>
<span class="w">				</span><span class="n">txtEntry</span><span class="p">.</span><span class="na">setUnixMode</span><span class="p">(</span><span class="n">FileMode</span><span class="p">.</span><span class="na">REGULAR_FILE</span><span class="p">.</span><span class="na">getBits</span><span class="p">());</span>
<span class="w">				</span><span class="n">txtEntry</span><span class="p">.</span><span class="na">setTime</span><span class="p">(</span><span class="n">lastModified</span><span class="p">);</span>
<span class="w">				</span><span class="n">zos</span><span class="p">.</span><span class="na">putArchiveEntry</span><span class="p">(</span><span class="n">txtEntry</span><span class="p">);</span>
<span class="w">				</span><span class="n">zos</span><span class="p">.</span><span class="na">write</span><span class="p">(</span><span class="n">txtBytes</span><span class="p">);</span>
<span class="w">				</span><span class="n">zos</span><span class="p">.</span><span class="na">closeArchiveEntry</span><span class="p">();</span>

<span class="w">				</span><span class="c1">// cleanup</span>
<span class="w">				</span><span class="n">zos</span><span class="p">.</span><span class="na">finish</span><span class="p">();</span>
<span class="w">				</span><span class="n">zos</span><span class="p">.</span><span class="na">close</span><span class="p">();</span>
<span class="w">				</span><span class="n">os</span><span class="p">.</span><span class="na">flush</span><span class="p">();</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="c1">// unix: download a tar.gz file with pt.py set with execute permissions</span>
<span class="w">				</span><span class="n">response</span><span class="p">.</span><span class="na">setHeader</span><span class="p">(</span><span class="s">&quot;Content-Disposition&quot;</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;attachment; filename=\&quot;pt.tar.gz\&quot;&quot;</span><span class="p">);</span>

<span class="w">				</span><span class="n">OutputStream</span><span class="w"> </span><span class="n">os</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">response</span><span class="p">.</span><span class="na">getOutputStream</span><span class="p">();</span>
<span class="w">				</span><span class="n">CompressorOutputStream</span><span class="w"> </span><span class="n">cos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">CompressorStreamFactory</span><span class="p">().</span><span class="na">createCompressorOutputStream</span><span class="p">(</span><span class="n">CompressorStreamFactory</span><span class="p">.</span><span class="na">GZIP</span><span class="p">,</span><span class="w"> </span><span class="n">os</span><span class="p">);</span>
<span class="w">				</span><span class="n">TarArchiveOutputStream</span><span class="w"> </span><span class="n">tos</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">TarArchiveOutputStream</span><span class="p">(</span><span class="n">cos</span><span class="p">);</span>
<span class="w">				</span><span class="n">tos</span><span class="p">.</span><span class="na">setAddPaxHeadersForNonAsciiNames</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
<span class="w">				</span><span class="n">tos</span><span class="p">.</span><span class="na">setLongFileMode</span><span class="p">(</span><span class="n">TarArchiveOutputStream</span><span class="p">.</span><span class="na">LONGFILE_POSIX</span><span class="p">);</span>

<span class="w">				</span><span class="c1">// add the Python script</span>
<span class="w">				</span><span class="n">TarArchiveEntry</span><span class="w"> </span><span class="n">pyEntry</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">TarArchiveEntry</span><span class="p">(</span><span class="s">&quot;pt&quot;</span><span class="p">);</span>
<span class="w">				</span><span class="n">pyEntry</span><span class="p">.</span><span class="na">setMode</span><span class="p">(</span><span class="n">FileMode</span><span class="p">.</span><span class="na">EXECUTABLE_FILE</span><span class="p">.</span><span class="na">getBits</span><span class="p">());</span>
<span class="w">				</span><span class="n">pyEntry</span><span class="p">.</span><span class="na">setModTime</span><span class="p">(</span><span class="n">lastModified</span><span class="p">);</span>
<span class="w">				</span><span class="n">pyEntry</span><span class="p">.</span><span class="na">setSize</span><span class="p">(</span><span class="n">pyBytes</span><span class="p">.</span><span class="na">length</span><span class="p">);</span>
<span class="w">				</span><span class="n">tos</span><span class="p">.</span><span class="na">putArchiveEntry</span><span class="p">(</span><span class="n">pyEntry</span><span class="p">);</span>
<span class="w">				</span><span class="n">tos</span><span class="p">.</span><span class="na">write</span><span class="p">(</span><span class="n">pyBytes</span><span class="p">);</span>
<span class="w">				</span><span class="n">tos</span><span class="p">.</span><span class="na">closeArchiveEntry</span><span class="p">();</span>

<span class="w">				</span><span class="c1">// add a brief readme</span>
<span class="w">				</span><span class="kt">byte</span><span class="w"> </span><span class="o">[]</span><span class="w"> </span><span class="n">txtBytes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">readAll</span><span class="p">(</span><span class="n">getClass</span><span class="p">().</span><span class="na">getResourceAsStream</span><span class="p">(</span><span class="s">&quot;/pt.txt&quot;</span><span class="p">));</span>
<span class="w">				</span><span class="n">TarArchiveEntry</span><span class="w"> </span><span class="n">txtEntry</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">TarArchiveEntry</span><span class="p">(</span><span class="s">&quot;README&quot;</span><span class="p">);</span>
<span class="w">				</span><span class="n">txtEntry</span><span class="p">.</span><span class="na">setMode</span><span class="p">(</span><span class="n">FileMode</span><span class="p">.</span><span class="na">REGULAR_FILE</span><span class="p">.</span><span class="na">getBits</span><span class="p">());</span>
<span class="w">				</span><span class="n">txtEntry</span><span class="p">.</span><span class="na">setModTime</span><span class="p">(</span><span class="n">lastModified</span><span class="p">);</span>
<span class="w">				</span><span class="n">txtEntry</span><span class="p">.</span><span class="na">setSize</span><span class="p">(</span><span class="n">txtBytes</span><span class="p">.</span><span class="na">length</span><span class="p">);</span>
<span class="w">				</span><span class="n">tos</span><span class="p">.</span><span class="na">putArchiveEntry</span><span class="p">(</span><span class="n">txtEntry</span><span class="p">);</span>
<span class="w">				</span><span class="n">tos</span><span class="p">.</span><span class="na">write</span><span class="p">(</span><span class="n">txtBytes</span><span class="p">);</span>
<span class="w">				</span><span class="n">tos</span><span class="p">.</span><span class="na">closeArchiveEntry</span><span class="p">();</span>

<span class="w">				</span><span class="c1">// cleanup</span>
<span class="w">				</span><span class="n">tos</span><span class="p">.</span><span class="na">finish</span><span class="p">();</span>
<span class="w">				</span><span class="n">tos</span><span class="p">.</span><span class="na">close</span><span class="p">();</span>
<span class="w">				</span><span class="n">cos</span><span class="p">.</span><span class="na">close</span><span class="p">();</span>
<span class="w">				</span><span class="n">os</span><span class="p">.</span><span class="na">flush</span><span class="p">();</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">Exception</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">e</span><span class="p">.</span><span class="na">printStackTrace</span><span class="p">();</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">	</span><span class="p">}</span>

<span class="w">	</span><span class="kt">byte</span><span class="w"> </span><span class="o">[]</span><span class="w"> </span><span class="n">readAll</span><span class="p">(</span><span class="n">InputStream</span><span class="w"> </span><span class="n">is</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">		</span><span class="n">ByteArrayOutputStream</span><span class="w"> </span><span class="n">os</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">ByteArrayOutputStream</span><span class="p">();</span>
<span class="w">		</span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="kt">byte</span><span class="w"> </span><span class="o">[]</span><span class="w"> </span><span class="n">buffer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="kt">byte</span><span class="o">[</span><span class="mi">4096</span><span class="o">]</span><span class="p">;</span>
<span class="w">			</span><span class="kt">int</span><span class="w"> </span><span class="n">len</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w">			</span><span class="k">while</span><span class="w"> </span><span class="p">((</span><span class="n">len</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">is</span><span class="p">.</span><span class="na">read</span><span class="p">(</span><span class="n">buffer</span><span class="p">))</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">os</span><span class="p">.</span><span class="na">write</span><span class="p">(</span><span class="n">buffer</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">len</span><span class="p">);</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="n">os</span><span class="p">.</span><span class="na">toByteArray</span><span class="p">();</span>
<span class="w">		</span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">IOException</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="n">e</span><span class="p">.</span><span class="na">printStackTrace</span><span class="p">();</span>
<span class="w">		</span><span class="p">}</span><span class="w"> </span><span class="k">finally</span><span class="w"> </span><span class="p">{</span>
<span class="w">			</span><span class="k">try</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="n">os</span><span class="p">.</span><span class="na">close</span><span class="p">();</span>
<span class="w">				</span><span class="n">is</span><span class="p">.</span><span class="na">close</span><span class="p">();</span>
<span class="w">			</span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">Exception</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w">				</span><span class="c1">// ignore</span>
<span class="w">			</span><span class="p">}</span>
<span class="w">		</span><span class="p">}</span>
<span class="w">		</span><span class="k">return</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="kt">byte</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span><span class="p">;</span>
<span class="w">	</span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.39.1</a>) at 2025-07-25 03:10:21 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
