You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by jl...@apache.org on 2019/05/26 08:48:43 UTC

[netbeans-jackpot30] branch master updated: Pull request handler prototype

This is an automated email from the ASF dual-hosted git repository.

jlahoda pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans-jackpot30.git


The following commit(s) were added to refs/heads/master by this push:
     new 9b49ca5  Pull request handler prototype
9b49ca5 is described below

commit 9b49ca5bf689334bc4cabd7a49e4ce338b170618
Author: Jan Lahoda <jl...@netbeans.org>
AuthorDate: Sun May 26 10:48:39 2019 +0200

    Pull request handler prototype
---
 prs/build.xml                                      |  50 ++
 prs/handler/build.xml                              |  35 ++
 prs/handler/impl/build.xml                         |  42 ++
 prs/handler/impl/manifest.mf                       |   6 +
 prs/handler/impl/nbproject/build-impl.xml          |  62 +++
 prs/handler/impl/nbproject/genfiles.properties     |  23 +
 prs/handler/impl/nbproject/project.properties      |  19 +
 prs/handler/impl/nbproject/project.xml             | 328 ++++++++++++
 prs/handler/impl/nbproject/suite.properties        |  16 +
 prs/handler/impl/release/modules/ext/.gitignore    |   1 +
 prs/handler/impl/release/modules/ext/binaries-list |   9 +
 .../modules/ext/commons-codec-1.7-license.txt      | 202 ++++++++
 .../modules/ext/commons-codec-1.7-notice.txt       |  14 +
 .../release/modules/ext/commons-io-1.4-license.txt | 203 ++++++++
 .../release/modules/ext/commons-io-1.4-notice.txt  |   6 +
 .../modules/ext/commons-lang3-3.7-license.txt      | 202 ++++++++
 .../modules/ext/commons-lang3-3.7-notice.txt       |   8 +
 .../release/modules/ext/diffparser-1.4-license.txt | 191 +++++++
 .../release/modules/ext/diffparser-1.4-notice.txt  |  14 +
 .../ext/jackson-annotations-2.9.0-license.txt      |   8 +
 .../modules/ext/jackson-core-2.9.2-license.txt     |   8 +
 .../modules/ext/jackson-core-2.9.2-notice.txt      |  20 +
 .../modules/ext/jackson-databind-2.9.2-license.txt |   8 +
 .../modules/ext/jackson-databind-2.9.2-notice.txt  |  20 +
 .../modules/ext/slf4j-api-1.7.25-license.txt       |  21 +
 prs/handler/impl/script/handler                    |   3 +
 prs/handler/impl/script/handler.docker             |  65 +++
 prs/handler/impl/script/handler.remote             |  14 +
 .../jackpot/prs/handler/impl/Bundle.properties     |  16 +
 .../prs/handler/impl/HandlePullRequest.java        | 266 ++++++++++
 .../jackpot/prs/handler/impl/MimeLookupImpl.java   |  92 ++++
 .../modules/jackpot/prs/handler/impl/cfg_hints.xml | 563 +++++++++++++++++++++
 .../prs/handler/impl/HandlePullRequestTest.java    |  27 +
 prs/handler/nbproject/build-impl.xml               |  67 +++
 prs/handler/nbproject/genfiles.properties          |  26 +
 prs/handler/nbproject/platform.properties          |  23 +
 prs/handler/nbproject/platform.xml                 |  51 ++
 prs/handler/nbproject/project.properties           |  22 +
 prs/handler/nbproject/project.xml                  |  26 +
 prs/handler/org.apache.commons.codec/build.xml     |  25 +
 prs/handler/org.apache.commons.codec/manifest.mf   |   6 +
 .../nbproject/build-impl.xml                       |  62 +++
 .../nbproject/genfiles.properties                  |  23 +
 .../nbproject/project.properties                   |  18 +
 .../org.apache.commons.codec/nbproject/project.xml |  33 ++
 .../nbproject/suite.properties                     |  16 +
 .../release/modules/ext/binaries-list              |  17 +
 .../modules/ext/commons-codec-1.3-license.txt      | 208 ++++++++
 .../modules/ext/commons-codec-1.3-notice.txt       |   3 +
 .../release/modules/ext/commons-codec-1.3.jar      | Bin 0 -> 46725 bytes
 .../src/org/apache/commons/codec/Bundle.properties |  16 +
 prs/handler/org.apache.commons.logging/build.xml   |  25 +
 prs/handler/org.apache.commons.logging/manifest.mf |   6 +
 .../nbproject/build-impl.xml                       |  62 +++
 .../nbproject/genfiles.properties                  |  23 +
 .../nbproject/project.properties                   |  18 +
 .../nbproject/project.xml                          |  33 ++
 .../nbproject/suite.properties                     |  16 +
 .../release/modules/ext/binaries-list              |  17 +
 .../modules/ext/commons-logging-1.1.1-license.txt  | 208 ++++++++
 .../modules/ext/commons-logging-1.1.1-notice.txt   |  15 +
 .../release/modules/ext/commons-logging-1.1.1.jar  | Bin 0 -> 60686 bytes
 .../org/apache/commons/logging/Bundle.properties   |  16 +
 prs/script/prs                                     |   1 +
 prs/webapp/pom.xml                                 |  88 ++++
 .../org/netbeans/jackpot/prs/webapp/Config.java    |  46 ++
 .../org/netbeans/jackpot/prs/webapp/WebApp.java    |  84 +++
 .../jackpot/prs/webapp/WebAppAuthTarget.java       |  92 ++++
 .../jackpot/prs/webapp/WebAppEnableDisable.java    |  91 ++++
 .../jackpot/prs/webapp/WebAppMainPage.java         | 106 ++++
 .../netbeans/jackpot/prs/webapp/WebAppNotify.java  |  77 +++
 71 files changed, 4228 insertions(+)

diff --git a/prs/build.xml b/prs/build.xml
new file mode 100644
index 0000000..cac238e
--- /dev/null
+++ b/prs/build.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<project name="prs" default="build" basedir=".">
+    <target name="build">
+        <ant dir="handler" target="download-ext-bins" />
+        <ant dir="handler/impl" target="clean" />
+        <ant dir="handler/impl" target="build-prs-handler" />
+        <exec executable="mvn" dir="webapp">
+            <arg value="clean" />
+        </exec>
+        <exec executable="mvn" dir="webapp">
+            <arg value="install" />
+        </exec>
+        <exec executable="mvn" dir="webapp">
+            <arg value="dependency:copy-dependencies" />
+        </exec>
+        <delete dir="build/prs" />
+        <mkdir dir="build/prs" />
+        <copy todir="build/prs/handler">
+             <fileset dir="handler/impl/build/handler"/>
+        </copy>
+        <copy todir="build/prs/webapp/dependency">
+             <fileset dir="webapp/target/dependency"/>
+        </copy>
+        <copy todir="build/prs/webapp/">
+             <fileset dir="webapp/target/" includes="webapp*" />
+        </copy>
+        <copy todir="build/prs/">
+             <fileset dir="script" includes="prs"/>
+        </copy>
+        <chmod file="build/prs/handler/bin/handler" perm="u+x" />
+        <chmod file="build/prs/prs" perm="u+x" />
+    </target>
+</project>
diff --git a/prs/handler/build.xml b/prs/handler/build.xml
new file mode 100644
index 0000000..ac82104
--- /dev/null
+++ b/prs/handler/build.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="handler" basedir=".">
+    <description>Builds the module suite handler.</description>
+    <import file="nbproject/build-impl.xml"/>
+    <target name="download-ext-bins">
+         <taskdef name="downloadbinaries" classname="org.netbeans.nbbuild.extlibs.DownloadBinaries" classpath="${harness.dir}/tasks.jar"/>
+         <property name="binaries.cache" location="${user.home}/.hgexternalcache"/>
+         <property name="binaries.server" value="http://netbeans.osuosl.org/binaries/"/>
+         <downloadbinaries cache="${binaries.cache}" server="${binaries.server}">
+             <manifest dir="${basedir}">
+                 <include name="**/binaries-list"/>
+             </manifest>
+         </downloadbinaries>
+    </target>
+</project>
diff --git a/prs/handler/impl/build.xml b/prs/handler/impl/build.xml
new file mode 100644
index 0000000..808ad44
--- /dev/null
+++ b/prs/handler/impl/build.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="org.netbeans.modules.jackpot.prs.handler.impl" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project org.netbeans.modules.jackpot.prs.handler.impl.</description>
+    <import file="nbproject/build-impl.xml"/>
+    <target name="build-prs-handler" depends="build,test-init">
+        <mkdir dir="${handler.build.dir}/bin" />
+        <mkdir dir="${handler.build.dir}/lib" />
+        <copy todir="${handler.build.dir}/lib" flatten="true" failonerror="false">
+            <path refid="test.unit.run.cp" />
+        </copy>
+        <copy todir="${handler.build.dir}/bin" file="script/handler" />
+        <copy todir="${handler.build.dir}/bin" file="script/handler.docker" />
+        <copy todir="${handler.build.dir}/bin" file="script/handler.remote" />
+        <chmod file="${handler.build.dir}/bin/handler*" perm="u+x" />
+        <delete file="${handler.build.dir}/lib/nb-javac-9-api.jar" />
+        <delete file="${handler.build.dir}/lib/nb-javac-9-impl.jar" />
+        <delete file="${handler.build.dir}/lib/org-netbeans-modules-java-source-nbjavac.jar" />
+    </target>
+    <target name="clean" depends="projectized-common.clean">
+        <delete dir="${handler.build.dir}" />
+    </target>
+</project>
diff --git a/prs/handler/impl/manifest.mf b/prs/handler/impl/manifest.mf
new file mode 100644
index 0000000..109f88c
--- /dev/null
+++ b/prs/handler/impl/manifest.mf
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+AutoUpdate-Show-In-Client: true
+OpenIDE-Module: org.netbeans.modules.jackpot.prs.handler.impl
+OpenIDE-Module-Localizing-Bundle: org/netbeans/modules/jackpot/prs/handler/impl/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
diff --git a/prs/handler/impl/nbproject/build-impl.xml b/prs/handler/impl/nbproject/build-impl.xml
new file mode 100644
index 0000000..3466fc3
--- /dev/null
+++ b/prs/handler/impl/nbproject/build-impl.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="org.netbeans.modules.jackpot.prs.handler.impl-impl" basedir="..">
+    <fail message="Please build using Ant 1.7.1 or higher.">
+        <condition>
+            <not>
+                <antversion atleast="1.7.1"/>
+            </not>
+        </condition>
+    </fail>
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <macrodef name="evalprops" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="property"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{property}" value="@{value}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="nbplatform.active.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:evalprops property="cluster.path.evaluated" value="${cluster.path}" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="Path to 'platform' cluster missing in $${cluster.path} property or using corrupt Netbeans Platform (missing harness).">
+        <condition>
+            <not>
+                <contains string="${cluster.path.evaluated}" substring="platform"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/prs/handler/impl/nbproject/genfiles.properties b/prs/handler/impl/nbproject/genfiles.properties
new file mode 100644
index 0000000..7729482
--- /dev/null
+++ b/prs/handler/impl/nbproject/genfiles.properties
@@ -0,0 +1,23 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+build.xml.data.CRC32=60cfbba1
+build.xml.script.CRC32=61b1f922
+build.xml.stylesheet.CRC32=15ca8a54@2.76
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=49a666be
+nbproject/build-impl.xml.script.CRC32=e6a5df10
+nbproject/build-impl.xml.stylesheet.CRC32=49aa68b0@2.76
diff --git a/prs/handler/impl/nbproject/project.properties b/prs/handler/impl/nbproject/project.properties
new file mode 100644
index 0000000..4d6f81a
--- /dev/null
+++ b/prs/handler/impl/nbproject/project.properties
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+javac.source=11
+javac.compilerargs=-Xlint -Xlint:-serial
+handler.build.dir=build/handler
+test.run.args=--add-exports jdk.javadoc/com.sun.tools.javadoc.main=ALL-UNNAMED
diff --git a/prs/handler/impl/nbproject/project.xml b/prs/handler/impl/nbproject/project.xml
new file mode 100644
index 0000000..9bdc239
--- /dev/null
+++ b/prs/handler/impl/nbproject/project.xml
@@ -0,0 +1,328 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>org.netbeans.modules.jackpot.prs.handler.impl</code-name-base>
+            <suite-component/>
+            <module-dependencies>
+                <dependency>
+                    <code-name-base>org.netbeans.bootstrap</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <implementation-version/>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.core.netigso</code-name-base>
+                    <run-dependency>
+                        <specification-version>1.35</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.core.osgi</code-name-base>
+                    <run-dependency>
+                        <specification-version>1.26</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.core.startup</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <implementation-version/>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.core.windows</code-name-base>
+                    <run-dependency>
+                        <release-version>2</release-version>
+                        <specification-version>2.86</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.libs.felix</code-name-base>
+                    <run-dependency>
+                        <specification-version>2.19</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.libs.freemarker</code-name-base>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>2.38.0.238</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.apisupport.ant</code-name-base>
+                    <run-dependency>
+                        <specification-version>2.76</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.editor</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>3</release-version>
+                        <implementation-version/>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.editor.actions</code-name-base>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.35.0.55</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.editor.lib</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>3</release-version>
+                        <specification-version>4.11.0.23.3.55</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.editor.lib2</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>2.22.0.55.3</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.editor.mimelookup</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.44</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.editor.tools.storage</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>1.12</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.java.editor</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <implementation-version/>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.java.hints</code-name-base>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.87.0.17.25.12.1.1.32.4.1.13</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.java.j2seplatform</code-name-base>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.45</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.java.source.base</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <implementation-version/>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.maven</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>2</release-version>
+                        <implementation-version/>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.netbinox</code-name-base>
+                    <run-dependency>
+                        <specification-version>1.45</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.parsing.indexing</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <implementation-version/>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.parsing.nb</code-name-base>
+                    <run-dependency>
+                        <specification-version>1.7.0.8.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.projectapi</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.71</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.projectapi.nb</code-name-base>
+                    <run-dependency>
+                        <specification-version>1.7</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.projectuiapi.base</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.89.0.9</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.modules.xml.xdm</code-name-base>
+                    <run-dependency>
+                        <release-version>1</release-version>
+                        <specification-version>1.38.0.1</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.spi.editor.hints</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <release-version>0</release-version>
+                        <specification-version>1.46.0.7.55</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.spi.editor.hints.projects</code-name-base>
+                    <run-dependency>
+                        <specification-version>1.15.0.1.7</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.netbeans.spi.java.hints</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <implementation-version/>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.filesystems</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>9.14</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.modules</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>7.52</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.text</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>6.71</specification-version>
+                    </run-dependency>
+                </dependency>
+                <dependency>
+                    <code-name-base>org.openide.util.lookup</code-name-base>
+                    <build-prerequisite/>
+                    <compile-dependency/>
+                    <run-dependency>
+                        <specification-version>8.37</specification-version>
+                    </run-dependency>
+                </dependency>
+            </module-dependencies>
+            <test-dependencies>
+                <test-type>
+                    <name>unit</name>
+                    <test-dependency>
+                        <code-name-base>org.netbeans.libs.junit4</code-name-base>
+                        <compile-dependency/>
+                    </test-dependency>
+                </test-type>
+            </test-dependencies>
+            <public-packages/>
+            <class-path-extension>
+                <runtime-relative-path>ext/commons-codec-1.7.jar</runtime-relative-path>
+                <binary-origin>release/modules/ext/commons-codec-1.7.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/commons-io-1.4.jar</runtime-relative-path>
+                <binary-origin>release/modules/ext/commons-io-1.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/commons-lang3-3.7.jar</runtime-relative-path>
+                <binary-origin>release/modules/ext/commons-lang3-3.7.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/github-api-1.95.jar</runtime-relative-path>
+                <binary-origin>release/modules/ext/github-api-1.95.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/jackson-databind-2.9.2.jar</runtime-relative-path>
+                <binary-origin>release/modules/ext/jackson-databind-2.9.2.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/jackson-core-2.9.2.jar</runtime-relative-path>
+                <binary-origin>release/modules/ext/jackson-core-2.9.2.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/slf4j-api-1.7.25.jar</runtime-relative-path>
+                <binary-origin>release/modules/ext/slf4j-api-1.7.25.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/diffparser-1.4.jar</runtime-relative-path>
+                <binary-origin>release/modules/ext/diffparser-1.4.jar</binary-origin>
+            </class-path-extension>
+            <class-path-extension>
+                <runtime-relative-path>ext/jackson-annotations-2.9.0.jar</runtime-relative-path>
+                <binary-origin>release/modules/ext/jackson-annotations-2.9.0.jar</binary-origin>
+            </class-path-extension>
+        </data>
+    </configuration>
+</project>
diff --git a/prs/handler/impl/nbproject/suite.properties b/prs/handler/impl/nbproject/suite.properties
new file mode 100644
index 0000000..5f42472
--- /dev/null
+++ b/prs/handler/impl/nbproject/suite.properties
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+suite.dir=${basedir}/..
diff --git a/prs/handler/impl/release/modules/ext/.gitignore b/prs/handler/impl/release/modules/ext/.gitignore
new file mode 100644
index 0000000..d392f0e
--- /dev/null
+++ b/prs/handler/impl/release/modules/ext/.gitignore
@@ -0,0 +1 @@
+*.jar
diff --git a/prs/handler/impl/release/modules/ext/binaries-list b/prs/handler/impl/release/modules/ext/binaries-list
new file mode 100644
index 0000000..2d5ceff
--- /dev/null
+++ b/prs/handler/impl/release/modules/ext/binaries-list
@@ -0,0 +1,9 @@
+9CD61D269C88F9FB0EB36CEA1EFCD596AB74772F commons-codec:commons-codec:1.7
+A8762D07E76CFDE2395257A5DA47BA7C1DBD3DCE commons-io:commons-io:1.4
+557EDD918FD41F9260963583EBF5A61A43A6B423 org.apache.commons:commons-lang3:3.7
+4A193299C372973ECD7650F75D91853E0EA380C9 io.reflectoring.diffparser:diffparser:1.4
+381C85EE0EF95E827BA9821DCE1B7BDDA8392684 org.kohsuke:github-api:1.95
+07C10D545325E3A6E72E06381AFE469FD40EB701 com.fasterxml.jackson.core:jackson-annotations:2.9.0
+AED20E50152A2F19ADC1995C8D8F307C7EFA414D com.fasterxml.jackson.core:jackson-core:2.9.2
+1D8D8CB7CF26920BA57FB61FA56DA88CC123B21F com.fasterxml.jackson.core:jackson-databind:2.9.2
+DA76CA59F6A57EE3102F8F9BD9CEE742973EFA8A org.slf4j:slf4j-api:1.7.25
diff --git a/prs/handler/impl/release/modules/ext/commons-codec-1.7-license.txt b/prs/handler/impl/release/modules/ext/commons-codec-1.7-license.txt
new file mode 100644
index 0000000..75b5248
--- /dev/null
+++ b/prs/handler/impl/release/modules/ext/commons-codec-1.7-license.txt
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/prs/handler/impl/release/modules/ext/commons-codec-1.7-notice.txt b/prs/handler/impl/release/modules/ext/commons-codec-1.7-notice.txt
new file mode 100644
index 0000000..ef23138
--- /dev/null
+++ b/prs/handler/impl/release/modules/ext/commons-codec-1.7-notice.txt
@@ -0,0 +1,14 @@
+Apache Commons Codec
+Copyright 2002-2012 The Apache Software Foundation
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+
+--------------------------------------------------------------------------------
+src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java contains 
+test data from http://aspell.sourceforge.net/test/batch0.tab.
+
+Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org). Verbatim copying
+and distribution of this entire article is permitted in any medium,
+provided this notice is preserved.
+--------------------------------------------------------------------------------
diff --git a/prs/handler/impl/release/modules/ext/commons-io-1.4-license.txt b/prs/handler/impl/release/modules/ext/commons-io-1.4-license.txt
new file mode 100644
index 0000000..43e91eb
--- /dev/null
+++ b/prs/handler/impl/release/modules/ext/commons-io-1.4-license.txt
@@ -0,0 +1,203 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
diff --git a/prs/handler/impl/release/modules/ext/commons-io-1.4-notice.txt b/prs/handler/impl/release/modules/ext/commons-io-1.4-notice.txt
new file mode 100644
index 0000000..c482abe
--- /dev/null
+++ b/prs/handler/impl/release/modules/ext/commons-io-1.4-notice.txt
@@ -0,0 +1,6 @@
+Apache Commons IO
+Copyright 2001-2008 The Apache Software Foundation
+
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+
diff --git a/prs/handler/impl/release/modules/ext/commons-lang3-3.7-license.txt b/prs/handler/impl/release/modules/ext/commons-lang3-3.7-license.txt
new file mode 100644
index 0000000..75b5248
--- /dev/null
+++ b/prs/handler/impl/release/modules/ext/commons-lang3-3.7-license.txt
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/prs/handler/impl/release/modules/ext/commons-lang3-3.7-notice.txt b/prs/handler/impl/release/modules/ext/commons-lang3-3.7-notice.txt
new file mode 100644
index 0000000..7928bfd
--- /dev/null
+++ b/prs/handler/impl/release/modules/ext/commons-lang3-3.7-notice.txt
@@ -0,0 +1,8 @@
+Apache Commons Lang
+Copyright 2001-2017 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
+
+This product includes software from the Spring Framework,
+under the Apache License 2.0 (see: StringUtils.containsWhitespace())
diff --git a/prs/handler/impl/release/modules/ext/diffparser-1.4-license.txt b/prs/handler/impl/release/modules/ext/diffparser-1.4-license.txt
new file mode 100644
index 0000000..37ec93a
--- /dev/null
+++ b/prs/handler/impl/release/modules/ext/diffparser-1.4-license.txt
@@ -0,0 +1,191 @@
+Apache License
+Version 2.0, January 2004
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and
+distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright
+owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities
+that control, are controlled by, or are under common control with that entity.
+For the purposes of this definition, "control" means (i) the power, direct or
+indirect, to cause the direction or management of such entity, whether by
+contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the
+outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising
+permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including
+but not limited to software source code, documentation source, and configuration
+files.
+
+"Object" form shall mean any form resulting from mechanical transformation or
+translation of a Source form, including but not limited to compiled object code,
+generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made
+available under the License, as indicated by a copyright notice that is included
+in or attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that
+is based on (or derived from) the Work and for which the editorial revisions,
+annotations, elaborations, or other modifications represent, as a whole, an
+original work of authorship. For the purposes of this License, Derivative Works
+shall not include works that remain separable from, or merely link (or bind by
+name) to the interfaces of, the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version
+of the Work and any modifications or additions to that Work or Derivative Works
+thereof, that is intentionally submitted to Licensor for inclusion in the Work
+by the copyright owner or by an individual or Legal Entity authorized to submit
+on behalf of the copyright owner. For the purposes of this definition,
+"submitted" means any form of electronic, verbal, or written communication sent
+to the Licensor or its representatives, including but not limited to
+communication on electronic mailing lists, source code control systems, and
+issue tracking systems that are managed by, or on behalf of, the Licensor for
+the purpose of discussing and improving the Work, but excluding communication
+that is conspicuously marked or otherwise designated in writing by the copyright
+owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf
+of whom a Contribution has been received by Licensor and subsequently
+incorporated within the Work.
+
+2. Grant of Copyright License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable copyright license to reproduce, prepare Derivative Works of,
+publicly display, publicly perform, sublicense, and distribute the Work and such
+Derivative Works in Source or Object form.
+
+3. Grant of Patent License.
+
+Subject to the terms and conditions of this License, each Contributor hereby
+grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
+irrevocable (except as stated in this section) patent license to make, have
+made, use, offer to sell, sell, import, and otherwise transfer the Work, where
+such license applies only to those patent claims licensable by such Contributor
+that are necessarily infringed by their Contribution(s) alone or by combination
+of their Contribution(s) with the Work to which such Contribution(s) was
+submitted. If You institute patent litigation against any entity (including a
+cross-claim or counterclaim in a lawsuit) alleging that the Work or a
+Contribution incorporated within the Work constitutes direct or contributory
+patent infringement, then any patent licenses granted to You under this License
+for that Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution.
+
+You may reproduce and distribute copies of the Work or Derivative Works thereof
+in any medium, with or without modifications, and in Source or Object form,
+provided that You meet the following conditions:
+
+You must give any other recipients of the Work or Derivative Works a copy of
+this License; and
+You must cause any modified files to carry prominent notices stating that You
+changed the files; and
+You must retain, in the Source form of any Derivative Works that You distribute,
+all copyright, patent, trademark, and attribution notices from the Source form
+of the Work, excluding those notices that do not pertain to any part of the
+Derivative Works; and
+If the Work includes a "NOTICE" text file as part of its distribution, then any
+Derivative Works that You distribute must include a readable copy of the
+attribution notices contained within such NOTICE file, excluding those notices
+that do not pertain to any part of the Derivative Works, in at least one of the
+following places: within a NOTICE text file distributed as part of the
+Derivative Works; within the Source form or documentation, if provided along
+with the Derivative Works; or, within a display generated by the Derivative
+Works, if and wherever such third-party notices normally appear. The contents of
+the NOTICE file are for informational purposes only and do not modify the
+License. You may add Your own attribution notices within Derivative Works that
+You distribute, alongside or as an addendum to the NOTICE text from the Work,
+provided that such additional attribution notices cannot be construed as
+modifying the License.
+You may add Your own copyright statement to Your modifications and may provide
+additional or different license terms and conditions for use, reproduction, or
+distribution of Your modifications, or for any such Derivative Works as a whole,
+provided Your use, reproduction, and distribution of the Work otherwise complies
+with the conditions stated in this License.
+
+5. Submission of Contributions.
+
+Unless You explicitly state otherwise, any Contribution intentionally submitted
+for inclusion in the Work by You to the Licensor shall be under the terms and
+conditions of this License, without any additional terms or conditions.
+Notwithstanding the above, nothing herein shall supersede or modify the terms of
+any separate license agreement you may have executed with Licensor regarding
+such Contributions.
+
+6. Trademarks.
+
+This License does not grant permission to use the trade names, trademarks,
+service marks, or product names of the Licensor, except as required for
+reasonable and customary use in describing the origin of the Work and
+reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty.
+
+Unless required by applicable law or agreed to in writing, Licensor provides the
+Work (and each Contributor provides its Contributions) on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
+including, without limitation, any warranties or conditions of TITLE,
+NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are
+solely responsible for determining the appropriateness of using or
+redistributing the Work and assume any risks associated with Your exercise of
+permissions under this License.
+
+8. Limitation of Liability.
+
+In no event and under no legal theory, whether in tort (including negligence),
+contract, or otherwise, unless required by applicable law (such as deliberate
+and grossly negligent acts) or agreed to in writing, shall any Contributor be
+liable to You for damages, including any direct, indirect, special, incidental,
+or consequential damages of any character arising as a result of this License or
+out of the use or inability to use the Work (including but not limited to
+damages for loss of goodwill, work stoppage, computer failure or malfunction, or
+any and all other commercial damages or losses), even if such Contributor has
+been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability.
+
+While redistributing the Work or Derivative Works thereof, You may choose to
+offer, and charge a fee for, acceptance of support, warranty, indemnity, or
+other liability obligations and/or rights consistent with this License. However,
+in accepting such obligations, You may act only on Your own behalf and on Your
+sole responsibility, not on behalf of any other Contributor, and only if You
+agree to indemnify, defend, and hold each Contributor harmless for any liability
+incurred by, or claims asserted against, such Contributor by reason of your
+accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work
+
+To apply the Apache License to your work, attach the following boilerplate
+notice, with the fields enclosed by brackets "[]" replaced with your own
+identifying information. (Don't include the brackets!) The text should be
+enclosed in the appropriate comment syntax for the file format. We also
+recommend that a file or class name and description of purpose be included on
+the same "printed page" as the copyright notice for easier identification within
+third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/prs/handler/impl/release/modules/ext/diffparser-1.4-notice.txt b/prs/handler/impl/release/modules/ext/diffparser-1.4-notice.txt
new file mode 100644
index 0000000..ce0fbe2
--- /dev/null
+++ b/prs/handler/impl/release/modules/ext/diffparser-1.4-notice.txt
@@ -0,0 +1,14 @@
+   Copyright 2013-2017 Tom Hombergs (tom.hombergs@gmail.com | http://reflectoring.io)
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+   
diff --git a/prs/handler/impl/release/modules/ext/jackson-annotations-2.9.0-license.txt b/prs/handler/impl/release/modules/ext/jackson-annotations-2.9.0-license.txt
new file mode 100644
index 0000000..ff94ef8
--- /dev/null
+++ b/prs/handler/impl/release/modules/ext/jackson-annotations-2.9.0-license.txt
@@ -0,0 +1,8 @@
+This copy of Jackson JSON processor annotations is licensed under the
+Apache (Software) License, version 2.0 ("the License").
+See the License for details about distribution rights, and the
+specific rights regarding derivate works.
+
+You may obtain a copy of the License at:
+
+http://www.apache.org/licenses/LICENSE-2.0
diff --git a/prs/handler/impl/release/modules/ext/jackson-core-2.9.2-license.txt b/prs/handler/impl/release/modules/ext/jackson-core-2.9.2-license.txt
new file mode 100644
index 0000000..f5f45d2
--- /dev/null
+++ b/prs/handler/impl/release/modules/ext/jackson-core-2.9.2-license.txt
@@ -0,0 +1,8 @@
+This copy of Jackson JSON processor streaming parser/generator is licensed under the
+Apache (Software) License, version 2.0 ("the License").
+See the License for details about distribution rights, and the
+specific rights regarding derivate works.
+
+You may obtain a copy of the License at:
+
+http://www.apache.org/licenses/LICENSE-2.0
diff --git a/prs/handler/impl/release/modules/ext/jackson-core-2.9.2-notice.txt b/prs/handler/impl/release/modules/ext/jackson-core-2.9.2-notice.txt
new file mode 100644
index 0000000..4c976b7
--- /dev/null
+++ b/prs/handler/impl/release/modules/ext/jackson-core-2.9.2-notice.txt
@@ -0,0 +1,20 @@
+# Jackson JSON processor
+
+Jackson is a high-performance, Free/Open Source JSON processing library.
+It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has
+been in development since 2007.
+It is currently developed by a community of developers, as well as supported
+commercially by FasterXML.com.
+
+## Licensing
+
+Jackson core and extension components may licensed under different licenses.
+To find the details that apply to this artifact see the accompanying LICENSE file.
+For more information, including possible other licensing options, contact
+FasterXML.com (http://fasterxml.com).
+
+## Credits
+
+A list of contributors may be found from CREDITS file, which is included
+in some artifacts (usually source distributions); but is always available
+from the source code management (SCM) system project uses.
diff --git a/prs/handler/impl/release/modules/ext/jackson-databind-2.9.2-license.txt b/prs/handler/impl/release/modules/ext/jackson-databind-2.9.2-license.txt
new file mode 100644
index 0000000..6acf754
--- /dev/null
+++ b/prs/handler/impl/release/modules/ext/jackson-databind-2.9.2-license.txt
@@ -0,0 +1,8 @@
+This copy of Jackson JSON processor databind module is licensed under the
+Apache (Software) License, version 2.0 ("the License").
+See the License for details about distribution rights, and the
+specific rights regarding derivate works.
+
+You may obtain a copy of the License at:
+
+http://www.apache.org/licenses/LICENSE-2.0
diff --git a/prs/handler/impl/release/modules/ext/jackson-databind-2.9.2-notice.txt b/prs/handler/impl/release/modules/ext/jackson-databind-2.9.2-notice.txt
new file mode 100644
index 0000000..5ab1e56
--- /dev/null
+++ b/prs/handler/impl/release/modules/ext/jackson-databind-2.9.2-notice.txt
@@ -0,0 +1,20 @@
+# Jackson JSON processor
+
+Jackson is a high-performance, Free/Open Source JSON processing library.
+It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has
+been in development since 2007.
+It is currently developed by a community of developers, as well as supported
+commercially by FasterXML.com.
+
+## Licensing
+
+Jackson core and extension components may be licensed under different licenses.
+To find the details that apply to this artifact see the accompanying LICENSE file.
+For more information, including possible other licensing options, contact
+FasterXML.com (http://fasterxml.com).
+
+## Credits
+
+A list of contributors may be found from CREDITS file, which is included
+in some artifacts (usually source distributions); but is always available
+from the source code management (SCM) system project uses.
diff --git a/prs/handler/impl/release/modules/ext/slf4j-api-1.7.25-license.txt b/prs/handler/impl/release/modules/ext/slf4j-api-1.7.25-license.txt
new file mode 100644
index 0000000..c8e72c2
--- /dev/null
+++ b/prs/handler/impl/release/modules/ext/slf4j-api-1.7.25-license.txt
@@ -0,0 +1,21 @@
+ Copyright (c) 2004-2017 QOS.ch
+ All rights reserved.
+
+ Permission is hereby granted, free  of charge, to any person obtaining
+ a  copy  of this  software  and  associated  documentation files  (the
+ "Software"), to  deal in  the Software without  restriction, including
+ without limitation  the rights to  use, copy, modify,  merge, publish,
+ distribute,  sublicense, and/or sell  copies of  the Software,  and to
+ permit persons to whom the Software  is furnished to do so, subject to
+ the following conditions:
+ 
+ The  above  copyright  notice  and  this permission  notice  shall  be
+ included in all copies or substantial portions of the Software.
+ 
+ THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
+ EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
+ MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/prs/handler/impl/script/handler b/prs/handler/impl/script/handler
new file mode 100755
index 0000000..78ae54f
--- /dev/null
+++ b/prs/handler/impl/script/handler
@@ -0,0 +1,3 @@
+#!/bin/sh
+LIB=`dirname $0`/../lib
+java $JACKPOT_PRS_EXTRA_JVM_OPTIONS --add-exports jdk.javadoc/com.sun.tools.javadoc.main=ALL-UNNAMED -classpath `find $LIB -name "*.jar" | tr '\n' ':'` org.netbeans.modules.jackpot.prs.handler.impl.HandlePullRequest "$@"
diff --git a/prs/handler/impl/script/handler.docker b/prs/handler/impl/script/handler.docker
new file mode 100755
index 0000000..6a19361
--- /dev/null
+++ b/prs/handler/impl/script/handler.docker
@@ -0,0 +1,65 @@
+#!/bin/sh -x
+
+#image:
+PROXY=$(docker build -q - <<EOF
+FROM ubuntu:18.10
+
+RUN apt update && \
+    apt --yes install squid
+
+RUN echo "acl maven dstdomain central.maven.org" >/etc/squid/conf.d/proxy.conf &&\
+    echo "acl ubuntu dstdomain security.ubuntu.com" >>/etc/squid/conf.d/proxy.conf &&\
+    echo "acl ubuntu dstdomain archive.ubuntu.com" >>/etc/squid/conf.d/proxy.conf &&\
+    echo "acl github dstdomain github.com" >>/etc/squid/conf.d/proxy.conf &&\
+    echo "acl github dstdomain api.github.com" >>/etc/squid/conf.d/proxy.conf &&\
+    echo "acl github dstdomain patch-diff.githubusercontent.com" >>/etc/squid/conf.d/proxy.conf &&\
+    echo "acl netbeans dstdomain netbeans.osuosl.org" >>/etc/squid/conf.d/proxy.conf &&\
+    echo "acl allowed_ports port 80" >>/etc/squid/conf.d/proxy.conf &&\
+    echo "acl allowed_ports port 443" >>/etc/squid/conf.d/proxy.conf &&\
+    echo "http_access allow maven allowed_ports" >>/etc/squid/conf.d/proxy.conf &&\
+    echo "http_access allow ubuntu allowed_ports" >>/etc/squid/conf.d/proxy.conf &&\
+    echo "http_access allow github allowed_ports" >>/etc/squid/conf.d/proxy.conf &&\
+    echo "http_access allow netbeans allowed_ports" >>/etc/squid/conf.d/proxy.conf &&\
+    echo "http_access deny all" >>/etc/squid/conf.d/proxy.conf
+
+ENTRYPOINT [ "squid", "--foreground" ]
+EOF
+)
+PROXY=`echo $PROXY | cut -d ':' -f 2`
+
+#container:
+PROXY_CONTAINER=`docker run --rm -d $PROXY`
+#docker container rename $PROXY_CONTAINER jackpot-proxy-$PROXY_CONTAINER
+
+#networking:
+docker network create --driver bridge --internal jackpot-network-$PROXY_CONTAINER
+docker network create --driver bridge jackpot-public-network-$PROXY_CONTAINER
+
+docker network disconnect bridge $PROXY_CONTAINER
+docker network connect --alias jackpot-proxy jackpot-network-$PROXY_CONTAINER $PROXY_CONTAINER
+docker network connect jackpot-public-network-$PROXY_CONTAINER $PROXY_CONTAINER
+
+WORKER=$(docker build -q -f - `dirname $0`/.. <<EOF
+FROM ubuntu:18.10
+
+RUN apt update && \
+    apt --yes install openjdk-11-jdk build-essential maven ant gradle git
+
+RUN useradd -m compute
+
+COPY . /home/compute/handler
+
+RUN chown -R compute /home/compute/handler
+
+USER compute
+
+ENTRYPOINT [ "/home/compute/handler/bin/handler", "-Dhttp.proxyHost=jackpot-proxy", "-Dhttp.proxyPort=3128", "-Dhttps.proxyHost=jackpot-proxy", "-Dhttps.proxyPort=3128"]
+EOF
+)
+
+docker run --rm --env PR_CONTENT --env OAUTH_TOKEN --env OAUTH_APP_TOKEN --network jackpot-network-$PROXY_CONTAINER --env "http_proxy=http://jackpot-proxy:3128/" --env "https_proxy=http://jackpot-proxy:3128/" --env "JACKPOT_PRS_EXTRA_JVM_OPTIONS=-Dhttp.proxyHost=jackpot-proxy -Dhttp.proxyPort=3128 -Dhttps.proxyHost=jackpot-proxy -Dhttps.proxyPort=3128" $WORKER
+
+docker container stop $PROXY_CONTAINER
+docker network rm jackpot-network-$PROXY_CONTAINER jackpot-public-network-$PROXY_CONTAINER
+
+
diff --git a/prs/handler/impl/script/handler.remote b/prs/handler/impl/script/handler.remote
new file mode 100755
index 0000000..a205007
--- /dev/null
+++ b/prs/handler/impl/script/handler.remote
@@ -0,0 +1,14 @@
+#!/bin/sh -x
+
+if [ "x$1" = "x" -o "x$2" = "x" -o "x$3" = "x" ]; then
+     echo "Incorrect parameters!"
+     exit 1;
+fi;
+
+rsync -av `dirname $0`/../ $1:$2/
+
+ssh -o "SendEnv=PR_CONTENT" -o "SendEnv=OAUTH_TOKEN" -o "SendEnv=OAUTH_APP_TOKEN" $1 /bin/bash <<EOF
+cd $2/bin;
+./$3
+EOF
+
diff --git a/prs/handler/impl/src/org/netbeans/modules/jackpot/prs/handler/impl/Bundle.properties b/prs/handler/impl/src/org/netbeans/modules/jackpot/prs/handler/impl/Bundle.properties
new file mode 100644
index 0000000..c8445a6
--- /dev/null
+++ b/prs/handler/impl/src/org/netbeans/modules/jackpot/prs/handler/impl/Bundle.properties
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+OpenIDE-Module-Name=PR Handler Impl
diff --git a/prs/handler/impl/src/org/netbeans/modules/jackpot/prs/handler/impl/HandlePullRequest.java b/prs/handler/impl/src/org/netbeans/modules/jackpot/prs/handler/impl/HandlePullRequest.java
new file mode 100644
index 0000000..8e2acec
--- /dev/null
+++ b/prs/handler/impl/src/org/netbeans/modules/jackpot/prs/handler/impl/HandlePullRequest.java
@@ -0,0 +1,266 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.jackpot.prs.handler.impl;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.reflectoring.diffparser.api.UnifiedDiffParser;
+import io.reflectoring.diffparser.api.model.Diff;
+import io.reflectoring.diffparser.api.model.Hunk;
+import io.reflectoring.diffparser.api.model.Line;
+import java.io.File;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+import org.kohsuke.github.GHCommitState;
+import org.kohsuke.github.GHPullRequest;
+import org.kohsuke.github.GHRepository;
+import org.kohsuke.github.GitHub;
+import org.netbeans.api.java.source.ClasspathInfo;
+import org.netbeans.api.java.source.JavaSource;
+import org.netbeans.api.project.FileOwnerQuery;
+import org.netbeans.api.project.Project;
+import org.netbeans.api.project.ProjectManager;
+import org.netbeans.api.project.ui.OpenProjects;
+import org.netbeans.modules.java.hints.spiimpl.batch.BatchUtilities;
+import org.netbeans.modules.java.hints.spiimpl.hints.HintsInvoker;
+import org.netbeans.modules.java.hints.spiimpl.options.HintsSettings;
+import org.netbeans.modules.parsing.impl.indexing.implspi.CacheFolderProvider;
+import org.netbeans.spi.editor.hints.ErrorDescription;
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileUtil;
+import org.openide.modules.ModuleInfo;
+import org.openide.modules.Places;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author lahvac
+ */
+public class HandlePullRequest {
+    public static void main(String... args) throws Exception {
+        String content = System.getenv().get("PR_CONTENT");
+        String token = System.getenv().get("OAUTH_TOKEN");
+        String appToken = System.getenv().get("OAUTH_APP_TOKEN");
+        processPullRequest(content, token, appToken);
+    }
+
+    public static void processPullRequest(String inputData, String oauthToken, String oauthAppToken) throws Exception {
+        Path tempDir = Files.createTempDirectory("pull.requests");
+        File userdir = tempDir.resolve("scratch-user").toFile();
+        File cachedir = tempDir.resolve("scratch-cache").toFile();
+        System.setProperty("netbeans.user", userdir.getAbsolutePath());
+        File varLog = new File(new File(userdir, "var"), "log");
+        varLog.mkdirs();
+        System.setProperty("jdk.home", System.getProperty("java.home")); //for j2seplatform
+        Class<?> main = Class.forName("org.netbeans.core.startup.Main");
+        main.getDeclaredMethod("initializeURLFactory").invoke(null);
+        new File(cachedir, "index").mkdirs();
+//        DefaultCacheFolderProvider.getInstance().setCacheFolder(FileUtil.toFileObject(new File(cachedir, "index")));
+        CacheFolderProvider.getCacheFolderForRoot(Places.getUserDirectory().toURI().toURL(), EnumSet.noneOf(CacheFolderProvider.Kind.class), CacheFolderProvider.Mode.EXISTENT);
+
+        Lookup.getDefault().lookup(ModuleInfo.class);
+
+        Map<String, Object> inputParsed = new ObjectMapper().readValue(inputData, Map.class);
+        Object action = inputParsed.get("action");
+        if (!"opened".equals(action))
+            return ;
+        Map<String, Object> pullRequest = (Map<String, Object>) inputParsed.get("pull_request");
+        if (pullRequest == null) {
+            return ;
+        }
+        Map<String, Object> base = (Map<String, Object>) pullRequest.get("base");
+        Map<String, Object> baseRepo = (Map<String, Object>) base.get("repo");
+        Map<String, Object> head = (Map<String, Object>) pullRequest.get("head");
+        Map<String, Object> headRepo = (Map<String, Object>) head.get("repo");
+        
+        GitHub statusGithub = oauthToken != null ? GitHub.connectUsingOAuth(oauthToken) : GitHub.connect();
+        String fullRepoName = (String) baseRepo.get("full_name");
+        GHRepository statusTarget = statusGithub.getRepository(fullRepoName);
+        String sha = (String) head.get("sha");
+        
+        statusTarget.createCommitStatus(sha, GHCommitState.PENDING, null, "Running Jackpot verification");
+
+        String cloneURL = (String) headRepo.get("clone_url");
+        new ProcessBuilder("git", "clone", cloneURL, "workdir").directory(tempDir.toFile()).inheritIO().start().waitFor();
+        FileObject workdir = FileUtil.toFileObject(tempDir.resolve("workdir").toFile());
+        new ProcessBuilder("git", "checkout", sha).directory(FileUtil.toFile(workdir)).inheritIO().start().waitFor();
+        Set<Project> projects = new HashSet<>();
+        Map<FileObject, FileData> file2Remap = new HashMap<>();
+        String diffURL = (String) pullRequest.get("diff_url");
+        URLConnection conn = new URL(diffURL).openConnection();
+        String text;
+        try (InputStream in = conn.getInputStream()) {
+            String encoding = conn.getContentEncoding();
+            if (encoding == null) encoding = "UTF-8";
+            //workaround for the diff parser, which does not handle git diffs properly:
+            text = new String(in.readAllBytes(), encoding)
+                    .replace("\ndiff --git", "\n\ndiff --git");
+        }
+        List<Diff> diffs = new UnifiedDiffParser().parse(text.getBytes());
+        for (Diff diff : diffs) {
+            String filename = diff.getToFileName().substring(2);
+            if (filename.endsWith(".java")) {
+                FileObject file = workdir.getFileObject(filename);
+                if (file == null) {
+                    //TODO: how to handle? log?
+                    continue;
+                }
+                Project project = FileOwnerQuery.getOwner(file);
+                if (project != null) {
+                    int[] remap = new int[file.asLines().size() + 1]; //TODO: encoding?
+                    Arrays.fill(remap, -1);
+                    int idx = 1;
+                    for (Hunk hunk : diff.getHunks()) {
+                        int pointer = hunk.getToFileRange().getLineStart();
+                        for (Line line : hunk.getLines()) {
+                            switch (line.getLineType()) {
+                                case NEUTRAL: pointer++; idx++; break;
+                                case TO: remap[pointer++] = idx++; break;
+                            }
+                        }
+                    }
+                    projects.add(project);
+                    file2Remap.put(file, new FileData(filename, remap));
+                }
+            }
+        }
+        int prId = (int) pullRequest.get("number");
+        GHPullRequest[] pr = new GHPullRequest[1];
+        boolean[] hasWarnings = {false};
+        for (Project project : projects) {
+            switch (project.getClass().getName()) {//XXX: ensure that the environment variables are dropped here!
+                case "org.netbeans.modules.maven.NbMavenProjectImpl":
+                    new ProcessBuilder("mvn", "dependency:go-offline").directory(FileUtil.toFile(project.getProjectDirectory())).inheritIO().start().waitFor();
+                    break;
+                case "org.netbeans.modules.apisupport.project.NbModuleProject":
+                    FileObject nbbuild = project.getProjectDirectory().getFileObject("../../nbbuild");
+                    if (nbbuild == null) {
+                        nbbuild = project.getProjectDirectory().getFileObject("../nbbuild");
+                    }
+                    if (nbbuild != null) { //TODO: only once
+                        new ProcessBuilder("ant", "-autoproxy", "download-all-extbins").directory(FileUtil.toFile(nbbuild)).inheritIO().start().waitFor();
+                    }
+                    //TODO: download extbins!
+                    break;
+                default:
+                    System.err.println("project name: " + project.getClass().getName());
+                    break;
+            }
+        }
+        OpenProjects.getDefault().open(projects.toArray(new Project[0]), false);
+        Map<ClasspathInfo, Collection<FileObject>> sorted = BatchUtilities.sortFiles(file2Remap.keySet());
+        for (Entry<ClasspathInfo, Collection<FileObject>> e : sorted.entrySet()) {
+            JavaSource.create(e.getKey(), e.getValue()).runWhenScanFinished(cc -> {
+                FileData fileData = file2Remap.get(cc.getFileObject());
+
+                if (fileData == null)
+                    return ;
+
+                cc.toPhase(JavaSource.Phase.RESOLVED); //XXX
+
+                List<ErrorDescription> warnings = new HintsInvoker(HintsSettings.getGlobalSettings(), new AtomicBoolean()).computeHints(cc);
+                System.err.println("warnings=" + warnings);
+                for (ErrorDescription ed : warnings) {
+                    int startLine = ed.getRange().getBegin().getLine() + 1;
+                    int targetPosition = fileData.remap[startLine];
+                    if (targetPosition == (-1))
+                        continue;
+                    String comment = "Jackpot:\nwarning: " + ed.getDescription();
+                    //TODO: fixes
+//                    if (additions != null) {
+//                        comment += "```suggestion\n" + additions.toString() + "```";
+//                    }
+                    hasWarnings[0] = true;
+                    if (pr[0] == null) {
+                        GitHub commentGithub = oauthAppToken != null ? GitHub.connectUsingOAuth(oauthAppToken) : GitHub.connect();
+                        GHRepository commentTarget = commentGithub.getRepository(fullRepoName);
+                        pr[0] = commentTarget.getPullRequest(prId);
+                    }
+                    pr[0].createReviewComment(comment, sha, fileData.filename, targetPosition);
+                }
+            }, false).get();
+        }
+//                String file = (String) m.get("file");
+//                int startLine = (Integer) m.get("startLine");
+//                List<String> fixes = (List<String>) m.get("fixes");
+//                StringBuilder additions = null;
+//                if (fixes != null && fixes.size() > 1) { //TODO: or == 1?
+//                    List<Diff> fixDiffs = new UnifiedDiffParser().parse(fixes.get(0).getBytes("UTF-8"));
+//                    if (fixDiffs.size() == 1 && fixDiffs.get(0).getHunks().size() == 1) {
+//                        int start = fixDiffs.get(0).getHunks().get(0).getToFileRange().getLineStart();
+//                        additions = new StringBuilder();
+//                        boolean seenRemoval = false;
+//                        for (Line line : fixDiffs.get(0).getHunks().get(0).getLines()) {
+//                            if (line.getLineType() == Line.LineType.FROM) {
+//                                if (seenRemoval) {
+//                                    start = -1;
+//                                    break;
+//                                } else {
+//                                    seenRemoval = true;
+//                                }
+//                            } else if (line.getLineType() == Line.LineType.TO) {
+//                                additions.append(line.getContent());
+//                                additions.append("\n");
+//                            }
+//                        }
+//                        if (start != (-1) && seenRemoval) {
+//                            startLine = start;
+//                        } else {
+//                            additions = null;
+//                        }
+//                    }
+//                }
+//            }
+//        }
+//        
+        String mainComment;
+        if (!hasWarnings[0]) {
+            mainComment = "Jackpot: no warnings.";
+        } else {
+            mainComment = "Jackpot: warnings found.";
+        }
+
+        //TODO: set status on crash/error!
+        statusTarget.createCommitStatus(sha, GHCommitState.SUCCESS, null, mainComment);
+    }
+    
+    private static final class FileData {
+        public final String filename;
+        public final int[] remap;
+
+        public FileData(String filename, int[] remap) {
+            this.filename = filename;
+            this.remap = remap;
+        }
+        
+    }
+
+}
diff --git a/prs/handler/impl/src/org/netbeans/modules/jackpot/prs/handler/impl/MimeLookupImpl.java b/prs/handler/impl/src/org/netbeans/modules/jackpot/prs/handler/impl/MimeLookupImpl.java
new file mode 100644
index 0000000..4342738
--- /dev/null
+++ b/prs/handler/impl/src/org/netbeans/modules/jackpot/prs/handler/impl/MimeLookupImpl.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.jackpot.prs.handler.impl;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.file.CopyOption;
+import java.nio.file.Files;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.prefs.Preferences;
+import org.netbeans.api.editor.mimelookup.MimePath;
+import org.netbeans.modules.editor.impl.DocumentFactoryImpl;
+import org.netbeans.modules.editor.java.JavaKit;
+import org.netbeans.modules.editor.tools.storage.api.ToolPreferences;
+import org.netbeans.modules.java.source.indexing.JavaCustomIndexer;
+import org.netbeans.modules.java.source.parsing.JavacParserFactory;
+import org.netbeans.spi.editor.hints.settings.FileHintPreferences;
+import org.netbeans.spi.editor.hints.settings.FileHintPreferences.GlobalHintPreferencesProvider;
+import org.netbeans.spi.editor.mimelookup.MimeDataProvider;
+import org.openide.util.Lookup;
+import org.openide.util.lookup.Lookups;
+import org.openide.util.lookup.ServiceProvider;
+
+/**
+ *
+ * @author lahvac
+ */
+@ServiceProvider(service=MimeDataProvider.class)
+public class MimeLookupImpl implements MimeDataProvider {
+
+    private final Lookup JAVA = Lookups.fixed(new JavaKit(), new JavacParserFactory(), new GlobalSettingsProvider(), new JavaCustomIndexer.Factory());
+    private final Lookup EMPTY = Lookups.fixed(new DocumentFactoryImpl());
+
+    @Override
+    public Lookup getLookup(MimePath path) {
+        if (path.getPath().equals("text/x-java")) {
+            return JAVA;
+        }
+        if (path.getPath().isEmpty()) {
+            return EMPTY;
+        }
+        return Lookup.EMPTY;
+    }
+    
+    public static final class GlobalSettingsProvider implements GlobalHintPreferencesProvider {
+
+        public static final String HINTS_TOOL_ID = "hints";
+
+        private Preferences prefs;
+
+        @Override
+        public synchronized Preferences getGlobalPreferences() {
+            if (prefs == null) {
+                try {
+                    File cfgHints = File.createTempFile("cfg_hints", "xml");
+                    try (InputStream in = MimeLookupImpl.class.getResourceAsStream("/org/netbeans/modules/jackpot/prs/handler/impl/cfg_hints.xml");
+                         OutputStream out = new FileOutputStream(cfgHints)) {
+                        out.write(in.readAllBytes());
+                    }
+                    prefs = ToolPreferences.from(cfgHints.toURI()).getPreferences(HINTS_TOOL_ID, "text/x-java");
+                } catch (IOException ex) {
+                    throw new IllegalStateException(ex);
+                }
+            }
+            
+            return prefs;
+        }
+        
+    }
+}
diff --git a/prs/handler/impl/src/org/netbeans/modules/jackpot/prs/handler/impl/cfg_hints.xml b/prs/handler/impl/src/org/netbeans/modules/jackpot/prs/handler/impl/cfg_hints.xml
new file mode 100644
index 0000000..09bdcc5
--- /dev/null
+++ b/prs/handler/impl/src/org/netbeans/modules/jackpot/prs/handler/impl/cfg_hints.xml
@@ -0,0 +1,563 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE configuration PUBLIC "-//NetBeans//DTD Tool Configuration 1.0//EN" "http://www.netbeans.org/dtds/ToolConfiguration-1_0.dtd">
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<configuration>
+    <tool kind="hints" type="text/x-java">
+        <node name="org.netbeans.modules.java.hints.encapsulation.ClassEncapsulation.packageCls">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.EqualsHint.arrayEquals">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.errors.ErrorFixesFakeHintCREATE_FINAL_FIELD_CTOR">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.encapsulation.ReturnEncapsulation.date">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="error-in-javadoc">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.StaticAccess">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="o.n.m.j2ee.jpa.verification.JPQLValidation">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.MalformedFormatString">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="AnnotationAsSuperInterface">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.jdk.ConvertToVarHint">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="o.n.m.j2ee.jpa.verification.PublicClass">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.perf.Tiny.unnecessaryTypeToString">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.Tiny.resultSet">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.Unbalanced$Array">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.InitializerCanBeStatic">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.jdk.AnnotationProcessors.oGSA">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.perf.BoxingOfBoxingValue">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.encapsulation.FieldEncapsulation.privateField">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="o.n.m.j2ee.jpa.verification.PersistenceUnitPresent">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.control.RedundantIf">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.finalize.CallFinalize">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.DoubleCheck">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.encapsulation.ClassEncapsulation.protectedCls">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.Tiny.equalsNull">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="o.n.m.j2ee.jpa.verification.IdClassOverridesEqualsAndHashCode">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.openjdk.jtreg.ModulesHint">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.ThrowableNotThrown.methodInvocation">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.ObsoleteCollection">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.perf.Tiny.enumSet">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="unnecessaryContinueLabel">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.suggestions.ConvertIfToSwitch">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.CloneAndCloneable.cloneInNonCloneableClass">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.TryCatchFinally.finallyDiscardsException">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.encapsulation.ClassEncapsulation.publicCls">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="o.n.m.j2ee.jpa.verification.ValidAttributes">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.perf.Tiny.enumMap">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.control.RedundantConditional">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="o.n.m.j2ee.jpa.verification.UniqueEntityName">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.CloneAndCloneable.cloneWithoutThrows">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.threading.Tiny.notifyOnCondition">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.errors.ErrorFixesFakeHintCREATE_LOCAL_VARIABLE">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.threading.UnlockOutsideFinally">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="StringBuilderAppend">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="o.n.m.j2ee.jpa.verification.NoIdClassOnEntitySubclass">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.AddOverrideAnnotation">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.Tiny.newObject">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.testing.Tiny.incovertibleTypes">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.perf.Tiny.redundantToString">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.encapsulation.ParamEncapsulation.collection">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.threading.Tiny.emptySynchronized">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.ClassStructure.finalPrivateMethod">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.jackpot.hintsimpl.LoggerStringConcat">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.UnusedAssignmentOrBranch.deadBranch">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.encapsulation.ParamEncapsulation.array">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.threading.Tiny.canBeFinal">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.encapsulation.ReturnEncapsulation.collection">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.jdk.ThrowableInitCause">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.SuspiciousNamesCombination">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.HideFieldByVar">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.suggestions.ConstantNameHint">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.SyncOnNonFinal">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.ThreadDumpStack">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.AssertWithSideEffects">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.Tiny.stringReplaceAllDot">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.testing.Tiny.mismatchedConstantVSReal">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.LoggerNotStaticFinal">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.threading.Tiny.synchronizedOnLock">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.jdk.UseSpecificCatch">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.jdk.ConvertSwitchToRuleSwitch">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.ArrayStringConversions">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.errors.ErrorFixesFakeHintIMPORT_CLASS">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.EqualsHint">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="o.n.m.j2ee.jpa.verification.IdDefinedInHierarchy">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="o.n.m.j2ee.jpa.verification.JPAAnnotsOnlyOnAccesor">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.BoxedIdentityComparison">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.StaticNonFinalUsedInInitialization">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.IncompatibleMask">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.encapsulation.FieldEncapsulation.packageField">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.perf.Tiny.stringConstructor">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.jdk.UnnecessaryBoxing.run">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.threading.Tiny.unsyncNotify">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.Tiny.systemArrayCopy">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.MissingHashCode">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="Wrong_String_Comparison">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.jdk.ConvertToARM">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.threading.Tiny.threadSuspend">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="Imports_SAME_PACKAGE">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="Imports_EXCLUDED">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="o.n.m.j2ee.jpa.verification.OnlyEntityOrMappedSuperclassCanUseIdClass">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.CollectionRemove">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="o.n.m.j2ee.jpa.verification.QueriesProperlyDefined">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.perf.Tiny.unnecessaryTempFromString">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.PointlessBitwiseExpression">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="Javac_canUseDiamond">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.Tiny.indentation">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.control.RemoveUnnecessary.unnecessaryContinue">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.threading.Tiny.unsyncWait">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.threading.Tiny.waitOnCondition">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.InfiniteRecursion.run">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.jdk.ConvertToStringSwitch">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.ExportNonAccessibleElement">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.UnusedCompoundAssignment">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.PrintStackTrace">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.encapsulation.FieldEncapsulation.protectedField">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.editor.htmlui.JSNI2JavaScriptBody">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.jdk.mapreduce.ForLoopToFunctionalHint">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.UnusedAssignmentOrBranch.unusedAssignment">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.jdk.IndexOfToContains">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.encapsulation.ReturnEncapsulation.array">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.RemoveUnnecessaryReturn">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.threading.Tiny.sleepInLoop">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.threading.Tiny.threadStartInConstructor">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="o.n.m.j2ee.jpa.verification.ConsistentAccessType">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.TryCatchFinally.finallyThrowsException">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.SuspiciousToArray">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.threading.Tiny.threadYield">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="o.n.m.j2ee.jpa.verification.HasNoArgConstructor">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.MalformedXPathExpression">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.ComparatorParameterNotUsed.run">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.jdk.UnnecessaryUnboxing">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.Unbalanced$Collection">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.jdk.IteratorToFor">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.NPECheck">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.threading.Tiny.threadRun">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.WrongPackageSuggestion">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="Inspection.hint">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="Imports_UNUSED">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.errors.ErrorFixesFakeHintSURROUND_WITH_TRY_CATCH">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="o.n.m.j2ee.jpa.verification.TopLevelClass">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="MAVEN_SEARCH_HINT">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.testing.Tiny.assertEqualsForArrays">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.threading.Tiny.nestedSynchronized">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.MathRandomCast">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.EqualsMethodHint">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.finalize.FinalizeDoesNotCallSuper">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="unnecessaryBreakLabel">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="o.n.m.j2ee.jpa.verification.LegalCombinationOfAnnotations">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.perf.ReplaceBufferByString">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="o.n.m.j2ee.jpa.verification.ValidPrimaryTableName">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.jdk.JoinCatches">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.Tiny.hashCodeOnArray">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.OverridableMethodCallInConstructor">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="Imports_DEFAULT_PACKAGE">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.CloneAndCloneable.cloneableWithoutClone">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.perf.SizeEqualsZero">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="o.n.m.j2ee.jpa.verification.SerializableClass">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.jdk.ConvertVarToExplicitType">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.Tiny.switchCaseLabelMismatch">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.apisupport.hints.HelpCtxHint">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="EmptyStatements_BLOCK">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.LeakingThisInConstructor">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.StringBufferCharConstructor">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.ThisInAnonymous">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="EmptyStatements_WHILE_LOOP">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.ShiftOutOfRange">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.ConfusingVarargsParameter.primitiveArray">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.encapsulation.ParamEncapsulation.date">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.openjdk.jtreg.TagOrderHint">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="o.n.m.j2ee.jpa.verification.NonFinalClass">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.apisupport.hints.UseNbBundleMessages">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="create-javadoc">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.CloneAndCloneable.cloneWithoutSuperClone">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.encapsulation.FieldEncapsulation.publicField">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="EmptyStatements_FOR_LOOP">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.Regexp">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.perf.StringBuffer2Builder">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="Javac_canUseLambda">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.AnnotationsNotRuntime">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.threading.Tiny.sleepInSync">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.CheckReturnValueHint">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.threading.Tiny.volatileArray">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.perf.ManualArrayCopy">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="AssignmentToItself">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.MultipleLoggers">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.ThrowableNotThrown.newThrowable">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.bugs.CastVSInstanceOf">
+            <attribute name="enabled" value="true"/>
+        </node>
+        <node name="EmptyStatements_DO_WHILE_LOOP">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.HideField">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.perf.NoBooleanConstructor">
+            <attribute name="enabled" value="false"/>
+        </node>
+        <node name="org.netbeans.modules.java.hints.finalize.FinalizeDeclared">
+            <attribute name="enabled" value="false"/>
+        </node>
+    </tool>
+</configuration>
diff --git a/prs/handler/impl/test/unit/src/org/netbeans/modules/jackpot/prs/handler/impl/HandlePullRequestTest.java b/prs/handler/impl/test/unit/src/org/netbeans/modules/jackpot/prs/handler/impl/HandlePullRequestTest.java
new file mode 100644
index 0000000..5d4377e
--- /dev/null
+++ b/prs/handler/impl/test/unit/src/org/netbeans/modules/jackpot/prs/handler/impl/HandlePullRequestTest.java
@@ -0,0 +1,27 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package org.netbeans.modules.jackpot.prs.handler.impl;
+
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import org.junit.Test;
+
+/**
+ *
+ * @author lahvac
+ */
+public class HandlePullRequestTest {
+    
+    public HandlePullRequestTest() {
+    }
+    
+    @Test
+    public void testMain() throws Exception {
+        HandlePullRequest.processPullRequest(Files.readString(Paths.get("/tmp/pr"), StandardCharsets.UTF_8), null, null);
+    }
+
+}
diff --git a/prs/handler/nbproject/build-impl.xml b/prs/handler/nbproject/build-impl.xml
new file mode 100644
index 0000000..c25170e
--- /dev/null
+++ b/prs/handler/nbproject/build-impl.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="handler-impl" basedir=".." xmlns:sproject="http://www.netbeans.org/ns/nb-module-suite-project/1">
+    <fail message="Please build using Ant 1.7.1 or higher.">
+        <condition>
+            <not>
+                <antversion atleast="1.7.1"/>
+            </not>
+        </condition>
+    </fail>
+    <property file="nbproject/private/platform-private.properties"/>
+    <property file="nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-suite-project/1">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <macrodef name="evalprops" uri="http://www.netbeans.org/ns/nb-module-suite-project/1">
+        <attribute name="property"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{property}" value="@{value}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <sproject:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir"/>
+    <sproject:property name="nbplatform.active.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir"/>
+    <sproject:evalprops property="cluster.path.evaluated" value="${cluster.path}"/>
+    <fail message="Path to 'platform' cluster missing in $${cluster.path} property or using corrupt Netbeans Platform (missing harness).">
+        <condition>
+            <not>
+                <contains string="${cluster.path.evaluated}" substring="platform"/>
+            </not>
+        </condition>
+    </fail>
+    <ant antfile="nbproject/platform.xml"/>
+    <fail message="Cannot find NetBeans build harness. ${line.separator}Check that nbplatform.${nbplatform.active}.netbeans.dest.dir and nbplatform.${nbplatform.active}.harness.dir are defined. ${line.separator}On a developer machine these are normally defined in ${user.properties.file}=${netbeans.user}/build.properties ${line.separator}but for automated builds you should pass these properties to Ant explicitly. ${line.separator}You may instead download the harness and platform: -Dbootst [...]
+        <condition>
+            <not>
+                <available file="${harness.dir}/suite.xml"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/suite.xml"/>
+</project>
diff --git a/prs/handler/nbproject/genfiles.properties b/prs/handler/nbproject/genfiles.properties
new file mode 100644
index 0000000..9b1bcce
--- /dev/null
+++ b/prs/handler/nbproject/genfiles.properties
@@ -0,0 +1,26 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+build.xml.data.CRC32=e04e43e4
+build.xml.script.CRC32=b7c00f3c
+build.xml.stylesheet.CRC32=70ce5c94@2.76
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=e04e43e4
+nbproject/build-impl.xml.script.CRC32=ef4d8a53
+nbproject/build-impl.xml.stylesheet.CRC32=473dc988@2.76
+nbproject/platform.xml.data.CRC32=e04e43e4
+nbproject/platform.xml.script.CRC32=6dcbd131
+nbproject/platform.xml.stylesheet.CRC32=ae64f0b6@2.76
diff --git a/prs/handler/nbproject/platform.properties b/prs/handler/nbproject/platform.properties
new file mode 100644
index 0000000..caae5fc
--- /dev/null
+++ b/prs/handler/nbproject/platform.properties
@@ -0,0 +1,23 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+cluster.path=\
+    ${nbplatform.active.dir}/apisupport:\
+    ${nbplatform.active.dir}/extide:\
+    ${nbplatform.active.dir}/harness:\
+    ${nbplatform.active.dir}/ide:\
+    ${nbplatform.active.dir}/java:\
+    ${nbplatform.active.dir}/platform
+nbplatform.active=apache-netbeans
diff --git a/prs/handler/nbproject/platform.xml b/prs/handler/nbproject/platform.xml
new file mode 100644
index 0000000..927643d
--- /dev/null
+++ b/prs/handler/nbproject/platform.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<project name="platform" default="download" basedir="..">
+    <condition property="download.required">
+        <and>
+            <not>
+                <available file="${harness.dir}/suite.xml"/>
+            </not>
+            <isset property="bootstrap.url"/>
+            <isset property="autoupdate.catalog.url"/>
+        </and>
+    </condition>
+    <target name="download" if="download.required">
+        <mkdir dir="${harness.dir}"/>
+        <pathconvert pathsep="|" property="download.clusters">
+            <mapper type="flatten"/>
+            <path path="${cluster.path}"/>
+        </pathconvert>
+        <property name="disabled.modules" value=""/>
+        <pathconvert property="module.includes" pathsep="">
+            <mapper type="glob" from="${basedir}${file.separator}*" to="(?!^\Q*\E$)"/>
+            <path>
+                <filelist files="${disabled.modules}" dir="."/>
+            </path>
+        </pathconvert>
+        <echo message="Downloading clusters ${download.clusters}"/>
+        <property name="tasks.jar" location="${java.io.tmpdir}/tasks.jar"/>
+        <get src="${bootstrap.url}" dest="${tasks.jar}" usetimestamp="true" verbose="true"/>
+        <taskdef name="autoupdate" classname="org.netbeans.nbbuild.AutoUpdate" classpath="${tasks.jar}"/>
+        <autoupdate installdir="${nbplatform.active.dir}" updatecenter="${autoupdate.catalog.url}">
+            <modules includes="${module.includes}.*" clusters="${download.clusters}"/>
+            <modules includes="org[.]netbeans[.]modules[.]apisupport[.]harness" clusters="harness"/>
+        </autoupdate>
+    </target>
+</project>
diff --git a/prs/handler/nbproject/project.properties b/prs/handler/nbproject/project.properties
new file mode 100644
index 0000000..a00f0a7
--- /dev/null
+++ b/prs/handler/nbproject/project.properties
@@ -0,0 +1,22 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+modules=\
+    ${project.org.netbeans.modules.jackpot.prs.handler.impl}:\
+    ${project.org.apache.commons.codec}:\
+    ${project.org.apache.commons.logging}
+project.org.apache.commons.codec=org.apache.commons.codec
+project.org.apache.commons.logging=org.apache.commons.logging
+project.org.netbeans.modules.jackpot.prs.handler.impl=impl
diff --git a/prs/handler/nbproject/project.xml b/prs/handler/nbproject/project.xml
new file mode 100644
index 0000000..ab0e9ea
--- /dev/null
+++ b/prs/handler/nbproject/project.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project.suite</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-suite-project/1">
+            <name>handler</name>
+        </data>
+    </configuration>
+</project>
diff --git a/prs/handler/org.apache.commons.codec/build.xml b/prs/handler/org.apache.commons.codec/build.xml
new file mode 100644
index 0000000..9eb1b8a
--- /dev/null
+++ b/prs/handler/org.apache.commons.codec/build.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="org.apache.commons.codec" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project org.apache.commons.codec.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/prs/handler/org.apache.commons.codec/manifest.mf b/prs/handler/org.apache.commons.codec/manifest.mf
new file mode 100644
index 0000000..01276fb
--- /dev/null
+++ b/prs/handler/org.apache.commons.codec/manifest.mf
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+AutoUpdate-Show-In-Client: true
+OpenIDE-Module: org.apache.commons.codec
+OpenIDE-Module-Localizing-Bundle: org/apache/commons/codec/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
diff --git a/prs/handler/org.apache.commons.codec/nbproject/build-impl.xml b/prs/handler/org.apache.commons.codec/nbproject/build-impl.xml
new file mode 100644
index 0000000..87dc727
--- /dev/null
+++ b/prs/handler/org.apache.commons.codec/nbproject/build-impl.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="org.apache.commons.codec-impl" basedir="..">
+    <fail message="Please build using Ant 1.7.1 or higher.">
+        <condition>
+            <not>
+                <antversion atleast="1.7.1"/>
+            </not>
+        </condition>
+    </fail>
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <macrodef name="evalprops" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="property"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{property}" value="@{value}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="nbplatform.active.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:evalprops property="cluster.path.evaluated" value="${cluster.path}" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="Path to 'platform' cluster missing in $${cluster.path} property or using corrupt Netbeans Platform (missing harness).">
+        <condition>
+            <not>
+                <contains string="${cluster.path.evaluated}" substring="platform"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/prs/handler/org.apache.commons.codec/nbproject/genfiles.properties b/prs/handler/org.apache.commons.codec/nbproject/genfiles.properties
new file mode 100644
index 0000000..569939a
--- /dev/null
+++ b/prs/handler/org.apache.commons.codec/nbproject/genfiles.properties
@@ -0,0 +1,23 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+build.xml.data.CRC32=71271522
+build.xml.script.CRC32=3da714ee
+build.xml.stylesheet.CRC32=15ca8a54@2.76
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=71271522
+nbproject/build-impl.xml.script.CRC32=67b36dc6
+nbproject/build-impl.xml.stylesheet.CRC32=49aa68b0@2.76
diff --git a/prs/handler/org.apache.commons.codec/nbproject/project.properties b/prs/handler/org.apache.commons.codec/nbproject/project.properties
new file mode 100644
index 0000000..c6ac153
--- /dev/null
+++ b/prs/handler/org.apache.commons.codec/nbproject/project.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+file.reference.commons-codec-1.3.jar=release/modules/ext/commons-codec-1.3.jar
+javac.source=1.7
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/prs/handler/org.apache.commons.codec/nbproject/project.xml b/prs/handler/org.apache.commons.codec/nbproject/project.xml
new file mode 100644
index 0000000..ea6e025
--- /dev/null
+++ b/prs/handler/org.apache.commons.codec/nbproject/project.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>org.apache.commons.codec</code-name-base>
+            <suite-component/>
+            <module-dependencies/>
+            <public-packages/>
+            <class-path-extension>
+                <runtime-relative-path>ext/commons-codec-1.3.jar</runtime-relative-path>
+                <binary-origin>release/modules/ext/commons-codec-1.3.jar</binary-origin>
+            </class-path-extension>
+        </data>
+    </configuration>
+</project>
diff --git a/prs/handler/org.apache.commons.codec/nbproject/suite.properties b/prs/handler/org.apache.commons.codec/nbproject/suite.properties
new file mode 100644
index 0000000..5f42472
--- /dev/null
+++ b/prs/handler/org.apache.commons.codec/nbproject/suite.properties
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+suite.dir=${basedir}/..
diff --git a/prs/handler/org.apache.commons.codec/release/modules/ext/binaries-list b/prs/handler/org.apache.commons.codec/release/modules/ext/binaries-list
new file mode 100644
index 0000000..9caf2fa
--- /dev/null
+++ b/prs/handler/org.apache.commons.codec/release/modules/ext/binaries-list
@@ -0,0 +1,17 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+FD32786786E2ADB664D5ECC965DA47629DCA14BA commons-codec:commons-codec:1.3
diff --git a/prs/handler/org.apache.commons.codec/release/modules/ext/commons-codec-1.3-license.txt b/prs/handler/org.apache.commons.codec/release/modules/ext/commons-codec-1.3-license.txt
new file mode 100644
index 0000000..d428420
--- /dev/null
+++ b/prs/handler/org.apache.commons.codec/release/modules/ext/commons-codec-1.3-license.txt
@@ -0,0 +1,208 @@
+Name: Apache Commons Codec
+Origin: Apache Software Foundation
+Version: 1.3
+License: Apache-2.0
+Description: Provides implementations of common encoders and decoders.
+URL: http://commons.apache.org/codec/
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/prs/handler/org.apache.commons.codec/release/modules/ext/commons-codec-1.3-notice.txt b/prs/handler/org.apache.commons.codec/release/modules/ext/commons-codec-1.3-notice.txt
new file mode 100644
index 0000000..439eb83
--- /dev/null
+++ b/prs/handler/org.apache.commons.codec/release/modules/ext/commons-codec-1.3-notice.txt
@@ -0,0 +1,3 @@
+This product includes software developed by
+The Apache Software Foundation (http://www.apache.org/).
+
diff --git a/prs/handler/org.apache.commons.codec/release/modules/ext/commons-codec-1.3.jar b/prs/handler/org.apache.commons.codec/release/modules/ext/commons-codec-1.3.jar
new file mode 100644
index 0000000..957b675
Binary files /dev/null and b/prs/handler/org.apache.commons.codec/release/modules/ext/commons-codec-1.3.jar differ
diff --git a/prs/handler/org.apache.commons.codec/src/org/apache/commons/codec/Bundle.properties b/prs/handler/org.apache.commons.codec/src/org/apache/commons/codec/Bundle.properties
new file mode 100644
index 0000000..ad64abf
--- /dev/null
+++ b/prs/handler/org.apache.commons.codec/src/org/apache/commons/codec/Bundle.properties
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+OpenIDE-Module-Name=org.apache.commons.codec
diff --git a/prs/handler/org.apache.commons.logging/build.xml b/prs/handler/org.apache.commons.logging/build.xml
new file mode 100644
index 0000000..284baa1
--- /dev/null
+++ b/prs/handler/org.apache.commons.logging/build.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!-- You may freely edit this file. See harness/README in the NetBeans platform -->
+<!-- for some information on what you could do (e.g. targets to override). -->
+<!-- If you delete this file and reopen the project it will be recreated. -->
+<project name="org.apache.commons.logging" default="netbeans" basedir=".">
+    <description>Builds, tests, and runs the project org.apache.commons.logging.</description>
+    <import file="nbproject/build-impl.xml"/>
+</project>
diff --git a/prs/handler/org.apache.commons.logging/manifest.mf b/prs/handler/org.apache.commons.logging/manifest.mf
new file mode 100644
index 0000000..aa0979d
--- /dev/null
+++ b/prs/handler/org.apache.commons.logging/manifest.mf
@@ -0,0 +1,6 @@
+Manifest-Version: 1.0
+AutoUpdate-Show-In-Client: true
+OpenIDE-Module: org.apache.commons.logging
+OpenIDE-Module-Localizing-Bundle: org/apache/commons/logging/Bundle.properties
+OpenIDE-Module-Specification-Version: 1.0
+
diff --git a/prs/handler/org.apache.commons.logging/nbproject/build-impl.xml b/prs/handler/org.apache.commons.logging/nbproject/build-impl.xml
new file mode 100644
index 0000000..806696c
--- /dev/null
+++ b/prs/handler/org.apache.commons.logging/nbproject/build-impl.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!--
+*** GENERATED FROM project.xml - DO NOT EDIT  ***
+***         EDIT ../build.xml INSTEAD         ***
+-->
+<project name="org.apache.commons.logging-impl" basedir="..">
+    <fail message="Please build using Ant 1.7.1 or higher.">
+        <condition>
+            <not>
+                <antversion atleast="1.7.1"/>
+            </not>
+        </condition>
+    </fail>
+    <property file="nbproject/private/suite-private.properties"/>
+    <property file="nbproject/suite.properties"/>
+    <fail unless="suite.dir">You must set 'suite.dir' to point to your containing module suite</fail>
+    <property file="${suite.dir}/nbproject/private/platform-private.properties"/>
+    <property file="${suite.dir}/nbproject/platform.properties"/>
+    <macrodef name="property" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="name"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{name}" value="${@{value}}"/>
+        </sequential>
+    </macrodef>
+    <macrodef name="evalprops" uri="http://www.netbeans.org/ns/nb-module-project/2">
+        <attribute name="property"/>
+        <attribute name="value"/>
+        <sequential>
+            <property name="@{property}" value="@{value}"/>
+        </sequential>
+    </macrodef>
+    <property file="${user.properties.file}"/>
+    <nbmproject2:property name="harness.dir" value="nbplatform.${nbplatform.active}.harness.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:property name="nbplatform.active.dir" value="nbplatform.${nbplatform.active}.netbeans.dest.dir" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <nbmproject2:evalprops property="cluster.path.evaluated" value="${cluster.path}" xmlns:nbmproject2="http://www.netbeans.org/ns/nb-module-project/2"/>
+    <fail message="Path to 'platform' cluster missing in $${cluster.path} property or using corrupt Netbeans Platform (missing harness).">
+        <condition>
+            <not>
+                <contains string="${cluster.path.evaluated}" substring="platform"/>
+            </not>
+        </condition>
+    </fail>
+    <import file="${harness.dir}/build.xml"/>
+</project>
diff --git a/prs/handler/org.apache.commons.logging/nbproject/genfiles.properties b/prs/handler/org.apache.commons.logging/nbproject/genfiles.properties
new file mode 100644
index 0000000..3cd2211
--- /dev/null
+++ b/prs/handler/org.apache.commons.logging/nbproject/genfiles.properties
@@ -0,0 +1,23 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+build.xml.data.CRC32=4aa1ecde
+build.xml.script.CRC32=704985da
+build.xml.stylesheet.CRC32=15ca8a54@2.76
+# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
+# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
+nbproject/build-impl.xml.data.CRC32=4aa1ecde
+nbproject/build-impl.xml.script.CRC32=a329aae5
+nbproject/build-impl.xml.stylesheet.CRC32=49aa68b0@2.76
diff --git a/prs/handler/org.apache.commons.logging/nbproject/project.properties b/prs/handler/org.apache.commons.logging/nbproject/project.properties
new file mode 100644
index 0000000..6fdc9a6
--- /dev/null
+++ b/prs/handler/org.apache.commons.logging/nbproject/project.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+file.reference.commons-logging-1.1.1.jar=release/modules/ext/commons-logging-1.1.1.jar
+javac.source=1.7
+javac.compilerargs=-Xlint -Xlint:-serial
diff --git a/prs/handler/org.apache.commons.logging/nbproject/project.xml b/prs/handler/org.apache.commons.logging/nbproject/project.xml
new file mode 100644
index 0000000..355e688
--- /dev/null
+++ b/prs/handler/org.apache.commons.logging/nbproject/project.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<project xmlns="http://www.netbeans.org/ns/project/1">
+    <type>org.netbeans.modules.apisupport.project</type>
+    <configuration>
+        <data xmlns="http://www.netbeans.org/ns/nb-module-project/3">
+            <code-name-base>org.apache.commons.logging</code-name-base>
+            <suite-component/>
+            <module-dependencies/>
+            <public-packages/>
+            <class-path-extension>
+                <runtime-relative-path>ext/commons-logging-1.1.1.jar</runtime-relative-path>
+                <binary-origin>release/modules/ext/commons-logging-1.1.1.jar</binary-origin>
+            </class-path-extension>
+        </data>
+    </configuration>
+</project>
diff --git a/prs/handler/org.apache.commons.logging/nbproject/suite.properties b/prs/handler/org.apache.commons.logging/nbproject/suite.properties
new file mode 100644
index 0000000..5f42472
--- /dev/null
+++ b/prs/handler/org.apache.commons.logging/nbproject/suite.properties
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+suite.dir=${basedir}/..
diff --git a/prs/handler/org.apache.commons.logging/release/modules/ext/binaries-list b/prs/handler/org.apache.commons.logging/release/modules/ext/binaries-list
new file mode 100644
index 0000000..5f56286
--- /dev/null
+++ b/prs/handler/org.apache.commons.logging/release/modules/ext/binaries-list
@@ -0,0 +1,17 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+5043BFEBC3DB072ED80FBD362E7CAF00E885D8AE commons-logging:commons-logging:1.1.1
diff --git a/prs/handler/org.apache.commons.logging/release/modules/ext/commons-logging-1.1.1-license.txt b/prs/handler/org.apache.commons.logging/release/modules/ext/commons-logging-1.1.1-license.txt
new file mode 100644
index 0000000..d68b66f
--- /dev/null
+++ b/prs/handler/org.apache.commons.logging/release/modules/ext/commons-logging-1.1.1-license.txt
@@ -0,0 +1,208 @@
+Name: Apache Jakarta Commons Logging
+Origin: Apache Software Foundation
+Version: 1.1.1
+License: Apache-2.0
+Description: Logging component
+URL: http://commons.apache.org/logging/
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/prs/handler/org.apache.commons.logging/release/modules/ext/commons-logging-1.1.1-notice.txt b/prs/handler/org.apache.commons.logging/release/modules/ext/commons-logging-1.1.1-notice.txt
new file mode 100644
index 0000000..6e15324
--- /dev/null
+++ b/prs/handler/org.apache.commons.logging/release/modules/ext/commons-logging-1.1.1-notice.txt
@@ -0,0 +1,15 @@
+// ------------------------------------------------------------------
+// NOTICE file corresponding to the section 4d of The Apache License,
+// Version 2.0, in this case for Commons Logging
+// ------------------------------------------------------------------
+
+Commons Logging
+Copyright 2001-2007 The Apache Software Foundation
+
+This product includes/uses software(s) developed by 'an unknown organization'
+  - Unnamed - avalon-framework:avalon-framework:jar:4.1.3
+  - Unnamed - log4j:log4j:jar:1.2.12
+  - Unnamed - logkit:logkit:jar:1.0.1
+
+
+
diff --git a/prs/handler/org.apache.commons.logging/release/modules/ext/commons-logging-1.1.1.jar b/prs/handler/org.apache.commons.logging/release/modules/ext/commons-logging-1.1.1.jar
new file mode 100644
index 0000000..1deef14
Binary files /dev/null and b/prs/handler/org.apache.commons.logging/release/modules/ext/commons-logging-1.1.1.jar differ
diff --git a/prs/handler/org.apache.commons.logging/src/org/apache/commons/logging/Bundle.properties b/prs/handler/org.apache.commons.logging/src/org/apache/commons/logging/Bundle.properties
new file mode 100644
index 0000000..3440563
--- /dev/null
+++ b/prs/handler/org.apache.commons.logging/src/org/apache/commons/logging/Bundle.properties
@@ -0,0 +1,16 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+OpenIDE-Module-Name=org.apache.commons.logging
diff --git a/prs/script/prs b/prs/script/prs
new file mode 100755
index 0000000..716651a
--- /dev/null
+++ b/prs/script/prs
@@ -0,0 +1 @@
+java -classpath `ls webapp/dependency/*.jar | tr '\n' ':'`:webapp/webapp-1.0-SNAPSHOT.jar -Dinstall.dir=`pwd` org.netbeans.jackpot.prs.webapp.WebApp $HOME/prs-config/
diff --git a/prs/webapp/pom.xml b/prs/webapp/pom.xml
new file mode 100644
index 0000000..2e1ff46
--- /dev/null
+++ b/prs/webapp/pom.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>org.netbeans.jackpot.prs</groupId>
+    <artifactId>webapp</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+    <dependencies>
+        <dependency>
+            <groupId>org.kohsuke</groupId>
+            <artifactId>github-api</artifactId>
+            <version>1.95</version>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.grizzly</groupId>
+            <artifactId>grizzly-servlet-webserver</artifactId>
+            <version>1.9.65</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.core</groupId>
+            <artifactId>jersey-server</artifactId>
+            <version>2.27</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.containers</groupId>
+            <artifactId>jersey-container-grizzly2-servlet</artifactId>
+            <version>2.26</version>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish.jersey.inject</groupId>
+            <artifactId>jersey-hk2</artifactId>
+            <version>2.27</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.xml.bind</groupId>
+            <artifactId>jaxb-api</artifactId>
+            <version>2.2.11</version>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.xml.bind</groupId>
+            <artifactId>jaxb-core</artifactId>
+            <version>2.2.11</version>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.xml.bind</groupId>
+            <artifactId>jaxb-impl</artifactId>
+            <version>2.2.11</version>
+        </dependency>
+        <dependency>
+            <groupId>javax.activation</groupId>
+            <artifactId>activation</artifactId>
+            <version>1.1.1</version>
+        </dependency>
+
+<!--        <dependency>
+            <groupId>org.glassfish.jersey.media</groupId>
+            <artifactId>jersey-media-json-jackson</artifactId>
+            <version>2.17</version>
+        </dependency>-->
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>2.9.2</version>
+        </dependency>
+    </dependencies>
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+    </properties>
+</project>
\ No newline at end of file
diff --git a/prs/webapp/src/main/java/org/netbeans/jackpot/prs/webapp/Config.java b/prs/webapp/src/main/java/org/netbeans/jackpot/prs/webapp/Config.java
new file mode 100644
index 0000000..cc93a08
--- /dev/null
+++ b/prs/webapp/src/main/java/org/netbeans/jackpot/prs/webapp/Config.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.netbeans.jackpot.prs.webapp;
+
+import java.nio.file.Path;
+import java.util.prefs.Preferences;
+
+/**
+ *
+ * @author lahvac
+ */
+public class Config {
+    
+    private static final Config INSTANCE = new Config();
+
+    public static Config getDefault() {
+        return INSTANCE;
+    }
+    
+    
+    public void setConfigDir(Path configDir) {
+        System.setProperty("java.util.prefs.userRoot", configDir.toString());
+    }
+    
+    public Preferences getPreferences() {
+        return Preferences.userRoot();
+    }
+    
+}
diff --git a/prs/webapp/src/main/java/org/netbeans/jackpot/prs/webapp/WebApp.java b/prs/webapp/src/main/java/org/netbeans/jackpot/prs/webapp/WebApp.java
new file mode 100644
index 0000000..e81d724
--- /dev/null
+++ b/prs/webapp/src/main/java/org/netbeans/jackpot/prs/webapp/WebApp.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.netbeans.jackpot.prs.webapp;
+
+import com.sun.grizzly.http.embed.GrizzlyWebServer;
+import com.sun.grizzly.http.servlet.ServletAdapter;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import org.glassfish.jersey.server.ServerProperties;
+import org.glassfish.jersey.servlet.ServletContainer;
+
+/**
+ *
+ * @author lahvac
+ */
+public class WebApp {
+    public static void main(String... origArgs) throws IOException {
+        int port = 9996;
+
+        List<String> args = new ArrayList<String>(Arrays.asList(origArgs));
+
+        if (args.size() > 1 && "--port".equals(args.get(0))) {
+            args.remove(0);
+            port = Integer.parseInt(args.remove(0));
+        }
+        
+        Config.getDefault().setConfigDir(Paths.get(args.remove(0)));
+        
+//        if (args.size() != 1 && args.size() != 2) {
+//            System.err.println("Usage: java -jar " + WebApp.class.getProtectionDomain().getCodeSource().getLocation().getPath() + " [--port <port>] <cache> [<static-content>]");
+//            return ;
+//        }
+//
+        GrizzlyWebServer gws;
+
+//        if (args.size() == 2) {
+//            gws = new GrizzlyWebServer(port, args.get(1));
+//        } else {
+            gws = new GrizzlyWebServer(port);
+//        }
+        
+        if (port == 0) {
+            gws.getSelectorThread().setAddress(InetAddress.getByName("localhost"));
+        }
+
+        // Jersey web resources
+        ServletAdapter jerseyAdapter = new ServletAdapter();
+        jerseyAdapter.addInitParameter(ServerProperties.PROVIDER_PACKAGES, WebAppNotify.class.getPackageName());
+        jerseyAdapter.addInitParameter(ServerProperties.TRACING, "ALL");
+        jerseyAdapter.setContextPath("/");
+        jerseyAdapter.setServletInstance(new ServletContainer());
+
+        // register all above defined adapters
+        gws.addGrizzlyAdapter(jerseyAdapter);
+
+        // let Grizzly run
+        gws.start();
+
+        if (port == 0) {
+            System.out.println("Running on port: " + gws.getSelectorThread().getPortLowLevel());
+        }
+    }
+}
diff --git a/prs/webapp/src/main/java/org/netbeans/jackpot/prs/webapp/WebAppAuthTarget.java b/prs/webapp/src/main/java/org/netbeans/jackpot/prs/webapp/WebAppAuthTarget.java
new file mode 100644
index 0000000..8ebd2e0
--- /dev/null
+++ b/prs/webapp/src/main/java/org/netbeans/jackpot/prs/webapp/WebAppAuthTarget.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.netbeans.jackpot.prs.webapp;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.ProtocolException;
+import java.net.URI;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.net.ssl.HttpsURLConnection;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import org.kohsuke.github.GHMyself;
+import org.kohsuke.github.GitHub;
+
+/**
+ *
+ * @author lahvac
+ */
+@Path("/github/authtarget")
+public class WebAppAuthTarget {
+    @GET
+    public static Response authCallBack(@Context HttpServletRequest request, @Context UriInfo uriInfo, @QueryParam("code") String code, @QueryParam("state") String state) {
+        try {
+            //TODO: check state
+            String clientId = Config.getDefault().getPreferences().node("app").get("client_id", null);
+            String clientSecret = Config.getDefault().getPreferences().node("app").get("client_secret", null);
+            String params = "client_id=" + clientId + "&client_secret=" + clientSecret + "&code=" + code;
+            byte[] data = params.getBytes("UTF-8");
+            URL accessTokenURL = new URL("https://github.com/login/oauth/access_token");
+            HttpsURLConnection conn = (HttpsURLConnection) accessTokenURL.openConnection();
+            conn.setRequestMethod("POST");
+            conn.setDoOutput(true);
+            conn.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded"); 
+            conn.setRequestProperty( "charset", "utf-8");
+            conn.setRequestProperty( "Content-Length", Integer.toString(data.length));
+            conn.getOutputStream().write(data);
+            ByteArrayOutputStream inp = new ByteArrayOutputStream();
+            try (InputStream in = conn.getInputStream()) {
+                int read;
+                while ((read = in.read()) != (-1)) {
+                    inp.write(read);
+                }
+            }
+            String keys = new String(inp.toByteArray(), "UTF-8").replace('&', '\n');
+            Properties keysProps = new Properties();
+            keysProps.load(new StringReader(keys));
+            String oauthToken = keysProps.getProperty("access_token");
+            HttpSession session = request.getSession();
+            session.setAttribute("access_token", oauthToken);
+            GHMyself currentUser = GitHub.connectUsingOAuth(oauthToken).getMyself();
+            session.setAttribute("user_name", currentUser.getName());
+            session.setAttribute("user_login", currentUser.getLogin());
+            //XXX: how to handle the access tokens?
+            Config.getDefault().getPreferences().node("users").node(currentUser.getLogin()).put("access_token", oauthToken);
+            return Response.seeOther(uriInfo.getBaseUri().resolve("/github")).build();
+        } catch (IOException ex) {
+            throw new IllegalStateException(ex);
+        }
+    }
+}
diff --git a/prs/webapp/src/main/java/org/netbeans/jackpot/prs/webapp/WebAppEnableDisable.java b/prs/webapp/src/main/java/org/netbeans/jackpot/prs/webapp/WebAppEnableDisable.java
new file mode 100644
index 0000000..4213667
--- /dev/null
+++ b/prs/webapp/src/main/java/org/netbeans/jackpot/prs/webapp/WebAppEnableDisable.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.netbeans.jackpot.prs.webapp;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.ProtocolException;
+import java.net.URI;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.prefs.Preferences;
+import javax.net.ssl.HttpsURLConnection;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import org.kohsuke.github.GHEvent;
+import org.kohsuke.github.GHHook;
+import org.kohsuke.github.GHMyself;
+import org.kohsuke.github.GHRepository;
+import org.kohsuke.github.GitHub;
+
+/**
+ *
+ * @author lahvac
+ */
+@Path("/github/enableDisable")
+public class WebAppEnableDisable {
+    private static final String NOTIFY_HOOK_URL = "http://jackpot.findusages.cloud/github/notify";
+    @GET
+    public static void authCallBack(@Context HttpServletRequest request, @QueryParam("repo") String repo) {
+        try {
+            String[] userAndRepo = repo.split("/");
+            Preferences repositories = Config.getDefault().getPreferences().node("users").node(userAndRepo[0]).node("repositories");
+            boolean enabled = !repositories.getBoolean(userAndRepo[1], false);
+            repositories.putBoolean(userAndRepo[1], enabled);
+            String accessToken = (String) request.getSession().getAttribute("access_token");
+            GHRepository repository = GitHub.connectUsingOAuth(accessToken).getRepository(repo);
+            Optional<GHHook> hook = repository.getHooks().stream().filter(h -> NOTIFY_HOOK_URL.equals(h.getConfig().get("url"))).findAny();
+            if (hook.isPresent()) {
+                if (!enabled) {
+                    //TODO: would be better to simply deactive the hook
+                    hook.get().delete();
+                }
+            } else {
+                if (enabled) {
+                    Map<String, String> config = new HashMap<>();
+                    config.put("url", NOTIFY_HOOK_URL);
+                    config.put("content_type", "json");
+                    config.put("content_type", "json");
+                    repository.createHook("Jackpot", config, EnumSet.of(GHEvent.PULL_REQUEST), true);
+                }
+            }
+        } catch (IOException ex) {
+            throw new IllegalStateException(ex);
+        }
+    }
+}
diff --git a/prs/webapp/src/main/java/org/netbeans/jackpot/prs/webapp/WebAppMainPage.java b/prs/webapp/src/main/java/org/netbeans/jackpot/prs/webapp/WebAppMainPage.java
new file mode 100644
index 0000000..7af0d7c
--- /dev/null
+++ b/prs/webapp/src/main/java/org/netbeans/jackpot/prs/webapp/WebAppMainPage.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.netbeans.jackpot.prs.webapp;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.prefs.Preferences;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import org.kohsuke.github.GHRepository;
+import org.kohsuke.github.GitHub;
+
+/**
+ *
+ * @author lahvac
+ */
+@Path("/github")
+public class WebAppMainPage {
+    @GET
+    @Path("/")
+    @Produces(MediaType.TEXT_HTML)
+    public static String main(@Context HttpServletRequest request) {
+        String userName = (String) request.getSession().getAttribute("user_name");
+        if (userName != null) {
+            Set<String> allowedUsers = new HashSet<>(Arrays.asList(Config.getDefault().getPreferences().node("app").get("allowed_users", "").split(",")));
+            String userLogin = (String) request.getSession().getAttribute("user_login");
+            if (!allowedUsers.contains(userLogin)) {
+                StringBuilder page = new StringBuilder();
+                page.append("<html>");
+                page.append("<body>");
+                page.append("    Sorry, this site is only for invited users at this point.");
+                page.append("</body>");
+                return page.toString();
+            }
+            StringBuilder page = new StringBuilder();
+            page.append("<html>");
+            try {
+                String accessToken = (String) request.getSession().getAttribute("access_token");
+                page.append("<body>");
+                page.append("<script>");
+                page.append("function enableDisable(repo) {");
+                page.append("    var xhr = new XMLHttpRequest();");
+                page.append("    xhr.open('GET', '/github/enableDisable?repo=' + repo, true);");
+                page.append("    xhr.send();");
+                page.append("}");
+                page.append("</script>");
+                page.append("    <a href=\"\">" + userName + "</a>");
+                page.append("Repositories:");
+                page.append("<ul>");
+                GitHub github = GitHub.connectUsingOAuth(accessToken);
+                Preferences repositories = Config.getDefault().getPreferences().node("users").node(userLogin).node("repositories");
+                for (Entry<String, GHRepository> e : github.getMyself().getRepositories().entrySet()) {//TODO: use list
+                    String checked;
+                    if (repositories.getBoolean(e.getValue().getName(), false)) {
+                        checked = " checked='true'";
+                    } else {
+                        checked = "";
+                    }
+                    page.append("<li><input type='checkbox' onclick='enableDisable(\"" + userLogin + "/" + e.getValue().getName() + "\")'" + checked + "/>"+ e.getValue().getName() + "</li>");
+                }
+                page.append("</ul>");
+                Set<String> admins = Set.of(Config.getDefault().getPreferences().node("app").get("admins", "").split(","));
+                if (admins.contains(userLogin)) {
+                    page.append("Remaining rate limit: " + github.rateLimit().toString());
+                }
+            } catch (IOException ex) {
+                //TODO: handle
+                ex.printStackTrace();
+            }
+            page.append("</body>");
+            return page.toString();
+        } else {
+            String clientId = Config.getDefault().getPreferences().node("app").get("client_id", null);
+            return "<html>" +
+                   "<body>" +
+                   "    <a href=\"https://github.com/login/oauth/authorize?client_id=" + clientId + "&scope=write:repo_hook%20repo:status&state=9843759384\">Login with GitHub.</a>" +
+                   "</body>";
+        }
+    }
+}
diff --git a/prs/webapp/src/main/java/org/netbeans/jackpot/prs/webapp/WebAppNotify.java b/prs/webapp/src/main/java/org/netbeans/jackpot/prs/webapp/WebAppNotify.java
new file mode 100644
index 0000000..11dbd19
--- /dev/null
+++ b/prs/webapp/src/main/java/org/netbeans/jackpot/prs/webapp/WebAppNotify.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.netbeans.jackpot.prs.webapp;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.prefs.Preferences;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.core.MediaType;
+
+/**
+ *
+ * @author lahvac
+ */
+@Path("/github/notify")
+public class WebAppNotify {
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    public static void webhook(String data) throws IOException {
+        Map<String, Object> inputParsed = new ObjectMapper().readValue(data, Map.class);
+        Object action = inputParsed.get("action");
+        if (!"opened".equals(action))
+            return ;
+        Map<String, Object> pullRequest = (Map<String, Object>) inputParsed.get("pull_request");
+        if (pullRequest == null) {
+            return ;
+        }
+        Map<String, Object> repository = (Map<String, Object>) inputParsed.get("repository");
+        if (repository == null) {
+            return ;
+        }
+        String[] userAndRepo = ((String) repository.get("full_name")).split("/");
+        Preferences repositories = Config.getDefault().getPreferences().node("users").node(userAndRepo[0]).node("repositories");
+        if (!repositories.getBoolean(userAndRepo[1], false)) {
+            return ;
+        }
+        Preferences handlerPrefs = Config.getDefault().getPreferences().node("handler");
+        String handler = handlerPrefs.get("handler", "handler");
+        String remoteHost = handlerPrefs.get("remoteHost", null);
+        String remotePath = handlerPrefs.get("remotePath", null);
+        ProcessBuilder builder;
+        if (remoteHost != null && remotePath != null) {
+            builder = new ProcessBuilder(System.getProperty("install.dir") + "/handler/bin/handler.remote", remoteHost, remotePath, handler);
+        } else {
+            builder = new ProcessBuilder(System.getProperty("install.dir") + "/handler/bin/" + handler);
+        }
+        builder.environment().put("PR_CONTENT", data);
+        //XXX: how to handle the access tokens?
+        builder.environment().put("OAUTH_TOKEN", Config.getDefault().getPreferences().node("users").node(userAndRepo[0]).get("access_token", ""));
+        builder.environment().put("OAUTH_APP_TOKEN", Config.getDefault().getPreferences().node("app").get("access_token", ""));
+        //TODO: logs!
+        builder.inheritIO().start();
+    }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists