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:
commit
bd220400a1
|
@ -19,6 +19,7 @@ bin/
|
||||||
*.backup
|
*.backup
|
||||||
*.debug
|
*.debug
|
||||||
*.dump
|
*.dump
|
||||||
|
.attach_pid*
|
||||||
|
|
||||||
# vim
|
# vim
|
||||||
.*.sw[a-p]
|
.*.sw[a-p]
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
|
@ -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]--> <!--[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>
|
|
|
@ -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
|
||||||
|
|
267
VERSION.txt
267
VERSION.txt
|
@ -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
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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"));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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 <parseNumber>"));
|
assertThat("Response", resp, containsString("[c:catch] exception.message : In <parseNumber>"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@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>")));
|
||||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -0,0 +1,533 @@
|
||||||
|
<code_scheme name="Jetty" version="173">
|
||||||
|
<option name="AUTODETECT_INDENTS" value="false" />
|
||||||
|
<option name="LINE_SEPARATOR" value="
" />
|
||||||
|
<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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
||||||
|
|
|
@ -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> ");
|
thumbs.append("</a> ");
|
||||||
}
|
}
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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-->
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>");
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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>");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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();
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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());
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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">
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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">
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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>
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
Binary file not shown.
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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>
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
Loading…
Reference in New Issue