Merge branch 'jetty-9.4.x' into jetty-9.4.x-2815-hpackOpaqueBytes

Signed-off-by: Greg Wilkins <gregw@webtide.com>
This commit is contained in:
Greg Wilkins 2019-09-11 10:17:33 +10:00
commit bd220400a1
3696 changed files with 134998 additions and 109758 deletions

1
.gitignore vendored
View File

@ -19,6 +19,7 @@ bin/
*.backup *.backup
*.debug *.debug
*.dump *.dump
.attach_pid*
# vim # vim
.*.sw[a-p] .*.sw[a-p]

317
Jenkinsfile vendored
View File

@ -1,199 +1,160 @@
#!groovy #!groovy
// in case of change update method isMainBuild pipeline {
def jdks = ["jdk8","jdk9","jdk10","jdk11"] agent any
def oss = ["linux"] // save some io during the build
def builds = [:] options { durabilityHint('PERFORMANCE_OPTIMIZED') }
for (def os in oss) { stages {
for (def jdk in jdks) { stage("Parallel Stage") {
builds[os+"_"+jdk] = getFullBuild( jdk, os ) parallel {
} stage("Build / Test - JDK8") {
} agent { node { label 'linux' } }
steps {
parallel builds timeout(time: 120, unit: 'MINUTES') {
mavenBuild("jdk8", "-Pmongodb install", "maven3", true)
// Collect up the jacoco execution results (only on main build)
def getFullBuild(jdk, os) {
return {
node(os) {
// System Dependent Locations
def mvnName = 'maven3.5'
def localRepo = "${env.JENKINS_HOME}/${env.EXECUTOR_NUMBER}" // ".repository" //
def settingsName = 'oss-settings.xml'
def mavenOpts = '-Xms1g -Xmx4g -Djava.awt.headless=true'
try {
stage("Checkout - ${jdk}") {
checkout scm
}
} catch (Exception e) {
notifyBuild("Checkout Failure", jdk)
throw e
}
try {
stage("Compile - ${jdk}") {
timeout(time: 15, unit: 'MINUTES') {
withMaven(
maven: mvnName,
jdk: "$jdk",
publisherStrategy: 'EXPLICIT',
globalMavenSettingsConfig: settingsName,
mavenOpts: mavenOpts,
mavenLocalRepo: localRepo) {
sh "mvn -V -B clean install -DskipTests -T6 -e"
}
}
}
} catch(Exception e) {
notifyBuild("Compile Failure", jdk)
throw e
}
try {
stage("Javadoc - ${jdk}") {
timeout(time: 20, unit: 'MINUTES') {
withMaven(
maven: mvnName,
jdk: "$jdk",
publisherStrategy: 'EXPLICIT',
globalMavenSettingsConfig: settingsName,
mavenOpts: mavenOpts,
mavenLocalRepo: localRepo) {
sh "mvn -V -B javadoc:javadoc -T6 -e"
}
}
}
} catch(Exception e) {
notifyBuild("Javadoc Failure", jdk)
throw e
}
try {
stage("Test - ${jdk}") {
timeout(time: 90, unit: 'MINUTES') {
// Run test phase / ignore test failures
withMaven(
maven: mvnName,
jdk: "$jdk",
publisherStrategy: 'EXPLICIT',
globalMavenSettingsConfig: settingsName,
//options: [invokerPublisher(disabled: false)],
mavenOpts: mavenOpts,
mavenLocalRepo: localRepo) {
sh "mvn -V -B install -Dmaven.test.failure.ignore=true -e -Pmongodb -T3 -Dunix.socket.tmp="+env.JENKINS_HOME
}
// withMaven doesn't label..
// Report failures in the jenkins UI
junit testResults:'**/target/surefire-reports/TEST-*.xml,**/target/failsafe-reports/TEST-*.xml'
consoleParsers = [[parserName: 'JavaDoc'],
[parserName: 'JavaC']];
if (isMainBuild( jdk )) {
// Collect up the jacoco execution results
def jacocoExcludes =
// build tools
"**/org/eclipse/jetty/ant/**" + ",**/org/eclipse/jetty/maven/**" +
",**/org/eclipse/jetty/jspc/**" +
// example code / documentation
",**/org/eclipse/jetty/embedded/**" + ",**/org/eclipse/jetty/asyncrest/**" +
",**/org/eclipse/jetty/demo/**" +
// special environments / late integrations
",**/org/eclipse/jetty/gcloud/**" + ",**/org/eclipse/jetty/infinispan/**" +
",**/org/eclipse/jetty/osgi/**" + ",**/org/eclipse/jetty/spring/**" +
",**/org/eclipse/jetty/http/spi/**" +
// test classes
",**/org/eclipse/jetty/tests/**" + ",**/org/eclipse/jetty/test/**";
jacoco inclusionPattern: '**/org/eclipse/jetty/**/*.class', jacoco inclusionPattern: '**/org/eclipse/jetty/**/*.class',
exclusionPattern: jacocoExcludes, exclusionPattern: '' +
execPattern : '**/target/jacoco.exec', // build tools
classPattern : '**/target/classes', '**/org/eclipse/jetty/ant/**' +
sourcePattern : '**/src/main/java' ',**/org/eclipse/jetty/maven/**' +
consoleParsers = [[parserName: 'Maven'], ',**/org/eclipse/jetty/jspc/**' +
[parserName: 'JavaDoc'], // example code / documentation
[parserName: 'JavaC']]; ',**/org/eclipse/jetty/embedded/**' +
',**/org/eclipse/jetty/asyncrest/**' +
',**/org/eclipse/jetty/demo/**' +
// special environments / late integrations
',**/org/eclipse/jetty/gcloud/**' +
',**/org/eclipse/jetty/infinispan/**' +
',**/org/eclipse/jetty/osgi/**' +
',**/org/eclipse/jetty/spring/**' +
',**/org/eclipse/jetty/http/spi/**' +
// test classes
',**/org/eclipse/jetty/tests/**' +
',**/org/eclipse/jetty/test/**',
execPattern: '**/target/jacoco.exec',
classPattern: '**/target/classes',
sourcePattern: '**/src/main/java'
warnings consoleParsers: [[parserName: 'Maven'], [parserName: 'Java']]
junit testResults: '**/target/surefire-reports/*.xml,**/target/invoker-reports/TEST*.xml'
} }
// Report on Maven and Javadoc warnings
step( [$class : 'WarningsPublisher',
consoleParsers: consoleParsers] )
}
if(isUnstable()) {
notifyBuild("Unstable / Test Errors", jdk)
} }
} }
} catch(Exception e) {
notifyBuild("Test Failure", jdk)
throw e
}
try stage("Build / Test - JDK11") {
{ agent { node { label 'linux' } }
stage ("Compact3 - ${jdk}") { steps {
withMaven( timeout(time: 120, unit: 'MINUTES') {
maven: mvnName, mavenBuild("jdk11", "-Pmongodb install", "maven3", true)
jdk: "$jdk", warnings consoleParsers: [[parserName: 'Maven'], [parserName: 'Java']]
publisherStrategy: 'EXPLICIT', junit testResults: '**/target/surefire-reports/*.xml,**/target/invoker-reports/TEST*.xml'
globalMavenSettingsConfig: settingsName, }
mavenOpts: mavenOpts,
mavenLocalRepo: localRepo) {
sh "mvn -f aggregates/jetty-all-compact3 -V -B -Pcompact3 clean install -T5"
} }
} }
} catch(Exception e) {
notifyBuild("Compact3 Failure", jdk)
throw e
}
stage("Build / Test - JDK12") {
agent { node { label 'linux' } }
steps {
timeout(time: 120, unit: 'MINUTES') {
mavenBuild("jdk12", "-Pmongodb install", "maven3", true)
warnings consoleParsers: [[parserName: 'Maven'], [parserName: 'Java']]
junit testResults: '**/target/surefire-reports/*.xml,**/target/invoker-reports/TEST*.xml'
}
}
}
stage("Build Javadoc") {
agent { node { label 'linux' } }
steps {
timeout(time: 30, unit: 'MINUTES') {
mavenBuild("jdk11", "install javadoc:javadoc javadoc:aggregate-jar -DskipTests", "maven3", true)
warnings consoleParsers: [[parserName: 'Maven'], [parserName: 'JavaDoc'], [parserName: 'Java']]
}
}
}
stage("Checkstyle ") {
agent { node { label 'linux' } }
steps {
timeout(time: 30, unit: 'MINUTES') {
mavenBuild("jdk11", "install -f build-resources", "maven3", true)
mavenBuild("jdk11", "install checkstyle:check -DskipTests", "maven3", true)
recordIssues(
enabledForFailure: true, aggregatingResults: true,
tools: [java(), checkStyle(pattern: '**/target/checkstyle-result.xml', reportEncoding: 'UTF-8')])
}
}
}
stage("Build Compact3") {
agent { node { label 'linux' } }
steps {
timeout(time: 30, unit: 'MINUTES') {
mavenBuild("jdk8", "-Pcompact3 install -DskipTests", "maven3", true)
warnings consoleParsers: [[parserName: 'Maven'], [parserName: 'Java']]
}
}
}
}
}
}
post {
failure {
slackNotif()
}
unstable {
slackNotif()
}
fixed {
slackNotif()
} }
} }
} }
def isMainBuild(jdk) { def slackNotif() {
return jdk == "jdk8" script {
try
{
if ( env.BRANCH_NAME == 'jetty-10.0.x' || env.BRANCH_NAME == 'jetty-9.4.x' )
{
//BUILD_USER = currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()
// by ${BUILD_USER}
COLOR_MAP = ['SUCCESS': 'good', 'FAILURE': 'danger', 'UNSTABLE': 'danger', 'ABORTED': 'danger']
slackSend channel: '#jenkins',
color: COLOR_MAP[currentBuild.currentResult],
message: "*${currentBuild.currentResult}:* Job ${env.JOB_NAME} build ${env.BUILD_NUMBER} - ${env.BUILD_URL}"
}
} catch (Exception e) {
e.printStackTrace()
echo "skip failure slack notification: " + e.getMessage()
}
}
} }
/**
* To other developers, if you are using this method above, please use the following syntax.
*
* mavenBuild("<jdk>", "<profiles> <goals> <plugins> <properties>"
*
* @param jdk the jdk tool name (in jenkins) to use for this build
* @param cmdline the command line in "<profiles> <goals> <properties>"`format.
* @return the Jenkinsfile step representing a maven build
*/
def mavenBuild(jdk, cmdline, mvnName, junitPublishDisabled) {
def localRepo = ".repository"
def mavenOpts = '-Xms1g -Xmx4g -Djava.awt.headless=true'
// True if this build is part of the "active" branches withMaven(
// for Jetty. maven: mvnName,
def isActiveBranch() { jdk: "$jdk",
def branchName = "${env.BRANCH_NAME}" publisherStrategy: 'EXPLICIT',
return ( branchName == "master" || options: [junitPublisher(disabled: junitPublishDisabled),mavenLinkerPublisher(disabled: false),pipelineGraphPublisher(disabled: false)],
( branchName.startsWith("jetty-") && branchName.endsWith(".x") ) ); mavenOpts: mavenOpts,
} mavenLocalRepo: localRepo) {
// Some common Maven command line + provided command line
// Test if the Jenkins Pipeline or Step has marked the sh "mvn -Pci -V -B -T3 -e -Dmaven.test.failure.ignore=true -Djetty.testtracker.log=true $cmdline -Dunix.socket.tmp=" + env.JENKINS_HOME
// current build as unstable
def isUnstable() {
return currentBuild.result == "UNSTABLE"
}
// Send a notification about the build status
def notifyBuild(String buildStatus, String jdk) {
if ( !isActiveBranch() ) {
// don't send notifications on transient branches
return
} }
// default the value
buildStatus = buildStatus ?: "UNKNOWN"
def email = "${env.EMAILADDRESS}"
def summary = "${env.JOB_NAME}#${env.BUILD_NUMBER} - ${buildStatus} with jdk ${jdk}"
def detail = """<h4>Job: <a href='${env.JOB_URL}'>${env.JOB_NAME}</a> [#${env.BUILD_NUMBER}]</h4>
<p><b>${buildStatus}</b></p>
<table>
<tr><td>Build</td><td><a href='${env.BUILD_URL}'>${env.BUILD_URL}</a></td><tr>
<tr><td>Console</td><td><a href='${env.BUILD_URL}console'>${env.BUILD_URL}console</a></td><tr>
<tr><td>Test Report</td><td><a href='${env.BUILD_URL}testReport/'>${env.BUILD_URL}testReport/</a></td><tr>
</table>
"""
emailext (
to: email,
subject: summary,
body: detail
)
} }
// vim: et:ts=2:sw=2:ft=groovy // vim: et:ts=2:sw=2:ft=groovy

View File

@ -2,53 +2,49 @@
def branch = params.get("JETTY_BRANCH" ,"jetty-9.4.x") def branch = params.get("JETTY_BRANCH" ,"jetty-9.4.x")
def owner = params.get("REPO_OWNER", "eclipse") def owner = params.get("REPO_OWNER", "eclipse")
def jdk = params.get("JDK", "jdk8")
def jmhJarPath = params.get("jmhJarPath","jetty-jmh/target/benchmarks.jar")
currentBuild.description = "Build branch $branch with jdk $jdk"
node("linux") { node("linux") {
// System Dependent Locations // System Dependent Locations
def mvntool = tool name: 'maven3.5', type: 'hudson.tasks.Maven$MavenInstallation'
def jdktool = tool name: "jdk8", type: 'hudson.model.JDK'
def mvnName = 'maven3.5' def mvnName = 'maven3.5'
def localRepo = "${env.JENKINS_HOME}/${env.EXECUTOR_NUMBER}" def localRepo = "${env.JENKINS_HOME}/${env.EXECUTOR_NUMBER}"
def settingsName = 'oss-settings.xml' def settingsName = 'oss-settings.xml'
def mavenOpts = '-Xms1g -Xmx4g -Djava.awt.headless=true' def mavenOpts = '-Xms1g -Xmx4g -Djava.awt.headless=true'
// Environment
List mvnEnv = ["PATH+MVN=${mvntool}/bin", "PATH+JDK=${jdktool}/bin", "JAVA_HOME=${jdktool}/", "MAVEN_HOME=${mvntool}"]
mvnEnv.add("MAVEN_OPTS=$mavenOpts")
stage("Checkout") { stage("Checkout") {
git url: "https://github.com/$owner/jetty.project.git", branch: "$branch" git url: "https://github.com/$owner/jetty.project.git", branch: "$branch"
} }
stage("Compile") { stage("Compile") {
withEnv(mvnEnv) { timeout(time: 15, unit: 'MINUTES') {
timeout(time: 15, unit: 'MINUTES') { withMaven(
withMaven( maven: mvnName,
maven: mvnName, jdk: jdk,
jdk: "jdk8", publisherStrategy: 'EXPLICIT',
publisherStrategy: 'EXPLICIT', globalMavenSettingsConfig: settingsName,
globalMavenSettingsConfig: settingsName, mavenOpts: mavenOpts,
mavenOpts: mavenOpts, mavenLocalRepo: localRepo) {
mavenLocalRepo: localRepo) { sh "mvn -V -B clean install -DskipTests -T6 -e -pl :jetty-jmh -am"
sh "mvn -V -B clean install -DskipTests -T6 -e"
}
} }
stash name: 'perf-tests', includes: 'jetty-jmh/target/benchmarks.jar'
} }
stash name: 'perf-tests', includes: jmhJarPath
} }
} }
// jmh run // jmh run
node( 'jmh-build-node' ) {
stage("jmh-run") { stage("jmh-run") {
node( 'jmh-build-node' ) { timeout( time: 210, unit: 'MINUTES' ) {
timeout( time: 120, unit: 'MINUTES' ) { withEnv( ["JAVA_HOME=${tool "$jdk"}"] ) {
withEnv( ["JAVA_HOME=${tool "jdk8"}"] ) {
unstash name: 'perf-tests' unstash name: 'perf-tests'
sh "${env.JAVA_HOME}/bin/java -jar jetty-jmh/target/benchmarks.jar -rff jetty-jmh/target/jmh_result.json -rf json" sh "rm -rf jmh_results"
jmhReport 'jetty-jmh/target/jmh_result.json' sh "mkdir jmh_results"
sh "${env.JAVA_HOME}/bin/java -jar $jmhJarPath -rff jmh_results/jmh_result.json -rf json -foe true -i 3 -t 3 -wi 3"
jmhReport 'jmh_results/jmh_result.json'
} }
} }
} }

415
LICENSE Normal file
View File

@ -0,0 +1,415 @@
This program and the accompanying materials are made available under the
terms of the Eclipse Public License 1.0 which is available at
https://www.eclipse.org/org/documents/epl-1.0/EPL-1.0.txt
or the Apache Software License 2.0 which is available at
https://www.apache.org/licenses/LICENSE-2.0
Eclipse Public License - v 1.0
THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
1. DEFINITIONS
"Contribution" means:
a) in the case of the initial Contributor, the initial code and documentation
distributed under this Agreement, and
b) in the case of each subsequent Contributor:
i) changes to the Program, and
ii) additions to the Program;
where such changes and/or additions to the Program originate from and are
distributed by that particular Contributor. A Contribution 'originates'
from a Contributor if it was added to the Program by such Contributor
itself or anyone acting on such Contributor's behalf. Contributions do not
include additions to the Program which: (i) are separate modules of
software distributed in conjunction with the Program under their own
license agreement, and (ii) are not derivative works of the Program.
"Contributor" means any person or entity that distributes the Program.
"Licensed Patents" mean patent claims licensable by a Contributor which are
necessarily infringed by the use or sale of its Contribution alone or when
combined with the Program.
"Program" means the Contributions distributed in accordance with this
Agreement.
"Recipient" means anyone who receives the Program under this Agreement,
including all Contributors.
2. GRANT OF RIGHTS
a) Subject to the terms of this Agreement, each Contributor hereby grants
Recipient a non-exclusive, worldwide, royalty-free copyright license to
reproduce, prepare derivative works of, publicly display, publicly
perform, distribute and sublicense the Contribution of such Contributor,
if any, and such derivative works, in source code and object code form.
b) Subject to the terms of this Agreement, each Contributor hereby grants
Recipient a non-exclusive, worldwide, royalty-free patent license under
Licensed Patents to make, use, sell, offer to sell, import and otherwise
transfer the Contribution of such Contributor, if any, in source code and
object code form. This patent license shall apply to the combination of
the Contribution and the Program if, at the time the Contribution is
added by the Contributor, such addition of the Contribution causes such
combination to be covered by the Licensed Patents. The patent license
shall not apply to any other combinations which include the Contribution.
No hardware per se is licensed hereunder.
c) Recipient understands that although each Contributor grants the licenses
to its Contributions set forth herein, no assurances are provided by any
Contributor that the Program does not infringe the patent or other
intellectual property rights of any other entity. Each Contributor
disclaims any liability to Recipient for claims brought by any other
entity based on infringement of intellectual property rights or
otherwise. As a condition to exercising the rights and licenses granted
hereunder, each Recipient hereby assumes sole responsibility to secure
any other intellectual property rights needed, if any. For example, if a
third party patent license is required to allow Recipient to distribute
the Program, it is Recipient's responsibility to acquire that license
before distributing the Program.
d) Each Contributor represents that to its knowledge it has sufficient
copyright rights in its Contribution, if any, to grant the copyright
license set forth in this Agreement.
3. REQUIREMENTS
A Contributor may choose to distribute the Program in object code form under
its own license agreement, provided that:
a) it complies with the terms and conditions of this Agreement; and
b) its license agreement:
i) effectively disclaims on behalf of all Contributors all warranties
and conditions, express and implied, including warranties or
conditions of title and non-infringement, and implied warranties or
conditions of merchantability and fitness for a particular purpose;
ii) effectively excludes on behalf of all Contributors all liability for
damages, including direct, indirect, special, incidental and
consequential damages, such as lost profits;
iii) states that any provisions which differ from this Agreement are
offered by that Contributor alone and not by any other party; and
iv) states that source code for the Program is available from such
Contributor, and informs licensees how to obtain it in a reasonable
manner on or through a medium customarily used for software exchange.
When the Program is made available in source code form:
a) it must be made available under this Agreement; and
b) a copy of this Agreement must be included with each copy of the Program.
Contributors may not remove or alter any copyright notices contained
within the Program.
Each Contributor must identify itself as the originator of its Contribution,
if
any, in a manner that reasonably allows subsequent Recipients to identify the
originator of the Contribution.
4. COMMERCIAL DISTRIBUTION
Commercial distributors of software may accept certain responsibilities with
respect to end users, business partners and the like. While this license is
intended to facilitate the commercial use of the Program, the Contributor who
includes the Program in a commercial product offering should do so in a manner
which does not create potential liability for other Contributors. Therefore,
if a Contributor includes the Program in a commercial product offering, such
Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
every other Contributor ("Indemnified Contributor") against any losses,
damages and costs (collectively "Losses") arising from claims, lawsuits and
other legal actions brought by a third party against the Indemnified
Contributor to the extent caused by the acts or omissions of such Commercial
Contributor in connection with its distribution of the Program in a commercial
product offering. The obligations in this section do not apply to any claims
or Losses relating to any actual or alleged intellectual property
infringement. In order to qualify, an Indemnified Contributor must:
a) promptly notify the Commercial Contributor in writing of such claim, and
b) allow the Commercial Contributor to control, and cooperate with the
Commercial Contributor in, the defense and any related settlement
negotiations. The Indemnified Contributor may participate in any such claim at
its own expense.
For example, a Contributor might include the Program in a commercial product
offering, Product X. That Contributor is then a Commercial Contributor. If
that Commercial Contributor then makes performance claims, or offers
warranties related to Product X, those performance claims and warranties are
such Commercial Contributor's responsibility alone. Under this section, the
Commercial Contributor would have to defend claims against the other
Contributors related to those performance claims and warranties, and if a
court requires any other Contributor to pay any damages as a result, the
Commercial Contributor must pay those damages.
5. NO WARRANTY
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED 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. Each
Recipient is solely responsible for determining the appropriateness of using
and distributing the Program and assumes all risks associated with its
exercise of rights under this Agreement , including but not limited to the
risks and costs of program errors, compliance with applicable laws, damage to
or loss of data, programs or equipment, and unavailability or interruption of
operations.
6. DISCLAIMER OF LIABILITY
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION
LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY
OF SUCH DAMAGES.
7. GENERAL
If any provision of this Agreement is invalid or unenforceable under
applicable law, it shall not affect the validity or enforceability of the
remainder of the terms of this Agreement, and without further action by the
parties hereto, such provision shall be reformed to the minimum extent
necessary to make such provision valid and enforceable.
If Recipient institutes patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Program itself
(excluding combinations of the Program with other software or hardware)
infringes such Recipient's patent(s), then such Recipient's rights granted
under Section 2(b) shall terminate as of the date such litigation is filed.
All Recipient's rights under this Agreement shall terminate if it fails to
comply with any of the material terms or conditions of this Agreement and does
not cure such failure in a reasonable period of time after becoming aware of
such noncompliance. If all Recipient's rights under this Agreement terminate,
Recipient agrees to cease use and distribution of the Program as soon as
reasonably practicable. However, Recipient's obligations under this Agreement
and any licenses granted by Recipient relating to the Program shall continue
and survive.
Everyone is permitted to copy and distribute copies of this Agreement, but in
order to avoid inconsistency the Agreement is copyrighted and may only be
modified in the following manner. The Agreement Steward reserves the right to
publish new versions (including revisions) of this Agreement from time to
time. No one other than the Agreement Steward has the right to modify this
Agreement. The Eclipse Foundation is the initial Agreement Steward. The
Eclipse Foundation may assign the responsibility to serve as the Agreement
Steward to a suitable separate entity. Each new version of the Agreement will
be given a distinguishing version number. The Program (including
Contributions) may always be distributed subject to the version of the
Agreement under which it was received. In addition, after a new version of the
Agreement is published, Contributor may elect to distribute the Program
(including its Contributions) under the new version. Except as expressly
stated in Sections 2(a) and 2(b) above, Recipient receives no rights or
licenses to the intellectual property of any Contributor under this Agreement,
whether expressly, by implication, estoppel or otherwise. All rights in the
Program not expressly granted under this Agreement are reserved.
This Agreement is governed by the laws of the State of New York and the
intellectual property laws of the United States of America. No party to this
Agreement will bring a legal action under this Agreement more than one year
after the cause of action arose. Each party waives its rights to a jury trial in
any resulting litigation.
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.

View File

@ -1,576 +0,0 @@
<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"><head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<meta name="ProgId" content="Word.Document">
<meta name="Generator" content="Microsoft Word 9">
<meta name="Originator" content="Microsoft Word 9">
<link rel="File-List" href="http://www.eclipse.org/legal/Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
<title>Eclipse Public License - Version 1.0 / Apache License - Version 2.0</title>
<!--[if gte mso 9]><xml>
<o:DocumentProperties>
<o:Revision>2</o:Revision>
<o:TotalTime>3</o:TotalTime>
<o:Created>2004-03-05T23:03:00Z</o:Created>
<o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
<o:Pages>4</o:Pages>
<o:Words>1626</o:Words>
<o:Characters>9270</o:Characters>
<o:Lines>77</o:Lines>
<o:Paragraphs>18</o:Paragraphs>
<o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
<o:Version>9.4402</o:Version>
</o:DocumentProperties>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:TrackRevisions/>
</w:WordDocument>
</xml><![endif]-->
<style>
<!--
/* Font Definitions */
@font-face
{font-family:Tahoma;
panose-1:2 11 6 4 3 5 4 4 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:553679495 -2147483648 8 0 66047 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
p
{margin-right:0in;
mso-margin-top-alt:auto;
mso-margin-bottom-alt:auto;
margin-left:0in;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
p.BalloonText, li.BalloonText, div.BalloonText
{mso-style-name:"Balloon Text";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:8.0pt;
font-family:Tahoma;
mso-fareast-font-family:"Times New Roman";}
@page Section1
{size:8.5in 11.0in;
margin:1.0in 1.25in 1.0in 1.25in;
mso-header-margin:.5in;
mso-footer-margin:.5in;
mso-paper-source:0;}
div.Section1
{page:Section1;}
-->
</style>
</head><body style="" lang="EN-US">
<div class="Section1">
<p style="text-align: center;" align="center"><b>Eclipse Public License - v 1.0</b>
</p>
<p><span style="font-size: 10pt;">THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE,
REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
OF THIS AGREEMENT.</span> </p>
<p><b><span style="font-size: 10pt;">1. DEFINITIONS</span></b> </p>
<p><span style="font-size: 10pt;">"Contribution" means:</span> </p>
<p class="MsoNormal" style="margin-left: 0.5in;"><span style="font-size: 10pt;">a)
in the case of the initial Contributor, the initial code and documentation
distributed under this Agreement, and<br clear="left">
b) in the case of each subsequent Contributor:</span></p>
<p class="MsoNormal" style="margin-left: 0.5in;"><span style="font-size: 10pt;">i)
changes to the Program, and</span></p>
<p class="MsoNormal" style="margin-left: 0.5in;"><span style="font-size: 10pt;">ii)
additions to the Program;</span></p>
<p class="MsoNormal" style="margin-left: 0.5in;"><span style="font-size: 10pt;">where
such changes and/or additions to the Program originate from and are distributed
by that particular Contributor. A Contribution 'originates' from a Contributor
if it was added to the Program by such Contributor itself or anyone acting on
such Contributor's behalf. Contributions do not include additions to the
Program which: (i) are separate modules of software distributed in conjunction
with the Program under their own license agreement, and (ii) are not derivative
works of the Program. </span></p>
<p><span style="font-size: 10pt;">"Contributor" means any person or
entity that distributes the Program.</span> </p>
<p><span style="font-size: 10pt;">"Licensed Patents " mean patent
claims licensable by a Contributor which are necessarily infringed by the use
or sale of its Contribution alone or when combined with the Program. </span></p>
<p><span style="font-size: 10pt;">"Program" means the Contributions
distributed in accordance with this Agreement.</span> </p>
<p><span style="font-size: 10pt;">"Recipient" means anyone who
receives the Program under this Agreement, including all Contributors.</span> </p>
<p><b><span style="font-size: 10pt;">2. GRANT OF RIGHTS</span></b> </p>
<p class="MsoNormal" style="margin-left: 0.5in;"><span style="font-size: 10pt;">a)
Subject to the terms of this Agreement, each Contributor hereby grants Recipient
a non-exclusive, worldwide, royalty-free copyright license to<span style="color: red;"> </span>reproduce, prepare derivative works of, publicly
display, publicly perform, distribute and sublicense the Contribution of such
Contributor, if any, and such derivative works, in source code and object code
form.</span></p>
<p class="MsoNormal" style="margin-left: 0.5in;"><span style="font-size: 10pt;">b)
Subject to the terms of this Agreement, each Contributor hereby grants
Recipient a non-exclusive, worldwide,<span style="color: green;"> </span>royalty-free
patent license under Licensed Patents to make, use, sell, offer to sell, import
and otherwise transfer the Contribution of such Contributor, if any, in source
code and object code form. This patent license shall apply to the combination
of the Contribution and the Program if, at the time the Contribution is added
by the Contributor, such addition of the Contribution causes such combination
to be covered by the Licensed Patents. The patent license shall not apply to
any other combinations which include the Contribution. No hardware per se is
licensed hereunder. </span></p>
<p class="MsoNormal" style="margin-left: 0.5in;"><span style="font-size: 10pt;">c)
Recipient understands that although each Contributor grants the licenses to its
Contributions set forth herein, no assurances are provided by any Contributor
that the Program does not infringe the patent or other intellectual property
rights of any other entity. Each Contributor disclaims any liability to Recipient
for claims brought by any other entity based on infringement of intellectual
property rights or otherwise. As a condition to exercising the rights and
licenses granted hereunder, each Recipient hereby assumes sole responsibility
to secure any other intellectual property rights needed, if any. For example,
if a third party patent license is required to allow Recipient to distribute
the Program, it is Recipient's responsibility to acquire that license before
distributing the Program.</span></p>
<p class="MsoNormal" style="margin-left: 0.5in;"><span style="font-size: 10pt;">d)
Each Contributor represents that to its knowledge it has sufficient copyright
rights in its Contribution, if any, to grant the copyright license set forth in
this Agreement. </span></p>
<p><b><span style="font-size: 10pt;">3. REQUIREMENTS</span></b> </p>
<p><span style="font-size: 10pt;">A Contributor may choose to distribute the
Program in object code form under its own license agreement, provided that:</span>
</p>
<p class="MsoNormal" style="margin-left: 0.5in;"><span style="font-size: 10pt;">a)
it complies with the terms and conditions of this Agreement; and</span></p>
<p class="MsoNormal" style="margin-left: 0.5in;"><span style="font-size: 10pt;">b)
its license agreement:</span></p>
<p class="MsoNormal" style="margin-left: 0.5in;"><span style="font-size: 10pt;">i)
effectively disclaims on behalf of all Contributors all warranties and
conditions, express and implied, including warranties or conditions of title
and non-infringement, and implied warranties or conditions of merchantability
and fitness for a particular purpose; </span></p>
<p class="MsoNormal" style="margin-left: 0.5in;"><span style="font-size: 10pt;">ii)
effectively excludes on behalf of all Contributors all liability for damages,
including direct, indirect, special, incidental and consequential damages, such
as lost profits; </span></p>
<p class="MsoNormal" style="margin-left: 0.5in;"><span style="font-size: 10pt;">iii)
states that any provisions which differ from this Agreement are offered by that
Contributor alone and not by any other party; and</span></p>
<p class="MsoNormal" style="margin-left: 0.5in;"><span style="font-size: 10pt;">iv)
states that source code for the Program is available from such Contributor, and
informs licensees how to obtain it in a reasonable manner on or through a
medium customarily used for software exchange.<span style="color: blue;"> </span></span></p>
<p><span style="font-size: 10pt;">When the Program is made available in source
code form:</span> </p>
<p class="MsoNormal" style="margin-left: 0.5in;"><span style="font-size: 10pt;">a)
it must be made available under this Agreement; and </span></p>
<p class="MsoNormal" style="margin-left: 0.5in;"><span style="font-size: 10pt;">b) a
copy of this Agreement must be included with each copy of the Program. </span></p>
<p><span style="font-size: 10pt;">Contributors may not remove or alter any
copyright notices contained within the Program. </span></p>
<p><span style="font-size: 10pt;">Each Contributor must identify itself as the
originator of its Contribution, if any, in a manner that reasonably allows
subsequent Recipients to identify the originator of the Contribution. </span></p>
<p><b><span style="font-size: 10pt;">4. COMMERCIAL DISTRIBUTION</span></b> </p>
<p><span style="font-size: 10pt;">Commercial distributors of software may
accept certain responsibilities with respect to end users, business partners
and the like. While this license is intended to facilitate the commercial use
of the Program, the Contributor who includes the Program in a commercial
product offering should do so in a manner which does not create potential
liability for other Contributors. Therefore, if a Contributor includes the
Program in a commercial product offering, such Contributor ("Commercial
Contributor") hereby agrees to defend and indemnify every other
Contributor ("Indemnified Contributor") against any losses, damages and
costs (collectively "Losses") arising from claims, lawsuits and other
legal actions brought by a third party against the Indemnified Contributor to
the extent caused by the acts or omissions of such Commercial Contributor in
connection with its distribution of the Program in a commercial product
offering. The obligations in this section do not apply to any claims or Losses
relating to any actual or alleged intellectual property infringement. In order
to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
Contributor in writing of such claim, and b) allow the Commercial Contributor
to control, and cooperate with the Commercial Contributor in, the defense and
any related settlement negotiations. The Indemnified Contributor may participate
in any such claim at its own expense.</span> </p>
<p><span style="font-size: 10pt;">For example, a Contributor might include the
Program in a commercial product offering, Product X. That Contributor is then a
Commercial Contributor. If that Commercial Contributor then makes performance
claims, or offers warranties related to Product X, those performance claims and
warranties are such Commercial Contributor's responsibility alone. Under this
section, the Commercial Contributor would have to defend claims against the
other Contributors related to those performance claims and warranties, and if a
court requires any other Contributor to pay any damages as a result, the
Commercial Contributor must pay those damages.</span> </p>
<p><b><span style="font-size: 10pt;">5. NO WARRANTY</span></b> </p>
<p><span style="font-size: 10pt;">EXCEPT AS EXPRESSLY SET FORTH IN THIS
AGREEMENT, THE PROGRAM IS PROVIDED 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. Each Recipient is solely
responsible for determining the appropriateness of using and distributing the
Program and assumes all risks associated with its exercise of rights under this
Agreement , including but not limited to the risks and costs of program errors,
compliance with applicable laws, damage to or loss of data, programs or
equipment, and unavailability or interruption of operations. </span></p>
<p><b><span style="font-size: 10pt;">6. DISCLAIMER OF LIABILITY</span></b> </p>
<p><span style="font-size: 10pt;">EXCEPT AS EXPRESSLY SET FORTH IN THIS
AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
<p><b><span style="font-size: 10pt;">7. GENERAL</span></b> </p>
<p><span style="font-size: 10pt;">If any provision of this Agreement is invalid
or unenforceable under applicable law, it shall not affect the validity or
enforceability of the remainder of the terms of this Agreement, and without
further action by the parties hereto, such provision shall be reformed to the
minimum extent necessary to make such provision valid and enforceable.</span> </p>
<p><span style="font-size: 10pt;">If Recipient institutes patent litigation
against any entity (including a cross-claim or counterclaim in a lawsuit)
alleging that the Program itself (excluding combinations of the Program with
other software or hardware) infringes such Recipient's patent(s), then such
Recipient's rights granted under Section 2(b) shall terminate as of the date
such litigation is filed. </span></p>
<p><span style="font-size: 10pt;">All Recipient's rights under this Agreement
shall terminate if it fails to comply with any of the material terms or
conditions of this Agreement and does not cure such failure in a reasonable
period of time after becoming aware of such noncompliance. If all Recipient's
rights under this Agreement terminate, Recipient agrees to cease use and
distribution of the Program as soon as reasonably practicable. However,
Recipient's obligations under this Agreement and any licenses granted by
Recipient relating to the Program shall continue and survive. </span></p>
<p><span style="font-size: 10pt;">Everyone is permitted to copy and distribute
copies of this Agreement, but in order to avoid inconsistency the Agreement is
copyrighted and may only be modified in the following manner. The Agreement
Steward reserves the right to publish new versions (including revisions) of
this Agreement from time to time. No one other than the Agreement Steward has
the right to modify this Agreement. The Eclipse Foundation is the initial
Agreement Steward. The Eclipse Foundation may assign the responsibility to
serve as the Agreement Steward to a suitable separate entity. Each new version
of the Agreement will be given a distinguishing version number. The Program
(including Contributions) may always be distributed subject to the version of
the Agreement under which it was received. In addition, after a new version of
the Agreement is published, Contributor may elect to distribute the Program
(including its Contributions) under the new version. Except as expressly stated
in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
the intellectual property of any Contributor under this Agreement, whether
expressly, by implication, estoppel or otherwise. All rights in the Program not
expressly granted under this Agreement are reserved.</span> </p>
<p><span style="font-size: 10pt;">This Agreement is governed by the laws of the
State of New York and the intellectual property laws of the United States of
America. No party to this Agreement will bring a legal action under this
Agreement more than one year after the cause of action arose. Each party waives
its rights to a jury trial in any resulting litigation.</span> </p>
<p class="MsoNormal"><!--[if !supportEmptyParas]-->&nbsp;<!--[endif]--><o:p></o:p></p>
</div>
<div class="Section2">
<p style="text-align: center;" align="center"><b>Apache License</b></br>
Version 2.0, January 2004<br/>
http://www.apache.org/licenses/<br/>
</p>
<p><span style="font-size: 10pt;">TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION</spam></p>
<p><b><span style="font-size: 10pt;">1. Definitions.</span></b> </p>
<p><span style="font-size: 10pt;">
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.</span></p>
<p><span style="font-size: 10pt;">
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.</span></p>
<p><span style="font-size: 10pt;">
"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.</span></p>
<p><span style="font-size: 10pt;">
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.</span></p>
<p><span style="font-size: 10pt;">
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.</span></p>
<p><span style="font-size: 10pt;">
"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.</span></p>
<p><span style="font-size: 10pt;">
"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).</span></p>
<p><span style="font-size: 10pt;">
"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.</span></p>
<p><span style="font-size: 10pt;">
"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."</span></p>
<p><span style="font-size: 10pt;">
"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.</span></p>
<p><b><span style="font-size: 10pt;">2. Grant of Copyright License.</span></b> </p>
<p><span style="font-size: 10pt;">
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.</span></p>
<p><b><span style="font-size: 10pt;">3. Grant of Patent License.</span></b><p>
<p><span style="font-size: 10pt;">
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.
</span></p>
<p><b><span style="font-size: 10pt;">
4. Redistribution.
</span></b></p>
<p><span style="font-size: 10pt;">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:</span><p>
<ul>
<li><span style="font-size: 10pt;">
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and</span><p>
</li>
<li><span style="font-size: 10pt;">
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and</span><p>
</li>
</li><span style="font-size: 10pt;">
(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</span><p>
</li>
<li><span style="font-size: 10pt;">
(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.</span><p>
</li>
</ul>
</span></p>
<p><span style="font-size: 10pt;">
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.
</span></p>
<p><b><span style="font-size: 10pt;">
5. Submission of Contributions.
</span></b></p>
<p><span style="font-size: 10pt;">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.
</span></p>
<p><b><span style="font-size: 10pt;">
6. Trademarks.
</span></b></p>
<p><span style="font-size: 10pt;">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.
</span></p>
<p><b><span style="font-size: 10pt;">
7. Disclaimer of Warranty.
</span></b></p>
<p><span style="font-size: 10pt;">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.
</span></p>
<p><b><span style="font-size: 10pt;">
8. Limitation of Liability.
</span></b></p>
<p><span style="font-size: 10pt;">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.
</span></p>
<p><b><span style="font-size: 10pt;">
9. Accepting Warranty or Additional Liability.
</span></b></p>
<p><span style="font-size: 10pt;">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.
</span></p>
<p><span style="font-size: 10pt;">
END OF TERMS AND CONDITIONS
</span></p>
<p><span style="font-size: 10pt;">
APPENDIX: How to apply the Apache License to your work.
</span></p>
<p><span style="font-size: 10pt;">
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.
</span></p>
<p><span style="font-size: 10pt;">
Copyright [yyyy] [name of copyright owner]
</span></p>
<p><span style="font-size: 10pt;">
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
</span></p>
<p><span style="font-size: 10pt;">
http://www.apache.org/licenses/LICENSE-2.0
</span></p>
<p><span style="font-size: 10pt;">
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.
</span></p>
</div>
</body></html>

View File

@ -1,6 +1,6 @@
============================================================== ==============================================================
Jetty Web Container Jetty Web Container
Copyright 1995-2018 Mort Bay Consulting Pty Ltd. Copyright 1995-2019 Mort Bay Consulting Pty Ltd.
============================================================== ==============================================================
The Jetty Web Container is Copyright Mort Bay Consulting Pty Ltd The Jetty Web Container is Copyright Mort Bay Consulting Pty Ltd

View File

@ -1,4 +1,251 @@
jetty-9.4.13-SNAPSHOT jetty-9.4.21-SNAPSHOT
jetty-9.4.20.v20190813 - 13 August 2019
+ 300 Implement Deflater / Inflater Object Pool
+ 2061 WebSocket hangs in blockingWrite
+ 3601 HTTP2 stall on reset streams
+ 3648 javax.websocket client container incorrectly creates Server
SslContextFactory
+ 3698 Missing WebSocket ServerContainer after server restart
+ 3700 stackoverflow in WebAppClassLoaderUrlStreamTest
+ 3708 Swap various java.lang.String replace() methods for better performant
ones
+ 3731 Add testing of CDI behaviors
+ 3736 NPE from WebAppClassLoader during CDI
+ 3746 ClassCastException in WriteFlusher.java - IdleState cannot be cast to
FailedState
+ 3749 Memory leak while processing AsyncListener annotations
+ 3755 ServerWithAnnotations doesn't do anything
+ 3758 Avoid sending empty trailer frames for http/2 requests
+ 3782 X-Forwarded-Port overrides X-Forwarded-For
+ 3786 ALPN support for Java 14
+ 3798 ClasspathPattern match method throws NPE. URI can be null
+ 3799 Programmatically added listeners from
ServletContextListener.contextInitialzed() are not called
+ 3804 Weld/CDI XML backwards compat
+ 3805 XmlConfiguration odd behavior for numbers
+ 3806 The error page handler didn't process correctly in proxy
+ 3815 PropertyFileLoginModule adds user principle as a role
+ 3822 trustAll will not work on some servers
+ 3829 Avoid sending empty trailer frames for http/2 responses
+ 3835 WebSocketSession are not being stopped properly
+ 3840 Byte-range request performance problems with large files
+ 3856 Different behaviour with maxFormContentSize=0 if Content-Length header
is present/missing
+ 3876 WebSocketPartialListener is only called for initial frames, not for
continuation frames
+ 3884 @WebSocket without @OnWebSocketMessage handler fails when receiving a
continuation frame
+ 3888 BufferUtil.toBuffer(Resource resource,boolean direct) does not like
large (4G+) Resources
+ 3906 Fix for #3840 breaks Path encapsulation in PathResource
+ 3929 Deadlock between new HTTP2Connection() and Server.stop()
+ 3940 Double initialization of Log
+ 3957 CustomRequestLog bad usage of MethodHandles.lookup()
+ 3960 Fix HttpConfiguration copy constructor
+ 3969 X-Forwarded-Port header customization isn't possible
jetty-9.4.19.v20190610 - 10 June 2019
+ 2909 Remove B64Code
+ 3332 jetty-maven-plugin - transitive dependencies not loaded from
"target/classes"
+ 3498 WebSocket Session.suspend() now suspends incoming frames instead of
reads
+ 3534 Use System nanoTime, not currentTimeMillis for IdleTimeout
+ 3550 Server becomes unresponsive after sitting idle from a load spike
+ 3562 InetAccessHandler should be able to apply to a certain port or
connector
+ 3568 Make UserStore able to be started/stopped with its LoginService
+ 3583 jetty-maven plugin in multi-module-project does not use files from
/target/test-classes folder of dependent projects
+ 3605 IdleTimeout with Jetty HTTP/2 and InputStreamResponseListener
+ 3608 Reply with 400 Bad request to malformed WebSocket handshake
+ 3616 Backport WebSocket SessionTracker from Jetty 10
+ 3620 Use of `throwUnavailableOnStartupException=true` does not stop Server
in jetty-home
+ 3627 Only renew session id when spnego authentication is fully complete
+ 3628 NPE in QueuedThreadPool.getReservedThreads()
+ 3630 X-Forwarded-For missing last hextet for ipv6
+ 3633 endpointIdentificationAlgorithm enabled by default
jetty-ssl-context.xml
+ 3653 access control exception if programmatic security manager is used
+ 3655 Spaces missing on Cookies generated via RFC6265
+ 3663 Remove deprecation of HttpClient replacement methods in WebSocketClient
+ 3680 Bom manages non-existent infinispan-remote and infinispan-embedded
dependencies due to config classifier
+ 3683 Multipart file not deleted when client aborts upload
+ 3690 Upgrade to asm 7.1
+ 3713 Emit warning when invoking deprecated method in Jetty XML
+ 3715 Improve Log.condensePackage performance
+ 3722 HttpSessionListener.sessionDestroyed should be able to access webapp
classes
+ 3726 Remove OSGi export uses of servlet-api from jetty-util
+ 3729 Make creation of java:comp/env threadsafe
+ 3743 Update XmlConfiguration usage in Jetty to always use Constructors that
provide Location information
+ 3748 @Resource field not injected in Jetty Demo
+ 3750 NPE in WebSocketClient.toString()
+ 3751 Modern Configure DTD / FPI is used inconsistently
jetty-9.4.18.v20190429 - 29 April 2019
+ 3476 IllegalStateException in WebSocket ConnectionState
+ 3550 Server becomes unresponsive after sitting idle from a load spike
+ 3563 Update to apache jasper 8.5.40
+ 3573 Update jetty-bom for new infinispan artifacts
+ 3582 HeapByteBuffer cleared unexpected
+ 3597 Session persistence broken from 9.4.13+
+ 3609 Fix infinispan start module dependencies
jetty-9.4.17.v20190418 - 18 April 2019
+ 3464 Split SslContextFactory into Client and Server
+ 3549 Directory Listing on Windows reveals Resource Base path
+ 3555 DefaultHandler Reveals Base Resource Path of each Context
jetty-9.4.16.v20190411 - 11 April 2019
+ 1861 Limit total bytes pooled by ByteBufferPools
+ 3133 Logging of `key.readyOps()` can throw unchecked `CancelledKeyException`
+ 3159 WebSocket permessage-deflate RSV1 validity check
+ 3274 OSGi versions of java.base classes in
org.apache.felix:org.osgi.foundation:jar conflicts with new rules on Java 9+
+ 3319 Modernize Directory Listing: HTML5 and Sorting
+ 3361 HandlerCollection.addHandler is lacking synchronization
+ 3373 OutOfMemoryError: Java heap space in GZIPContentDecoder
+ 3389 Websockets jsr356 willDecode not invoked during decoding
+ 3394 java.security.acl.Group is deprecated and marked for removal
+ 3404 Cleanup QuotedQualityCSV internal use of Double
+ 3411 HttpClient does not timeout during multiple redirection
+ 3421 Duplicate JSESSIONID sent when invalidating new session
+ 3422 CLOSE_WAIT socket status forever after terminating websocket client
side
+ 3425 Upgrade conscrypt version to 2.0.0 and remove usage of reflection
+ 3429 JMX Operation to trigger manual deployment scan in WebAppProvider
+ 3440 Stop server if Unavailable thrown
+ 3444 org.eclipse.jetty.http.Http1FieldPreEncoder generates an invalid header
byte-array if header is null
+ 3456 Allow multiple programmatic login/logout in same request
+ 3464 Split SslContextFactory into Client and Server
+ 3481 TLS close_notify() is not guaranteed
+ 3489 Using setExtraClasspath("lib/extra/*") does not work on Microsoft
Windows
+ 3526 HTTP Request Locale not retained in WebsocketUpgrade Request
+ 3540 Use configured Provider in SslContextFactory consistently
+ 3545 NullPointerException on ServletOutputStream.print("");
jetty-9.4.15.v20190215 - 15 February 2019
+ 113 Add support for NCSA Extended Log File Format
+ 150 extraClasspath() method on WebAppContext dont support dir path
+ 2646 Better handle concurrent calls to change session id and invalidate
within a context
+ 2718 NPE using more than one Endpoint.publish
+ 2817 Change HttpClient and WebSocketClient default to always have SSL
support enabled
+ 3030 Enforce Content-Encoding check only on parameter extraction
+ 3038 SSL Connection Leak
+ 3049 Warn on common SslContextFactory problematic configurations
+ 3133 Logging of `key.readyOps()` can throw unchecked `CancelledKeyException`
+ 3139 NPE on
WebSocketServerContainerInitializer.configureContext(ServletContextHandler)
+ 3146 ServletContainerInitializer from war WEB-INF/classes not executing
+ 3154 Add support for javax.net.ssl.HostnameVerifier to HttpClient
+ 3161 Update to Apache JSP 8.5.35
+ 3178 BufferingResponseListener does not clear buffer in onHeaders
+ 3186 Jetty maven plugin - javax.annotation.jar picked up from jetty plugin
rather than from applications classpath
+ 3202 jetty-maven plugin in multi-module project not using files from /target
folders of sister projects
+ 3207 Async ServletOutputStream print methods
+ 3210 Threadpool module creates unmanged threadpool
+ 3212 Client and server need to to treat an incoming HTTP/2 RST_STREAM frame
differently
+ 3234 AuthenticationProtocolHandler should not cache the failed results
+ 3240 ALPN support for Java 13
+ 3241 Missing main manifest attribute in jetty-runner.jar
+ 3242 Fix WebSocket components dump()
+ 3278 NullPointerException if base resource is an empty ResourceCollection
+ 3279 WebSocket write may hang forever
+ 3302 Support host:port in X-Forwarded-For header in
ForwardedRequestCustomizer
+ 3305 Avoid additional selectNow() on non-Windows runtimes
+ 3307 WebAppClassLoader loadClass can throw NullPointerException for missing
class
+ 3311 Ability to serve HTTP and HTTPS from the same port
+ 3317 Improve uncaught exception handler double logging
+ 3329 Hazelcast delete expired session fails in deserialize
+ 3350 Do not expect to be able to connect to https URLs with the HttpClient
created from a parameterless constructor
jetty-9.3.27.v20190418 - 18 April 2019
+ 3549 Directory Listing on Windows reveals Resource Base path
+ 3555 DefaultHandler Reveals Base Resource Path of each Context
jetty-9.3.26.v20190403 - 03 April 2019
+ 2954 Improve cause reporting for HttpClient failures
+ 3274 OSGi versions of java.base classes in
org.apache.felix:org.osgi.foundation:jar conflicts with new rules on Java 9+
+ 3302 Support host:port in X-Forwarded-For header in
ForwardedRequestCustomizer
+ 3319 Allow reverse sort for directory listed files
jetty-9.2.28.v20190418 - 18 April 2019
+ 3549 Directory Listing on Windows reveals Resource Base path
+ 3555 DefaultHandler Reveals Base Resource Path of each Context
jetty-9.2.27.v20190403 - 03 April 2019
+ 3319 Refactored Directory Listing to modernize and avoid XSS
jetty-9.4.14.v20181114 - 14 November 2018
+ 3097 Duplicated programmatic Servlet Listeners causing duplicate calls
+ 3103 HttpClientLoadTest reports a leak in byte buffer
+ 3104 Align jetty-schemas version within apache-jsp module as well
jetty-9.4.13.v20181111 - 11 November 2018
+ 2191 JPMS Support
+ 2431 Upgrade to Junit 5
+ 2691 LdapLoginModule does not find accounts in subtrees
+ 2702 ArithmeticException in Credentials.stringEquals and .byteEquals
+ 2718 NPE using more than one Endpoint.publish
+ 2727 Cleanup behavior of JMX MBean discovery
+ 2740 Ensure OSGiWebappClassLoader uses bundleloader for all loadClass
methods
+ 2787 Use status code from nested BadMessageException wrapped in
ServletException
+ 2796 HTTP/2 max local stream count exceeded when request fails
+ 2834 Support Java 11 bytecode during annotation scanning
+ 2865 Update to apache jasper 8.5.33
+ 2868 Adding SPNEGO authentication support for Jetty Client
+ 2871 HTTP/2 Server reads -1 after client resets stream
+ 2875 Fix WebSocketClient.connect() hang when attempting to connect at an
invalid websocket endpoint
+ 2886 SNI matching does not work in certain cases when there is only one CN
certificate in the keystore
+ 2901 Introduce HttpConnectionUpgrader as a conversation component in
HttpClient
+ 2903 Avoid Listener instantiation during QuickStart generation
+ 2906 jetty-maven-plugin run goal adds output directory of reactor project
dependencies to classpath without regard for scope
+ 2912 Requests handled with GzipHandler should remove Content-Encoding and
Content-Length headers
+ 2913 Remove reliance on sun.reflect.Reflection to be compatible with Java 11
+ 2936 Error during initial RequestDispatch with bad request query results in
failure for ErrorHandler to process
+ 2941 Upgrade to ASM 7 to support Java 11 bytecode
+ 2954 Improve cause reporting for HttpClient failures
+ 2970 Ensure HttpChannel.onComplete is always called
+ 3018 Improve error handling and logging of min data rate violations
+ 3023 Wrong non-redirect behaviour with "null" path info
+ 3030 Enforce Content-Encoding check only on parameter extraction
+ 3041 Cookies parsing in RFC2965 should allow deprecated comma separators
+ 3049 Warn on common SslContextFactory problematic configurations
+ 3054 Update OSGi to ASM 7
+ 3090 MBeanContainer throws NPE for arrays
+ 3092 Wrong classloader used to load *MBean classes
jetty-9.3.25.v20180904 - 04 September 2018
+ 2135 Android 8.1 needs direct buffers for SSL/TLS to work
+ 2777 Workaround for Conscrypt's ssl == null
+ 2787 BadMessageException wrapped as ServletException not handled
+ 2860 Leakage of HttpDestinations in HttpClient
+ 2871 Server reads -1 after client resets HTTP/2 stream
jetty-9.4.12.v20180830 - 30 August 2018 jetty-9.4.12.v20180830 - 30 August 2018
+ 300 Implement Deflater / Inflater Object Pool + 300 Implement Deflater / Inflater Object Pool
@ -19,7 +266,7 @@ jetty-9.4.12.v20180830 - 30 August 2018
+ 2398 MultiPartFormInputStream parsing should default to UTF-8, but allowed + 2398 MultiPartFormInputStream parsing should default to UTF-8, but allowed
to be overridden by Request.setCharacterEncoding() to be overridden by Request.setCharacterEncoding()
+ 2468 EWYK concurrent produce can fail SSL connections + 2468 EWYK concurrent produce can fail SSL connections
+ 2501 Include accepting connections in connection limit. + 2501 Include accepting connections in connection limit
+ 2530 Client waits forever for cancelled large uploads + 2530 Client waits forever for cancelled large uploads
+ 2560 Review PathResource exception handling + 2560 Review PathResource exception handling
+ 2565 HashLoginService silently ignores file:/ config paths from 9.3.x + 2565 HashLoginService silently ignores file:/ config paths from 9.3.x
@ -33,7 +280,7 @@ jetty-9.4.12.v20180830 - 30 August 2018
beans beans
+ 2662 Remove unnecessary boxing conversions + 2662 Remove unnecessary boxing conversions
+ 2663 Guard Throwable.addSuppressed() calls + 2663 Guard Throwable.addSuppressed() calls
+ 2672 Max local stream count exceeded for HttpClient with HTTP/2 transport + 2672 Max local stream count exceeded for HttpClient with HTTP/2 transport
+ 2675 Demo rewrite rules prevent URL Session tracking + 2675 Demo rewrite rules prevent URL Session tracking
+ 2677 Decode URI before matching against "/favicon.ico" + 2677 Decode URI before matching against "/favicon.ico"
+ 2679 HTTP/2 Spec Compliance + 2679 HTTP/2 Spec Compliance
@ -92,12 +339,16 @@ jetty-9.4.12.v20180830 - 30 August 2018
+ 2860 Leakage of HttpDestinations in HttpClient + 2860 Leakage of HttpDestinations in HttpClient
+ 2871 Server reads -1 after client resets HTTP/2 stream + 2871 Server reads -1 after client resets HTTP/2 stream
jetty-9.3.25.v20180904 - 04 September 2018 jetty-9.2.26.v20180806 - 06 August 2018
+ 2135 Android 8.1 needs direct buffers for SSL/TLS to work
+ 2777 Workaround for Conscrypt's ssl == null + 2777 Workaround for Conscrypt's ssl == null
+ 2787 BadMessageException wrapped as ServletException not handled
+ 2860 Leakage of HttpDestinations in HttpClient jetty-9.2.25.v20180606 - 06 June 2018
+ 2871 Server reads -1 after client resets HTTP/2 stream + 2114 Fix NPE in JettyHttpServerProvider
+ 2135 Android 8.1 needs direct buffers for SSL/TLS to work
+ 2529 HttpParser cleanup
+ 2603 WebSocket ByteAccumulator initialized with wrong maximum
+ 2604 WebSocket ByteAccumulator should report sizes in
MessageTooLargeException
jetty-9.4.11.v20180605 - 05 June 2018 jetty-9.4.11.v20180605 - 05 June 2018
+ 1785 Support for vhost@connectorname syntax of virtual hosts + 1785 Support for vhost@connectorname syntax of virtual hosts

View File

@ -2,7 +2,7 @@
<parent> <parent>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId> <artifactId>jetty-project</artifactId>
<version>9.4.13-SNAPSHOT</version> <version>9.4.21-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -37,8 +37,8 @@
</goals> </goals>
<configuration> <configuration>
<excludes>**/MANIFEST.MF,javax/**</excludes> <excludes>**/MANIFEST.MF,javax/**</excludes>
<excludeArtifactIds>javax</excludeArtifactIds> <excludeArtifactIds>javax,jetty-test-helper</excludeArtifactIds>
<excludeGroupIds>javax,org.eclipse.jetty.orbit,org.slf4j,org.ow2.asm</excludeGroupIds> <excludeGroupIds>javax,org.eclipse.jetty.orbit,org.slf4j,org.ow2.asm,org.junit</excludeGroupIds>
<outputDirectory>${project.build.directory}/classes</outputDirectory> <outputDirectory>${project.build.directory}/classes</outputDirectory>
<overWriteReleases>false</overWriteReleases> <overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots> <overWriteSnapshots>true</overWriteSnapshots>
@ -54,20 +54,11 @@
<classifier>sources</classifier> <classifier>sources</classifier>
<includes>**/*</includes> <includes>**/*</includes>
<excludes> <excludes>
META-INF/**, META-INF/**, **/Servlet3Continuation*, **/Jetty6Continuation*, **/AppContextLeakPreventer*.java, **/AWTLeakPreventer*.java, **/IntrospectorCleaner*.java, **/PostConstructAnnotationHandler*.java, **/PreDestroyAnnotationHandler*.java, **/ResourceAnnotationHandler*.java, **/ResourcesAnnotationHandler*.java
**/Servlet3Continuation*,
**/Jetty6Continuation*,
**/AppContextLeakPreventer*.java,
**/AWTLeakPreventer*.java,
**/IntrospectorCleaner*.java,
**/PostConstructAnnotationHandler*.java,
**/PreDestroyAnnotationHandler*.java,
**/ResourceAnnotationHandler*.java,
**/ResourcesAnnotationHandler*.java
</excludes> </excludes>
<includeGroupIds>org.eclipse.jetty,org.eclipse.jetty.websocket</includeGroupIds> <includeGroupIds>org.eclipse.jetty,org.eclipse.jetty.websocket</includeGroupIds>
<excludeArtifactIds>javax</excludeArtifactIds> <excludeArtifactIds>javax,jetty-test-helper</excludeArtifactIds>
<excludeGroupIds>javax,org.eclipse.jetty.orbit,org.slf4j,org.ow2.asm</excludeGroupIds> <excludeGroupIds>javax,org.eclipse.jetty.orbit,org.slf4j,org.ow2.asm,org.junit</excludeGroupIds>
<outputDirectory>${project.build.directory}/sources</outputDirectory> <outputDirectory>${project.build.directory}/sources</outputDirectory>
<overWriteReleases>true</overWriteReleases> <overWriteReleases>true</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots> <overWriteSnapshots>true</overWriteSnapshots>
@ -80,8 +71,7 @@
<artifactId>maven-jar-plugin</artifactId> <artifactId>maven-jar-plugin</artifactId>
<configuration> <configuration>
<archive> <archive>
<manifest> <manifest></manifest>
</manifest>
<manifestEntries> <manifestEntries>
<mode>development</mode> <mode>development</mode>
<url>https://eclipse.org/jetty</url> <url>https://eclipse.org/jetty</url>

View File

@ -2,7 +2,7 @@
<parent> <parent>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId> <artifactId>jetty-project</artifactId>
<version>9.4.13-SNAPSHOT</version> <version>9.4.21-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -63,8 +63,7 @@
</goals> </goals>
<configuration> <configuration>
<archive> <archive>
<manifest> <manifest></manifest>
</manifest>
<manifestEntries> <manifestEntries>
<mode>development</mode> <mode>development</mode>
<url>http://eclipse.org/jetty</url> <url>http://eclipse.org/jetty</url>

View File

@ -2,7 +2,7 @@
<parent> <parent>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId> <artifactId>jetty-project</artifactId>
<version>9.4.13-SNAPSHOT</version> <version>9.4.21-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>apache-jsp</artifactId> <artifactId>apache-jsp</artifactId>
@ -10,7 +10,8 @@
<url>http://www.eclipse.org/jetty</url> <url>http://www.eclipse.org/jetty</url>
<packaging>jar</packaging> <packaging>jar</packaging>
<properties> <properties>
<bundle-symbolic-name>${project.groupId}.${project.artifactId}</bundle-symbolic-name> <bundle-symbolic-name>${project.groupId}.apache-jsp</bundle-symbolic-name>
<jpms-module-name>${project.groupId}.apache.jsp</jpms-module-name>
</properties> </properties>
<build> <build>
<plugins> <plugins>
@ -18,17 +19,16 @@
<groupId>org.apache.felix</groupId> <groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId> <artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions> <extensions>true</extensions>
<configuration> <configuration>
<instructions> <instructions>
<Bundle-Description>Jetty-specific ServletContainerInitializer for Jasper</Bundle-Description> <Bundle-Description>Jetty-specific ServletContainerInitializer for Jasper</Bundle-Description>
<Export-Package>org.eclipse.jetty.apache.jsp.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}", <Export-Package>org.eclipse.jetty.apache.jsp.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}", org.eclipse.jetty.jsp.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}"
org.eclipse.jetty.jsp.*;version="${parsedVersion.majorVersion}.${parsedVersion.minorVersion}.${parsedVersion.incrementalVersion}" </Export-Package>
</Export-Package> <Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional</Require-Capability>
<Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional</Require-Capability> <Provide-Capability>osgi.serviceloader;osgi.serviceloader=javax.servlet.ServletContainerInitializer,osgi.serviceloader;osgi.serviceloader=org.apache.juli.logging.Log</Provide-Capability>
<Provide-Capability>osgi.serviceloader;osgi.serviceloader=javax.servlet.ServletContainerInitializer,osgi.serviceloader;osgi.serviceloader=org.apache.juli.logging.Log</Provide-Capability> <_nouses>true</_nouses>
<_nouses>true</_nouses> </instructions>
</instructions> </configuration>
</configuration>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
@ -60,9 +60,9 @@
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-util</artifactId> <artifactId>jetty-util</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<!-- Schemas --> <!-- Schemas -->
@ -73,8 +73,8 @@
<!-- servlet api --> <!-- servlet api -->
<dependency> <dependency>
<groupId>javax.servlet</groupId> <groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId> <artifactId>javax.servlet-api</artifactId>
</dependency> </dependency>
<!-- JSP Impl --> <!-- JSP Impl -->
@ -90,7 +90,6 @@
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<!-- tests --> <!-- tests -->
<dependency> <dependency>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -23,7 +23,6 @@ import java.net.URL;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import javax.servlet.ServletContext; import javax.servlet.ServletContext;
import org.apache.jasper.servlet.JasperInitializer; import org.apache.jasper.servlet.JasperInitializer;
@ -37,7 +36,8 @@ import org.xml.sax.SAXException;
*/ */
public class JettyJasperInitializer extends JasperInitializer public class JettyJasperInitializer extends JasperInitializer
{ {
private static final Log LOG = LogFactory.getLog(JasperInitializer.class); private static final Log LOG = LogFactory.getLog(JasperInitializer.class);
/** /**
* NullTldScanner * NullTldScanner
* *
@ -47,10 +47,7 @@ public class JettyJasperInitializer extends JasperInitializer
private final class NullTldScanner extends TldScanner private final class NullTldScanner extends TldScanner
{ {
/** /**
* @param context *
* @param namespaceAware
* @param validation
* @param blockExternal
*/ */
private NullTldScanner(ServletContext context, boolean namespaceAware, boolean validation, boolean blockExternal) private NullTldScanner(ServletContext context, boolean namespaceAware, boolean validation, boolean blockExternal)
{ {
@ -81,7 +78,7 @@ public class JettyJasperInitializer extends JasperInitializer
@Override @Override
public void scanJars() public void scanJars()
{ {
return; //do nothing return; //do nothing
} }
} }
@ -91,22 +88,25 @@ public class JettyJasperInitializer extends JasperInitializer
*/ */
@Override @Override
public TldScanner newTldScanner(ServletContext context, boolean namespaceAware, boolean validate, boolean blockExternal) public TldScanner newTldScanner(ServletContext context, boolean namespaceAware, boolean validate, boolean blockExternal)
{ {
String tmp = context.getInitParameter("org.eclipse.jetty.jsp.precompiled"); String tmp = context.getInitParameter("org.eclipse.jetty.jsp.precompiled");
if (tmp!=null && !tmp.equals("") && Boolean.valueOf(tmp)) if (tmp != null && !tmp.equals("") && Boolean.valueOf(tmp))
{ {
if (LOG.isDebugEnabled()) LOG.debug("Jsp precompilation detected"); if (LOG.isDebugEnabled())
LOG.debug("Jsp precompilation detected");
return new NullTldScanner(context, namespaceAware, validate, blockExternal); return new NullTldScanner(context, namespaceAware, validate, blockExternal);
} }
Collection<URL> tldUrls = (Collection<URL>)context.getAttribute("org.eclipse.jetty.tlds"); Collection<URL> tldUrls = (Collection<URL>)context.getAttribute("org.eclipse.jetty.tlds");
if (tldUrls != null) if (tldUrls != null)
{ {
if (LOG.isDebugEnabled()) LOG.debug("Tld pre-scan detected"); if (LOG.isDebugEnabled())
return new JettyTldPreScanned(context,namespaceAware,validate,blockExternal,tldUrls); LOG.debug("Tld pre-scan detected");
return new JettyTldPreScanned(context, namespaceAware, validate, blockExternal, tldUrls);
} }
if (LOG.isDebugEnabled()) LOG.debug("Defaulting to jasper tld scanning"); if (LOG.isDebugEnabled())
LOG.debug("Defaulting to jasper tld scanning");
return super.newTldScanner(context, namespaceAware, validate, blockExternal); return super.newTldScanner(context, namespaceAware, validate, blockExternal);
} }
} }

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -16,12 +16,10 @@
// ======================================================================== // ========================================================================
// //
package org.eclipse.jetty.apache.jsp; package org.eclipse.jetty.apache.jsp;
import java.net.URL; import java.net.URL;
import java.util.Collection; import java.util.Collection;
import javax.servlet.ServletContext; import javax.servlet.ServletContext;
import org.apache.jasper.servlet.TldPreScanned; import org.apache.jasper.servlet.TldPreScanned;
@ -33,25 +31,24 @@ import org.apache.tomcat.util.descriptor.tld.TldResourcePath;
* Change to TldPreScanned to not require that the tlds have been * Change to TldPreScanned to not require that the tlds have been
* pre-scanned from a jar file, but rather may be files in the * pre-scanned from a jar file, but rather may be files in the
* file system. * file system.
* *
* This is important for running in the jetty maven plugin * This is important for running in the jetty maven plugin
* environment in multi-module builds, where modules that contain tlds * environment in multi-module builds, where modules that contain tlds
* may be in the reactor at the same time as a webapp being run with the * may be in the reactor at the same time as a webapp being run with the
* plugin. That means that the tlds will be used from their location in * plugin. That means that the tlds will be used from their location in
* the file system, rather than from their assembled jar. * the file system, rather than from their assembled jar.
*
*/ */
public class JettyTldPreScanned extends TldPreScanned public class JettyTldPreScanned extends TldPreScanned
{ {
private final Collection<URL> _jettyPreScannedURLs; private final Collection<URL> _jettyPreScannedURLs;
public JettyTldPreScanned(ServletContext context, boolean namespaceAware, boolean validation, boolean blockExternal, Collection<URL> preScannedTlds) public JettyTldPreScanned(ServletContext context, boolean namespaceAware, boolean validation, boolean blockExternal, Collection<URL> preScannedTlds)
{ {
super(context, namespaceAware, validation, blockExternal, preScannedTlds); super(context, namespaceAware, validation, blockExternal, preScannedTlds);
_jettyPreScannedURLs = preScannedTlds; _jettyPreScannedURLs = preScannedTlds;
} }
/** /**
* @see org.apache.jasper.servlet.TldPreScanned#scanJars() * @see org.apache.jasper.servlet.TldPreScanned#scanJars()
*/ */
@Override @Override
@ -65,8 +62,8 @@ public class JettyTldPreScanned extends TldPreScanned
int a = str.indexOf("jar:"); int a = str.indexOf("jar:");
int b = str.indexOf("META-INF"); int b = str.indexOf("META-INF");
if (b < 0) if (b < 0)
throw new IllegalStateException("Bad tld url: "+str); throw new IllegalStateException("Bad tld url: " + str);
String path = str.substring(b); String path = str.substring(b);
if (a >= 0) if (a >= 0)
{ {
@ -95,5 +92,4 @@ public class JettyTldPreScanned extends TldPreScanned
} }
} }
} }
} }

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -18,28 +18,28 @@
package org.eclipse.jetty.apache.jsp; package org.eclipse.jetty.apache.jsp;
public class JuliLog implements org.apache.juli.logging.Log public class JuliLog implements org.apache.juli.logging.Log
{ {
public static org.apache.juli.logging.Log getInstance(String name) public static org.apache.juli.logging.Log getInstance(String name)
{ {
return new JuliLog(name); return new JuliLog(name);
} }
private final org.eclipse.jetty.util.log.Logger _logger; private final org.eclipse.jetty.util.log.Logger _logger;
private final org.eclipse.jetty.util.log.StdErrLog _stdErrLog; private final org.eclipse.jetty.util.log.StdErrLog _stdErrLog;
public JuliLog() public JuliLog()
{ {
_logger=org.eclipse.jetty.util.log.Log.getRootLogger(); _logger = org.eclipse.jetty.util.log.Log.getRootLogger();
_stdErrLog=(_logger instanceof org.eclipse.jetty.util.log.StdErrLog) ? (org.eclipse.jetty.util.log.StdErrLog)_logger:null; _stdErrLog = (_logger instanceof org.eclipse.jetty.util.log.StdErrLog) ? (org.eclipse.jetty.util.log.StdErrLog)_logger : null;
} }
public JuliLog(String name) public JuliLog(String name)
{ {
_logger=org.eclipse.jetty.util.log.Log.getLogger(name); _logger = org.eclipse.jetty.util.log.Log.getLogger(name);
_stdErrLog=(_logger instanceof org.eclipse.jetty.util.log.StdErrLog) ? (org.eclipse.jetty.util.log.StdErrLog)_logger:null; _stdErrLog = (_logger instanceof org.eclipse.jetty.util.log.StdErrLog) ? (org.eclipse.jetty.util.log.StdErrLog)_logger : null;
} }
@Override @Override
public boolean isDebugEnabled() public boolean isDebugEnabled()
{ {
@ -49,31 +49,31 @@ public class JuliLog implements org.apache.juli.logging.Log
@Override @Override
public boolean isErrorEnabled() public boolean isErrorEnabled()
{ {
return _stdErrLog==null?true:_stdErrLog.getLevel()<=org.eclipse.jetty.util.log.StdErrLog.LEVEL_WARN; return _stdErrLog == null || _stdErrLog.getLevel() <= org.eclipse.jetty.util.log.StdErrLog.LEVEL_WARN;
} }
@Override @Override
public boolean isFatalEnabled() public boolean isFatalEnabled()
{ {
return _stdErrLog==null?true:_stdErrLog.getLevel()<=org.eclipse.jetty.util.log.StdErrLog.LEVEL_WARN; return _stdErrLog == null || _stdErrLog.getLevel() <= org.eclipse.jetty.util.log.StdErrLog.LEVEL_WARN;
} }
@Override @Override
public boolean isInfoEnabled() public boolean isInfoEnabled()
{ {
return _stdErrLog==null?true:_stdErrLog.getLevel()<=org.eclipse.jetty.util.log.StdErrLog.LEVEL_INFO; return _stdErrLog == null || _stdErrLog.getLevel() <= org.eclipse.jetty.util.log.StdErrLog.LEVEL_INFO;
} }
@Override @Override
public boolean isTraceEnabled() public boolean isTraceEnabled()
{ {
return _stdErrLog==null?true:_stdErrLog.getLevel()<=org.eclipse.jetty.util.log.StdErrLog.LEVEL_DEBUG; return _stdErrLog == null || _stdErrLog.getLevel() <= org.eclipse.jetty.util.log.StdErrLog.LEVEL_DEBUG;
} }
@Override @Override
public boolean isWarnEnabled() public boolean isWarnEnabled()
{ {
return _stdErrLog==null?true:_stdErrLog.getLevel()<=org.eclipse.jetty.util.log.StdErrLog.LEVEL_WARN; return _stdErrLog == null || _stdErrLog.getLevel() <= org.eclipse.jetty.util.log.StdErrLog.LEVEL_WARN;
} }
@Override @Override
@ -82,16 +82,16 @@ public class JuliLog implements org.apache.juli.logging.Log
if (message instanceof String) if (message instanceof String)
_logger.debug((String)message); _logger.debug((String)message);
else else
_logger.debug("{}",message); _logger.debug("{}", message);
} }
@Override @Override
public void trace(Object message, Throwable t) public void trace(Object message, Throwable t)
{ {
if (message instanceof String) if (message instanceof String)
_logger.debug((String)message,t); _logger.debug((String)message, t);
else else
_logger.debug("{}",message,t); _logger.debug("{}", message, t);
} }
@Override @Override
@ -100,16 +100,16 @@ public class JuliLog implements org.apache.juli.logging.Log
if (message instanceof String) if (message instanceof String)
_logger.debug((String)message); _logger.debug((String)message);
else else
_logger.debug("{}",message); _logger.debug("{}", message);
} }
@Override @Override
public void debug(Object message, Throwable t) public void debug(Object message, Throwable t)
{ {
if (message instanceof String) if (message instanceof String)
_logger.debug((String)message,t); _logger.debug((String)message, t);
else else
_logger.debug("{}",message,t); _logger.debug("{}", message, t);
} }
@Override @Override
@ -118,16 +118,16 @@ public class JuliLog implements org.apache.juli.logging.Log
if (message instanceof String) if (message instanceof String)
_logger.info((String)message); _logger.info((String)message);
else else
_logger.info("{}",message); _logger.info("{}", message);
} }
@Override @Override
public void info(Object message, Throwable t) public void info(Object message, Throwable t)
{ {
if (message instanceof String) if (message instanceof String)
_logger.info((String)message,t); _logger.info((String)message, t);
else else
_logger.info("{}",message,t); _logger.info("{}", message, t);
} }
@Override @Override
@ -136,16 +136,16 @@ public class JuliLog implements org.apache.juli.logging.Log
if (message instanceof String) if (message instanceof String)
_logger.warn((String)message); _logger.warn((String)message);
else else
_logger.warn("{}",message); _logger.warn("{}", message);
} }
@Override @Override
public void warn(Object message, Throwable t) public void warn(Object message, Throwable t)
{ {
if (message instanceof String) if (message instanceof String)
_logger.warn((String)message,t); _logger.warn((String)message, t);
else else
_logger.warn("{}",message,t); _logger.warn("{}", message, t);
} }
@Override @Override
@ -154,16 +154,16 @@ public class JuliLog implements org.apache.juli.logging.Log
if (message instanceof String) if (message instanceof String)
_logger.warn((String)message); _logger.warn((String)message);
else else
_logger.warn("{}",message); _logger.warn("{}", message);
} }
@Override @Override
public void error(Object message, Throwable t) public void error(Object message, Throwable t)
{ {
if (message instanceof String) if (message instanceof String)
_logger.warn((String)message,t); _logger.warn((String)message, t);
else else
_logger.warn("{}",message,t); _logger.warn("{}", message, t);
} }
@Override @Override
@ -172,16 +172,16 @@ public class JuliLog implements org.apache.juli.logging.Log
if (message instanceof String) if (message instanceof String)
_logger.warn((String)message); _logger.warn((String)message);
else else
_logger.warn("{}",message); _logger.warn("{}", message);
} }
@Override @Override
public void fatal(Object message, Throwable t) public void fatal(Object message, Throwable t)
{ {
if (message instanceof String) if (message instanceof String)
_logger.warn((String)message,t); _logger.warn((String)message, t);
else else
_logger.warn("{}",message,t); _logger.warn("{}", message, t);
} }
} }

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -22,7 +22,6 @@ import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import javax.servlet.RequestDispatcher; import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -30,11 +29,10 @@ import javax.servlet.http.HttpServletResponse;
import org.apache.jasper.servlet.JspServlet; import org.apache.jasper.servlet.JspServlet;
/** /**
* JettyJspServlet * JettyJspServlet
* *
* Wrapper for the jsp servlet that handles receiving requests mapped from * Wrapper for the jsp servlet that handles receiving requests mapped from
* jsp-property-groups. Mappings could be wildcard urls like "/*", which would * jsp-property-groups. Mappings could be wildcard urls like "/*", which would
* include welcome files, but we need those to be handled by the DefaultServlet. * include welcome files, but we need those to be handled by the DefaultServlet.
*/ */
@ -42,33 +40,29 @@ public class JettyJspServlet extends JspServlet
{ {
/** /**
* *
*/ */
private static final long serialVersionUID = -5387857473125086791L; private static final long serialVersionUID = -5387857473125086791L;
@Override @Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{ {
HttpServletRequest request = null; HttpServletRequest request = null;
if (req instanceof HttpServletRequest) if (req instanceof HttpServletRequest)
request = (HttpServletRequest)req; request = req;
else else
throw new ServletException("Request not HttpServletRequest"); throw new ServletException("Request not HttpServletRequest");
String servletPath=null; String servletPath = null;
String pathInfo=null; String pathInfo = null;
if (request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI)!=null) if (request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI) != null)
{ {
servletPath=(String)request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH); servletPath = (String)request.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH);
pathInfo=(String)request.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO); pathInfo = (String)request.getAttribute(RequestDispatcher.INCLUDE_PATH_INFO);
if (servletPath==null) if (servletPath == null)
{ {
servletPath=request.getServletPath(); servletPath = request.getServletPath();
pathInfo=request.getPathInfo(); pathInfo = request.getPathInfo();
} }
} }
else else
@ -76,9 +70,9 @@ public class JettyJspServlet extends JspServlet
servletPath = request.getServletPath(); servletPath = request.getServletPath();
pathInfo = request.getPathInfo(); pathInfo = request.getPathInfo();
} }
String pathInContext = addPaths(servletPath,pathInfo); String pathInContext = addPaths(servletPath, pathInfo);
String jspFile = getInitParameter("jspFile"); String jspFile = getInitParameter("jspFile");
//if this is a forced-path from a jsp-file, we want the jsp servlet to handle it, //if this is a forced-path from a jsp-file, we want the jsp servlet to handle it,
@ -92,7 +86,7 @@ public class JettyJspServlet extends JspServlet
return; return;
} }
else else
{ {
//check if it resolves to a directory //check if it resolves to a directory
String realPath = getServletContext().getRealPath(pathInContext); String realPath = getServletContext().getRealPath(pathInContext);
if (realPath != null) if (realPath != null)
@ -107,7 +101,7 @@ public class JettyJspServlet extends JspServlet
} }
} }
} }
//fall through to the normal jsp servlet handling //fall through to the normal jsp servlet handling
super.service(req, resp); super.service(req, resp);
} }
@ -119,12 +113,12 @@ public class JettyJspServlet extends JspServlet
*/ */
private String addPaths(String servletPath, String pathInfo) private String addPaths(String servletPath, String pathInfo)
{ {
if (servletPath.length()==0) if (servletPath.isEmpty())
return pathInfo; return pathInfo;
if (pathInfo==null) if (pathInfo == null)
return servletPath; return servletPath;
return servletPath+pathInfo; return servletPath + pathInfo;
} }
} }

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -18,15 +18,10 @@
package org.eclipse.jetty.jsp; package org.eclipse.jetty.jsp;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.not;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -47,6 +42,10 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.not;
@ExtendWith(WorkDirExtension.class) @ExtendWith(WorkDirExtension.class)
public class TestJettyJspServlet public class TestJettyJspServlet
{ {
@ -54,7 +53,7 @@ public class TestJettyJspServlet
private File _dir; private File _dir;
private ServletTester _tester; private ServletTester _tester;
public static class DfltServlet extends HttpServlet public static class DfltServlet extends HttpServlet
{ {
@ -62,8 +61,8 @@ public class TestJettyJspServlet
{ {
super(); super();
} }
/** /**
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/ */
@Override @Override
@ -72,11 +71,10 @@ public class TestJettyJspServlet
resp.setContentType("html/text"); resp.setContentType("html/text");
resp.getOutputStream().println("This.Is.The.Default."); resp.getOutputStream().println("This.Is.The.Default.");
} }
} }
@BeforeEach @BeforeEach
public void setUp () throws Exception public void setUp() throws Exception
{ {
JspFactory.setDefaultFactory(new JspFactoryImpl()); JspFactory.setDefaultFactory(new JspFactoryImpl());
_dir = MavenTestingUtils.getTestResourceDir("base"); _dir = MavenTestingUtils.getTestResourceDir("base");
@ -88,12 +86,12 @@ public class TestJettyJspServlet
_tester.getContext().setAttribute(InstanceManager.class.getName(), new SimpleInstanceManager()); _tester.getContext().setAttribute(InstanceManager.class.getName(), new SimpleInstanceManager());
ServletHolder dfltHolder = new ServletHolder(); ServletHolder dfltHolder = new ServletHolder();
dfltHolder.setName("default"); dfltHolder.setName("default");
dfltHolder.setHeldClass( DfltServlet.class); dfltHolder.setHeldClass(DfltServlet.class);
_tester.getContext().addServlet(dfltHolder, "/"); _tester.getContext().addServlet(dfltHolder, "/");
_tester.start(); _tester.start();
} }
@AfterEach @AfterEach
public void tearDown() throws Exception public void tearDown() throws Exception
{ {
@ -105,8 +103,8 @@ public class TestJettyJspServlet
public void testWithJsp() throws Exception public void testWithJsp() throws Exception
{ {
//test that an ordinary jsp is served by jsp servlet //test that an ordinary jsp is served by jsp servlet
String request = "" + String request =
"GET /context/foo.jsp HTTP/1.1\r\n" + "GET /context/foo.jsp HTTP/1.1\r\n" +
"Host: localhost\r\n" + "Host: localhost\r\n" +
"Connection: close\r\n" + "Connection: close\r\n" +
"\r\n"; "\r\n";
@ -115,14 +113,13 @@ public class TestJettyJspServlet
HttpTester.Response response = HttpTester.parseResponse(rawResponse); HttpTester.Response response = HttpTester.parseResponse(rawResponse);
assertThat(response.toString(), response.getContent(), not(containsString("This.Is.The.Default."))); assertThat(response.toString(), response.getContent(), not(containsString("This.Is.The.Default.")));
} }
@Test @Test
public void testWithDirectory() throws Exception public void testWithDirectory() throws Exception
{ {
//test that a dir is served by the default servlet //test that a dir is served by the default servlet
String request = "" + String request =
"GET /context/dir HTTP/1.1\r\n" + "GET /context/dir HTTP/1.1\r\n" +
"Host: localhost\r\n" + "Host: localhost\r\n" +
"Connection: close\r\n" + "Connection: close\r\n" +
"\r\n"; "\r\n";

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -16,11 +16,8 @@
// ======================================================================== // ========================================================================
// //
package org.eclipse.jetty.jsp; package org.eclipse.jetty.jsp;
import static org.junit.jupiter.api.Assertions.*;
import java.io.File; import java.io.File;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
@ -34,10 +31,12 @@ import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.toolchain.test.MavenTestingUtils; import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.fail;
/** /**
* TestJettyTldPreScanned * TestJettyTldPreScanned
*
*
*/ */
public class TestJettyTldPreScanned public class TestJettyTldPreScanned
{ {
@ -47,21 +46,21 @@ public class TestJettyTldPreScanned
*/ */
@Test @Test
public void testIt() public void testIt()
throws Exception throws Exception
{ {
File jar = MavenTestingUtils.getTestResourceFile("taglib.jar"); File jar = MavenTestingUtils.getTestResourceFile("taglib.jar");
File tld = MavenTestingUtils.getTestResourceFile("META-INF/foo-taglib.tld"); File tld = MavenTestingUtils.getTestResourceFile("META-INF/foo-taglib.tld");
List<URL> list = new ArrayList<>(); List<URL> list = new ArrayList<>();
list.add(new URL("jar:"+jar.toURI().toURL().toString()+"!/META-INF/bar-taglib.tld")); list.add(new URL("jar:" + jar.toURI().toURL().toString() + "!/META-INF/bar-taglib.tld"));
list.add(tld.toURI().toURL()); list.add(tld.toURI().toURL());
JettyTldPreScanned preScanned = new JettyTldPreScanned(new ServletContextHandler().getServletContext(),false,false,false,list); JettyTldPreScanned preScanned = new JettyTldPreScanned(new ServletContextHandler().getServletContext(), false, false, false, list);
preScanned.scanJars(); preScanned.scanJars();
Map<TldResourcePath, TaglibXml> map = preScanned.getTldResourcePathTaglibXmlMap(); Map<TldResourcePath, TaglibXml> map = preScanned.getTldResourcePathTaglibXmlMap();
assertNotNull(map); assertNotNull(map);
assertEquals(2, map.size()); assertEquals(2, map.size());
for (TldResourcePath p: map.keySet()) for (TldResourcePath p : map.keySet())
{ {
URL u = p.getUrl(); URL u = p.getUrl();
TaglibXml tlx = map.get(p); TaglibXml tlx = map.get(p);
@ -70,5 +69,4 @@ public class TestJettyTldPreScanned
fail("unknown tag"); fail("unknown tag");
} }
} }
} }

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -18,12 +18,11 @@
package org.eclipse.jetty.jsp; package org.eclipse.jetty.jsp;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlet.ServletHolder;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class TestJspFileNameToClass public class TestJspFileNameToClass
{ {
@ -33,18 +32,17 @@ public class TestJspFileNameToClass
ServletHolder h = new ServletHolder(); ServletHolder h = new ServletHolder();
h.setName("test"); h.setName("test");
assertEquals(null, h.getClassNameForJsp(null));
assertEquals(null, h.getClassNameForJsp(null)); assertEquals(null, h.getClassNameForJsp(""));
assertEquals(null, h.getClassNameForJsp("")); assertEquals(null, h.getClassNameForJsp("/blah/"));
assertEquals(null, h.getClassNameForJsp("/blah/")); assertEquals(null, h.getClassNameForJsp("//blah///"));
assertEquals(null, h.getClassNameForJsp("//blah///")); assertEquals(null, h.getClassNameForJsp("/a/b/c/blah/"));
assertEquals(null, h.getClassNameForJsp("/a/b/c/blah/")); assertEquals("org.apache.jsp.a.b.c.blah", h.getClassNameForJsp("/a/b/c/blah"));
assertEquals("org.apache.jsp.a.b.c.blah", h.getClassNameForJsp("/a/b/c/blah"));
assertEquals("org.apache.jsp.blah_jsp", h.getClassNameForJsp("/blah.jsp")); assertEquals("org.apache.jsp.blah_jsp", h.getClassNameForJsp("/blah.jsp"));
@ -56,5 +54,4 @@ public class TestJspFileNameToClass
assertEquals("org.apache.jsp.a.b.c.blah_jsp", h.getClassNameForJsp("a/b/c/blah.jsp")); assertEquals("org.apache.jsp.a.b.c.blah_jsp", h.getClassNameForJsp("a/b/c/blah.jsp"));
} }
} }

View File

@ -2,7 +2,7 @@
<parent> <parent>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId> <artifactId>jetty-project</artifactId>
<version>9.4.13-SNAPSHOT</version> <version>9.4.21-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>apache-jstl</artifactId> <artifactId>apache-jstl</artifactId>
@ -10,17 +10,17 @@
<url>http://tomcat.apache.org/taglibs/standard/</url> <url>http://tomcat.apache.org/taglibs/standard/</url>
<packaging>jar</packaging> <packaging>jar</packaging>
<properties> <properties>
<bundle-symbolic-name>${project.groupId}.apache.jstl</bundle-symbolic-name> <bundle-symbolic-name>${project.groupId}.apache.jstl</bundle-symbolic-name>
</properties> </properties>
<build> <build>
<plugins> <plugins>
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>
<configuration> <configuration>
<useSystemClassLoader>false</useSystemClassLoader> <useSystemClassLoader>false</useSystemClassLoader>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.jacoco</groupId> <groupId>org.jacoco</groupId>
@ -35,36 +35,36 @@
<dependencies> <dependencies>
<!-- JSTL Api --> <!-- JSTL Api -->
<dependency> <dependency>
<groupId>org.apache.taglibs</groupId> <groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-spec</artifactId> <artifactId>taglibs-standard-spec</artifactId>
</dependency> </dependency>
<!-- JSTL Impl --> <!-- JSTL Impl -->
<dependency> <dependency>
<groupId>org.apache.taglibs</groupId> <groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId> <artifactId>taglibs-standard-impl</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-test-helper</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>apache-jsp</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-annotations</artifactId> <artifactId>jetty-test-helper</artifactId>
<version>${project.version}</version> <scope>test</scope>
<scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>apache-jsp</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-annotations</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-webapp</artifactId> <artifactId>jetty-webapp</artifactId>

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -33,7 +33,7 @@ public class JspConfig
{ {
context.setAttribute("javax.servlet.context.tempdir", scratchDir); context.setAttribute("javax.servlet.context.tempdir", scratchDir);
context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", context.setAttribute("org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
".*/javax.servlet-[^/]*\\.jar$|.*/servlet-api-[^/]*\\.jar$|.*javax.servlet.jsp.jstl-[^/]*\\.jar|.*taglibs-standard-impl-.*\\.jar"); ".*/javax.servlet-[^/]*\\.jar$|.*/servlet-api-[^/]*\\.jar$|.*javax.servlet.jsp.jstl-[^/]*\\.jar|.*taglibs-standard-impl-.*\\.jar");
context.setWar(baseUri.toASCIIString()); context.setWar(baseUri.toASCIIString());
context.setResourceBase(baseUri.toASCIIString()); context.setResourceBase(baseUri.toASCIIString());
} }

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -18,10 +18,6 @@
package org.eclipse.jetty.jstl; package org.eclipse.jetty.jstl;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@ -42,11 +38,15 @@ import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
public class JspIncludeTest public class JspIncludeTest
{ {
private static Server server; private static Server server;
private static URI baseUri; private static URI baseUri;
@BeforeAll @BeforeAll
public static void startServer() throws Exception public static void startServer() throws Exception
{ {
@ -55,37 +55,37 @@ public class JspIncludeTest
ServerConnector connector = new ServerConnector(server); ServerConnector connector = new ServerConnector(server);
connector.setPort(0); connector.setPort(0);
server.addConnector(connector); server.addConnector(connector);
// Setup WebAppContext // Setup WebAppContext
File testWebAppDir = MavenTestingUtils.getProjectDir("src/test/webapp"); File testWebAppDir = MavenTestingUtils.getProjectDir("src/test/webapp");
// Prepare WebApp libs // Prepare WebApp libs
File libDir = new File(testWebAppDir, "WEB-INF/lib"); File libDir = new File(testWebAppDir, "WEB-INF/lib");
FS.ensureDirExists(libDir); FS.ensureDirExists(libDir);
File testTagLibDir = MavenTestingUtils.getProjectDir("src/test/taglibjar"); File testTagLibDir = MavenTestingUtils.getProjectDir("src/test/taglibjar");
JAR.create(testTagLibDir, new File(libDir, "testtaglib.jar")); JAR.create(testTagLibDir, new File(libDir, "testtaglib.jar"));
// Configure WebAppContext // Configure WebAppContext
Configuration.ClassList classlist = Configuration.ClassList Configuration.ClassList classlist = Configuration.ClassList
.setServerDefault(server); .setServerDefault(server);
classlist.addBefore( classlist.addBefore(
"org.eclipse.jetty.webapp.JettyWebXmlConfiguration", "org.eclipse.jetty.webapp.JettyWebXmlConfiguration",
"org.eclipse.jetty.annotations.AnnotationConfiguration"); "org.eclipse.jetty.annotations.AnnotationConfiguration");
WebAppContext context = new WebAppContext(); WebAppContext context = new WebAppContext();
context.setContextPath("/"); context.setContextPath("/");
File scratchDir = MavenTestingUtils.getTargetFile("tests/" + JspIncludeTest.class.getSimpleName() + "-scratch"); File scratchDir = MavenTestingUtils.getTargetFile("tests/" + JspIncludeTest.class.getSimpleName() + "-scratch");
FS.ensureEmpty(scratchDir); FS.ensureEmpty(scratchDir);
JspConfig.init(context, testWebAppDir.toURI(), scratchDir); JspConfig.init(context, testWebAppDir.toURI(), scratchDir);
server.setHandler(context); server.setHandler(context);
// Start Server // Start Server
server.start(); server.start();
// Figure out Base URI // Figure out Base URI
String host = connector.getHost(); String host = connector.getHost();
if (host == null) if (host == null)
@ -95,13 +95,13 @@ public class JspIncludeTest
int port = connector.getLocalPort(); int port = connector.getLocalPort();
baseUri = new URI(String.format("http://%s:%d/", host, port)); baseUri = new URI(String.format("http://%s:%d/", host, port));
} }
@AfterAll @AfterAll
public static void stopServer() throws Exception public static void stopServer() throws Exception
{ {
server.stop(); server.stop();
} }
@Test @Test
public void testTopWithIncluded() throws IOException public void testTopWithIncluded() throws IOException
{ {
@ -114,13 +114,13 @@ public class JspIncludeTest
try try
{ {
connection = (HttpURLConnection) uri.toURL().openConnection(); connection = (HttpURLConnection)uri.toURL().openConnection();
connection.connect(); connection.connect();
if (HttpURLConnection.HTTP_OK != connection.getResponseCode()) if (HttpURLConnection.HTTP_OK != connection.getResponseCode())
{ {
String body = getPotentialBody(connection); String body = getPotentialBody(connection);
String err = String.format("GET request failed (%d %s) %s%n%s", connection.getResponseCode(), connection.getResponseMessage(), String err = String.format("GET request failed (%d %s) %s%n%s", connection.getResponseCode(), connection.getResponseMessage(),
uri.toASCIIString(), body); uri.toASCIIString(), body);
throw new IOException(err); throw new IOException(err);
} }
in = connection.getInputStream(); in = connection.getInputStream();

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -18,18 +18,12 @@
package org.eclipse.jetty.jstl; package org.eclipse.jetty.jstl;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.MatcherAssert.assertThat;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URI; import java.net.URI;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspException;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
@ -44,11 +38,16 @@ import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
public class JstlTest public class JstlTest
{ {
private static Server server; private static Server server;
private static URI baseUri; private static URI baseUri;
@BeforeAll @BeforeAll
public static void startServer() throws Exception public static void startServer() throws Exception
{ {
@ -57,37 +56,37 @@ public class JstlTest
ServerConnector connector = new ServerConnector(server); ServerConnector connector = new ServerConnector(server);
connector.setPort(0); connector.setPort(0);
server.addConnector(connector); server.addConnector(connector);
// Setup WebAppContext // Setup WebAppContext
File testWebAppDir = MavenTestingUtils.getProjectDir("src/test/webapp"); File testWebAppDir = MavenTestingUtils.getProjectDir("src/test/webapp");
// Prepare WebApp libs // Prepare WebApp libs
File libDir = new File(testWebAppDir, "WEB-INF/lib"); File libDir = new File(testWebAppDir, "WEB-INF/lib");
FS.ensureDirExists(libDir); FS.ensureDirExists(libDir);
File testTagLibDir = MavenTestingUtils.getProjectDir("src/test/taglibjar"); File testTagLibDir = MavenTestingUtils.getProjectDir("src/test/taglibjar");
JAR.create(testTagLibDir,new File(libDir, "testtaglib.jar")); JAR.create(testTagLibDir, new File(libDir, "testtaglib.jar"));
// Configure WebAppContext // Configure WebAppContext
Configuration.ClassList classlist = Configuration.ClassList Configuration.ClassList classlist = Configuration.ClassList
.setServerDefault(server); .setServerDefault(server);
classlist.addBefore( classlist.addBefore(
"org.eclipse.jetty.webapp.JettyWebXmlConfiguration", "org.eclipse.jetty.webapp.JettyWebXmlConfiguration",
"org.eclipse.jetty.annotations.AnnotationConfiguration"); "org.eclipse.jetty.annotations.AnnotationConfiguration");
WebAppContext context = new WebAppContext(); WebAppContext context = new WebAppContext();
context.setContextPath("/"); context.setContextPath("/");
File scratchDir = MavenTestingUtils.getTargetFile("tests/" + JstlTest.class.getSimpleName() + "-scratch"); File scratchDir = MavenTestingUtils.getTargetFile("tests/" + JstlTest.class.getSimpleName() + "-scratch");
FS.ensureEmpty(scratchDir); FS.ensureEmpty(scratchDir);
JspConfig.init(context,testWebAppDir.toURI(),scratchDir); JspConfig.init(context, testWebAppDir.toURI(), scratchDir);
server.setHandler(context); server.setHandler(context);
// Start Server // Start Server
server.start(); server.start();
// Figure out Base URI // Figure out Base URI
String host = connector.getHost(); String host = connector.getHost();
if (host == null) if (host == null)
@ -95,22 +94,22 @@ public class JstlTest
host = "localhost"; host = "localhost";
} }
int port = connector.getLocalPort(); int port = connector.getLocalPort();
baseUri = new URI(String.format("http://%s:%d/",host,port)); baseUri = new URI(String.format("http://%s:%d/", host, port));
} }
@AfterAll @AfterAll
public static void stopServer() throws Exception public static void stopServer() throws Exception
{ {
if (server != null) if (server != null)
server.stop(); server.stop();
} }
@Test @Test
public void testUrlsBasic() throws IOException public void testUrlsBasic() throws IOException
{ {
HttpURLConnection http = (HttpURLConnection) baseUri.resolve("/urls.jsp").toURL().openConnection(); HttpURLConnection http = (HttpURLConnection)baseUri.resolve("/urls.jsp").toURL().openConnection();
assertThat("http response", http.getResponseCode(), is(200)); assertThat("http response", http.getResponseCode(), is(200));
try(InputStream input = http.getInputStream()) try (InputStream input = http.getInputStream())
{ {
String resp = IO.toString(input, StandardCharsets.UTF_8); String resp = IO.toString(input, StandardCharsets.UTF_8);
assertThat("Response should be JSP processed", resp, not(containsString("<c:url"))); assertThat("Response should be JSP processed", resp, not(containsString("<c:url")));
@ -118,13 +117,13 @@ public class JstlTest
assertThat("Response", resp, containsString("[c:url param] = ref.jsp;key=value;jsessionid=")); assertThat("Response", resp, containsString("[c:url param] = ref.jsp;key=value;jsessionid="));
} }
} }
@Test @Test
public void testCatchBasic() throws IOException public void testCatchBasic() throws IOException
{ {
HttpURLConnection http = (HttpURLConnection) baseUri.resolve("/catch-basic.jsp").toURL().openConnection(); HttpURLConnection http = (HttpURLConnection)baseUri.resolve("/catch-basic.jsp").toURL().openConnection();
assertThat("http response", http.getResponseCode(), is(200)); assertThat("http response", http.getResponseCode(), is(200));
try(InputStream input = http.getInputStream()) try (InputStream input = http.getInputStream())
{ {
String resp = IO.toString(input, StandardCharsets.UTF_8); String resp = IO.toString(input, StandardCharsets.UTF_8);
assertThat("Response should be JSP processed", resp, not(containsString("<c:catch"))); assertThat("Response should be JSP processed", resp, not(containsString("<c:catch")));
@ -132,13 +131,13 @@ public class JstlTest
assertThat("Response", resp, containsString("[c:catch] exception.message : In &lt;parseNumber&gt;")); assertThat("Response", resp, containsString("[c:catch] exception.message : In &lt;parseNumber&gt;"));
} }
} }
@Test @Test
public void testCatchTaglib() throws IOException public void testCatchTaglib() throws IOException
{ {
HttpURLConnection http = (HttpURLConnection) baseUri.resolve("/catch-taglib.jsp").toURL().openConnection(); HttpURLConnection http = (HttpURLConnection)baseUri.resolve("/catch-taglib.jsp").toURL().openConnection();
assertThat("http response", http.getResponseCode(), is(200)); assertThat("http response", http.getResponseCode(), is(200));
try(InputStream input = http.getInputStream()) try (InputStream input = http.getInputStream())
{ {
String resp = IO.toString(input, StandardCharsets.UTF_8); String resp = IO.toString(input, StandardCharsets.UTF_8);
assertThat("Response should be JSP processed", resp, not(containsString("<c:catch>"))); assertThat("Response should be JSP processed", resp, not(containsString("<c:catch>")));

View File

@ -1,7 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<description>Test webapp for JSTL</description> <description>Test webapp for JSTL</description>
</web-app> </web-app>

View File

@ -0,0 +1,354 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="16">
<profile kind="CodeFormatterProfile" name="Jetty" version="16">
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_logical_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.align_with_spaces" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_logical_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="next_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="128"/>
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_method_body_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="next_line"/>
<setting id="org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_additive_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_relational_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_shift_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="next_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="next_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body" value="next_line"/>
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="18"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_parameters" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_loops" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_relational_operator" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="32"/>
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_additive_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_module_statements" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="next_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="next_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain" value="48"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_additive_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_conditional_operator" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_shift_operator" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines" value="2147483647"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="next_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="83"/>
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_code_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_assignment_operator" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="next_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_arguments" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_logical_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_relational_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_tag_description" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="18"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_string_concatenation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_logical_operator" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_shift_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_shift_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="next_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="next_line"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_additive_operator" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_relational_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_string_concatenation" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="512"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
</profile>
</profiles>

View File

@ -0,0 +1,533 @@
<code_scheme name="Jetty" version="173">
<option name="AUTODETECT_INDENTS" value="false" />
<option name="LINE_SEPARATOR" value="&#xA;" />
<option name="RIGHT_MARGIN" value="128" />
<AndroidXmlCodeStyleSettings>
<option name="USE_CUSTOM_SETTINGS" value="true" />
</AndroidXmlCodeStyleSettings>
<HTMLCodeStyleSettings>
<option name="HTML_ATTRIBUTE_WRAP" value="0" />
</HTMLCodeStyleSettings>
<JavaCodeStyleSettings>
<option name="USE_EXTERNAL_ANNOTATIONS" value="true" />
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999" />
<option name="NAMES_COUNT_TO_USE_IMPORT_ON_DEMAND" value="999" />
<option name="PACKAGES_TO_USE_IMPORT_ON_DEMAND">
<value />
</option>
<option name="IMPORT_LAYOUT_TABLE">
<value>
<package name="java" withSubpackages="true" static="false" />
<package name="javax" withSubpackages="true" static="false" />
<emptyLine />
<package name="" withSubpackages="true" static="false" />
<emptyLine />
<package name="" withSubpackages="true" static="true" />
</value>
</option>
<option name="JD_ALIGN_PARAM_COMMENTS" value="false" />
<option name="JD_ALIGN_EXCEPTION_COMMENTS" value="false" />
<option name="JD_P_AT_EMPTY_LINES" value="false" />
<option name="JD_KEEP_EMPTY_PARAMETER" value="false" />
<option name="JD_KEEP_EMPTY_EXCEPTION" value="false" />
<option name="JD_KEEP_EMPTY_RETURN" value="false" />
<option name="JD_PRESERVE_LINE_FEEDS" value="true" />
</JavaCodeStyleSettings>
<MarkdownNavigatorCodeStyleSettings>
<option name="RIGHT_MARGIN" value="72" />
</MarkdownNavigatorCodeStyleSettings>
<XML>
<option name="XML_ATTRIBUTE_WRAP" value="0" />
<option name="XML_TEXT_WRAP" value="0" />
<option name="XML_KEEP_LINE_BREAKS" value="false" />
<option name="XML_KEEP_LINE_BREAKS_IN_TEXT" value="false" />
<option name="XML_KEEP_BLANK_LINES" value="1" />
<option name="XML_ALIGN_ATTRIBUTES" value="false" />
<option name="XML_SPACE_INSIDE_EMPTY_TAG" value="true" />
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
</XML>
<codeStyleSettings language="Groovy">
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="JAVA">
<option name="RIGHT_MARGIN" value="128" />
<option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" />
<option name="KEEP_BLANK_LINES_IN_DECLARATIONS" value="1" />
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
<option name="KEEP_BLANK_LINES_BETWEEN_PACKAGE_DECLARATION_AND_HEADER" value="1" />
<option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="0" />
<option name="BRACE_STYLE" value="2" />
<option name="CLASS_BRACE_STYLE" value="2" />
<option name="METHOD_BRACE_STYLE" value="2" />
<option name="LAMBDA_BRACE_STYLE" value="2" />
<option name="ELSE_ON_NEW_LINE" value="true" />
<option name="WHILE_ON_NEW_LINE" value="true" />
<option name="CATCH_ON_NEW_LINE" value="true" />
<option name="FINALLY_ON_NEW_LINE" value="true" />
<option name="ALIGN_MULTILINE_PARAMETERS" value="true" />
<option name="ALIGN_MULTILINE_ARRAY_INITIALIZER_EXPRESSION" value="true" />
<option name="SPACE_AFTER_TYPE_CAST" value="false" />
<option name="RESOURCE_LIST_WRAP" value="2" />
<option name="KEEP_SIMPLE_METHODS_IN_ONE_LINE" value="false" />
<option name="KEEP_SIMPLE_LAMBDAS_IN_ONE_LINE" value="true" />
<option name="KEEP_SIMPLE_CLASSES_IN_ONE_LINE" value="true" />
<option name="ARRAY_INITIALIZER_WRAP" value="1" />
<option name="ARRAY_INITIALIZER_LBRACE_ON_NEXT_LINE" value="true" />
<option name="ARRAY_INITIALIZER_RBRACE_ON_NEXT_LINE" value="true" />
<option name="DOWHILE_BRACE_FORCE" value="3" />
<option name="WHILE_BRACE_FORCE" value="3" />
<option name="FOR_BRACE_FORCE" value="3" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
<option name="USE_RELATIVE_INDENTS" value="false" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<ENUM>true</ENUM>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<FIELD>true</FIELD>
<FINAL>true</FINAL>
<PUBLIC>true</PUBLIC>
<STATIC>true</STATIC>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<FIELD>true</FIELD>
<FINAL>true</FINAL>
<PROTECTED>true</PROTECTED>
<STATIC>true</STATIC>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<FIELD>true</FIELD>
<FINAL>true</FINAL>
<PACKAGE_PRIVATE>true</PACKAGE_PRIVATE>
<STATIC>true</STATIC>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<FIELD>true</FIELD>
<FINAL>true</FINAL>
<PRIVATE>true</PRIVATE>
<STATIC>true</STATIC>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<FIELD>true</FIELD>
<PUBLIC>true</PUBLIC>
<STATIC>true</STATIC>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<FIELD>true</FIELD>
<PROTECTED>true</PROTECTED>
<STATIC>true</STATIC>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<FIELD>true</FIELD>
<PACKAGE_PRIVATE>true</PACKAGE_PRIVATE>
<STATIC>true</STATIC>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<FIELD>true</FIELD>
<PRIVATE>true</PRIVATE>
<STATIC>true</STATIC>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<INITIALIZER_BLOCK>true</INITIALIZER_BLOCK>
<STATIC>true</STATIC>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<FIELD>true</FIELD>
<FINAL>true</FINAL>
<PUBLIC>true</PUBLIC>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<FIELD>true</FIELD>
<FINAL>true</FINAL>
<PROTECTED>true</PROTECTED>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<FIELD>true</FIELD>
<FINAL>true</FINAL>
<PACKAGE_PRIVATE>true</PACKAGE_PRIVATE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<FIELD>true</FIELD>
<FINAL>true</FINAL>
<PRIVATE>true</PRIVATE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<FIELD>true</FIELD>
<PUBLIC>true</PUBLIC>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<FIELD>true</FIELD>
<PROTECTED>true</PROTECTED>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<FIELD>true</FIELD>
<PACKAGE_PRIVATE>true</PACKAGE_PRIVATE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<FIELD>true</FIELD>
<PRIVATE>true</PRIVATE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<FIELD>true</FIELD>
</match>
</rule>
</section>
<section>
<rule>
<match>
<INITIALIZER_BLOCK>true</INITIALIZER_BLOCK>
</match>
</rule>
</section>
<section>
<rule>
<match>
<CONSTRUCTOR>true</CONSTRUCTOR>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<METHOD>true</METHOD>
<STATIC>true</STATIC>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<METHOD>true</METHOD>
<PUBLIC>true</PUBLIC>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<METHOD>true</METHOD>
<PROTECTED>true</PROTECTED>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<METHOD>true</METHOD>
<PRIVATE>true</PRIVATE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<INTERFACE>true</INTERFACE>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<CLASS>true</CLASS>
<STATIC>true</STATIC>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<CLASS>true</CLASS>
</match>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
<codeStyleSettings language="XML">
<option name="RIGHT_MARGIN" value="256" />
<option name="FORCE_REARRANGE_MODE" value="1" />
<indentOptions>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="2" />
<option name="TAB_SIZE" value="2" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:android</NAME>
<XML_NAMESPACE>Namespace:</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:.*</NAME>
<XML_NAMESPACE>Namespace:</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:id</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:name</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>name</NAME>
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>style</NAME>
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:layout_width</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:layout_height</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:layout_.*</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:width</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:height</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_NAMESPACE>.*</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
</code_scheme>

22
build-resources/pom.xml Normal file
View File

@ -0,0 +1,22 @@
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.jetty</groupId>
<artifactId>build-resources</artifactId>
<version>9.4.21-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Jetty :: Build Resources</name>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
<configuration>
<!-- never deploy to a repository, only use in reactor -->
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,281 @@
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<!--
Checkstyle configuration that checks the Jetty coding conventions.
-->
<module name = "Checker">
<property name="charset" value="UTF-8"/>
<property name="severity" value="warning"/>
<property name="fileExtensions" value="java"/>
<!-- reference to suppressions filter for both eclipse and intellij checkstyle plugins -->
<module name="SuppressionFilter">
<property name="file" value="${checkstyle.suppressions.file}"/>
<property name="optional" value="true"/>
</module>
<!-- Excludes all 'module-info.java' files -->
<!-- See https://checkstyle.org/config_filefilters.html -->
<module name="BeforeExecutionExclusionFileFilter">
<property name="fileNamePattern" value="module\-info\.java$"/>
</module>
<!-- Checks for whitespace -->
<!-- See http://checkstyle.sf.net/config_whitespace.html -->
<module name="FileTabCharacter">
<property name="eachLine" value="true"/>
</module>
<module name="TreeWalker">
<module name="SuppressionCommentFilter">
<property name="offCommentFormat" value="@checkstyle-disable-check : ([\w\|]+)"/>
<property name="onCommentFormat" value="@checkstyle-enable-check : ([\w\|]+)"/>
<property name="checkFormat" value="$1"/>
</module>
<!--
Eclipse Jetty Specific.
===========================================================================================
-->
<!-- Location of Annotations -->
<module name="AnnotationLocation">
<property name="allowSamelineSingleParameterlessAnnotation" value="false"/>
</module>
<!-- Catch Parameter Name Format -->
<module name="CatchParameterName">
<property name="format" value="^(e|t|x|ex|th|e2|[a-z][a-z][a-zA-Z0-9]+)$"/>
</module>
<!-- Class Type Parameter Name Format -->
<module name="ClassTypeParameterName">
<property name="format" value="^[A-Z][A-Z0-9]*$"/>
</module>
<!-- Import Line Ordering -->
<module name="CustomImportOrder">
<property name="sortImportsInGroupAlphabetically" value="true"/>
<property name="separateLineBetweenGroups" value="true"/>
<property name="customImportOrderRules" value="STANDARD_JAVA_PACKAGE###THIRD_PARTY_PACKAGE###STATIC"/>
</module>
<!-- do not allow empty blocks in: try, finally, if, else, or switch -->
<module name="EmptyBlock">
<property name="option" value="TEXT"/>
<property name="tokens"
value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
</module>
<!-- enforce empty line after specified tokens -->
<module name="EmptyLineSeparator">
<property name="allowNoEmptyLineBetweenFields" value="true"/>
<property name="allowMultipleEmptyLines" value="false"/>
<property name="tokens"
value="PACKAGE_DEF, IMPORT, STATIC_IMPORT, CLASS_DEF, INTERFACE_DEF, ENUM_DEF,
STATIC_INIT, INSTANCE_INIT, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
</module>
<!-- Indentation Rules -->
<module name="Indentation">
<property name="arrayInitIndent" value="8"/>
</module>
<!-- Interface Type Parameter Name -->
<module name="InterfaceTypeParameterName">
<property name="format" value="^[A-Z][A-Z0-9]*$"/>
</module>
<!-- left curly brace must be on new line -->
<module name="LeftCurly">
<property name="option" value="nl"/>
</module>
<!-- Method Type Parameter Name -->
<module name="MethodTypeParameterName">
<property name="format" value="^[A-Z][A-Z0-9]*$"/>
</module>
<!-- Member Name Format -->
<module name="MemberName">
<property name="format" value="^[_a-z][a-zA-Z0-9]*$"/>
</module>
<!-- require braces is disabled - we don't enforce that in Jetty
<module name="NeedBraces">
<property name="allowSingleLineStatement" value="true"/>
</module>
-->
<!-- No Whitespace After specific tokens -->
<module name="NoWhitespaceAfter">
<property name="tokens" value="ARRAY_INIT, AT, INC, DEC, UNARY_MINUS, UNARY_PLUS, BNOT, LNOT, DOT, ARRAY_DECLARATOR, INDEX_OP, TYPECAST"/>
<property name="allowLineBreaks" value="true"/>
</module>
<!-- No Whitespace Before specific tokens -->
<module name="NoWhitespaceBefore">
<property name="tokens"
value="COMMA, SEMI, POST_INC, POST_DEC, DOT, ELLIPSIS, METHOD_REF"/>
<property name="allowLineBreaks" value="true"/>
</module>
<!-- allowed wrapping for operators -->
<module name="OperatorWrap">
<property name="id" value="OperatorWrapNextLine"/>
<property name="tokens" value="QUESTION, COLON"/>
<property name="option" value="nl"/>
</module>
<module name="OperatorWrap">
<property name="id" value="OperatorWrapSameLine"/>
<property name="tokens" value="EQUAL, NOT_EQUAL, DIV, PLUS, MINUS, STAR, MOD, SR, BSR, GE, GT, SL, LE, LT, BXOR, BOR, LOR, BAND, LAND, TYPE_EXTENSION_AND, LITERAL_INSTANCEOF"/>
<property name="option" value="eol"/>
</module>
<!-- ensure we don't have legacy comments that confuse javadoc tooling -->
<module name="Regexp">
<property name="id" value="LegacyMethodSeparators"/>
<property name="format" value="/\*\s*[=*-]*\s*\*/"/>
<property name="illegalPattern" value="true"/>
<property name="ignoreComments" value="false"/>
<property name="message" value="Legacy Method Separators"/>
</module>
<!-- right curly brace must be on new line -->
<module name="RightCurly">
<property name="option" value="alone_or_singleline"/>
</module>
<!-- Various Wrapping of ".", ",", "...", "[]", and method ref New Lines -->
<module name="SeparatorWrap">
<property name="id" value="SeparatorWrapNextLine"/>
<property name="tokens" value="DOT"/>
<property name="option" value="nl"/>
</module>
<module name="SeparatorWrap">
<property name="id" value="SeparatorWrapSameLine"/>
<property name="tokens" value="COMMA, ELLIPSIS, ARRAY_DECLARATOR, METHOD_REF"/>
<property name="option" value="eol"/>
</module>
<!-- checks that a token is followed by whitespace -->
<module name="WhitespaceAround">
<property name="allowEmptyConstructors" value="true"/>
<property name="allowEmptyLambdas" value="true"/>
<property name="allowEmptyMethods" value="true"/>
<property name="allowEmptyTypes" value="true"/>
<property name="allowEmptyLoops" value="true"/>
</module>
<!--
Checks based on common Open Source specific recommendations.
===========================================================================================
-->
<!-- limit use of unicode escape sequences (eg "\u20ac") in mainline code. -->
<module name="AvoidEscapedUnicodeCharacters">
<!-- allow control characters to use unicode escape sequences -->
<property name="allowEscapesForControlCharacters" value="true"/>
<!-- allow unicode escape sequences if also followed by tail comments -->
<property name="allowByTailComment" value="true"/>
<!-- allow use of non-printable escape sequences -->
<property name="allowNonPrintableEscapes" value="true"/>
</module>
<!-- not allowing star import lines -->
<module name="AvoidStarImport"/>
<!-- if you have an empty catch block, name the caught exception "ignored" -->
<module name="EmptyCatchBlock">
<property name="exceptionVariableName" value="ignored"/>
</module>
<!-- if a switch statement contains java code, but lacks fall through comment its an error -->
<module name="FallThrough"/>
<!-- reject unicode or octal values in mainline code -->
<module name="IllegalTokenText">
<property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
<property name="format"
value="\\u00(09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
<property name="message"
value="Consider using special escape sequence instead of octal value or Unicode escaped value."/>
</module>
<!-- all switch statements should have "default" label declared -->
<!-- Disabled: Is super noisy
<module name="MissingSwitchDefault"/>
-->
<!-- prevent line wrapping of import / package statements -->
<module name="NoLineWrap"/>
<!-- only 1 top level class defined per java file -->
<module name="OneTopLevelClass"/>
<!-- Filename and Classname match -->
<module name="OuterTypeFilename"/>
<!--
Checks based on the Java Language Specification recommendations.
https://docs.oracle.com/javase/specs/jls/se8/html/index.html
===========================================================================================
-->
<!-- array type style -->
<!-- int[] foo; // OK
int foo[]; // BAD -->
<module name="ArrayTypeStyle" />
<!-- Whitespace around Generics (angle brackets) follow convention -->
<module name="GenericWhitespace" />
<!-- Lambda Parameter Name Format -->
<module name="LambdaParameterName" />
<!-- Local Parameter Name Format -->
<module name="LocalVariableName" />
<!-- Method Name Format -->
<module name="MethodName" />
<!-- Checks the padding between the identifier of a method definition, constructor definition,
method call, or constructor invocation: nospace -->
<module name="MethodParamPad"/>
<!-- ensure that modifiers follow suggested order -->
<module name="ModifierOrder"/>
<!-- only 1 variable declaration per line -->
<module name="MultipleVariableDeclarations"/>
<!-- No Object.finalize() use -->
<module name="NoFinalizer"/>
<!-- checks that there is only one statement per line -->
<module name="OneStatementPerLine"/>
<!-- package name JLS rules -->
<module name="PackageName" />
<!-- Parameter Name Format -->
<module name="ParameterName" />
<!-- the policy on the padding of parentheses: nospace -->
<module name="ParenPad"/>
<!-- Type Name format -->
<module name="TypeName" />
<!-- checks that long constants are defined with an upper ell. That is 'L' and not 'l' -->
<module name="UpperEll"/>
<!-- TODO: look for float / double version of above -->
</module>
</module>

View File

@ -0,0 +1,35 @@
<?xml version="1.0"?>
<!DOCTYPE suppressions PUBLIC
"-//Checkstyle//DTD SuppressionFilter Configuration 1.2//EN"
"https://checkstyle.org/dtds/suppressions_1_2.dtd">
<suppressions>
<!-- all /target/ directories -->
<suppress checks=".*" files="[/\\]target[/\\]generated-sources[/\\]" />
<!-- General JUnit Test Cases -->
<suppress checks="AbbreviationAsWordInNameCheck"
files="[/\\]src[/\\]test[/\\]java[/\\]" />
<suppress checks="AvoidEscapedUnicodeCharactersCheck"
files="[/\\]src[/\\]test[/\\]java[/\\]" />
<suppress checks="LocalVariableNameCheck"
files="[/\\]src[/\\]test[/\\]java[/\\]" />
<suppress checks="MethodNameCheck"
files="[/\\]src[/\\]test[/\\]java[/\\]" />
<suppress checks="TypeNameCheck"
files="[/\\]src[/\\]test[/\\]java[/\\]" />
<!-- jetty-jmh specific -->
<suppress checks="AbbreviationAsWordInNameCheck"
files="[/\\]jetty-jmh[/\\]src[/\\]main[/\\]java[/\\]" />
<suppress checks="AvoidEscapedUnicodeCharactersCheck"
files="[/\\]jetty-jmh[/\\]src[/\\]main[/\\]java[/\\]" />
<suppress checks="LocalVariableNameCheck"
files="[/\\]jetty-jmh[/\\]src[/\\]main[/\\]java[/\\]" />
<suppress checks="MethodNameCheck"
files="[/\\]jetty-jmh[/\\]src[/\\]main[/\\]java[/\\]" />
<suppress checks="TypeNameCheck"
files="[/\\]jetty-jmh[/\\]src[/\\]main[/\\]java[/\\]" />
</suppressions>

View File

@ -2,17 +2,19 @@
<parent> <parent>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>example-async-rest</artifactId> <artifactId>example-async-rest</artifactId>
<version>9.4.13-SNAPSHOT</version> <version>9.4.21-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.jetty.example-async-rest</groupId> <groupId>org.eclipse.jetty.example-async-rest</groupId>
<artifactId>example-async-rest-jar</artifactId> <artifactId>example-async-rest-jar</artifactId>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>Example Async Rest :: Jar</name> <name>Example Async Rest :: Jar</name>
<url>http://www.eclipse.org/jetty</url>
<properties> <properties>
<bundle-symbolic-name>${project.groupId}.examples.asyc.rest</bundle-symbolic-name> <bundle-symbolic-name>${project.parent.groupId}.examples.async.rest</bundle-symbolic-name>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -24,7 +24,6 @@ import java.math.RoundingMode;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.Map; import java.util.Map;
import java.util.Queue; import java.util.Queue;
import javax.servlet.ServletConfig; import javax.servlet.ServletConfig;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
@ -43,18 +42,17 @@ import javax.servlet.http.HttpServletResponse;
*/ */
public class AbstractRestServlet extends HttpServlet public class AbstractRestServlet extends HttpServlet
{ {
protected final static String __DEFAULT_APPID = "Webtide81-adf4-4f0a-ad58-d91e41bbe85"; protected static final String __DEFAULT_APPID = "Webtide81-adf4-4f0a-ad58-d91e41bbe85";
protected final static String STYLE = protected static final String STYLE = "<style type='text/css'>" +
"<style type='text/css'>"+ " img.thumb:hover {height:50px}" +
" img.thumb:hover {height:50px}"+ " img.thumb {vertical-align:text-top}" +
" img.thumb {vertical-align:text-top}"+ " span.red {color: #ff0000}" +
" span.red {color: #ff0000}"+ " span.green {color: #00ff00}" +
" span.green {color: #00ff00}"+ " iframe {border: 0px}" +
" iframe {border: 0px}"+
"</style>"; "</style>";
protected final static String ITEMS_PARAM = "items"; protected static final String ITEMS_PARAM = "items";
protected final static String APPID_PARAM = "appid"; protected static final String APPID_PARAM = "appid";
protected String _appid; protected String _appid;
@ -67,41 +65,54 @@ public class AbstractRestServlet extends HttpServlet
_appid = servletConfig.getInitParameter(APPID_PARAM); _appid = servletConfig.getInitParameter(APPID_PARAM);
} }
// TODO: consider using StringUtil.sanitizeFileSystemName instead of this?
public static String sanitize(String s) // might introduce jetty-util dependency though
public static String sanitize(String str)
{ {
if (s==null) if (str == null)
return null; return null;
return s.replace("<","?").replace("&","?").replace("\n","?");
char[] chars = str.toCharArray();
int len = chars.length;
for (int i = 0; i < len; i++)
{
char c = chars[i];
if ((c <= 0x1F) || // control characters
(c == '<') || (c == '&'))
{
chars[i] = '?';
}
}
return String.valueOf(chars);
} }
protected String restURL(String item) protected String restURL(String item)
{ {
try try
{ {
return ("http://open.api.ebay.com/shopping?MaxEntries=3&appid=" + _appid + return ("http://open.api.ebay.com/shopping?MaxEntries=3&appid=" + _appid +
"&version=573&siteid=0&callname=FindItems&responseencoding=JSON&QueryKeywords=" + "&version=573&siteid=0&callname=FindItems&responseencoding=JSON&QueryKeywords=" +
URLEncoder.encode(item,"UTF-8")); URLEncoder.encode(item, "UTF-8"));
} }
catch(Exception e) catch (Exception e)
{ {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
protected String generateThumbs(Queue<Map<String,String>> results) protected String generateThumbs(Queue<Map<String, String>> results)
{ {
StringBuilder thumbs = new StringBuilder(); StringBuilder thumbs = new StringBuilder();
for (Map<String, String> m : results) for (Map<String, String> m : results)
{ {
if (!m.containsKey("GalleryURL")) if (!m.containsKey("GalleryURL"))
continue; continue;
thumbs.append("<a href=\""+m.get("ViewItemURLForNaturalSearch")+"\">"); thumbs.append("<a href=\"" + m.get("ViewItemURLForNaturalSearch") + "\">");
thumbs.append("<img class='thumb' border='1px' height='25px'"+ thumbs.append("<img class='thumb' border='1px' height='25px'" +
" src='"+m.get("GalleryURL")+"'"+ " src='" + m.get("GalleryURL") + "'" +
" title='"+m.get("Title")+"'"+ " title='" + m.get("Title") + "'" +
"/>"); "/>");
thumbs.append("</a>&nbsp;"); thumbs.append("</a>&nbsp;");
} }
return thumbs.toString(); return thumbs.toString();
@ -110,21 +121,20 @@ public class AbstractRestServlet extends HttpServlet
protected String ms(long nano) protected String ms(long nano)
{ {
BigDecimal dec = new BigDecimal(nano); BigDecimal dec = new BigDecimal(nano);
return dec.divide(new BigDecimal(1000000L)).setScale(1,RoundingMode.UP).toString(); return dec.divide(new BigDecimal(1000000L)).setScale(1, RoundingMode.UP).toString();
} }
protected int width(long nano) protected int width(long nano)
{ {
int w=(int)((nano+999999L)/5000000L); int w = (int)((nano + 999999L) / 5000000L);
if (w==0) if (w == 0)
w=2; w = 2;
return w; return w;
} }
@Override @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{ {
doGet(request, response); doGet(request, response);
} }
} }

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -25,7 +25,6 @@ import java.util.Map;
import java.util.Queue; import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import javax.servlet.AsyncContext; import javax.servlet.AsyncContext;
import javax.servlet.ServletConfig; import javax.servlet.ServletConfig;
import javax.servlet.ServletException; import javax.servlet.ServletException;
@ -52,9 +51,9 @@ import org.eclipse.jetty.util.ajax.JSON;
*/ */
public class AsyncRestServlet extends AbstractRestServlet public class AsyncRestServlet extends AbstractRestServlet
{ {
final static String RESULTS_ATTR = "org.eclipse.jetty.demo.client"; static final String RESULTS_ATTR = "org.eclipse.jetty.demo.client";
final static String DURATION_ATTR = "org.eclipse.jetty.demo.duration"; static final String DURATION_ATTR = "org.eclipse.jetty.demo.duration";
final static String START_ATTR = "org.eclispe.jetty.demo.start"; static final String START_ATTR = "org.eclispe.jetty.demo.start";
HttpClient _client; HttpClient _client;
@ -78,17 +77,17 @@ public class AsyncRestServlet extends AbstractRestServlet
@Override @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{ {
Long start=System.nanoTime(); Long start = System.nanoTime();
// Do we have results yet? // Do we have results yet?
Queue<Map<String, String>> results = (Queue<Map<String, String>>) request.getAttribute(RESULTS_ATTR); Queue<Map<String, String>> results = (Queue<Map<String, String>>)request.getAttribute(RESULTS_ATTR);
// If no results, this must be the first dispatch, so send the REST request(s) // If no results, this must be the first dispatch, so send the REST request(s)
if (results==null) if (results == null)
{ {
// define results data structures // define results data structures
final Queue<Map<String, String>> resultsQueue = new ConcurrentLinkedQueue<>(); final Queue<Map<String, String>> resultsQueue = new ConcurrentLinkedQueue<>();
request.setAttribute(RESULTS_ATTR, results=resultsQueue); request.setAttribute(RESULTS_ATTR, results = resultsQueue);
// suspend the request // suspend the request
// This is done before scheduling async handling to avoid race of // This is done before scheduling async handling to avoid race of
@ -97,24 +96,25 @@ public class AsyncRestServlet extends AbstractRestServlet
async.setTimeout(30000); async.setTimeout(30000);
// extract keywords to search for // extract keywords to search for
String[] keywords=sanitize(request.getParameter(ITEMS_PARAM)).split(","); String[] keywords = sanitize(request.getParameter(ITEMS_PARAM)).split(",");
final AtomicInteger outstanding=new AtomicInteger(keywords.length); final AtomicInteger outstanding = new AtomicInteger(keywords.length);
// Send request each keyword // Send request each keyword
for (final String item:keywords) for (final String item : keywords)
{ {
_client.newRequest(restURL(item)).method(HttpMethod.GET).send( _client.newRequest(restURL(item)).method(HttpMethod.GET).send(
new AsyncRestRequest() new AsyncRestRequest()
{ {
@Override @Override
void onAuctionFound(Map<String,String> auction) void onAuctionFound(Map<String, String> auction)
{ {
resultsQueue.add(auction); resultsQueue.add(auction);
} }
@Override @Override
void onComplete() void onComplete()
{ {
if (outstanding.decrementAndGet()<=0) if (outstanding.decrementAndGet() <= 0)
async.dispatch(); async.dispatch();
} }
}); });
@ -138,23 +138,23 @@ public class AsyncRestServlet extends AbstractRestServlet
out.println(STYLE); out.println(STYLE);
out.println("</head><body><small>"); out.println("</head><body><small>");
long initial = (Long) request.getAttribute(DURATION_ATTR); long initial = (Long)request.getAttribute(DURATION_ATTR);
long start0 = (Long) request.getAttribute(START_ATTR); long start0 = (Long)request.getAttribute(START_ATTR);
long now = System.nanoTime(); long now = System.nanoTime();
long total=now-start0; long total = now - start0;
long generate=now-start; long generate = now - start;
long thread=initial+generate; long thread = initial + generate;
out.print("<b>Asynchronous: "+sanitize(request.getParameter(ITEMS_PARAM))+"</b><br/>"); out.print("<b>Asynchronous: " + sanitize(request.getParameter(ITEMS_PARAM)) + "</b><br/>");
out.print("Total Time: "+ms(total)+"ms<br/>"); out.print("Total Time: " + ms(total) + "ms<br/>");
out.print("Thread held (<span class='red'>red</span>): "+ms(thread)+"ms (" + ms(initial) + " initial + " + ms(generate) + " generate )<br/>"); out.print("Thread held (<span class='red'>red</span>): " + ms(thread) + "ms (" + ms(initial) + " initial + " + ms(generate) + " generate )<br/>");
out.print("Async wait (<span class='green'>green</span>): "+ms(total-thread)+"ms<br/>"); out.print("Async wait (<span class='green'>green</span>): " + ms(total - thread) + "ms<br/>");
out.println("<img border='0px' src='asyncrest/red.png' height='20px' width='"+width(initial)+"px'>"+ out.println("<img border='0px' src='asyncrest/red.png' height='20px' width='" + width(initial) + "px'>" +
"<img border='0px' src='asyncrest/green.png' height='20px' width='"+width(total-thread)+"px'>"+ "<img border='0px' src='asyncrest/green.png' height='20px' width='" + width(total - thread) + "px'>" +
"<img border='0px' src='asyncrest/red.png' height='20px' width='"+width(generate)+"px'>"); "<img border='0px' src='asyncrest/red.png' height='20px' width='" + width(generate) + "px'>");
out.println("<hr />"); out.println("<hr />");
out.println(thumbs); out.println(thumbs);
@ -162,7 +162,7 @@ public class AsyncRestServlet extends AbstractRestServlet
out.println("</body></html>"); out.println("</body></html>");
out.close(); out.close();
} }
private abstract class AsyncRestRequest extends Response.Listener.Adapter private abstract class AsyncRestRequest extends Response.Listener.Adapter
{ {
final Utf8StringBuilder _content = new Utf8StringBuilder(); final Utf8StringBuilder _content = new Utf8StringBuilder();
@ -175,27 +175,28 @@ public class AsyncRestServlet extends AbstractRestServlet
public void onContent(Response response, ByteBuffer content) public void onContent(Response response, ByteBuffer content)
{ {
byte[] bytes = BufferUtil.toArray(content); byte[] bytes = BufferUtil.toArray(content);
_content.append(bytes,0,bytes.length); _content.append(bytes, 0, bytes.length);
} }
@Override @Override
public void onComplete(Result result) public void onComplete(Result result)
{ {
// extract auctions from the results // extract auctions from the results
Map<String,?> query = (Map<String,?>) JSON.parse(_content.toString()); Map<String, ?> query = (Map<String, ?>)JSON.parse(_content.toString());
Object[] auctions = (Object[]) query.get("Item"); Object[] auctions = (Object[])query.get("Item");
if (auctions != null) if (auctions != null)
{ {
for (Object o : auctions) for (Object o : auctions)
onAuctionFound((Map<String,String>)o); {
onAuctionFound((Map<String, String>)o);
}
} }
onComplete(); onComplete();
} }
abstract void onAuctionFound(Map<String,String> details); abstract void onAuctionFound(Map<String, String> details);
abstract void onComplete();
abstract void onComplete();
} }
@Override @Override

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -27,7 +27,6 @@ import java.net.URL;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.Map; import java.util.Map;
import java.util.Queue; import java.util.Queue;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -39,37 +38,37 @@ import org.eclipse.jetty.util.ajax.JSON;
* Servlet implementation class SerialRestServlet * Servlet implementation class SerialRestServlet
*/ */
public class SerialRestServlet extends AbstractRestServlet public class SerialRestServlet extends AbstractRestServlet
{ {
@Override @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{ {
long start = System.nanoTime(); long start = System.nanoTime();
String[] keywords=sanitize(request.getParameter(ITEMS_PARAM)).split(","); String[] keywords = sanitize(request.getParameter(ITEMS_PARAM)).split(",");
Queue<Map<String,String>> results = new LinkedList<Map<String,String>>(); Queue<Map<String, String>> results = new LinkedList<Map<String, String>>();
// make all requests serially // make all requests serially
for (String itemName : keywords) for (String itemName : keywords)
{ {
URL url = new URL(restURL(itemName)); URL url = new URL(restURL(itemName));
HttpURLConnection connection = (HttpURLConnection)url.openConnection(); HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET"); connection.setRequestMethod("GET");
Map query = (Map)JSON.parse(new BufferedReader(new InputStreamReader(connection.getInputStream()))); Map query = (Map)JSON.parse(new BufferedReader(new InputStreamReader(connection.getInputStream())));
Object[] auctions = (Object[]) query.get("Item"); Object[] auctions = (Object[])query.get("Item");
if (auctions != null) if (auctions != null)
{ {
for (Object o : auctions) for (Object o : auctions)
results.add((Map) o); {
results.add((Map)o);
}
} }
} }
// Generate the response // Generate the response
String thumbs=generateThumbs(results); String thumbs = generateThumbs(results);
response.setContentType("text/html"); response.setContentType("text/html");
PrintWriter out = response.getWriter(); PrintWriter out = response.getWriter();
out.println("<html><head>"); out.println("<html><head>");
@ -77,32 +76,28 @@ public class SerialRestServlet extends AbstractRestServlet
out.println("</head><body><small>"); out.println("</head><body><small>");
long now = System.nanoTime(); long now = System.nanoTime();
long total=now-start; long total = now - start;
out.print("<b>Blocking: " + sanitize(request.getParameter(ITEMS_PARAM)) + "</b><br/>");
out.print("Total Time: " + ms(total) + "ms<br/>");
out.print("Thread held (<span class='red'>red</span>): " + ms(total) + "ms<br/>");
out.println("<img border='0px' src='asyncrest/red.png' height='20px' width='" + width(total) + "px'>");
out.print("<b>Blocking: "+sanitize(request.getParameter(ITEMS_PARAM))+"</b><br/>");
out.print("Total Time: "+ms(total)+"ms<br/>");
out.print("Thread held (<span class='red'>red</span>): "+ms(total)+"ms<br/>");
out.println("<img border='0px' src='asyncrest/red.png' height='20px' width='"+width(total)+"px'>");
out.println("<hr />"); out.println("<hr />");
out.println(thumbs); out.println(thumbs);
out.println("</small>"); out.println("</small>");
out.println("</body></html>"); out.println("</body></html>");
out.close(); out.close();
} }
/** /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response) * response)
*/ */
@Override @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{ {
doGet(request, response); doGet(request, response);
} }
} }

View File

@ -2,16 +2,19 @@
<parent> <parent>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>example-async-rest</artifactId> <artifactId>example-async-rest</artifactId>
<version>9.4.13-SNAPSHOT</version> <version>9.4.21-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.jetty.example-async-rest</groupId> <groupId>org.eclipse.jetty.example-async-rest</groupId>
<artifactId>example-async-rest-webapp</artifactId> <artifactId>example-async-rest-webapp</artifactId>
<packaging>war</packaging> <packaging>war</packaging>
<name>Example Async Rest :: Webapp</name> <name>Example Async Rest :: Webapp</name>
<build> <build>
<finalName>async-rest</finalName> <finalName>async-rest</finalName>
</build> </build>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.eclipse.jetty.example-async-rest</groupId> <groupId>org.eclipse.jetty.example-async-rest</groupId>
@ -24,10 +27,10 @@
<version>${project.version}</version> <version>${project.version}</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>javax.servlet</groupId> <groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId> <artifactId>javax.servlet-api</artifactId>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -1,5 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<!-- <!--
This is the jetty specific web application configuration file. When starting This is the jetty specific web application configuration file. When starting

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -26,17 +26,17 @@ public class DemoServer
public static void main(String[] args) public static void main(String[] args)
throws Exception throws Exception
{ {
String jetty_home = System.getProperty("jetty.home","."); String jetty_home = System.getProperty("jetty.home", ".");
Server server = new Server(Integer.getInteger("jetty.http.port", 8080).intValue());
Server server = new Server(Integer.getInteger("jetty.http.port",8080).intValue());
WebAppContext webapp = new WebAppContext(); WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/"); webapp.setContextPath("/");
webapp.setWar(jetty_home+"/target/async-rest/"); webapp.setWar(jetty_home + "/target/async-rest/");
webapp.setParentLoaderPriority(true); webapp.setParentLoaderPriority(true);
webapp.setServerClasses(new String[]{}); webapp.setServerClasses(new String[]{});
server.setHandler(webapp); server.setHandler(webapp);
server.start(); server.start();
server.join(); server.join();
} }

View File

@ -2,16 +2,18 @@
<parent> <parent>
<groupId>org.eclipse.jetty.examples</groupId> <groupId>org.eclipse.jetty.examples</groupId>
<artifactId>examples-parent</artifactId> <artifactId>examples-parent</artifactId>
<version>9.4.13-SNAPSHOT</version> <version>9.4.21-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>example-async-rest</artifactId> <artifactId>example-async-rest</artifactId>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>Example Async Rest</name> <name>Example Async Rest</name>
<modules> <modules>
<module>async-rest-jar</module> <module>async-rest-jar</module>
<module>async-rest-webapp</module> <module>async-rest-webapp</module>
</modules> </modules>
</project> </project>

View File

@ -2,7 +2,7 @@
<parent> <parent>
<groupId>org.eclipse.jetty.examples</groupId> <groupId>org.eclipse.jetty.examples</groupId>
<artifactId>examples-parent</artifactId> <artifactId>examples-parent</artifactId>
<version>9.4.13-SNAPSHOT</version> <version>9.4.21-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -95,10 +95,6 @@
<artifactId>test-mock-resources</artifactId> <artifactId>test-mock-resources</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>javax.transaction-api</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-proxy</artifactId> <artifactId>jetty-proxy</artifactId>
@ -128,7 +124,12 @@
<groupId>org.eclipse.jetty.orbit</groupId> <groupId>org.eclipse.jetty.orbit</groupId>
<artifactId>javax.mail.glassfish</artifactId> <artifactId>javax.mail.glassfish</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>javax.transaction</groupId>
<artifactId>javax.transaction-api</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.toolchain</groupId> <groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-test-helper</artifactId> <artifactId>jetty-test-helper</artifactId>
<!-- scope>test</scope--> <!-- scope>test</scope-->

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -20,7 +20,6 @@ package org.eclipse.jetty.embedded;
import java.io.IOException; import java.io.IOException;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import javax.servlet.AsyncContext; import javax.servlet.AsyncContext;
import javax.servlet.ReadListener; import javax.servlet.ReadListener;
import javax.servlet.ServletException; import javax.servlet.ServletException;
@ -31,7 +30,6 @@ import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
public class AsyncEchoServlet extends HttpServlet public class AsyncEchoServlet extends HttpServlet
{ {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@ -60,7 +58,7 @@ public class AsyncEchoServlet extends HttpServlet
this.input = asyncContext.getRequest().getInputStream(); this.input = asyncContext.getRequest().getInputStream();
this.output = asyncContext.getResponse().getOutputStream(); this.output = asyncContext.getResponse().getOutputStream();
} }
@Override @Override
public void onDataAvailable() throws IOException public void onDataAvailable() throws IOException
{ {
@ -78,7 +76,7 @@ public class AsyncEchoServlet extends HttpServlet
{ {
handleAsyncIO(); handleAsyncIO();
} }
private void handleAsyncIO() throws IOException private void handleAsyncIO() throws IOException
{ {
// This method is called: // This method is called:
@ -86,7 +84,7 @@ public class AsyncEchoServlet extends HttpServlet
// 2) after first registering a ReadListener iff write is ready // 2) after first registering a ReadListener iff write is ready
// 3) when a previous write completes after an output.isReady() returns false // 3) when a previous write completes after an output.isReady() returns false
// 4) from an input callback // 4) from an input callback
// We should try to read, only if we are able to write! // We should try to read, only if we are able to write!
while (true) while (true)
{ {
@ -98,15 +96,15 @@ public class AsyncEchoServlet extends HttpServlet
if (!input.isReady()) if (!input.isReady())
// Nothing available to read, so wait for another call to onDataAvailable // Nothing available to read, so wait for another call to onDataAvailable
break; break;
int read = input.read(buffer); int read = input.read(buffer);
if (read<0) if (read < 0)
{ {
if (complete.compareAndSet(false,true)) if (complete.compareAndSet(false, true))
asyncContext.complete(); asyncContext.complete();
break; break;
} }
else if (read>0) else if (read > 0)
{ {
output.write(buffer, 0, read); output.write(buffer, 0, read);
} }
@ -116,7 +114,7 @@ public class AsyncEchoServlet extends HttpServlet
@Override @Override
public void onError(Throwable failure) public void onError(Throwable failure)
{ {
new Throwable("onError",failure).printStackTrace(); new Throwable("onError", failure).printStackTrace();
asyncContext.complete(); asyncContext.complete();
} }
} }

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -20,8 +20,6 @@ package org.eclipse.jetty.embedded;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -30,9 +28,8 @@ import javax.servlet.http.HttpServletResponse;
public class DumpServlet extends HttpServlet public class DumpServlet extends HttpServlet
{ {
@Override @Override
protected void doGet( HttpServletRequest request, protected void doGet(HttpServletRequest request,
HttpServletResponse response ) throws ServletException, HttpServletResponse response) throws IOException
IOException
{ {
response.setContentType("text/html"); response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK); response.setStatus(HttpServletResponse.SC_OK);
@ -51,8 +48,7 @@ public class DumpServlet extends HttpServlet
String r = request.getParameter("resource"); String r = request.getParameter("resource");
if (r != null) if (r != null)
{ {
out.println("resource(" + r + ")=" out.println("resource(" + r + ")=" + getServletContext().getResource(r));
+ getServletContext().getResource(r));
} }
out.println("</pre>"); out.println("</pre>");

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -28,13 +28,13 @@ import org.eclipse.jetty.servlet.ServletContextHandler;
public class ExampleServer public class ExampleServer
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
Server server = new Server(); Server server = new Server();
ServerConnector connector = new ServerConnector(server); ServerConnector connector = new ServerConnector(server);
connector.setPort(8080); connector.setPort(8080);
server.setConnectors(new Connector[] { connector }); server.setConnectors(new Connector[]{connector});
ServletContextHandler context = new ServletContextHandler(); ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/"); context.setContextPath("/");
@ -42,7 +42,7 @@ public class ExampleServer
context.addServlet(AsyncEchoServlet.class, "/echo/*"); context.addServlet(AsyncEchoServlet.class, "/echo/*");
HandlerCollection handlers = new HandlerCollection(); HandlerCollection handlers = new HandlerCollection();
handlers.setHandlers(new Handler[] { context, new DefaultHandler() }); handlers.setHandlers(new Handler[]{context, new DefaultHandler()});
server.setHandler(handlers); server.setHandler(handlers);
server.start(); server.start();

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -29,7 +29,7 @@ import org.eclipse.jetty.xml.XmlConfiguration;
*/ */
public class ExampleServerXml public class ExampleServerXml
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
// Find Jetty XML (in classpath) that configures and starts Server. // Find Jetty XML (in classpath) that configures and starts Server.
Resource serverXml = Resource.newSystemResource("exampleserver.xml"); Resource serverXml = Resource.newSystemResource("exampleserver.xml");

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -25,7 +25,6 @@ import java.nio.ByteBuffer;
import java.nio.channels.FileChannel; import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode; import java.nio.channels.FileChannel.MapMode;
import java.nio.file.StandardOpenOption; import java.nio.file.StandardOpenOption;
import javax.servlet.AsyncContext; import javax.servlet.AsyncContext;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -59,14 +58,15 @@ import org.eclipse.jetty.util.resource.Resource;
*/ */
public class FastFileServer public class FastFileServer
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
Server server = new Server(8080); Server server = new Server(8080);
HandlerList handlers = new HandlerList(); HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { handlers.setHandlers(new Handler[]{
new FastFileHandler(new File(System.getProperty("user.dir"))), new FastFileHandler(new File(System.getProperty("user.dir"))),
new DefaultHandler() }); new DefaultHandler()
});
server.setHandler(handlers); server.setHandler(handlers);
server.start(); server.start();
@ -78,17 +78,17 @@ public class FastFileServer
private final MimeTypes mimeTypes = new MimeTypes(); private final MimeTypes mimeTypes = new MimeTypes();
private final File dir; private final File dir;
private FastFileHandler( File dir ) private FastFileHandler(File dir)
{ {
this.dir = dir; this.dir = dir;
} }
@Override @Override
public void handle( String target, public void handle(String target,
Request baseRequest, Request baseRequest,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response ) throws IOException, HttpServletResponse response) throws IOException,
ServletException ServletException
{ {
// define small medium and large. // define small medium and large.
// This should be turned for your content, JVM and OS, but we will // This should be turned for your content, JVM and OS, but we will
@ -111,19 +111,20 @@ public class FastFileServer
{ {
if (!request.getPathInfo().endsWith(URIUtil.SLASH)) if (!request.getPathInfo().endsWith(URIUtil.SLASH))
{ {
response.sendRedirect(response.encodeRedirectURL(request.getRequestURI()+URIUtil.SLASH)); response.sendRedirect(response.encodeRedirectURL(request.getRequestURI() + URIUtil.SLASH));
return; return;
} }
String listing = Resource.newResource(file).getListHTML( String listing = Resource.newResource(file).getListHTML(
request.getRequestURI(), request.getRequestURI(),
request.getPathInfo().lastIndexOf("/") > 0); request.getPathInfo().lastIndexOf("/") > 0,
request.getQueryString());
response.setContentType("text/html; charset=utf-8"); response.setContentType("text/html; charset=utf-8");
response.getWriter().println(listing); response.getWriter().println(listing);
return; return;
} }
// Set some content headers. // Set some content headers.
// Jetty DefaultServlet will cache formatted date strings, but we // Jetty DefaultServlet will cache formatted date strings, but we
// will reformat for each request here // will reformat for each request here
response.setDateHeader("Last-Modified", file.lastModified()); response.setDateHeader("Last-Modified", file.lastModified());
@ -134,9 +135,9 @@ public class FastFileServer
if (file.length() < SMALL) if (file.length() < SMALL)
{ {
// need to caste to Jetty output stream for best API // need to caste to Jetty output stream for best API
((HttpOutput) response.getOutputStream()) ((HttpOutput)response.getOutputStream())
.sendContent(FileChannel.open(file.toPath(), .sendContent(FileChannel.open(file.toPath(),
StandardOpenOption.READ)); StandardOpenOption.READ));
return; return;
} }
@ -153,7 +154,7 @@ public class FastFileServer
} }
@Override @Override
public void failed( Throwable x ) public void failed(Throwable x)
{ {
// log error and complete async response; // log error and complete async response;
x.printStackTrace(); x.printStackTrace();
@ -165,9 +166,9 @@ public class FastFileServer
if (file.length() < MEDIUM) if (file.length() < MEDIUM)
{ {
// the file channel is closed by the async send // the file channel is closed by the async send
((HttpOutput) response.getOutputStream()) ((HttpOutput)response.getOutputStream())
.sendContent(FileChannel.open(file.toPath(), .sendContent(FileChannel.open(file.toPath(),
StandardOpenOption.READ), completionCB); StandardOpenOption.READ), completionCB);
return; return;
} }
@ -176,10 +177,10 @@ public class FastFileServer
// can be hard to GC on some JVMs. But for this example we will // can be hard to GC on some JVMs. But for this example we will
// create a new buffer per file // create a new buffer per file
ByteBuffer buffer; ByteBuffer buffer;
try ( RandomAccessFile raf = new RandomAccessFile(file, "r"); ) try (RandomAccessFile raf = new RandomAccessFile(file, "r"))
{ {
buffer = raf.getChannel().map(MapMode.READ_ONLY, 0, buffer = raf.getChannel().map(MapMode.READ_ONLY, 0,
raf.length()); raf.length());
} }
// Assuming the file buffer might be shared cached version, so lets // Assuming the file buffer might be shared cached version, so lets
@ -188,8 +189,8 @@ public class FastFileServer
// send the content as a buffer with a callback to complete the // send the content as a buffer with a callback to complete the
// async request need to caste to Jetty output stream for best API // async request need to caste to Jetty output stream for best API
((HttpOutput) response.getOutputStream()).sendContent(buffer, ((HttpOutput)response.getOutputStream()).sendContent(buffer,
completionCB); completionCB);
} }
} }
} }

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -24,7 +24,7 @@ import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler; import org.eclipse.jetty.server.handler.ResourceHandler;
/** /**
* Simple Jetty FileServer. * Simple Jetty FileServer.
* This is a simple example of Jetty configured as a FileServer. * This is a simple example of Jetty configured as a FileServer.
*/ */
@ -39,17 +39,17 @@ public class FileServer
// Create the ResourceHandler. It is the object that will actually handle the request for a given file. It is // Create the ResourceHandler. It is the object that will actually handle the request for a given file. It is
// a Jetty Handler object so it is suitable for chaining with other handlers as you will see in other examples. // a Jetty Handler object so it is suitable for chaining with other handlers as you will see in other examples.
ResourceHandler resource_handler = new ResourceHandler(); ResourceHandler resourceHandler = new ResourceHandler();
// Configure the ResourceHandler. Setting the resource base indicates where the files should be served out of. // Configure the ResourceHandler. Setting the resource base indicates where the files should be served out of.
// In this example it is the current directory but it can be configured to anything that the jvm has access to. // In this example it is the current directory but it can be configured to anything that the jvm has access to.
resource_handler.setDirectoriesListed(true); resourceHandler.setDirectoriesListed(true);
resource_handler.setWelcomeFiles(new String[]{ "index.html" }); resourceHandler.setWelcomeFiles(new String[]{"index.html"});
resource_handler.setResourceBase("."); resourceHandler.setResourceBase(".");
// Add the ResourceHandler to the server. // Add the ResourceHandler to the server.
HandlerList handlers = new HandlerList(); HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { resource_handler, new DefaultHandler() }); handlers.setHandlers(new Handler[]{resourceHandler, new DefaultHandler()});
server.setHandler(handlers); server.setHandler(handlers);
// Start things up! By using the server.join() the server thread will join with the current thread. // Start things up! By using the server.join() the server thread will join with the current thread.

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -34,12 +34,11 @@ import org.eclipse.jetty.xml.XmlConfiguration;
*/ */
public class FileServerXml public class FileServerXml
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
Resource fileserverXml = Resource.newSystemResource("fileserver.xml"); Resource fileServerXml = Resource.newSystemResource("fileserver.xml");
XmlConfiguration configuration = new XmlConfiguration( XmlConfiguration configuration = new XmlConfiguration(fileServerXml);
fileserverXml.getInputStream()); Server server = (Server)configuration.configure();
Server server = (Server) configuration.configure();
server.start(); server.start();
server.join(); server.join();
} }

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -20,7 +20,6 @@ package org.eclipse.jetty.embedded;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -38,23 +37,23 @@ public class HelloHandler extends AbstractHandler
this("Hello World"); this("Hello World");
} }
public HelloHandler( String greeting ) public HelloHandler(String greeting)
{ {
this(greeting, null); this(greeting, null);
} }
public HelloHandler( String greeting, String body ) public HelloHandler(String greeting, String body)
{ {
this.greeting = greeting; this.greeting = greeting;
this.body = body; this.body = body;
} }
@Override @Override
public void handle( String target, public void handle(String target,
Request baseRequest, Request baseRequest,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response ) throws IOException, HttpServletResponse response) throws IOException,
ServletException ServletException
{ {
response.setContentType("text/html; charset=utf-8"); response.setContentType("text/html; charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK); response.setStatus(HttpServletResponse.SC_OK);

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -19,7 +19,6 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.IOException; import java.io.IOException;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -35,19 +34,19 @@ public class HelloServlet extends HttpServlet
this("Hello"); this("Hello");
} }
public HelloServlet( String greeting ) public HelloServlet(String greeting)
{ {
this.greeting = greeting; this.greeting = greeting;
} }
@Override @Override
protected void doGet( HttpServletRequest request, protected void doGet(HttpServletRequest request,
HttpServletResponse response ) throws ServletException, HttpServletResponse response) throws ServletException,
IOException IOException
{ {
response.setContentType("text/html"); response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK); response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().println( response.getWriter().println(
"<h1>" + greeting + " from HelloServlet</h1>"); "<h1>" + greeting + " from HelloServlet</h1>");
} }
} }

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -20,7 +20,6 @@ package org.eclipse.jetty.embedded;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -30,21 +29,23 @@ import javax.servlet.http.HttpSession;
@SuppressWarnings("serial") @SuppressWarnings("serial")
public class HelloSessionServlet extends HttpServlet public class HelloSessionServlet extends HttpServlet
{ {
public HelloSessionServlet() {} public HelloSessionServlet()
{
}
@Override @Override
protected void doGet( HttpServletRequest request, protected void doGet(HttpServletRequest request,
HttpServletResponse response ) throws ServletException, HttpServletResponse response) throws ServletException,
IOException IOException
{ {
response.setContentType("text/html"); response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK); response.setStatus(HttpServletResponse.SC_OK);
response.addHeader("Cache-Control","no-cache"); response.addHeader("Cache-Control", "no-cache");
HttpSession session = request.getSession(); HttpSession session = request.getSession();
String message; String message;
String link; String link;
String greeting = request.getParameter("greeting"); String greeting = request.getParameter("greeting");
if (greeting != null) if (greeting != null)
{ {
@ -56,7 +57,7 @@ public class HelloSessionServlet extends HttpServlet
{ {
greeting = (String)session.getAttribute("greeting"); greeting = (String)session.getAttribute("greeting");
if (greeting != null) if (greeting != null)
{ {
message = "Greeting '" + greeting + "' set from session."; message = "Greeting '" + greeting + "' set from session.";
} }
@ -68,17 +69,15 @@ public class HelloSessionServlet extends HttpServlet
link = "Click <a href=\"/?greeting=Hola\">here</a> to set a new greeting."; link = "Click <a href=\"/?greeting=Hola\">here</a> to set a new greeting.";
} }
PrintWriter out = response.getWriter(); PrintWriter out = response.getWriter();
out.println("<h1>" + greeting + " from HelloSessionServlet</h1>"); out.println("<h1>" + greeting + " from HelloSessionServlet</h1>");
out.println("<p>" + message + "</p>"); out.println("<p>" + message + "</p>");
out.println("<pre>"); out.println("<pre>");
out.println("session.getId() = " +session.getId()); out.println("session.getId() = " + session.getId());
out.println("session.isNew() = " +session.isNew()); out.println("session.isNew() = " + session.isNew());
out.println("</pre>"); out.println("</pre>");
out.println("<p>" + link + "</p>"); out.println("<p>" + link + "</p>");
} }
} }

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -19,7 +19,6 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.IOException; import java.io.IOException;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -31,11 +30,11 @@ import org.eclipse.jetty.server.handler.AbstractHandler;
public class HelloWorld extends AbstractHandler public class HelloWorld extends AbstractHandler
{ {
@Override @Override
public void handle( String target, public void handle(String target,
Request baseRequest, Request baseRequest,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response ) throws IOException, HttpServletResponse response) throws IOException,
ServletException ServletException
{ {
// Declare response encoding and types // Declare response encoding and types
response.setContentType("text/html; charset=utf-8"); response.setContentType("text/html; charset=utf-8");
@ -50,7 +49,7 @@ public class HelloWorld extends AbstractHandler
baseRequest.setHandled(true); baseRequest.setHandled(true);
} }
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
Server server = new Server(8080); Server server = new Server(8080);
server.setHandler(new HelloWorld()); server.setHandler(new HelloWorld());

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -16,16 +16,13 @@
// ======================================================================== // ========================================================================
// //
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import java.nio.file.Files;
import java.util.Date; import java.util.Date;
import java.util.EnumSet; import java.util.EnumSet;
import javax.servlet.DispatcherType; import javax.servlet.DispatcherType;
import javax.servlet.Filter; import javax.servlet.Filter;
import javax.servlet.FilterChain; import javax.servlet.FilterChain;
@ -59,75 +56,74 @@ import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.servlets.PushCacheFilter; import org.eclipse.jetty.servlets.PushCacheFilter;
import org.eclipse.jetty.util.ssl.SslContextFactory; import org.eclipse.jetty.util.ssl.SslContextFactory;
/* ------------------------------------------------------------ */
/** /**
*
*/ */
public class Http2Server public class Http2Server
{ {
public static void main(String... args) throws Exception public static void main(String... args) throws Exception
{ {
Server server = new Server(); Server server = new Server();
MBeanContainer mbContainer = new MBeanContainer( MBeanContainer mbContainer = new MBeanContainer(
ManagementFactory.getPlatformMBeanServer()); ManagementFactory.getPlatformMBeanServer());
server.addBean(mbContainer); server.addBean(mbContainer);
ServletContextHandler context = new ServletContextHandler(server, "/",ServletContextHandler.SESSIONS); ServletContextHandler context = new ServletContextHandler(server, "/", ServletContextHandler.SESSIONS);
String docroot = "src/main/resources/docroot"; String docroot = "src/main/resources/docroot";
if (!new File(docroot).exists()) if (!new File(docroot).exists())
docroot = "examples/embedded/src/main/resources/docroot"; docroot = "examples/embedded/src/main/resources/docroot";
context.setResourceBase(docroot); context.setResourceBase(docroot);
context.addFilter(PushCacheFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST)); context.addFilter(PushCacheFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
// context.addFilter(PushSessionCacheFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST)); // context.addFilter(PushSessionCacheFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST));
context.addFilter(PushedTilesFilter.class,"/*",EnumSet.of(DispatcherType.REQUEST)); context.addFilter(PushedTilesFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
context.addServlet(new ServletHolder(servlet), "/test/*"); context.addServlet(new ServletHolder(servlet), "/test/*");
context.addServlet(DefaultServlet.class, "/").setInitParameter("maxCacheSize","81920"); context.addServlet(DefaultServlet.class, "/").setInitParameter("maxCacheSize", "81920");
server.setHandler(context); server.setHandler(context);
// HTTP Configuration // HTTP Configuration
HttpConfiguration http_config = new HttpConfiguration(); HttpConfiguration httpConfig = new HttpConfiguration();
http_config.setSecureScheme("https"); httpConfig.setSecureScheme("https");
http_config.setSecurePort(8443); httpConfig.setSecurePort(8443);
http_config.setSendXPoweredBy(true); httpConfig.setSendXPoweredBy(true);
http_config.setSendServerVersion(true); httpConfig.setSendServerVersion(true);
// HTTP Connector // HTTP Connector
ServerConnector http = new ServerConnector(server,new HttpConnectionFactory(http_config), new HTTP2CServerConnectionFactory(http_config)); ServerConnector http = new ServerConnector(server, new HttpConnectionFactory(httpConfig), new HTTP2CServerConnectionFactory(httpConfig));
http.setPort(8080); http.setPort(8080);
server.addConnector(http); server.addConnector(http);
// SSL Context Factory for HTTPS and HTTP/2 // SSL Context Factory for HTTPS and HTTP/2
String jetty_distro = System.getProperty("jetty.distro","../../jetty-distribution/target/distribution"); String jettyDistro = System.getProperty("jetty.distro", "../../jetty-distribution/target/distribution");
if (!new File(jetty_distro).exists()) if (!new File(jettyDistro).exists())
jetty_distro = "jetty-distribution/target/distribution"; jettyDistro = "jetty-distribution/target/distribution";
SslContextFactory sslContextFactory = new SslContextFactory(); SslContextFactory sslContextFactory = new SslContextFactory.Server();
sslContextFactory.setKeyStorePath(jetty_distro + "/demo-base/etc/keystore"); sslContextFactory.setKeyStorePath(jettyDistro + "/demo-base/etc/keystore");
sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g"); sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
sslContextFactory.setCipherComparator(HTTP2Cipher.COMPARATOR); sslContextFactory.setCipherComparator(HTTP2Cipher.COMPARATOR);
// sslContextFactory.setProvider("Conscrypt"); // sslContextFactory.setProvider("Conscrypt");
// HTTPS Configuration // HTTPS Configuration
HttpConfiguration https_config = new HttpConfiguration(http_config); HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig);
https_config.addCustomizer(new SecureRequestCustomizer()); httpsConfig.addCustomizer(new SecureRequestCustomizer());
// HTTP/2 Connection Factory // HTTP/2 Connection Factory
HTTP2ServerConnectionFactory h2 = new HTTP2ServerConnectionFactory(https_config); HTTP2ServerConnectionFactory h2 = new HTTP2ServerConnectionFactory(httpsConfig);
ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory(); ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory();
alpn.setDefaultProtocol(http.getDefaultProtocol()); alpn.setDefaultProtocol(http.getDefaultProtocol());
// SSL Connection Factory // SSL Connection Factory
SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory,alpn.getProtocol()); SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory, alpn.getProtocol());
// HTTP/2 Connector // HTTP/2 Connector
ServerConnector http2Connector = ServerConnector http2Connector =
new ServerConnector(server,ssl,alpn,h2,new HttpConnectionFactory(https_config)); new ServerConnector(server, ssl, alpn, h2, new HttpConnectionFactory(httpsConfig));
http2Connector.setPort(8443); http2Connector.setPort(8443);
server.addConnector(http2Connector); server.addConnector(http2Connector);
ALPN.debug=false; ALPN.debug = false;
server.start(); server.start();
server.join(); server.join();
@ -145,21 +141,21 @@ public class Http2Server
{ {
Request baseRequest = Request.getBaseRequest(request); Request baseRequest = Request.getBaseRequest(request);
if (baseRequest.isPush() && baseRequest.getRequestURI().contains("tiles") ) if (baseRequest.isPush() && baseRequest.getRequestURI().contains("tiles"))
{ {
String uri = baseRequest.getRequestURI().replace("tiles","pushed").substring(baseRequest.getContextPath().length()); String uri = baseRequest.getRequestURI().replace("tiles", "pushed").substring(baseRequest.getContextPath().length());
request.getRequestDispatcher(uri).forward(request,response); request.getRequestDispatcher(uri).forward(request, response);
return; return;
} }
chain.doFilter(request,response); chain.doFilter(request, response);
} }
@Override @Override
public void destroy() public void destroy()
{ {
} }
}; }
static Servlet servlet = new HttpServlet() static Servlet servlet = new HttpServlet()
{ {
@ -168,25 +164,27 @@ public class Http2Server
@Override @Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{ {
String code=request.getParameter("code"); String code = request.getParameter("code");
if (code!=null) if (code != null)
response.setStatus(Integer.parseInt(code)); response.setStatus(Integer.parseInt(code));
HttpSession session = request.getSession(true); HttpSession session = request.getSession(true);
if (session.isNew()) if (session.isNew())
response.addCookie(new Cookie("bigcookie", response.addCookie(new Cookie("bigcookie",
"This is a test cookies that was created on "+new Date()+" and is used by the jetty http/2 test servlet.")); "This is a test cookies that was created on " + new Date() + " and is used by the jetty http/2 test servlet."));
response.setHeader("Custom","Value"); response.setHeader("Custom", "Value");
response.setContentType("text/plain"); response.setContentType("text/plain");
String content = "Hello from Jetty using "+request.getProtocol() +"\n"; String content = "Hello from Jetty using " + request.getProtocol() + "\n";
content+="uri="+request.getRequestURI()+"\n"; content += "uri=" + request.getRequestURI() + "\n";
content+="session="+session.getId()+(session.isNew()?"(New)\n":"\n"); content += "session=" + session.getId() + (session.isNew() ? "(New)\n" : "\n");
content+="date="+new Date()+"\n"; content += "date=" + new Date() + "\n";
Cookie[] cookies = request.getCookies(); Cookie[] cookies = request.getCookies();
if (cookies!=null && cookies.length>0) if (cookies != null && cookies.length > 0)
for (Cookie c : cookies) for (Cookie c : cookies)
content+="cookie "+c.getName()+"="+c.getValue()+"\n"; {
content += "cookie " + c.getName() + "=" + c.getValue() + "\n";
}
response.setContentLength(content.length()); response.setContentLength(content.length());
response.getOutputStream().print(content); response.getOutputStream().print(content);

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -27,7 +27,8 @@ import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.servlet.ServletHolder;
import org.eclipse.jetty.util.resource.Resource; import org.eclipse.jetty.util.resource.Resource;
/** /**
*
*/ */
public class JarServer public class JarServer
{ {
@ -40,9 +41,9 @@ public class JarServer
Resource base = Resource.newResource("jar:file:src/main/resources/content.jar!/"); Resource base = Resource.newResource("jar:file:src/main/resources/content.jar!/");
context.setBaseResource(base); context.setBaseResource(base);
context.addServlet(new ServletHolder(new DefaultServlet()), "/"); context.addServlet(new ServletHolder(new DefaultServlet()), "/");
HandlerList handlers = new HandlerList(); HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] { context, new DefaultHandler() }); handlers.setHandlers(new Handler[]{context, new DefaultHandler()});
server.setHandler(handlers); server.setHandler(handlers);
server.start(); server.start();

View File

@ -0,0 +1,109 @@
//
// ========================================================================
// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.embedded;
import java.io.File;
import java.nio.file.Path;
import org.eclipse.jetty.util.StringUtil;
import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger;
/**
* A utility test class to locate a Jetty Distribution for testing purposes by searching:
* <ul>
* <li>The <code>jetty.home</code> system property</li>
* <li>The <code>JETTY_HOME</code> environment variable</li>
* <li>The working directory hierarchy with subdirectory <code>jetty-distribution/target/home</code></li>
* </ul>
*/
public class JettyDistribution
{
private static final Logger LOG = Log.getLogger(JettyDistribution.class);
public static final Path DISTRIBUTION;
static
{
Path distro = asJettyDistribution(System.getProperty("jetty.home"));
if (distro == null)
distro = asJettyDistribution(System.getenv().get("JETTY_HOME"));
if (distro == null)
{
try
{
Path working = new File(".").getAbsoluteFile().getCanonicalFile().toPath();
while (distro == null && working != null)
{
distro = asJettyDistribution(working.resolve("jetty-distribution/target/distribution").toString());
working = working.getParent();
}
}
catch (Throwable cause)
{
LOG.warn(cause);
}
}
DISTRIBUTION = distro;
}
private static Path asJettyDistribution(String test)
{
try
{
if (StringUtil.isBlank(test))
{
LOG.info("asJettyDistribution {} is blank", test);
return null;
}
File dir = new File(test);
if (!dir.exists() || !dir.isDirectory())
{
LOG.info("asJettyDistribution {} is not a directory", test);
return null;
}
File demoBase = new File(dir, "demo-base");
if (!demoBase.exists() || !demoBase.isDirectory())
{
LOG.info("asJettyDistribution {} has no demo-base", test);
return null;
}
LOG.info("asJettyDistribution {}", dir);
return dir.getAbsoluteFile().getCanonicalFile().toPath();
}
catch (Exception e)
{
LOG.ignore(e);
}
return null;
}
public static Path resolve(String path)
{
return DISTRIBUTION.resolve(path);
}
public static void main(String... arg)
{
System.err.println("Jetty Distribution is " + DISTRIBUTION);
}
}

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -19,7 +19,6 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import org.eclipse.jetty.deploy.DeploymentManager; import org.eclipse.jetty.deploy.DeploymentManager;
@ -28,14 +27,17 @@ import org.eclipse.jetty.deploy.bindings.DebugListenerBinding;
import org.eclipse.jetty.deploy.providers.WebAppProvider; import org.eclipse.jetty.deploy.providers.WebAppProvider;
import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.jmx.MBeanContainer; import org.eclipse.jetty.jmx.MBeanContainer;
import org.eclipse.jetty.rewrite.handler.MsieSslRule;
import org.eclipse.jetty.rewrite.handler.RewriteHandler; import org.eclipse.jetty.rewrite.handler.RewriteHandler;
import org.eclipse.jetty.rewrite.handler.ValidUrlRule;
import org.eclipse.jetty.security.HashLoginService; import org.eclipse.jetty.security.HashLoginService;
import org.eclipse.jetty.server.AsyncRequestLogWriter;
import org.eclipse.jetty.server.CustomRequestLog;
import org.eclipse.jetty.server.DebugListener; import org.eclipse.jetty.server.DebugListener;
import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.LowResourceMonitor; import org.eclipse.jetty.server.LowResourceMonitor;
import org.eclipse.jetty.server.NCSARequestLog;
import org.eclipse.jetty.server.SecureRequestCustomizer; import org.eclipse.jetty.server.SecureRequestCustomizer;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnectionStatistics; import org.eclipse.jetty.server.ServerConnectionStatistics;
@ -44,7 +46,6 @@ import org.eclipse.jetty.server.SslConnectionFactory;
import org.eclipse.jetty.server.handler.ContextHandlerCollection; import org.eclipse.jetty.server.handler.ContextHandlerCollection;
import org.eclipse.jetty.server.handler.DefaultHandler; import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerCollection; import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.server.handler.RequestLogHandler;
import org.eclipse.jetty.server.handler.StatisticsHandler; import org.eclipse.jetty.server.handler.StatisticsHandler;
import org.eclipse.jetty.util.ssl.SslContextFactory; import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.util.thread.QueuedThreadPool; import org.eclipse.jetty.util.thread.QueuedThreadPool;
@ -57,37 +58,23 @@ import org.eclipse.jetty.webapp.Configuration;
*/ */
public class LikeJettyXml public class LikeJettyXml
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
// Path to as-built jetty-distribution directory // Path to as-built jetty-distribution directory
String jettyHomeBuild = "../../jetty-distribution/target/distribution"; String jettyHomeBuild = JettyDistribution.DISTRIBUTION.toString();
// Find jetty home and base directories // Find jetty home and base directories
String homePath = System.getProperty("jetty.home", jettyHomeBuild); String homePath = System.getProperty("jetty.home", jettyHomeBuild);
File start_jar = new File(homePath,"start.jar");
if (!start_jar.exists())
{
homePath = jettyHomeBuild = "jetty-distribution/target/distribution";
start_jar = new File(homePath,"start.jar");
if (!start_jar.exists())
throw new FileNotFoundException(start_jar.toString());
}
File homeDir = new File(homePath); File homeDir = new File(homePath);
String basePath = System.getProperty("jetty.base", homeDir + "/demo-base"); String basePath = System.getProperty("jetty.base", homeDir + "/demo-base");
File baseDir = new File(basePath); File baseDir = new File(basePath);
if(!baseDir.exists())
{
throw new FileNotFoundException(baseDir.getAbsolutePath());
}
// Configure jetty.home and jetty.base system properties
String jetty_home = homeDir.getAbsolutePath();
String jetty_base = baseDir.getAbsolutePath();
System.setProperty("jetty.home", jetty_home);
System.setProperty("jetty.base", jetty_base);
// Configure jetty.home and jetty.base system properties
String jettyHome = homeDir.getAbsolutePath();
String jettyBase = baseDir.getAbsolutePath();
System.setProperty("jetty.home", jettyHome);
System.setProperty("jetty.base", jettyBase);
// === jetty.xml === // === jetty.xml ===
// Setup Threadpool // Setup Threadpool
@ -98,101 +85,98 @@ public class LikeJettyXml
Server server = new Server(threadPool); Server server = new Server(threadPool);
// Scheduler // Scheduler
server.addBean(new ScheduledExecutorScheduler()); server.addBean(new ScheduledExecutorScheduler(null, false));
// HTTP Configuration // HTTP Configuration
HttpConfiguration http_config = new HttpConfiguration(); HttpConfiguration httpConfig = new HttpConfiguration();
http_config.setSecureScheme("https"); httpConfig.setSecureScheme("https");
http_config.setSecurePort(8443); httpConfig.setSecurePort(8443);
http_config.setOutputBufferSize(32768); httpConfig.setOutputBufferSize(32768);
http_config.setRequestHeaderSize(8192); httpConfig.setRequestHeaderSize(8192);
http_config.setResponseHeaderSize(8192); httpConfig.setResponseHeaderSize(8192);
http_config.setSendServerVersion(true); httpConfig.setSendServerVersion(true);
http_config.setSendDateHeader(false); httpConfig.setSendDateHeader(false);
// httpConfig.addCustomizer(new ForwardedRequestCustomizer()); // httpConfig.addCustomizer(new ForwardedRequestCustomizer());
// Handler Structure // Handler Structure
HandlerCollection handlers = new HandlerCollection(); HandlerCollection handlers = new HandlerCollection();
ContextHandlerCollection contexts = new ContextHandlerCollection(); ContextHandlerCollection contexts = new ContextHandlerCollection();
handlers.setHandlers(new Handler[] { contexts, new DefaultHandler() }); handlers.setHandlers(new Handler[]{contexts, new DefaultHandler()});
server.setHandler(handlers); server.setHandler(handlers);
// Extra options // Extra options
server.setDumpAfterStart(false); server.setDumpAfterStart(true);
server.setDumpBeforeStop(false); server.setDumpBeforeStop(false);
server.setStopAtShutdown(true); server.setStopAtShutdown(true);
// === jetty-jmx.xml === // === jetty-jmx.xml ===
MBeanContainer mbContainer = new MBeanContainer( MBeanContainer mbContainer = new MBeanContainer(
ManagementFactory.getPlatformMBeanServer()); ManagementFactory.getPlatformMBeanServer());
server.addBean(mbContainer); server.addBean(mbContainer);
// === jetty-http.xml === // === jetty-http.xml ===
ServerConnector http = new ServerConnector(server, ServerConnector http = new ServerConnector(server,
new HttpConnectionFactory(http_config)); new HttpConnectionFactory(httpConfig));
http.setPort(8080); http.setPort(8080);
http.setIdleTimeout(30000); http.setIdleTimeout(30000);
server.addConnector(http); server.addConnector(http);
// === jetty-https.xml === // === jetty-https.xml ===
// SSL Context Factory // SSL Context Factory
SslContextFactory sslContextFactory = new SslContextFactory(); SslContextFactory sslContextFactory = new SslContextFactory.Server();
sslContextFactory.setKeyStorePath(jetty_home + "/../../../jetty-server/src/test/config/etc/keystore"); sslContextFactory.setKeyStorePath(jettyHome + "/../../../jetty-server/src/test/config/etc/keystore");
sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g"); sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
sslContextFactory.setTrustStorePath(jetty_home + "/../../../jetty-server/src/test/config/etc/keystore"); sslContextFactory.setTrustStorePath(jettyHome + "/../../../jetty-server/src/test/config/etc/keystore");
sslContextFactory.setTrustStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setTrustStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslContextFactory.setExcludeCipherSuites("SSL_RSA_WITH_DES_CBC_SHA", sslContextFactory.setExcludeCipherSuites("SSL_RSA_WITH_DES_CBC_SHA",
"SSL_DHE_RSA_WITH_DES_CBC_SHA", "SSL_DHE_DSS_WITH_DES_CBC_SHA", "SSL_DHE_RSA_WITH_DES_CBC_SHA", "SSL_DHE_DSS_WITH_DES_CBC_SHA",
"SSL_RSA_EXPORT_WITH_RC4_40_MD5", "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
"SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
"SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
"SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"); "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA");
// SSL HTTP Configuration // SSL HTTP Configuration
HttpConfiguration https_config = new HttpConfiguration(http_config); HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig);
https_config.addCustomizer(new SecureRequestCustomizer()); httpsConfig.addCustomizer(new SecureRequestCustomizer());
// SSL Connector // SSL Connector
ServerConnector sslConnector = new ServerConnector(server, ServerConnector sslConnector = new ServerConnector(server,
new SslConnectionFactory(sslContextFactory,HttpVersion.HTTP_1_1.asString()), new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
new HttpConnectionFactory(https_config)); new HttpConnectionFactory(httpsConfig));
sslConnector.setPort(8443); sslConnector.setPort(8443);
server.addConnector(sslConnector); server.addConnector(sslConnector);
// === jetty-deploy.xml === // === jetty-deploy.xml ===
DeploymentManager deployer = new DeploymentManager(); DeploymentManager deployer = new DeploymentManager();
DebugListener debug = new DebugListener(System.err,true,true,true); DebugListener debug = new DebugListener(System.err, true, true, true);
server.addBean(debug); server.addBean(debug);
deployer.addLifeCycleBinding(new DebugListenerBinding(debug)); deployer.addLifeCycleBinding(new DebugListenerBinding(debug));
deployer.setContexts(contexts); deployer.setContexts(contexts);
deployer.setContextAttribute( deployer.setContextAttribute(
"org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", "org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
".*/[^/]*servlet-api-[^/]*\\.jar$|.*/javax.servlet.jsp.jstl-.*\\.jar$|.*/[^/]*taglibs.*\\.jar$"); ".*/[^/]*servlet-api-[^/]*\\.jar$|.*/javax.servlet.jsp.jstl-.*\\.jar$|.*/[^/]*taglibs.*\\.jar$");
WebAppProvider webapp_provider = new WebAppProvider(); WebAppProvider webAppProvider = new WebAppProvider();
webapp_provider.setMonitoredDirName(jetty_base + "/webapps"); webAppProvider.setMonitoredDirName(jettyBase + "/webapps");
webapp_provider.setDefaultsDescriptor(jetty_home + "/etc/webdefault.xml"); webAppProvider.setDefaultsDescriptor(jettyHome + "/etc/webdefault.xml");
webapp_provider.setScanInterval(1); webAppProvider.setScanInterval(1);
webapp_provider.setExtractWars(true); webAppProvider.setExtractWars(true);
webapp_provider.setConfigurationManager(new PropertiesConfigurationManager()); webAppProvider.setConfigurationManager(new PropertiesConfigurationManager());
deployer.addAppProvider(webapp_provider); deployer.addAppProvider(webAppProvider);
server.addBean(deployer); server.addBean(deployer);
// === setup jetty plus == // === setup jetty plus ==
Configuration.ClassList classlist = Configuration.ClassList Configuration.ClassList classlist = Configuration.ClassList
.setServerDefault( server ); .setServerDefault(server);
classlist.addAfter( classlist.addAfter(
"org.eclipse.jetty.webapp.FragmentConfiguration", "org.eclipse.jetty.webapp.FragmentConfiguration",
"org.eclipse.jetty.plus.webapp.EnvConfiguration", "org.eclipse.jetty.plus.webapp.EnvConfiguration",
"org.eclipse.jetty.plus.webapp.PlusConfiguration"); "org.eclipse.jetty.plus.webapp.PlusConfiguration");
classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration", classlist.addBefore("org.eclipse.jetty.webapp.JettyWebXmlConfiguration",
"org.eclipse.jetty.annotations.AnnotationConfiguration"); "org.eclipse.jetty.annotations.AnnotationConfiguration");
// === jetty-stats.xml === // === jetty-stats.xml ===
StatisticsHandler stats = new StatisticsHandler(); StatisticsHandler stats = new StatisticsHandler();
@ -204,39 +188,33 @@ public class LikeJettyXml
RewriteHandler rewrite = new RewriteHandler(); RewriteHandler rewrite = new RewriteHandler();
rewrite.setHandler(server.getHandler()); rewrite.setHandler(server.getHandler());
server.setHandler(rewrite); server.setHandler(rewrite);
rewrite.addRule(new MsieSslRule());
rewrite.addRule(new ValidUrlRule());
// === jetty-requestlog.xml === // === jetty-requestlog.xml ===
NCSARequestLog requestLog = new NCSARequestLog(); AsyncRequestLogWriter logWriter = new AsyncRequestLogWriter(jettyHome + "/logs/yyyy_mm_dd.request.log");
requestLog.setFilename(jetty_home + "/logs/yyyy_mm_dd.request.log"); CustomRequestLog requestLog = new CustomRequestLog(logWriter, CustomRequestLog.EXTENDED_NCSA_FORMAT + " \"%C\"");
requestLog.setFilenameDateFormat("yyyy_MM_dd"); logWriter.setFilenameDateFormat("yyyy_MM_dd");
requestLog.setRetainDays(90); logWriter.setRetainDays(90);
requestLog.setAppend(true); logWriter.setTimeZone("GMT");
requestLog.setExtended(true); server.setRequestLog(requestLog);
requestLog.setLogCookies(false);
requestLog.setLogTimeZone("GMT");
RequestLogHandler requestLogHandler = new RequestLogHandler();
requestLogHandler.setRequestLog(requestLog);
handlers.addHandler(requestLogHandler);
// === jetty-lowresources.xml === // === jetty-lowresources.xml ===
LowResourceMonitor lowResourcesMonitor=new LowResourceMonitor(server); LowResourceMonitor lowResourcesMonitor = new LowResourceMonitor(server);
lowResourcesMonitor.setPeriod(1000); lowResourcesMonitor.setPeriod(1000);
lowResourcesMonitor.setLowResourcesIdleTimeout(200); lowResourcesMonitor.setLowResourcesIdleTimeout(200);
lowResourcesMonitor.setMonitorThreads(true); lowResourcesMonitor.setMonitorThreads(true);
lowResourcesMonitor.setMaxConnections(0);
lowResourcesMonitor.setMaxMemory(0); lowResourcesMonitor.setMaxMemory(0);
lowResourcesMonitor.setMaxLowResourcesTime(5000); lowResourcesMonitor.setMaxLowResourcesTime(5000);
server.addBean(lowResourcesMonitor); server.addBean(lowResourcesMonitor);
// === test-realm.xml === // === test-realm.xml ===
HashLoginService login = new HashLoginService(); HashLoginService login = new HashLoginService();
login.setName("Test Realm"); login.setName("Test Realm");
login.setConfig(jetty_base + "/etc/realm.properties"); login.setConfig(jettyBase + "/etc/realm.properties");
login.setHotReload(false); login.setHotReload(false);
server.addBean(login); server.addBean(login);
// Start the server // Start the server
server.start(); server.start();
server.join(); server.join();

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -20,9 +20,7 @@ package org.eclipse.jetty.embedded;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.security.Security;
import org.conscrypt.OpenSSLProvider;
import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConfiguration;
@ -38,8 +36,8 @@ import org.eclipse.jetty.util.ssl.SslContextFactory;
*/ */
public class ManyConnectors public class ManyConnectors
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
// Since this example shows off SSL configuration, we need a keystore // Since this example shows off SSL configuration, we need a keystore
// with the appropriate key. These lookup of jetty.home is purely a hack // with the appropriate key. These lookup of jetty.home is purely a hack
// to get access to a keystore that we use in many unit tests and should // to get access to a keystore that we use in many unit tests and should
@ -67,10 +65,10 @@ public class ManyConnectors
// <code>http</code> of course, as the default for secured http is // <code>http</code> of course, as the default for secured http is
// <code>https</code> but we show setting the scheme to show it can be // <code>https</code> but we show setting the scheme to show it can be
// done. The port for secured communication is also set here. // done. The port for secured communication is also set here.
HttpConfiguration http_config = new HttpConfiguration(); HttpConfiguration httpConfig = new HttpConfiguration();
http_config.setSecureScheme("https"); httpConfig.setSecureScheme("https");
http_config.setSecurePort(8443); httpConfig.setSecurePort(8443);
http_config.setOutputBufferSize(32768); httpConfig.setOutputBufferSize(32768);
// HTTP connector // HTTP connector
// The first server connector we create is the one for http, passing in // The first server connector we create is the one for http, passing in
@ -78,7 +76,7 @@ public class ManyConnectors
// the output buffer size, etc. We also set the port (8080) and // the output buffer size, etc. We also set the port (8080) and
// configure an idle timeout. // configure an idle timeout.
ServerConnector http = new ServerConnector(server, ServerConnector http = new ServerConnector(server,
new HttpConnectionFactory(http_config)); new HttpConnectionFactory(httpConfig));
http.setPort(8080); http.setPort(8080);
http.setIdleTimeout(30000); http.setIdleTimeout(30000);
@ -88,8 +86,8 @@ public class ManyConnectors
// to know about. Much more configuration is available the ssl context, // to know about. Much more configuration is available the ssl context,
// including things like choosing the particular certificate out of a // including things like choosing the particular certificate out of a
// keystore to be used. // keystore to be used.
SslContextFactory sslContextFactory = new SslContextFactory(); SslContextFactory sslContextFactory = new SslContextFactory.Server();
sslContextFactory.setKeyStorePath(keystoreFile.getAbsolutePath()); sslContextFactory.setKeyStorePath(keystoreFile.getAbsolutePath());
sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g"); sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
@ -107,19 +105,19 @@ public class ManyConnectors
// SecureRequestCustomizer which is how a new connector is able to // SecureRequestCustomizer which is how a new connector is able to
// resolve the https connection before handing control over to the Jetty // resolve the https connection before handing control over to the Jetty
// Server. // Server.
HttpConfiguration https_config = new HttpConfiguration(http_config); HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig);
SecureRequestCustomizer src = new SecureRequestCustomizer(); SecureRequestCustomizer src = new SecureRequestCustomizer();
src.setStsMaxAge(2000); src.setStsMaxAge(2000);
src.setStsIncludeSubDomains(true); src.setStsIncludeSubDomains(true);
https_config.addCustomizer(src); httpsConfig.addCustomizer(src);
// HTTPS connector // HTTPS connector
// We create a second ServerConnector, passing in the http configuration // We create a second ServerConnector, passing in the http configuration
// we just made along with the previously created ssl context factory. // we just made along with the previously created ssl context factory.
// Next we set the port and a longer idle timeout. // Next we set the port and a longer idle timeout.
ServerConnector https = new ServerConnector(server, ServerConnector https = new ServerConnector(server,
new SslConnectionFactory(sslContextFactory,HttpVersion.HTTP_1_1.asString()), new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()),
new HttpConnectionFactory(https_config)); new HttpConnectionFactory(httpsConfig));
https.setPort(8443); https.setPort(8443);
https.setIdleTimeout(500000); https.setIdleTimeout(500000);
@ -130,14 +128,14 @@ public class ManyConnectors
// has something to pass requests off to. // has something to pass requests off to.
// Set the connectors // Set the connectors
server.setConnectors(new Connector[] { http, https }); server.setConnectors(new Connector[]{http, https});
// Set a handler // Set a handler
server.setHandler(new HelloHandler()); server.setHandler(new HelloHandler());
// Start the server // Start the server
server.start(); server.start();
server.dumpStdErr();
server.join(); server.join();
} }
} }

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -25,7 +25,7 @@ import org.eclipse.jetty.server.handler.ContextHandlerCollection;
public class ManyContexts public class ManyContexts
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
Server server = new Server(8080); Server server = new Server(8080);
@ -40,16 +40,19 @@ public class ManyContexts
contextIT.setHandler(new HelloHandler("Bongiorno")); contextIT.setHandler(new HelloHandler("Bongiorno"));
ContextHandler contextV = new ContextHandler("/"); ContextHandler contextV = new ContextHandler("/");
contextV.setVirtualHosts(new String[] { "127.0.0.2" }); contextV.setVirtualHosts(new String[]{"127.0.0.2"});
contextV.setHandler(new HelloHandler("Virtual Hello")); contextV.setHandler(new HelloHandler("Virtual Hello"));
ContextHandlerCollection contexts = new ContextHandlerCollection(); ContextHandlerCollection contexts = new ContextHandlerCollection();
contexts.setHandlers(new Handler[] { context, contextFR, contextIT, contexts.setHandlers(new Handler[]{
contextV }); context, contextFR, contextIT,
contextV
});
server.setHandler(contexts); server.setHandler(contexts);
server.start(); server.start();
server.dumpStdErr();
server.join(); server.join();
} }
} }

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -21,13 +21,12 @@ package org.eclipse.jetty.embedded;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.Map; import java.util.Map;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.CustomRequestLog;
import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.NCSARequestLog;
import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.AbstractHandler; import org.eclipse.jetty.server.handler.AbstractHandler;
@ -35,7 +34,6 @@ import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerCollection; import org.eclipse.jetty.server.handler.HandlerCollection;
import org.eclipse.jetty.server.handler.HandlerList; import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.HandlerWrapper; import org.eclipse.jetty.server.handler.HandlerWrapper;
import org.eclipse.jetty.server.handler.RequestLogHandler;
import org.eclipse.jetty.server.handler.gzip.GzipHandler; import org.eclipse.jetty.server.handler.gzip.GzipHandler;
import org.eclipse.jetty.util.ajax.JSON; import org.eclipse.jetty.util.ajax.JSON;
@ -73,14 +71,14 @@ public class ManyHandlers
public static class ParamHandler extends AbstractHandler public static class ParamHandler extends AbstractHandler
{ {
@Override @Override
public void handle( String target, public void handle(String target,
Request baseRequest, Request baseRequest,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response ) throws IOException, HttpServletResponse response) throws IOException,
ServletException ServletException
{ {
Map<String, String[]> params = request.getParameterMap(); Map<String, String[]> params = request.getParameterMap();
if (params.size() > 0) if (!params.isEmpty())
{ {
response.setContentType("text/plain"); response.setContentType("text/plain");
response.getWriter().println(JSON.toString(params)); response.getWriter().println(JSON.toString(params));
@ -95,18 +93,18 @@ public class ManyHandlers
public static class WelcomeWrapHandler extends HandlerWrapper public static class WelcomeWrapHandler extends HandlerWrapper
{ {
@Override @Override
public void handle( String target, public void handle(String target,
Request baseRequest, Request baseRequest,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response ) throws IOException, HttpServletResponse response) throws IOException,
ServletException ServletException
{ {
request.setAttribute("welcome", "Hello"); request.setAttribute("welcome", "Hello");
super.handle(target, baseRequest, request, response); super.handle(target, baseRequest, request, response);
} }
} }
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
Server server = new Server(8080); Server server = new Server(8080);
@ -115,13 +113,11 @@ public class ManyHandlers
HandlerWrapper wrapper = new WelcomeWrapHandler(); HandlerWrapper wrapper = new WelcomeWrapHandler();
Handler hello = new HelloHandler(); Handler hello = new HelloHandler();
Handler dft = new DefaultHandler(); Handler dft = new DefaultHandler();
RequestLogHandler requestLog = new RequestLogHandler();
// configure request logging // configure request logging
File requestLogFile = File.createTempFile("demo", "log"); File requestLogFile = File.createTempFile("demo", "log");
NCSARequestLog ncsaLog = new NCSARequestLog( CustomRequestLog ncsaLog = new CustomRequestLog(requestLogFile.getAbsolutePath());
requestLogFile.getAbsolutePath()); server.setRequestLog(ncsaLog);
requestLog.setRequestLog(ncsaLog);
// create the handler collections // create the handler collections
HandlerCollection handlers = new HandlerCollection(); HandlerCollection handlers = new HandlerCollection();
@ -129,20 +125,8 @@ public class ManyHandlers
// link them all together // link them all together
wrapper.setHandler(hello); wrapper.setHandler(hello);
list.setHandlers(new Handler[] { param, new GzipHandler(), dft }); list.setHandlers(new Handler[]{param, new GzipHandler()});
handlers.setHandlers(new Handler[] { list, requestLog }); handlers.setHandlers(new Handler[]{list, dft});
// Handler tree looks like the following
// <pre>
// Server
// + HandlerCollection
// . + HandlerList
// . | + param (ParamHandler)
// . | + wrapper (WelcomeWrapHandler)
// . | | \ hello (HelloHandler)
// . | \ dft (DefaultHandler)
// . \ requestLog (RequestLogHandler)
// </pre>
server.setHandler(handlers); server.setHandler(handlers);

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -29,13 +29,13 @@ import org.eclipse.jetty.servlet.ServletHolder;
public class ManyServletContexts public class ManyServletContexts
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
Server server = new Server(8080); Server server = new Server(8080);
// Setup JMX // Setup JMX
MBeanContainer mbContainer = new MBeanContainer( MBeanContainer mbContainer = new MBeanContainer(
ManagementFactory.getPlatformMBeanServer()); ManagementFactory.getPlatformMBeanServer());
server.addBean(mbContainer, true); server.addBean(mbContainer, true);
// Declare server handler collection // Declare server handler collection
@ -44,7 +44,7 @@ public class ManyServletContexts
// Configure context "/" (root) for servlets // Configure context "/" (root) for servlets
ServletContextHandler root = new ServletContextHandler(contexts, "/", ServletContextHandler root = new ServletContextHandler(contexts, "/",
ServletContextHandler.SESSIONS); ServletContextHandler.SESSIONS);
// Add servlets to root context // Add servlets to root context
root.addServlet(new ServletHolder(new HelloServlet("Hello")), "/"); root.addServlet(new ServletHolder(new HelloServlet("Hello")), "/");
root.addServlet(new ServletHolder(new HelloServlet("Ciao")), "/it/*"); root.addServlet(new ServletHolder(new HelloServlet("Ciao")), "/it/*");
@ -52,7 +52,7 @@ public class ManyServletContexts
// Configure context "/other" for servlets // Configure context "/other" for servlets
ServletContextHandler other = new ServletContextHandler(contexts, ServletContextHandler other = new ServletContextHandler(contexts,
"/other", ServletContextHandler.SESSIONS); "/other", ServletContextHandler.SESSIONS);
// Add servlets to /other context // Add servlets to /other context
other.addServlet(DefaultServlet.class.getCanonicalName(), "/"); other.addServlet(DefaultServlet.class.getCanonicalName(), "/");
other.addServlet(new ServletHolder(new HelloServlet("YO!")), "*.yo"); other.addServlet(new ServletHolder(new HelloServlet("YO!")), "*.yo");

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -19,7 +19,6 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.IOException; import java.io.IOException;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -30,7 +29,7 @@ import org.eclipse.jetty.servlet.ServletHandler;
public class MinimalServlets public class MinimalServlets
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
// Create a basic jetty server object that will listen on port 8080. // Create a basic jetty server object that will listen on port 8080.
// Note that if you set this to port 0 then a randomly available port // Note that if you set this to port 0 then a randomly available port
@ -66,9 +65,9 @@ public class MinimalServlets
public static class HelloServlet extends HttpServlet public static class HelloServlet extends HttpServlet
{ {
@Override @Override
protected void doGet( HttpServletRequest request, protected void doGet(HttpServletRequest request,
HttpServletResponse response ) throws ServletException, HttpServletResponse response) throws ServletException,
IOException IOException
{ {
response.setContentType("text/html"); response.setContentType("text/html");
response.setStatus(HttpServletResponse.SC_OK); response.setStatus(HttpServletResponse.SC_OK);

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -26,7 +26,7 @@ import org.eclipse.jetty.server.ServerConnector;
*/ */
public class OneConnector public class OneConnector
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
// The Server // The Server
Server server = new Server(); Server server = new Server();

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -23,18 +23,18 @@ import org.eclipse.jetty.server.handler.ContextHandler;
public class OneContext public class OneContext
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
Server server = new Server( 8080 ); Server server = new Server(8080);
// Add a single handler on context "/hello" // Add a single handler on context "/hello"
ContextHandler context = new ContextHandler(); ContextHandler context = new ContextHandler();
context.setContextPath( "/hello" ); context.setContextPath("/hello");
context.setHandler( new HelloHandler() ); context.setHandler(new HelloHandler());
// Can be accessed using http://localhost:8080/hello // Can be accessed using http://localhost:8080/hello
server.setHandler( context ); server.setHandler(context);
// Start the server // Start the server
server.start(); server.start();

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -22,7 +22,7 @@ import org.eclipse.jetty.server.Server;
public class OneHandler public class OneHandler
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
Server server = new Server(8080); Server server = new Server(8080);
server.setHandler(new HelloHandler()); server.setHandler(new HelloHandler());

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -18,28 +18,102 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.io.IOException;
import java.util.EnumSet;
import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.ServletResponse;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.DefaultServlet;
import org.eclipse.jetty.servlet.ListenerHolder;
import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletContextHandler;
public class OneServletContext public class OneServletContext
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
Server server = new Server(8080); Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler( ServletContextHandler context = new ServletContextHandler(
ServletContextHandler.SESSIONS); ServletContextHandler.SESSIONS);
context.setContextPath("/"); context.setContextPath("/");
context.setResourceBase(System.getProperty("java.io.tmpdir")); context.setResourceBase(System.getProperty("java.io.tmpdir"));
server.setHandler(context); server.setHandler(context);
// Add dump servlet // Add dump servlet
context.addServlet(DumpServlet.class, "/dump/*"); context.addServlet(
// Add default servlet context.addServlet(DumpServlet.class, "/dump/*"),
"*.dump");
context.addServlet(HelloServlet.class, "/hello/*");
context.addServlet(DefaultServlet.class, "/"); context.addServlet(DefaultServlet.class, "/");
context.addFilter(TestFilter.class, "/*", EnumSet.of(DispatcherType.REQUEST));
context.addFilter(TestFilter.class, "/test", EnumSet.of(DispatcherType.REQUEST, DispatcherType.ASYNC));
context.addFilter(TestFilter.class, "*.test", EnumSet.of(DispatcherType.REQUEST, DispatcherType.INCLUDE, DispatcherType.FORWARD));
context.getServletHandler().addListener(new ListenerHolder(InitListener.class));
context.getServletHandler().addListener(new ListenerHolder(RequestListener.class));
server.start(); server.start();
server.dumpStdErr();
server.join(); server.join();
} }
public static class TestFilter implements Filter
{
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
chain.doFilter(request, response);
}
@Override
public void destroy()
{
}
}
public static class InitListener implements ServletContextListener
{
@Override
public void contextInitialized(ServletContextEvent sce)
{
}
@Override
public void contextDestroyed(ServletContextEvent sce)
{
}
}
public static class RequestListener implements ServletRequestListener
{
@Override
public void requestDestroyed(ServletRequestEvent sre)
{
}
@Override
public void requestInitialized(ServletRequestEvent sre)
{
}
}
} }

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -28,15 +28,15 @@ import org.eclipse.jetty.servlet.ServletContextHandler;
public class OneServletContextJmxStats public class OneServletContextJmxStats
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
Server server = new Server(8080); Server server = new Server(8080);
// Add JMX tracking to Server // Add JMX tracking to Server
server.addBean(new MBeanContainer(ManagementFactory server.addBean(new MBeanContainer(ManagementFactory
.getPlatformMBeanServer())); .getPlatformMBeanServer()));
ServletContextHandler context = new ServletContextHandler( ServletContextHandler context = new ServletContextHandler(
ServletContextHandler.SESSIONS); ServletContextHandler.SESSIONS);
context.setContextPath("/"); context.setContextPath("/");
server.setHandler(context); server.setHandler(context);

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -25,7 +25,6 @@ import org.eclipse.jetty.server.session.SessionCache;
import org.eclipse.jetty.server.session.SessionHandler; import org.eclipse.jetty.server.session.SessionHandler;
import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletContextHandler;
public class OneServletContextWithSession public class OneServletContextWithSession
{ {
public static void main(String[] args) throws Exception public static void main(String[] args) throws Exception
@ -34,14 +33,14 @@ public class OneServletContextWithSession
// Create a ServletContext, with a session handler enabled. // Create a ServletContext, with a session handler enabled.
ServletContextHandler context = new ServletContextHandler( ServletContextHandler context = new ServletContextHandler(
ServletContextHandler.SESSIONS); ServletContextHandler.SESSIONS);
context.setContextPath("/"); context.setContextPath("/");
context.setResourceBase(System.getProperty("java.io.tmpdir")); context.setResourceBase(System.getProperty("java.io.tmpdir"));
server.setHandler(context); server.setHandler(context);
// Access the SessionHandler from the context. // Access the SessionHandler from the context.
SessionHandler sessions = context.getSessionHandler(); SessionHandler sessions = context.getSessionHandler();
// Explicitly set Session Cache and null Datastore. // Explicitly set Session Cache and null Datastore.
// This is normally done by default, // This is normally done by default,
// but is done explicitly here for demonstration. // but is done explicitly here for demonstration.
@ -58,6 +57,7 @@ public class OneServletContextWithSession
context.addServlet(HelloSessionServlet.class, "/"); context.addServlet(HelloSessionServlet.class, "/");
server.start(); server.start();
server.dumpStdErr();
server.join(); server.join();
} }
} }

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -23,12 +23,11 @@ import java.lang.management.ManagementFactory;
import org.eclipse.jetty.jmx.MBeanContainer; import org.eclipse.jetty.jmx.MBeanContainer;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.AllowSymLinkAliasChecker;
import org.eclipse.jetty.webapp.WebAppContext; import org.eclipse.jetty.webapp.WebAppContext;
public class OneWebApp public class OneWebApp
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
// Create a basic jetty server object that will listen on port 8080. // Create a basic jetty server object that will listen on port 8080.
// Note that if you set this to port 0 then a randomly available port // Note that if you set this to port 0 then a randomly available port
@ -38,7 +37,7 @@ public class OneWebApp
// Setup JMX // Setup JMX
MBeanContainer mbContainer = new MBeanContainer( MBeanContainer mbContainer = new MBeanContainer(
ManagementFactory.getPlatformMBeanServer()); ManagementFactory.getPlatformMBeanServer());
server.addBean(mbContainer); server.addBean(mbContainer);
// The WebAppContext is the entity that controls the environment in // The WebAppContext is the entity that controls the environment in
@ -50,19 +49,18 @@ public class OneWebApp
// PlusConfiguration) to choosing where the webapp will unpack itself. // PlusConfiguration) to choosing where the webapp will unpack itself.
WebAppContext webapp = new WebAppContext(); WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/"); webapp.setContextPath("/");
File warFile = new File( File warFile = JettyDistribution.resolve("demo-base/webapps/async-rest.war").toFile();
"../../tests/test-jmx/jmx-webapp/target/jmx-webapp");
webapp.setWar(warFile.getAbsolutePath()); webapp.setWar(warFile.getAbsolutePath());
// A WebAppContext is a ContextHandler as well so it needs to be set to // A WebAppContext is a ContextHandler as well so it needs to be set to
// the server so it is aware of where to send the appropriate requests. // the server so it is aware of where to send the appropriate requests.
server.setHandler(webapp); server.setHandler(webapp);
// Start things up! // Start things up!
server.start(); server.start();
server.dumpStdErr(); server.dumpStdErr();
// The use of server.join() the will make the current thread join and // The use of server.join() the will make the current thread join and
// wait until the server is done executing. // wait until the server is done executing.
// See http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join() // See http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -29,19 +29,19 @@ import org.eclipse.jetty.webapp.WebAppContext;
public class OneWebAppWithJsp public class OneWebAppWithJsp
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
// Create a basic jetty server object that will listen on port 8080. // Create a basic jetty server object that will listen on port 8080.
// Note that if you set this to port 0 then // Note that if you set this to port 0 then
// a randomly available port will be assigned that you can either look // a randomly available port will be assigned that you can either look
// in the logs for the port, // in the logs for the port,
// or programmatically obtain it for use in test cases. // or programmatically obtain it for use in test cases.
Server server = new Server( 8080 ); Server server = new Server(8080);
// Setup JMX // Setup JMX
MBeanContainer mbContainer = new MBeanContainer( MBeanContainer mbContainer = new MBeanContainer(
ManagementFactory.getPlatformMBeanServer() ); ManagementFactory.getPlatformMBeanServer());
server.addBean( mbContainer ); server.addBean(mbContainer);
// The WebAppContext is the entity that controls the environment in // The WebAppContext is the entity that controls the environment in
// which a web application lives and // which a web application lives and
@ -53,38 +53,37 @@ public class OneWebAppWithJsp
// the webapp (through // the webapp (through
// PlusConfiguration) to choosing where the webapp will unpack itself. // PlusConfiguration) to choosing where the webapp will unpack itself.
WebAppContext webapp = new WebAppContext(); WebAppContext webapp = new WebAppContext();
webapp.setContextPath( "/" ); webapp.setContextPath("/");
File warFile = new File( File warFile = new File(
"../../jetty-distribution/target/distribution/demo-base/webapps/test.war" ); "jetty-distribution/target/distribution/demo-base/webapps/test.war");
if (!warFile.exists()) if (!warFile.exists())
{ {
throw new RuntimeException( "Unable to find WAR File: " throw new RuntimeException("Unable to find WAR File: " + warFile.getAbsolutePath());
+ warFile.getAbsolutePath() );
} }
webapp.setWar( warFile.getAbsolutePath() ); webapp.setWar(warFile.getAbsolutePath());
webapp.setExtractWAR(true); webapp.setExtractWAR(true);
// This webapp will use jsps and jstl. We need to enable the // This webapp will use jsps and jstl. We need to enable the
// AnnotationConfiguration in order to correctly // AnnotationConfiguration in order to correctly
// set up the jsp container // set up the jsp container
Configuration.ClassList classlist = Configuration.ClassList Configuration.ClassList classlist = Configuration.ClassList
.setServerDefault( server ); .setServerDefault(server);
classlist.addBefore( classlist.addBefore(
"org.eclipse.jetty.webapp.JettyWebXmlConfiguration", "org.eclipse.jetty.webapp.JettyWebXmlConfiguration",
"org.eclipse.jetty.annotations.AnnotationConfiguration" ); "org.eclipse.jetty.annotations.AnnotationConfiguration");
// Set the ContainerIncludeJarPattern so that jetty examines these // Set the ContainerIncludeJarPattern so that jetty examines these
// container-path jars for tlds, web-fragments etc. // container-path jars for tlds, web-fragments etc.
// If you omit the jar that contains the jstl .tlds, the jsp engine will // If you omit the jar that contains the jstl .tlds, the jsp engine will
// scan for them instead. // scan for them instead.
webapp.setAttribute( webapp.setAttribute(
"org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", "org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
".*/[^/]*servlet-api-[^/]*\\.jar$|.*/javax.servlet.jsp.jstl-.*\\.jar$|.*/[^/]*taglibs.*\\.jar$" ); ".*/[^/]*servlet-api-[^/]*\\.jar$|.*/javax.servlet.jsp.jstl-.*\\.jar$|.*/[^/]*taglibs.*\\.jar$");
// A WebAppContext is a ContextHandler as well so it needs to be set to // A WebAppContext is a ContextHandler as well so it needs to be set to
// the server so it is aware of where to // the server so it is aware of where to
// send the appropriate requests. // send the appropriate requests.
server.setHandler( webapp ); server.setHandler(webapp);
// Configure a LoginService. // Configure a LoginService.
// Since this example is for our test webapp, we need to setup a // Since this example is for our test webapp, we need to setup a
@ -95,13 +94,13 @@ public class OneWebAppWithJsp
// can be started and stopped according to the lifecycle of the server // can be started and stopped according to the lifecycle of the server
// itself. // itself.
HashLoginService loginService = new HashLoginService(); HashLoginService loginService = new HashLoginService();
loginService.setName( "Test Realm" ); loginService.setName("Test Realm");
loginService.setConfig( "src/test/resources/realm.properties" ); loginService.setConfig("examples/embedded/src/test/resources/realm.properties");
server.addBean( loginService ); server.addBean(loginService);
// Start things up! // Start things up!
server.start(); server.start();
server.dumpStdErr(); server.dumpStdErr();
// The use of server.join() the will make the current thread join and // The use of server.join() the will make the current thread join and

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -27,7 +27,7 @@ import org.eclipse.jetty.servlet.ServletHolder;
public class ProxyServer public class ProxyServer
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
Server server = new Server(); Server server = new Server();
ServerConnector connector = new ServerConnector(server); ServerConnector connector = new ServerConnector(server);
@ -40,12 +40,11 @@ public class ProxyServer
// Setup proxy servlet // Setup proxy servlet
ServletContextHandler context = new ServletContextHandler(proxy, "/", ServletContextHandler context = new ServletContextHandler(proxy, "/",
ServletContextHandler.SESSIONS); ServletContextHandler.SESSIONS);
ServletHolder proxyServlet = new ServletHolder(ProxyServlet.class); ServletHolder proxyServlet = new ServletHolder(ProxyServlet.class);
proxyServlet.setInitParameter("blackList", "www.eclipse.org"); proxyServlet.setInitParameter("blackList", "www.eclipse.org");
context.addServlet(proxyServlet, "/*"); context.addServlet(proxyServlet, "/*");
server.start(); server.start();
} }
} }

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -28,19 +28,19 @@ import org.eclipse.jetty.servlet.ServletContextHandler;
public class RewriteServer public class RewriteServer
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
Server server = new Server(8080); Server server = new Server(8080);
HttpConfiguration config=server.getConnectors()[0].getConnectionFactory(HttpConnectionFactory.class).getHttpConfiguration(); HttpConfiguration config = server.getConnectors()[0].getConnectionFactory(HttpConnectionFactory.class).getHttpConfiguration();
RewriteCustomizer rewrite = new RewriteCustomizer(); RewriteCustomizer rewrite = new RewriteCustomizer();
config.addCustomizer(rewrite); config.addCustomizer(rewrite);
rewrite.addRule(new CompactPathRule()); rewrite.addRule(new CompactPathRule());
rewrite.addRule(new RewriteRegexRule("(.*)foo(.*)","$1FOO$2")); rewrite.addRule(new RewriteRegexRule("(.*)foo(.*)", "$1FOO$2"));
ServletContextHandler context = new ServletContextHandler( ServletContextHandler context = new ServletContextHandler(
ServletContextHandler.SESSIONS); ServletContextHandler.SESSIONS);
context.setContextPath("/"); context.setContextPath("/");
server.setHandler(context); server.setHandler(context);

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -30,7 +30,7 @@ import org.eclipse.jetty.util.security.Constraint;
public class SecuredHelloHandler public class SecuredHelloHandler
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
// Create a basic jetty server object that will listen on port 8080. // Create a basic jetty server object that will listen on port 8080.
// Note that if you set this to port 0 then a randomly available port // Note that if you set this to port 0 then a randomly available port
@ -47,7 +47,7 @@ public class SecuredHelloHandler
// In this example the name can be whatever you like since we are not // In this example the name can be whatever you like since we are not
// dealing with webapp realms. // dealing with webapp realms.
LoginService loginService = new HashLoginService("MyRealm", LoginService loginService = new HashLoginService("MyRealm",
"src/test/resources/realm.properties"); "src/test/resources/realm.properties");
server.addBean(loginService); server.addBean(loginService);
// A security handler is a jetty handler that secures content behind a // A security handler is a jetty handler that secures content behind a
@ -65,7 +65,7 @@ public class SecuredHelloHandler
Constraint constraint = new Constraint(); Constraint constraint = new Constraint();
constraint.setName("auth"); constraint.setName("auth");
constraint.setAuthenticate(true); constraint.setAuthenticate(true);
constraint.setRoles(new String[] { "user", "admin" }); constraint.setRoles(new String[]{"user", "admin"});
// Binds a url pattern with the previously created constraint. The roles // Binds a url pattern with the previously created constraint. The roles
// for this constraing mapping are mined from the Constraint itself // for this constraing mapping are mined from the Constraint itself

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -21,6 +21,7 @@ package org.eclipse.jetty.embedded;
import java.io.File; import java.io.File;
import org.eclipse.jetty.plus.jndi.EnvEntry; import org.eclipse.jetty.plus.jndi.EnvEntry;
import org.eclipse.jetty.plus.jndi.NamingDump;
import org.eclipse.jetty.plus.jndi.Resource; import org.eclipse.jetty.plus.jndi.Resource;
import org.eclipse.jetty.plus.jndi.Transaction; import org.eclipse.jetty.plus.jndi.Transaction;
import org.eclipse.jetty.security.HashLoginService; import org.eclipse.jetty.security.HashLoginService;
@ -33,30 +34,28 @@ import org.eclipse.jetty.webapp.WebAppContext;
*/ */
public class ServerWithAnnotations public class ServerWithAnnotations
{ {
public static final void main( String args[] ) throws Exception public static final void main(String[] args) throws Exception
{ {
// Create the server // Create the server
Server server = new Server(8080); Server server = new Server(8080);
// Enable parsing of jndi-related parts of web.xml and jetty-env.xml // Enable parsing of jndi-related parts of web.xml and jetty-env.xml
Configuration.ClassList classlist = Configuration.ClassList Configuration.ClassList classlist = Configuration.ClassList
.setServerDefault(server); .setServerDefault(server);
classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration", classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration",
"org.eclipse.jetty.plus.webapp.EnvConfiguration", "org.eclipse.jetty.plus.webapp.EnvConfiguration",
"org.eclipse.jetty.plus.webapp.PlusConfiguration"); "org.eclipse.jetty.plus.webapp.PlusConfiguration");
classlist.addBefore( classlist.addBefore(
"org.eclipse.jetty.webapp.JettyWebXmlConfiguration", "org.eclipse.jetty.webapp.JettyWebXmlConfiguration",
"org.eclipse.jetty.annotations.AnnotationConfiguration"); "org.eclipse.jetty.annotations.AnnotationConfiguration");
// Create a WebApp // Create a WebApp
WebAppContext webapp = new WebAppContext(); WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/"); webapp.setContextPath("/");
File warFile = new File( File warFile = JettyDistribution.resolve("demo-base/webapps/test-spec.war").toFile();
"../../jetty-distribution/target/distribution/demo-base/webapps/test.war");
webapp.setWar(warFile.getAbsolutePath()); webapp.setWar(warFile.getAbsolutePath());
webapp.setAttribute( webapp.setAttribute(
"org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern", "org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern",
".*/javax.servlet-[^/]*\\.jar$|.*/servlet-api-[^/]*\\.jar$"); ".*/javax.servlet-[^/]*\\.jar$|.*/servlet-api-[^/]*\\.jar$");
server.setHandler(webapp); server.setHandler(webapp);
// Register new transaction manager in JNDI // Register new transaction manager in JNDI
@ -64,19 +63,23 @@ public class ServerWithAnnotations
new Transaction(new com.acme.MockUserTransaction()); new Transaction(new com.acme.MockUserTransaction());
// Define an env entry with webapp scope. // Define an env entry with webapp scope.
new EnvEntry(webapp, "maxAmount", new Double(100), true); // THIS ENTRY IS OVERRIDEN BY THE ENTRY IN jetty-env.xml
new EnvEntry(webapp, "maxAmount", 100d, true);
// Register a mock DataSource scoped to the webapp // Register a mock DataSource scoped to the webapp
new Resource(webapp, "jdbc/mydatasource", new com.acme.MockDataSource()); new Resource(server, "jdbc/mydatasource", new com.acme.MockDataSource());
// Add JNDI context to server for dump
server.addBean(new NamingDump());
// Configure a LoginService // Configure a LoginService
HashLoginService loginService = new HashLoginService(); HashLoginService loginService = new HashLoginService();
loginService.setName("Test Realm"); loginService.setName("Test Realm");
loginService.setConfig("src/test/resources/realm.properties"); loginService.setConfig("examples/embedded/src/test/resources/realm.properties");
server.addBean(loginService); server.addBean(loginService);
server.start(); server.start();
server.dumpStdErr();
server.join(); server.join();
} }
} }

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -19,7 +19,6 @@
package org.eclipse.jetty.embedded; package org.eclipse.jetty.embedded;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import javax.management.remote.JMXServiceURL; import javax.management.remote.JMXServiceURL;
import org.eclipse.jetty.jmx.ConnectorServer; import org.eclipse.jetty.jmx.ConnectorServer;
@ -31,24 +30,24 @@ import org.eclipse.jetty.server.Server;
*/ */
public class ServerWithJMX public class ServerWithJMX
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
// === jetty-jmx.xml === // === jetty-jmx.xml ===
MBeanContainer mbContainer = new MBeanContainer( MBeanContainer mbContainer = new MBeanContainer(
ManagementFactory.getPlatformMBeanServer()); ManagementFactory.getPlatformMBeanServer());
Server server = new Server(8080); Server server = new Server(8080);
server.addBean(mbContainer); server.addBean(mbContainer);
ConnectorServer jmx = new ConnectorServer( ConnectorServer jmx = new ConnectorServer(
new JMXServiceURL( new JMXServiceURL(
"rmi", "rmi",
null, null,
1999, 1999,
"/jndi/rmi://localhost:1999/jmxrmi"), "/jndi/rmi://localhost:1999/jmxrmi"),
"org.eclipse.jetty.jmx:name=rmiconnectorserver"); "org.eclipse.jetty.jmx:name=rmiconnectorserver");
server.addBean(jmx); server.addBean(jmx);
server.start(); server.start();
server.dumpStdErr(); server.dumpStdErr();
server.join(); server.join();

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -30,7 +30,7 @@ import org.eclipse.jetty.webapp.WebAppContext;
*/ */
public class ServerWithJNDI public class ServerWithJNDI
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
// Create the server // Create the server
@ -38,23 +38,23 @@ public class ServerWithJNDI
// Enable parsing of jndi-related parts of web.xml and jetty-env.xml // Enable parsing of jndi-related parts of web.xml and jetty-env.xml
Configuration.ClassList classlist = Configuration.ClassList Configuration.ClassList classlist = Configuration.ClassList
.setServerDefault(server); .setServerDefault(server);
classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration", classlist.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration",
"org.eclipse.jetty.plus.webapp.EnvConfiguration", "org.eclipse.jetty.plus.webapp.EnvConfiguration",
"org.eclipse.jetty.plus.webapp.PlusConfiguration"); "org.eclipse.jetty.plus.webapp.PlusConfiguration");
// Create a WebApp // Create a WebApp
WebAppContext webapp = new WebAppContext(); WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/"); webapp.setContextPath("/");
File warFile = new File( File warFile = new File(
"../../jetty-distribution/target/distribution/demo-base/webapps/test-jndi.war"); "../../jetty-distribution/target/distribution/demo-base/webapps/test-jndi.war");
webapp.setWar(warFile.getAbsolutePath()); webapp.setWar(warFile.getAbsolutePath());
server.setHandler(webapp); server.setHandler(webapp);
// Register new transaction manager in JNDI // Register new transaction manager in JNDI
// At runtime, the webapp accesses this as java:comp/UserTransaction // At runtime, the webapp accesses this as java:comp/UserTransaction
new org.eclipse.jetty.plus.jndi.Transaction( new org.eclipse.jetty.plus.jndi.Transaction(
new com.acme.MockUserTransaction()); new com.acme.MockUserTransaction());
// Define an env entry with Server scope. // Define an env entry with Server scope.
// At runtime, the webapp accesses this as java:comp/env/woggle // At runtime, the webapp accesses this as java:comp/env/woggle
@ -108,7 +108,7 @@ public class ServerWithJNDI
// At runtime the webapp accesses this as // At runtime the webapp accesses this as
// java:comp/env/jdbc/mydatasource // java:comp/env/jdbc/mydatasource
new org.eclipse.jetty.plus.jndi.Resource( new org.eclipse.jetty.plus.jndi.Resource(
webapp, "jdbc/mydatasource", new com.acme.MockDataSource()); webapp, "jdbc/mydatasource", new com.acme.MockDataSource());
server.start(); server.start();
server.join(); server.join();

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -25,7 +25,7 @@ import org.eclipse.jetty.server.Server;
*/ */
public class SimplestServer public class SimplestServer
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
Server server = new Server(8080); Server server = new Server(8080);
server.start(); server.start();

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -37,7 +37,7 @@ import org.eclipse.jetty.util.resource.Resource;
*/ */
public class SplitFileServer public class SplitFileServer
{ {
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
// Create the Server object and a corresponding ServerConnector and then // Create the Server object and a corresponding ServerConnector and then
// set the port for the connector. In this example the server will // set the port for the connector. In this example the server will
@ -47,7 +47,7 @@ public class SplitFileServer
Server server = new Server(); Server server = new Server();
ServerConnector connector = new ServerConnector(server); ServerConnector connector = new ServerConnector(server);
connector.setPort(8090); connector.setPort(8090);
server.setConnectors(new Connector[] { connector }); server.setConnectors(new Connector[]{connector});
// Create a Context Handler and ResourceHandler. The ContextHandler is // Create a Context Handler and ResourceHandler. The ContextHandler is
// getting set to "/" path but this could be anything you like for // getting set to "/" path but this could be anything you like for
@ -77,13 +77,13 @@ public class SplitFileServer
// This will let jetty process urls against the declared contexts in // This will let jetty process urls against the declared contexts in
// order to match up content. // order to match up content.
ContextHandlerCollection contexts = new ContextHandlerCollection(); ContextHandlerCollection contexts = new ContextHandlerCollection();
contexts.setHandlers(new Handler[] { context0, context1 }); contexts.setHandlers(new Handler[]{context0, context1});
server.setHandler(contexts); server.setHandler(contexts);
// Start things up! // Start things up!
server.start(); server.start();
// Dump the server state // Dump the server state
System.out.println(server.dump()); System.out.println(server.dump());

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -23,6 +23,8 @@ import javax.websocket.Session;
import javax.websocket.server.ServerEndpoint; import javax.websocket.server.ServerEndpoint;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.websocket.jsr356.server.ServerContainer; import org.eclipse.jetty.websocket.jsr356.server.ServerContainer;
import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer; import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
@ -39,28 +41,33 @@ public class WebSocketJsrServer
public static class EchoJsrSocket public static class EchoJsrSocket
{ {
@OnMessage @OnMessage
public void onMessage( Session session, String message ) public void onMessage(Session session, String message)
{ {
session.getAsyncRemote().sendText(message); session.getAsyncRemote().sendText(message);
} }
} }
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
Server server = new Server(8080); Server server = new Server(8080);
HandlerList handlers = new HandlerList();
ServletContextHandler context = new ServletContextHandler( ServletContextHandler context = new ServletContextHandler(
ServletContextHandler.SESSIONS); ServletContextHandler.SESSIONS);
context.setContextPath("/"); context.setContextPath("/");
server.setHandler(context); handlers.addHandler(context);
// Enable javax.websocket configuration for the context // Enable javax.websocket configuration for the context
ServerContainer wsContainer = WebSocketServerContainerInitializer ServerContainer wsContainer = WebSocketServerContainerInitializer
.configureContext(context); .configureContext(context);
// Add your websockets to the container // Add your websockets to the container
wsContainer.addEndpoint(EchoJsrSocket.class); wsContainer.addEndpoint(EchoJsrSocket.class);
handlers.addHandler(new DefaultHandler());
server.setHandler(handlers);
server.start(); server.start();
context.dumpStdErr(); context.dumpStdErr();
server.join(); server.join();

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -41,7 +41,7 @@ public class WebSocketServer
public static class EchoSocket public static class EchoSocket
{ {
@OnWebSocketMessage @OnWebSocketMessage
public void onMessage( Session session, String message ) public void onMessage(Session session, String message)
{ {
session.getRemote().sendStringByFuture(message); session.getRemote().sendStringByFuture(message);
} }
@ -54,19 +54,19 @@ public class WebSocketServer
public static class EchoServlet extends WebSocketServlet public static class EchoServlet extends WebSocketServlet
{ {
@Override @Override
public void configure( WebSocketServletFactory factory ) public void configure(WebSocketServletFactory factory)
{ {
// Register the echo websocket with the basic WebSocketCreator // Register the echo websocket with the basic WebSocketCreator
factory.register(EchoSocket.class); factory.register(EchoSocket.class);
} }
} }
public static void main( String[] args ) throws Exception public static void main(String[] args) throws Exception
{ {
Server server = new Server(8080); Server server = new Server(8080);
ServletContextHandler context = new ServletContextHandler( ServletContextHandler context = new ServletContextHandler(
ServletContextHandler.SESSIONS); ServletContextHandler.SESSIONS);
context.setContextPath("/"); context.setContextPath("/");
server.setHandler(context); server.setHandler(context);

View File

@ -1,5 +1,4 @@
<?xml version="1.0"?> <?xml version="1.0"?><!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure id="ExampleServer" class="org.eclipse.jetty.server.Server"> <Configure id="ExampleServer" class="org.eclipse.jetty.server.Server">

View File

@ -9,3 +9,4 @@
#org.eclipse.jetty.server.LEVEL=DEBUG #org.eclipse.jetty.server.LEVEL=DEBUG
#org.eclipse.jetty.servlets.LEVEL=DEBUG #org.eclipse.jetty.servlets.LEVEL=DEBUG
#org.eclipse.jetty.alpn.LEVEL=DEBUG #org.eclipse.jetty.alpn.LEVEL=DEBUG
#org.eclipse.jetty.jmx.LEVEL=DEBUG

View File

@ -1,5 +1,4 @@
<?xml version="1.0"?> <?xml version="1.0"?><!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
<Configure id="OtherServer" class="org.eclipse.jetty.server.Server"> <Configure id="OtherServer" class="org.eclipse.jetty.server.Server">
<Set name="handler"> <Set name="handler">

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -24,8 +24,8 @@ public class TestXml
{ {
public static void main(String[] args) throws Exception public static void main(String[] args) throws Exception
{ {
System.setProperty("jetty.home","../jetty-distribution/target/distribution"); System.setProperty("jetty.home", "../jetty-distribution/target/distribution");
XmlConfiguration.main("../jetty-jmx/src/main/config/etc/jetty-jmx.xml", XmlConfiguration.main("../jetty-jmx/src/main/config/etc/jetty-jmx.xml",
"../jetty-server/src/main/config/etc/jetty.xml"); "../jetty-server/src/main/config/etc/jetty.xml");
} }
} }

View File

@ -1,21 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd"> <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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent> <parent>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-project</artifactId> <artifactId>jetty-project</artifactId>
<version>9.4.13-SNAPSHOT</version> <version>9.4.21-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.eclipse.jetty.examples</groupId> <groupId>org.eclipse.jetty.examples</groupId>
<artifactId>examples-parent</artifactId> <artifactId>examples-parent</artifactId>
<name>Jetty Examples :: Parent</name> <name>Jetty Examples :: Parent</name>
<packaging>pom</packaging> <packaging>pom</packaging>
<properties> <properties>
<sonar.skip>true</sonar.skip> <sonar.skip>true</sonar.skip>
</properties> </properties>
<build> <build>
<plugins> <plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<!-- No point deploying example projects -->
<skip>true</skip>
</configuration>
</plugin>
<plugin> <plugin>
<groupId>org.codehaus.mojo</groupId> <groupId>org.codehaus.mojo</groupId>
<artifactId>findbugs-maven-plugin</artifactId> <artifactId>findbugs-maven-plugin</artifactId>
@ -26,6 +36,7 @@
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
<modules> <modules>
<!-- <!--
- The async-rest and embedded are examples that have historical locations, - The async-rest and embedded are examples that have historical locations,

View File

@ -2,7 +2,7 @@
<parent> <parent>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-alpn-parent</artifactId> <artifactId>jetty-alpn-parent</artifactId>
<version>9.4.13-SNAPSHOT</version> <version>9.4.21-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>jetty-alpn-client</artifactId> <artifactId>jetty-alpn-client</artifactId>
@ -23,8 +23,8 @@
</goals> </goals>
<configuration> <configuration>
<instructions> <instructions>
<Import-Package>org.eclipse.jetty.alpn;resolution:=optional,*</Import-Package> <Import-Package>org.eclipse.jetty.alpn;resolution:=optional,*</Import-Package>
<Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.processor)";resolution:=optional, osgi.serviceloader; filter:="(osgi.serviceloader=org.eclipse.jetty.io.ssl.ALPNProcessor$Client)";resolution:=optional;cardinality:=multiple</Require-Capability> <Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.processor)";resolution:=optional, osgi.serviceloader; filter:="(osgi.serviceloader=org.eclipse.jetty.io.ssl.ALPNProcessor$Client)";resolution:=optional;cardinality:=multiple</Require-Capability>
</instructions> </instructions>
</configuration> </configuration>
</execution> </execution>
@ -33,8 +33,8 @@
<!-- always include the sources to be able to prepare the eclipse-jetty-SDK feature <!-- always include the sources to be able to prepare the eclipse-jetty-SDK feature
with a snapshot. --> with a snapshot. -->
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId> <artifactId>maven-source-plugin</artifactId>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.codehaus.mojo</groupId> <groupId>org.codehaus.mojo</groupId>

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -21,7 +21,6 @@ package org.eclipse.jetty.alpn.client;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLEngine;
import org.eclipse.jetty.io.ClientConnectionFactory; import org.eclipse.jetty.io.ClientConnectionFactory;
@ -49,7 +48,7 @@ public class ALPNClientConnection extends NegotiatingClientConnection
public void selected(String protocol) public void selected(String protocol)
{ {
if (protocol==null || !protocols.contains(protocol)) if (protocol == null || !protocols.contains(protocol))
close(); close();
else else
super.completed(); super.completed();

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -18,14 +18,12 @@
package org.eclipse.jetty.alpn.client; package org.eclipse.jetty.alpn.client;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.ServiceLoader; import java.util.ServiceLoader;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLEngine;
import org.eclipse.jetty.io.ClientConnectionFactory; import org.eclipse.jetty.io.ClientConnectionFactory;
@ -34,11 +32,10 @@ import org.eclipse.jetty.io.EndPoint;
import org.eclipse.jetty.io.NegotiatingClientConnectionFactory; import org.eclipse.jetty.io.NegotiatingClientConnectionFactory;
import org.eclipse.jetty.io.ssl.ALPNProcessor.Client; import org.eclipse.jetty.io.ssl.ALPNProcessor.Client;
import org.eclipse.jetty.io.ssl.SslClientConnectionFactory; import org.eclipse.jetty.io.ssl.SslClientConnectionFactory;
import org.eclipse.jetty.io.ssl.SslHandshakeListener;
import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Log;
import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.util.log.Logger;
public class ALPNClientConnectionFactory extends NegotiatingClientConnectionFactory implements SslHandshakeListener public class ALPNClientConnectionFactory extends NegotiatingClientConnectionFactory
{ {
private static final Logger LOG = Log.getLogger(ALPNClientConnectionFactory.class); private static final Logger LOG = Log.getLogger(ALPNClientConnectionFactory.class);
@ -57,14 +54,14 @@ public class ALPNClientConnectionFactory extends NegotiatingClientConnectionFact
IllegalStateException failure = new IllegalStateException("No Client ALPNProcessors!"); IllegalStateException failure = new IllegalStateException("No Client ALPNProcessors!");
// Use a for loop on iterator so load exceptions can be caught and ignored // Use a for loop on iterator so load exceptions can be caught and ignored
for (Iterator<Client> i = ServiceLoader.load(Client.class).iterator(); i.hasNext();) for (Iterator<Client> i = ServiceLoader.load(Client.class).iterator(); i.hasNext(); )
{ {
Client processor; Client processor;
try try
{ {
processor = i.next(); processor = i.next();
} }
catch(Throwable x) catch (Throwable x)
{ {
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
LOG.debug(x); LOG.debug(x);
@ -96,7 +93,7 @@ public class ALPNClientConnectionFactory extends NegotiatingClientConnectionFact
} }
@Override @Override
public Connection newConnection(EndPoint endPoint, Map<String, Object> context) throws IOException public Connection newConnection(EndPoint endPoint, Map<String, Object> context)
{ {
SSLEngine engine = (SSLEngine)context.get(SslClientConnectionFactory.SSL_ENGINE_CONTEXT_KEY); SSLEngine engine = (SSLEngine)context.get(SslClientConnectionFactory.SSL_ENGINE_CONTEXT_KEY);
for (Client processor : processors) for (Client processor : processors)
@ -106,7 +103,7 @@ public class ALPNClientConnectionFactory extends NegotiatingClientConnectionFact
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
LOG.debug("{} for {} on {}", processor, engine, endPoint); LOG.debug("{} for {} on {}", processor, engine, endPoint);
ALPNClientConnection connection = new ALPNClientConnection(endPoint, executor, getClientConnectionFactory(), ALPNClientConnection connection = new ALPNClientConnection(endPoint, executor, getClientConnectionFactory(),
engine, context, protocols); engine, context, protocols);
processor.configure(engine, connection); processor.configure(engine, connection);
return customize(connection, context); return customize(connection, context);
} }

View File

@ -1,12 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" <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">
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">
<parent> <parent>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-alpn-parent</artifactId> <artifactId>jetty-alpn-parent</artifactId>
<version>9.4.13-SNAPSHOT</version> <version>9.4.21-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -35,23 +33,23 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>
<build> <build>
<plugins> <plugins>
<plugin> <plugin>
<groupId>org.apache.felix</groupId> <groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId> <artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions> <extensions>true</extensions>
<configuration> <configuration>
<instructions> <instructions>
<Bundle-Description>Conscrypt Client ALPN</Bundle-Description> <Bundle-Description>Conscrypt Client ALPN</Bundle-Description>
<Import-Package>org.conscrypt;version="${conscrypt.version}",*</Import-Package> <Import-Package>org.conscrypt;version="${conscrypt.version}",*</Import-Package>
<Export-Package>*</Export-Package> <Export-Package>*</Export-Package>
<Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional</Require-Capability> <Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional</Require-Capability>
<Provide-Capability>osgi.serviceloader; osgi.serviceloader=org.eclipse.jetty.io.ssl.ALPNProcessor$Client</Provide-Capability> <Provide-Capability>osgi.serviceloader; osgi.serviceloader=org.eclipse.jetty.io.ssl.ALPNProcessor$Client</Provide-Capability>
<_nouses>true</_nouses> <_nouses>true</_nouses>
</instructions> </instructions>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -18,12 +18,10 @@
package org.eclipse.jetty.alpn.conscrypt.client; package org.eclipse.jetty.alpn.conscrypt.client;
import java.lang.reflect.Method;
import java.nio.charset.StandardCharsets;
import java.security.Security; import java.security.Security;
import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLEngine;
import org.conscrypt.Conscrypt;
import org.conscrypt.OpenSSLProvider; import org.conscrypt.OpenSSLProvider;
import org.eclipse.jetty.alpn.client.ALPNClientConnection; import org.eclipse.jetty.alpn.client.ALPNClientConnection;
import org.eclipse.jetty.io.Connection; import org.eclipse.jetty.io.Connection;
@ -40,7 +38,7 @@ public class ConscryptClientALPNProcessor implements ALPNProcessor.Client
@Override @Override
public void init() public void init()
{ {
if (Security.getProvider("Conscrypt")==null) if (Security.getProvider("Conscrypt") == null)
{ {
Security.addProvider(new OpenSSLProvider()); Security.addProvider(new OpenSSLProvider());
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
@ -59,13 +57,11 @@ public class ConscryptClientALPNProcessor implements ALPNProcessor.Client
{ {
try try
{ {
Method setAlpnProtocols = sslEngine.getClass().getDeclaredMethod("setApplicationProtocols", String[].class);
setAlpnProtocols.setAccessible(true);
ALPNClientConnection alpn = (ALPNClientConnection)connection; ALPNClientConnection alpn = (ALPNClientConnection)connection;
String[] protocols = alpn.getProtocols().toArray(new String[0]); String[] protocols = alpn.getProtocols().toArray(new String[0]);
setAlpnProtocols.invoke(sslEngine, (Object)protocols); Conscrypt.setApplicationProtocols(sslEngine, protocols);
((SslConnection.DecryptedEndPoint)connection.getEndPoint()).getSslConnection() ((SslConnection.DecryptedEndPoint)connection.getEndPoint()).getSslConnection()
.addHandshakeListener(new ALPNListener(alpn)); .addHandshakeListener(new ALPNListener(alpn));
} }
catch (RuntimeException x) catch (RuntimeException x)
{ {
@ -92,9 +88,9 @@ public class ConscryptClientALPNProcessor implements ALPNProcessor.Client
try try
{ {
SSLEngine sslEngine = alpnConnection.getSSLEngine(); SSLEngine sslEngine = alpnConnection.getSSLEngine();
Method method = sslEngine.getClass().getDeclaredMethod("getApplicationProtocol"); String protocol = Conscrypt.getApplicationProtocol(sslEngine);
method.setAccessible(true); if (LOG.isDebugEnabled())
String protocol = (String)method.invoke(sslEngine); LOG.debug("Selected {} for {}", protocol, alpnConnection);
alpnConnection.selected(protocol); alpnConnection.selected(protocol);
} }
catch (Throwable e) catch (Throwable e)

View File

@ -1,89 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.alpn.java.client;
import java.net.InetSocketAddress;
import java.security.Security;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.conscrypt.OpenSSLProvider;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpURI;
import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.http.MetaData;
import org.eclipse.jetty.http2.api.Session;
import org.eclipse.jetty.http2.api.Stream;
import org.eclipse.jetty.http2.client.HTTP2Client;
import org.eclipse.jetty.http2.frames.DataFrame;
import org.eclipse.jetty.http2.frames.HeadersFrame;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.FuturePromise;
import org.eclipse.jetty.util.Jetty;
import org.eclipse.jetty.util.Promise;
import org.eclipse.jetty.util.ssl.SslContextFactory;
public class ConscryptHTTP2Client
{
public static void main(String[] args) throws Exception
{
Security.addProvider(new OpenSSLProvider());
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setProvider("Conscrypt");
HTTP2Client client = new HTTP2Client();
client.addBean(sslContextFactory);
client.start();
String host = "webtide.com";
int port = 443;
FuturePromise<Session> sessionPromise = new FuturePromise<>();
client.connect(sslContextFactory, new InetSocketAddress(host, port), new Session.Listener.Adapter(), sessionPromise);
Session session = sessionPromise.get(5, TimeUnit.SECONDS);
HttpFields requestFields = new HttpFields();
requestFields.put("User-Agent", client.getClass().getName() + "/" + Jetty.VERSION);
MetaData.Request metaData = new MetaData.Request("GET", new HttpURI("https://" + host + ":" + port + "/"), HttpVersion.HTTP_2, requestFields);
HeadersFrame headersFrame = new HeadersFrame(metaData, null, true);
CountDownLatch latch = new CountDownLatch(1);
session.newStream(headersFrame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
{
@Override
public void onHeaders(Stream stream, HeadersFrame frame)
{
System.err.println(frame);
if (frame.isEndStream())
latch.countDown();
}
@Override
public void onData(Stream stream, DataFrame frame, Callback callback)
{
System.err.println(frame);
callback.succeeded();
if (frame.isEndStream())
latch.countDown();
}
});
latch.await(5, TimeUnit.SECONDS);
client.stop();
}
}

View File

@ -0,0 +1,120 @@
//
// ========================================================================
// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.alpn.java.client;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.security.Security;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.conscrypt.Conscrypt;
import org.conscrypt.OpenSSLProvider;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpURI;
import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.http.MetaData;
import org.eclipse.jetty.http2.api.Session;
import org.eclipse.jetty.http2.api.Stream;
import org.eclipse.jetty.http2.client.HTTP2Client;
import org.eclipse.jetty.http2.frames.DataFrame;
import org.eclipse.jetty.http2.frames.HeadersFrame;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.FuturePromise;
import org.eclipse.jetty.util.Jetty;
import org.eclipse.jetty.util.Promise;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class ConscryptHTTP2ClientTest
{
@Tag("external")
@Test
public void testConscryptHTTP2Client() throws Exception
{
String host = "webtide.com";
int port = 443;
Assumptions.assumeTrue(canConnectTo(host, port));
Security.insertProviderAt(new OpenSSLProvider(), 1);
SslContextFactory sslContextFactory = new SslContextFactory.Client();
sslContextFactory.setProvider("Conscrypt");
Conscrypt.setDefaultHostnameVerifier((hostname, session) -> true);
HTTP2Client client = new HTTP2Client();
try
{
client.addBean(sslContextFactory);
client.start();
FuturePromise<Session> sessionPromise = new FuturePromise<>();
client.connect(sslContextFactory, new InetSocketAddress(host, port), new Session.Listener.Adapter(), sessionPromise);
Session session = sessionPromise.get(15, TimeUnit.SECONDS);
HttpFields requestFields = new HttpFields();
requestFields.put("User-Agent", client.getClass().getName() + "/" + Jetty.VERSION);
MetaData.Request metaData = new MetaData.Request("GET", new HttpURI("https://" + host + ":" + port + "/"), HttpVersion.HTTP_2, requestFields);
HeadersFrame headersFrame = new HeadersFrame(metaData, null, true);
CountDownLatch latch = new CountDownLatch(1);
session.newStream(headersFrame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
{
@Override
public void onHeaders(Stream stream, HeadersFrame frame)
{
System.err.println(frame);
if (frame.isEndStream())
latch.countDown();
}
@Override
public void onData(Stream stream, DataFrame frame, Callback callback)
{
System.err.println(frame);
callback.succeeded();
if (frame.isEndStream())
latch.countDown();
}
});
assertTrue(latch.await(15, TimeUnit.SECONDS));
}
finally
{
client.stop();
}
}
private boolean canConnectTo(String host, int port)
{
try
{
new Socket(host, port).close();
return true;
}
catch (Throwable x)
{
return false;
}
}
}

View File

@ -1,10 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <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">
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <parent>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-alpn-parent</artifactId> <artifactId>jetty-alpn-parent</artifactId>
<version>9.4.13-SNAPSHOT</version> <version>9.4.21-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
@ -38,23 +37,48 @@
<version>${project.version}</version> <version>${project.version}</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-alpn-conscrypt-client</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-client</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.http2</groupId>
<artifactId>http2-client</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.http2</groupId>
<artifactId>http2-http-client-transport</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>
<plugins> <plugins>
<plugin> <plugin>
<groupId>org.apache.felix</groupId> <groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId> <artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions> <extensions>true</extensions>
<configuration> <configuration>
<instructions> <instructions>
<Bundle-Description>Conscrypt ALPN</Bundle-Description> <Bundle-Description>Conscrypt ALPN</Bundle-Description>
<Import-Package>org.conscrypt;version="${conscrypt.version}",*</Import-Package> <Import-Package>org.conscrypt;version="${conscrypt.version}",*</Import-Package>
<Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional</Require-Capability> <Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional</Require-Capability>
<Provide-Capability>osgi.serviceloader;osgi.serviceloader=org.eclipse.jetty.io.ssl.ALPNProcessor$Server</Provide-Capability> <Provide-Capability>osgi.serviceloader;osgi.serviceloader=org.eclipse.jetty.io.ssl.ALPNProcessor$Server</Provide-Capability>
<_nouses>true</_nouses> <_nouses>true</_nouses>
</instructions> </instructions>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
</project> </project>

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -18,13 +18,13 @@
package org.eclipse.jetty.alpn.conscrypt.server; package org.eclipse.jetty.alpn.conscrypt.server;
import java.lang.reflect.Method;
import java.security.Security; import java.security.Security;
import java.util.List; import java.util.List;
import java.util.function.BiFunction;
import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLSocket;
import org.conscrypt.ApplicationProtocolSelector;
import org.conscrypt.Conscrypt;
import org.conscrypt.OpenSSLProvider; import org.conscrypt.OpenSSLProvider;
import org.eclipse.jetty.alpn.server.ALPNServerConnection; import org.eclipse.jetty.alpn.server.ALPNServerConnection;
import org.eclipse.jetty.io.Connection; import org.eclipse.jetty.io.Connection;
@ -41,7 +41,7 @@ public class ConscryptServerALPNProcessor implements ALPNProcessor.Server
@Override @Override
public void init() public void init()
{ {
if (Security.getProvider("Conscrypt")==null) if (Security.getProvider("Conscrypt") == null)
{ {
Security.addProvider(new OpenSSLProvider()); Security.addProvider(new OpenSSLProvider());
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
@ -56,13 +56,11 @@ public class ConscryptServerALPNProcessor implements ALPNProcessor.Server
} }
@Override @Override
public void configure(SSLEngine sslEngine,Connection connection) public void configure(SSLEngine sslEngine, Connection connection)
{ {
try try
{ {
Method method = sslEngine.getClass().getMethod("setHandshakeApplicationProtocolSelector", BiFunction.class); Conscrypt.setApplicationProtocolSelector(sslEngine, new ALPNCallback((ALPNServerConnection)connection));
method.setAccessible(true);
method.invoke(sslEngine,new ALPNCallback((ALPNServerConnection)connection));
} }
catch (RuntimeException x) catch (RuntimeException x)
{ {
@ -74,23 +72,30 @@ public class ConscryptServerALPNProcessor implements ALPNProcessor.Server
} }
} }
private final class ALPNCallback implements BiFunction<SSLEngine,List<String>,String>, SslHandshakeListener private final class ALPNCallback extends ApplicationProtocolSelector implements SslHandshakeListener
{ {
private final ALPNServerConnection alpnConnection; private final ALPNServerConnection alpnConnection;
private ALPNCallback(ALPNServerConnection connection) private ALPNCallback(ALPNServerConnection connection)
{ {
alpnConnection = connection; alpnConnection = connection;
((DecryptedEndPoint)alpnConnection.getEndPoint()).getSslConnection().addHandshakeListener(this); ((DecryptedEndPoint)alpnConnection.getEndPoint()).getSslConnection().addHandshakeListener(this);
} }
@Override @Override
public String apply(SSLEngine engine, List<String> protocols) public String selectApplicationProtocol(SSLEngine engine, List<String> protocols)
{ {
if (LOG.isDebugEnabled())
LOG.debug("apply {} {}", alpnConnection, protocols);
alpnConnection.select(protocols); alpnConnection.select(protocols);
return alpnConnection.getProtocol(); String protocol = alpnConnection.getProtocol();
if (LOG.isDebugEnabled())
LOG.debug("Selected {} among {} for {}", protocol, protocols, alpnConnection);
return protocol;
}
@Override
public String selectApplicationProtocol(SSLSocket socket, List<String> protocols)
{
throw new UnsupportedOperationException();
} }
@Override @Override
@ -99,7 +104,7 @@ public class ConscryptServerALPNProcessor implements ALPNProcessor.Server
String protocol = alpnConnection.getProtocol(); String protocol = alpnConnection.getProtocol();
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
LOG.debug("TLS handshake succeeded, protocol={} for {}", protocol, alpnConnection); LOG.debug("TLS handshake succeeded, protocol={} for {}", protocol, alpnConnection);
if (protocol ==null) if (protocol == null)
alpnConnection.unsupported(); alpnConnection.unsupported();
} }

View File

@ -1,72 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.alpn.conscrypt.server;
import java.security.Security;
import org.conscrypt.OpenSSLProvider;
import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory;
import org.eclipse.jetty.http2.HTTP2Cipher;
import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.SecureRequestCustomizer;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.SslConnectionFactory;
import org.eclipse.jetty.util.ssl.SslContextFactory;
/**
* Test server that verifies that the Conscrypt ALPN mechanism works.
*/
public class ConscryptHTTP2Server
{
public static void main(String[] args) throws Exception
{
Security.addProvider(new OpenSSLProvider());
Server server = new Server();
HttpConfiguration httpsConfig = new HttpConfiguration();
httpsConfig.setSecureScheme("https");
httpsConfig.setSecurePort(8443);
httpsConfig.setSendXPoweredBy(true);
httpsConfig.setSendServerVersion(true);
httpsConfig.addCustomizer(new SecureRequestCustomizer());
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setProvider("Conscrypt");
sslContextFactory.setKeyStorePath("src/test/resources/keystore.jks");
sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
sslContextFactory.setCipherComparator(HTTP2Cipher.COMPARATOR);
HttpConnectionFactory http = new HttpConnectionFactory(httpsConfig);
HTTP2ServerConnectionFactory h2 = new HTTP2ServerConnectionFactory(httpsConfig);
ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory();
alpn.setDefaultProtocol(http.getProtocol());
SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory, alpn.getProtocol());
ServerConnector http2Connector = new ServerConnector(server, ssl, alpn, h2, http);
http2Connector.setPort(8443);
server.addConnector(http2Connector);
server.start();
}
}

View File

@ -0,0 +1,151 @@
//
// ========================================================================
// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.alpn.conscrypt.server;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.Security;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.conscrypt.OpenSSLProvider;
import org.eclipse.jetty.alpn.server.ALPNServerConnectionFactory;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.client.api.ContentResponse;
import org.eclipse.jetty.http2.client.HTTP2Client;
import org.eclipse.jetty.http2.client.http.HttpClientTransportOverHTTP2;
import org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory;
import org.eclipse.jetty.server.HttpConfiguration;
import org.eclipse.jetty.server.HttpConnectionFactory;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.SecureRequestCustomizer;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.server.SslConnectionFactory;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.util.JavaVersion;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
/**
* Test server that verifies that the Conscrypt ALPN mechanism works for both server and client side
*/
public class ConscryptHTTP2ServerTest
{
static
{
Security.addProvider(new OpenSSLProvider());
}
private Server server = new Server();
private SslContextFactory.Server newServerSslContextFactory()
{
SslContextFactory.Server sslContextFactory = new SslContextFactory.Server();
configureSslContextFactory(sslContextFactory);
return sslContextFactory;
}
private SslContextFactory.Client newClientSslContextFactory()
{
SslContextFactory.Client sslContextFactory = new SslContextFactory.Client();
configureSslContextFactory(sslContextFactory);
sslContextFactory.setEndpointIdentificationAlgorithm(null);
return sslContextFactory;
}
private void configureSslContextFactory(SslContextFactory sslContextFactory)
{
Path path = Paths.get("src", "test", "resources");
File keys = path.resolve("keystore").toFile();
sslContextFactory.setKeyStorePath(keys.getAbsolutePath());
sslContextFactory.setKeyManagerPassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslContextFactory.setTrustStorePath(keys.getAbsolutePath());
sslContextFactory.setTrustStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslContextFactory.setProvider("Conscrypt");
if (JavaVersion.VERSION.getPlatform() < 9)
{
// Conscrypt enables TLSv1.3 by default but it's not supported in Java 8.
sslContextFactory.addExcludeProtocols("TLSv1.3");
}
}
@BeforeEach
public void startServer() throws Exception
{
HttpConfiguration httpsConfig = new HttpConfiguration();
httpsConfig.setSecureScheme("https");
httpsConfig.setSendXPoweredBy(true);
httpsConfig.setSendServerVersion(true);
httpsConfig.addCustomizer(new SecureRequestCustomizer());
HttpConnectionFactory http = new HttpConnectionFactory(httpsConfig);
HTTP2ServerConnectionFactory h2 = new HTTP2ServerConnectionFactory(httpsConfig);
ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory();
alpn.setDefaultProtocol(http.getProtocol());
SslConnectionFactory ssl = new SslConnectionFactory(newServerSslContextFactory(), alpn.getProtocol());
ServerConnector http2Connector = new ServerConnector(server, ssl, alpn, h2, http);
http2Connector.setPort(0);
server.addConnector(http2Connector);
server.setHandler(new AbstractHandler()
{
@Override
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
{
response.setStatus(200);
baseRequest.setHandled(true);
}
});
server.start();
}
@AfterEach
public void stopServer() throws Exception
{
if (server != null)
server.stop();
}
@Test
public void testSimpleRequest() throws Exception
{
HTTP2Client h2Client = new HTTP2Client();
HttpClient client = new HttpClient(new HttpClientTransportOverHTTP2(h2Client), newClientSslContextFactory());
client.start();
try
{
int port = ((ServerConnector)server.getConnectors()[0]).getLocalPort();
ContentResponse contentResponse = client.GET("https://localhost:" + port);
assertEquals(200, contentResponse.getStatus());
}
finally
{
client.stop();
}
}
}

View File

@ -1,61 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" <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">
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">
<parent> <parent>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-alpn-parent</artifactId> <artifactId>jetty-alpn-parent</artifactId>
<version>9.4.13-SNAPSHOT</version> <version>9.4.21-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>jetty-alpn-java-client</artifactId> <artifactId>jetty-alpn-java-client</artifactId>
<name>Jetty :: ALPN :: JDK9 Client Implementation</name> <name>Jetty :: ALPN :: JDK9 Client Implementation</name>
<properties> <properties>
<bundle-symbolic-name>${project.groupId}.alpn.java.client</bundle-symbolic-name> <bundle-symbolic-name>${project.groupId}.alpn.java.client</bundle-symbolic-name>
</properties> </properties>
<build> <build>
<plugins> <plugins>
<plugin> <plugin>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<configuration> <configuration>
<source>1.9</source> <source>1.9</source>
<target>1.9</target> <target>1.9</target>
<release>9</release> <release>9</release>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.felix</groupId> <groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId> <artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions> <extensions>true</extensions>
<configuration> <configuration>
<instructions> <instructions>
<Bundle-Description>JDK9 Client ALPN</Bundle-Description> <Bundle-Description>JDK9 Client ALPN</Bundle-Description>
<Export-Package>*</Export-Package> <Export-Package>*</Export-Package>
<Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional</Require-Capability> <Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional</Require-Capability>
<Provide-Capability>osgi.serviceloader; osgi.serviceloader=org.eclipse.jetty.io.ssl.ALPNProcessor$Client</Provide-Capability> <Provide-Capability>osgi.serviceloader; osgi.serviceloader=org.eclipse.jetty.io.ssl.ALPNProcessor$Client</Provide-Capability>
<_nouses>true</_nouses> <_nouses>true</_nouses>
</instructions> </instructions>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-alpn-client</artifactId> <artifactId>jetty-alpn-client</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.eclipse.jetty.http2</groupId> <groupId>org.eclipse.jetty.http2</groupId>
<artifactId>http2-client</artifactId> <artifactId>http2-client</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -19,7 +19,6 @@
package org.eclipse.jetty.alpn.java.client; package org.eclipse.jetty.alpn.java.client;
import java.util.List; import java.util.List;
import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLEngine;
import javax.net.ssl.SSLParameters; import javax.net.ssl.SSLParameters;
@ -39,15 +38,15 @@ public class JDK9ClientALPNProcessor implements ALPNProcessor.Client
@Override @Override
public void init() public void init()
{ {
if (JavaVersion.VERSION.getPlatform()<9) if (JavaVersion.VERSION.getPlatform() < 9)
throw new IllegalStateException(this + " not applicable for java "+JavaVersion.VERSION); throw new IllegalStateException(this + " not applicable for java " + JavaVersion.VERSION);
} }
@Override @Override
public boolean appliesTo(SSLEngine sslEngine) public boolean appliesTo(SSLEngine sslEngine)
{ {
Module module = sslEngine.getClass().getModule(); Module module = sslEngine.getClass().getModule();
return module!=null && "java.base".equals(module.getName()); return module != null && "java.base".equals(module.getName());
} }
@Override @Override
@ -59,7 +58,7 @@ public class JDK9ClientALPNProcessor implements ALPNProcessor.Client
sslParameters.setApplicationProtocols(protocols.toArray(new String[protocols.size()])); sslParameters.setApplicationProtocols(protocols.toArray(new String[protocols.size()]));
sslEngine.setSSLParameters(sslParameters); sslEngine.setSSLParameters(sslParameters);
((DecryptedEndPoint)connection.getEndPoint()).getSslConnection() ((DecryptedEndPoint)connection.getEndPoint()).getSslConnection()
.addHandshakeListener(new ALPNListener(alpn)); .addHandshakeListener(new ALPNListener(alpn));
} }
private final class ALPNListener implements SslHandshakeListener private final class ALPNListener implements SslHandshakeListener

View File

@ -1,85 +0,0 @@
//
// ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.alpn.java.client;
import java.net.InetSocketAddress;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpURI;
import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.http.MetaData;
import org.eclipse.jetty.http2.api.Session;
import org.eclipse.jetty.http2.api.Stream;
import org.eclipse.jetty.http2.client.HTTP2Client;
import org.eclipse.jetty.http2.frames.DataFrame;
import org.eclipse.jetty.http2.frames.HeadersFrame;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.FuturePromise;
import org.eclipse.jetty.util.Jetty;
import org.eclipse.jetty.util.Promise;
import org.eclipse.jetty.util.ssl.SslContextFactory;
public class JDK9HTTP2Client
{
public static void main(String[] args) throws Exception
{
HTTP2Client client = new HTTP2Client();
SslContextFactory sslContextFactory = new SslContextFactory();
client.addBean(sslContextFactory);
client.start();
String host = "webtide.com";
int port = 443;
FuturePromise<Session> sessionPromise = new FuturePromise<>();
client.connect(sslContextFactory, new InetSocketAddress(host, port), new Session.Listener.Adapter(), sessionPromise);
Session session = sessionPromise.get(5, TimeUnit.SECONDS);
HttpFields requestFields = new HttpFields();
requestFields.put("User-Agent", client.getClass().getName() + "/" + Jetty.VERSION);
MetaData.Request metaData = new MetaData.Request("GET", new HttpURI("https://" + host + ":" + port + "/"), HttpVersion.HTTP_2, requestFields);
HeadersFrame headersFrame = new HeadersFrame(metaData, null, true);
CountDownLatch latch = new CountDownLatch(1);
session.newStream(headersFrame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
{
@Override
public void onHeaders(Stream stream, HeadersFrame frame)
{
System.err.println(frame);
if (frame.isEndStream())
latch.countDown();
}
@Override
public void onData(Stream stream, DataFrame frame, Callback callback)
{
System.err.println(frame);
callback.succeeded();
if (frame.isEndStream())
latch.countDown();
}
});
latch.await(5, TimeUnit.SECONDS);
client.stop();
}
}

View File

@ -0,0 +1,111 @@
//
// ========================================================================
// Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.alpn.java.client;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpURI;
import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.http.MetaData;
import org.eclipse.jetty.http2.api.Session;
import org.eclipse.jetty.http2.api.Stream;
import org.eclipse.jetty.http2.client.HTTP2Client;
import org.eclipse.jetty.http2.frames.DataFrame;
import org.eclipse.jetty.http2.frames.HeadersFrame;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.FuturePromise;
import org.eclipse.jetty.util.Jetty;
import org.eclipse.jetty.util.Promise;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
public class JDK9HTTP2ClientTest
{
@Tag("external")
@Test
public void testJDK9HTTP2Client() throws Exception
{
String host = "webtide.com";
int port = 443;
Assumptions.assumeTrue(canConnectTo(host, port));
HTTP2Client client = new HTTP2Client();
try
{
SslContextFactory sslContextFactory = new SslContextFactory.Client();
client.addBean(sslContextFactory);
client.start();
FuturePromise<Session> sessionPromise = new FuturePromise<>();
client.connect(sslContextFactory, new InetSocketAddress(host, port), new Session.Listener.Adapter(), sessionPromise);
Session session = sessionPromise.get(15, TimeUnit.SECONDS);
HttpFields requestFields = new HttpFields();
requestFields.put("User-Agent", client.getClass().getName() + "/" + Jetty.VERSION);
MetaData.Request metaData = new MetaData.Request("GET", new HttpURI("https://" + host + ":" + port + "/"), HttpVersion.HTTP_2, requestFields);
HeadersFrame headersFrame = new HeadersFrame(metaData, null, true);
CountDownLatch latch = new CountDownLatch(1);
session.newStream(headersFrame, new Promise.Adapter<>(), new Stream.Listener.Adapter()
{
@Override
public void onHeaders(Stream stream, HeadersFrame frame)
{
System.err.println(frame);
if (frame.isEndStream())
latch.countDown();
}
@Override
public void onData(Stream stream, DataFrame frame, Callback callback)
{
System.err.println(frame);
callback.succeeded();
if (frame.isEndStream())
latch.countDown();
}
});
latch.await(15, TimeUnit.SECONDS);
}
finally
{
client.stop();
}
}
private boolean canConnectTo(String host, int port)
{
try
{
new Socket(host, port).close();
return true;
}
catch (Throwable x)
{
return false;
}
}
}

View File

@ -1,74 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" <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">
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <parent>
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <groupId>org.eclipse.jetty</groupId>
<parent> <artifactId>jetty-alpn-parent</artifactId>
<groupId>org.eclipse.jetty</groupId> <version>9.4.21-SNAPSHOT</version>
<artifactId>jetty-alpn-parent</artifactId> </parent>
<version>9.4.13-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<artifactId>jetty-alpn-java-server</artifactId> <artifactId>jetty-alpn-java-server</artifactId>
<name>Jetty :: ALPN :: JDK9 Server Implementation</name> <name>Jetty :: ALPN :: JDK9 Server Implementation</name>
<properties> <properties>
<bundle-symbolic-name>${project.groupId}.alpn.java.server</bundle-symbolic-name> <bundle-symbolic-name>${project.groupId}.alpn.java.server</bundle-symbolic-name>
</properties> </properties>
<build> <build>
<plugins> <plugins>
<plugin> <plugin>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<configuration> <configuration>
<source>1.9</source> <source>1.9</source>
<target>1.9</target> <target>1.9</target>
<release>9</release> <release>9</release>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>
<groupId>org.apache.felix</groupId> <groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId> <artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions> <extensions>true</extensions>
<configuration> <configuration>
<instructions> <instructions>
<Bundle-Description>JDK9 Server ALPN</Bundle-Description> <Bundle-Description>JDK9 Server ALPN</Bundle-Description>
<Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional</Require-Capability> <Require-Capability>osgi.extender; filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional</Require-Capability>
<Provide-Capability>osgi.serviceloader;osgi.serviceloader=org.eclipse.jetty.io.ssl.ALPNProcessor$Server</Provide-Capability> <Provide-Capability>osgi.serviceloader;osgi.serviceloader=org.eclipse.jetty.io.ssl.ALPNProcessor$Server</Provide-Capability>
<_nouses>true</_nouses> <_nouses>true</_nouses>
</instructions> </instructions>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-io</artifactId> <artifactId>jetty-io</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.eclipse.jetty.alpn</groupId> <groupId>org.eclipse.jetty.alpn</groupId>
<artifactId>alpn-api</artifactId> <artifactId>alpn-api</artifactId>
<version>${alpn.api.version}</version> <version>${alpn.api.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.eclipse.jetty</groupId> <groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-alpn-server</artifactId> <artifactId>jetty-alpn-server</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.eclipse.jetty.http2</groupId> <groupId>org.eclipse.jetty.http2</groupId>
<artifactId>http2-server</artifactId> <artifactId>http2-server</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.eclipse.jetty.toolchain</groupId> <groupId>org.eclipse.jetty.toolchain</groupId>
<artifactId>jetty-test-helper</artifactId> <artifactId>jetty-test-helper</artifactId>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -20,7 +20,6 @@ package org.eclipse.jetty.alpn.java.server;
import java.util.List; import java.util.List;
import java.util.function.BiFunction; import java.util.function.BiFunction;
import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLEngine;
import org.eclipse.jetty.alpn.server.ALPNServerConnection; import org.eclipse.jetty.alpn.server.ALPNServerConnection;
@ -39,15 +38,15 @@ public class JDK9ServerALPNProcessor implements ALPNProcessor.Server, SslHandsha
@Override @Override
public void init() public void init()
{ {
if (JavaVersion.VERSION.getPlatform()<9) if (JavaVersion.VERSION.getPlatform() < 9)
throw new IllegalStateException(this + " not applicable for java "+JavaVersion.VERSION); throw new IllegalStateException(this + " not applicable for java " + JavaVersion.VERSION);
} }
@Override @Override
public boolean appliesTo(SSLEngine sslEngine) public boolean appliesTo(SSLEngine sslEngine)
{ {
Module module = sslEngine.getClass().getModule(); Module module = sslEngine.getClass().getModule();
return module!=null && "java.base".equals(module.getName()); return module != null && "java.base".equals(module.getName());
} }
@Override @Override
@ -56,7 +55,7 @@ public class JDK9ServerALPNProcessor implements ALPNProcessor.Server, SslHandsha
sslEngine.setHandshakeApplicationProtocolSelector(new ALPNCallback((ALPNServerConnection)connection)); sslEngine.setHandshakeApplicationProtocolSelector(new ALPNCallback((ALPNServerConnection)connection));
} }
private final class ALPNCallback implements BiFunction<SSLEngine,List<String>,String>, SslHandshakeListener private final class ALPNCallback implements BiFunction<SSLEngine, List<String>, String>, SslHandshakeListener
{ {
private final ALPNServerConnection alpnConnection; private final ALPNServerConnection alpnConnection;
@ -81,7 +80,7 @@ public class JDK9ServerALPNProcessor implements ALPNProcessor.Server, SslHandsha
String protocol = alpnConnection.getProtocol(); String protocol = alpnConnection.getProtocol();
if (LOG.isDebugEnabled()) if (LOG.isDebugEnabled())
LOG.debug("TLS handshake succeeded, protocol={} for {}", protocol, alpnConnection); LOG.debug("TLS handshake succeeded, protocol={} for {}", protocol, alpnConnection);
if (protocol ==null) if (protocol == null)
alpnConnection.unsupported(); alpnConnection.unsupported();
} }

View File

@ -1,6 +1,6 @@
// //
// ======================================================================== // ========================================================================
// Copyright (c) 1995-2018 Mort Bay Consulting Pty. Ltd. // Copyright (c) 1995-2019 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials // All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0 // are made available under the terms of the Eclipse Public License v1.0
@ -18,16 +18,12 @@
package org.eclipse.jetty.alpn.java.server; package org.eclipse.jetty.alpn.java.server;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.OutputStream; import java.io.OutputStream;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import javax.net.ssl.SSLContext; import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLParameters; import javax.net.ssl.SSLParameters;
import javax.net.ssl.SSLSocket; import javax.net.ssl.SSLSocket;
@ -47,6 +43,9 @@ import org.eclipse.jetty.server.handler.AbstractHandler;
import org.eclipse.jetty.util.ssl.SslContextFactory; import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
public class JDK9ALPNTest public class JDK9ALPNTest
{ {
private Server server; private Server server;
@ -68,7 +67,7 @@ public class JDK9ALPNTest
private SslContextFactory newSslContextFactory() private SslContextFactory newSslContextFactory()
{ {
SslContextFactory sslContextFactory = new SslContextFactory(); SslContextFactory sslContextFactory = new SslContextFactory.Server();
sslContextFactory.setKeyStorePath("src/test/resources/keystore.jks"); sslContextFactory.setKeyStorePath("src/test/resources/keystore.jks");
sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4"); sslContextFactory.setKeyStorePassword("OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4");
sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g"); sslContextFactory.setKeyManagerPassword("OBF:1u2u1wml1z7s1z7a1wnl1u2g");
@ -90,7 +89,7 @@ public class JDK9ALPNTest
} }
}); });
SslContextFactory sslContextFactory = new SslContextFactory(true); SslContextFactory sslContextFactory = new SslContextFactory.Client(true);
sslContextFactory.start(); sslContextFactory.start();
SSLContext sslContext = sslContextFactory.getSslContext(); SSLContext sslContext = sslContextFactory.getSslContext();
try (SSLSocket client = (SSLSocket)sslContext.getSocketFactory().createSocket("localhost", connector.getLocalPort())) try (SSLSocket client = (SSLSocket)sslContext.getSocketFactory().createSocket("localhost", connector.getLocalPort()))
@ -100,8 +99,8 @@ public class JDK9ALPNTest
client.startHandshake(); client.startHandshake();
OutputStream output = client.getOutputStream(); OutputStream output = client.getOutputStream();
output.write(("" + output.write((
"GET / HTTP/1.1\r\n" + "GET / HTTP/1.1\r\n" +
"Host: localhost\r\n" + "Host: localhost\r\n" +
"Connection: close\r\n" + "Connection: close\r\n" +
"\r\n" + "\r\n" +
@ -132,7 +131,7 @@ public class JDK9ALPNTest
} }
}); });
SslContextFactory sslContextFactory = new SslContextFactory(true); SslContextFactory sslContextFactory = new SslContextFactory.Client(true);
sslContextFactory.start(); sslContextFactory.start();
SSLContext sslContext = sslContextFactory.getSslContext(); SSLContext sslContext = sslContextFactory.getSslContext();
try (SSLSocket client = (SSLSocket)sslContext.getSocketFactory().createSocket("localhost", connector.getLocalPort())) try (SSLSocket client = (SSLSocket)sslContext.getSocketFactory().createSocket("localhost", connector.getLocalPort()))
@ -145,8 +144,8 @@ public class JDK9ALPNTest
client.startHandshake(); client.startHandshake();
OutputStream output = client.getOutputStream(); OutputStream output = client.getOutputStream();
output.write(("" + output.write((
"GET / HTTP/1.1\r\n" + "GET / HTTP/1.1\r\n" +
"Host: localhost\r\n" + "Host: localhost\r\n" +
"Connection: close\r\n" + "Connection: close\r\n" +
"\r\n" + "\r\n" +
@ -163,6 +162,5 @@ public class JDK9ALPNTest
break; break;
} }
} }
} }
} }

Some files were not shown because too many files have changed in this diff Show More