diff --git a/.circleci/config.yml b/.circleci/config.yml index be10f4a..c717bf7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,37 +1,41 @@ version: 2 +defaults: &defaults + working_directory: ~/repo + environment: + JVM_OPTS: -Xmx3200m + TERM: dumb + CI_NAME: "CircleCI" + +defaults_gradle: &defaults_bld + steps: + - checkout + - run: + name: Download the dependencies + command: ./bld download + - run: + name: Run tests with bld + command: ./bld compile test + jobs: - build: + bld_jdk18: + <<: *defaults + docker: - - image: circleci/openjdk:8-jdk + - image: cimg/openjdk:18.0 - working_directory: ~/repo + <<: *defaults_bld - environment: - JVM_OPTS: -Xmx3200m - TERM: dumb + bld_jdk17: + <<: *defaults - steps: - - checkout - - restore_cache: - keys: - - gradle-dependencies-{{ checksum "build.gradle" }} - # fallback to using the latest cache if no exact match is found - - gradle-dependencies- + docker: + - image: cimg/openjdk:17.0 - - run: - name: Gradle Dependencies - command: ./gradlew dependencies + <<: *defaults_bld - - save_cache: - paths: ~/.m2 - key: gradle-dependencies-{{ checksum "build.gradle" }} - - - run: - name: Run All Checks - command: ./gradlew check - - - store_artifacts: - path: build/reports/ - destination: reports - - store_test_results: - path: build/reports/ +workflows: + version: 2 + bld: + jobs: + - bld_jdk17 + - bld_jdk18 diff --git a/.github/workflows/bld.yml b/.github/workflows/bld.yml new file mode 100644 index 0000000..ddcc35c --- /dev/null +++ b/.github/workflows/bld.yml @@ -0,0 +1,32 @@ +name: bld-ci + +on: [ push, pull_request, workflow_dispatch ] + +jobs: + build-bld-project: + runs-on: ubuntu-latest + + strategy: + matrix: + java-version: [ 17, 19, 20 ] + + steps: + - name: Checkout source repository + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Set up JDK ${{ matrix.java-version }} + uses: actions/setup-java@v3 + with: + distribution: 'zulu' + java-version: ${{ matrix.java-version }} + + - name: Grant execute permission for bld + run: chmod +x bld + + - name: Download the dependencies + run: ./bld download + + - name: Run tests with bld + run: ./bld compile test \ No newline at end of file diff --git a/.github_changelog_generator b/.github_changelog_generator index 073fac8..19e45d2 100644 --- a/.github_changelog_generator +++ b/.github_changelog_generator @@ -1 +1 @@ -future-release=1.0.6 +future-release=1.1.0 diff --git a/.gitignore b/.gitignore index cb14895..091e664 100644 --- a/.gitignore +++ b/.gitignore @@ -1,25 +1,57 @@ -**/.idea/dictionaries -**/.idea/gradle.xml -**/.idea/libraries -**/.idea/tasks.xml -**/.idea/workspace.xml -*.iws -.DS_Store -.classpath .gradle -.nb-gradle -.project -.settings -/bin -/build -/deploy -/dist -/gen -/gradle.properties -/local.properties -/out -/proguard-project.txt -/project.properties -/test-output -Thumbs.db -ehthumbs.db \ No newline at end of file +.DS_Store +build +lib/bld/** +!lib/bld/bld-wrapper.properties +!lib/bld/bld-wrapper.jar +lib/compile/ +lib/runtime/ +lib/standalone/ +lib/test/ + +# IDEA ignores + +# User-specific +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Editor-based Rest Client +.idea/httpRequests + +local.properties \ No newline at end of file diff --git a/.idea/HttpStatus.iml b/.idea/HttpStatus.iml deleted file mode 100644 index d6ebd48..0000000 --- a/.idea/HttpStatus.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/app.iml b/.idea/app.iml new file mode 100644 index 0000000..787b59b --- /dev/null +++ b/.idea/app.iml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/bld.iml b/.idea/bld.iml new file mode 100644 index 0000000..e63e11e --- /dev/null +++ b/.idea/bld.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/checkstyle-idea.xml b/.idea/checkstyle-idea.xml deleted file mode 100644 index 95c433c..0000000 --- a/.idea/checkstyle-idea.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..d91f848 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/copyright/Erik_s_Copyright.xml b/.idea/copyright/Erik_s_Copyright.xml new file mode 100644 index 0000000..2bffb46 --- /dev/null +++ b/.idea/copyright/Erik_s_Copyright.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..1419e40 --- /dev/null +++ b/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 78c3966..1e01b48 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -1,59 +1,8 @@ \ No newline at end of file diff --git a/.idea/libraries/bld.xml b/.idea/libraries/bld.xml new file mode 100644 index 0000000..71decad --- /dev/null +++ b/.idea/libraries/bld.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/compile.xml b/.idea/libraries/compile.xml new file mode 100644 index 0000000..9bd86aa --- /dev/null +++ b/.idea/libraries/compile.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/runtime.xml b/.idea/libraries/runtime.xml new file mode 100644 index 0000000..2ae5c4b --- /dev/null +++ b/.idea/libraries/runtime.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/test.xml b/.idea/libraries/test.xml new file mode 100644 index 0000000..b80486a --- /dev/null +++ b/.idea/libraries/test.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 28a804d..fa84ea4 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,18 @@ - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 4c575ac..55adcb9 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,8 @@ - + + \ No newline at end of file diff --git a/.idea/modules/httpstatus.iml b/.idea/modules/httpstatus.iml deleted file mode 100644 index 24d0b52..0000000 --- a/.idea/modules/httpstatus.iml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations/Run Tests.xml b/.idea/runConfigurations/Run Tests.xml new file mode 100644 index 0000000..99dc892 --- /dev/null +++ b/.idea/runConfigurations/Run Tests.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 94a25f7..35eb1dd 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 7ee8f56..0000000 --- a/.travis.yml +++ /dev/null @@ -1,19 +0,0 @@ -language: java -dist: trusty - -jdk: - - oraclejdk8 - - openjdk14 - -addons: - sonarcloud: - organization: "ethauvin-github" - -before_install: - - chmod +x gradlew - -after_success: - - | - if [ "${TRAVIS_TEST_RESULT}" == 0 ] && [ "$TRAVIS_JDK_VERSION" == "openjdk14" ]; then - ./gradlew sonarqube - fi diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..2dd24a5 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "type": "java", + "name": "Run Tests", + "request": "launch", + "mainClass": "net.thauvin.erik.httpstatus.HttpStatusTest" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..84f1103 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,15 @@ +{ + "java.project.sourcePaths": [ + "src/main/java", + "src/main/resources", + "src/test/java", + "src/bld/java" + ], + "java.configuration.updateBuildConfiguration": "automatic", + "java.project.referencedLibraries": [ + "${HOME}/.rife2/dist/rife2-1.6.3.jar", + "lib/compile/*.jar", + "lib/runtime/*.jar", + "lib/test/*.jar" + ] +} diff --git a/CHANGELOG.md b/CHANGELOG.md index 15337f6..5a59454 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## [1.0.5](https://github.com/ethauvin/HttpStatus/tree/1.0.5) (2021-03-19) +## [1.0.5](https://github.com/ethauvin/HttpStatus/tree/1.0.5) (2021-03-20) [Full Changelog](https://github.com/ethauvin/HttpStatus/compare/1.0.4...1.0.5) diff --git a/HttpStatus.ipr b/HttpStatus.ipr deleted file mode 100644 index 7e19236..0000000 --- a/HttpStatus.ipr +++ /dev/null @@ -1,686 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Android Lint - - - Java - - - Portability issuesJava - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.8.x - - - - - - - - \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt index 2fba8ed..3f79a9e 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) 2015-2021, Erik C. Thauvin (erik@thauvin.net) +Copyright (c) 2015-2023, Erik C. Thauvin (erik@thauvin.net) All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/README.md b/README.md index 101a07f..ef20641 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,13 @@ # HttpStatus JSP Tag Library -[![Release](https://img.shields.io/github/release/ethauvin/httpstatus.svg)](https://github.com/ethauvin/httpstatus/releases/latest) [![Maven Central](https://img.shields.io/maven-central/v/net.thauvin.erik.httpstatus/httpstatus.svg?label=maven%20central)](https://search.maven.org/search?q=g:%22net.thauvin.erik.httpstatus%22%20AND%20a:%22httpstatus%22) -[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause) [![Known Vulnerabilities](https://snyk.io/test/github/ethauvin/httpstatus/badge.svg?targetFile=build.gradle)](https://snyk.io/test/github/ethauvin/httpstatus?targetFile=build.gradle) [![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ethauvin_HttpStatus&metric=alert_status)](https://sonarcloud.io/dashboard?id=ethauvin_HttpStatus) -[![Build Status](https://travis-ci.com/ethauvin/HttpStatus.svg?branch=master)](https://travis-ci.com/ethauvin/HttpStatus) [![Build status](https://ci.appveyor.com/api/projects/status/w5j4kul3w2rkigxb?svg=true)](https://ci.appveyor.com/project/ethauvin/httpstatus) [![CircleCI](https://circleci.com/gh/ethauvin/HttpStatus/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/HttpStatus/tree/master) +[![Java](https://img.shields.io/badge/java-17%2B-blue)](https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html) +[![Release](https://img.shields.io/github/release/ethauvin/httpstatus.svg)](https://github.com/ethauvin/httpstatus/releases/latest) +[![Maven Central](https://img.shields.io/maven-central/v/net.thauvin.erik.httpstatus/httpstatus.svg?label=maven%20central)](https://search.maven.org/search?q=g:%22net.thauvin.erik.httpstatus%22%20AND%20a:%22httpstatus%22) +![Sonatype Nexus (Snapshots)](https://img.shields.io/nexus/s/net.thauvin.erik.httpstatus/httpstatus?server=https%3A%2F%2Foss.sonatype.org) +[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause) +[![Known Vulnerabilities](https://snyk.io/test/github/ethauvin/httpstatus/badge.svg?targetFile=pom.xml)](https://snyk.io/test/github/ethauvin/httpstatus?targetFile=pom.xml) +[![GitHub CI](https://github.com/ethauvin/httpstatus/actions/workflows/bld.yml/badge.svg)](https://github.com/ethauvin/httpstatus/actions/workflows/bld.yml) +[![CircleCI](https://circleci.com/gh/ethauvin/HttpStatus/tree/master.svg?style=shield)](https://circleci.com/gh/ethauvin/HttpStatus/tree/master) A simple [JSP](http://www.oracle.com/technetwork/java/javaee/jsp/index.html) Tag Library to display the [code](#hscode), [reason](#hsreason), [cause](#hscode) and/or [message](#hsmessage) for [HTTP status codes](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html) in JSP error pages. @@ -32,6 +37,29 @@ would display on a [501 status code](http://www.w3.org/Protocols/rfc2616/rfc2616 Not Implemented +## Usage with [Gradle](https://gradle.org/) or [Maven](http://maven.apache.org/) +Include the following in your `build.gradle` file: + +```gradle +repositories { + mavenCentral() +} + +dependencies { + implementation 'net.thauvin.erik.httpstatus:httpstatus:1.1.0' +} +``` + +or as a Maven artifact: + +```xml + + net.thauvin.erik.httpstatus + httpstatus + 1.1.0 + +``` + ## hs:cause The `` tag displays the cause of current HTTP status code, if any. A shorthand for: @@ -79,7 +107,59 @@ Attribute | Description `default` | The fallback value to output, if no reason is available. `escapeXml` | Converts <, >, &, ', " to their corresponding [entity codes](http://dev.w3.org/html5/html-author/charref). Value is `true` by default. -The reasons are defined in a [ResourceBundle](http://docs.oracle.com/javase/8/docs/api/java/util/ResourceBundle.html) properties as follows: +## StatusCode Bean + +The `StatusCode` bean can be used to check the class of the status code error. For example, using the JSTL: + +```jsp +<%@ taglib prefix="hs" uri="http://erik.thauvin.net/taglibs/httpstatus" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + + An error occurred on your side. () + + + An error occurred on our side. () + + +``` + +or in a Servlet: + +```java +import net.thauvin.erik.httpstatus.StatusCode; + +// --- + +StatusCode statusCode = new StatusCode((Integer) request.getAttribute("javax.servlet.error.status_code")); +if (statusCode.isError()) { + if (statusCode.isServerError()) { + String reason = statusCode.getReason(); + } else { + // ... + } +} +``` + +The `StatusCode` bean methods are: + +Method | Description +----------------- | -------------------------------------------------------------------- +`getReason` | Returns the reason for the status code (eg: `Internal Server Error`) +`isClientError` | Checks if the status code is a client error. +`isError` | Checks if the status code is a server or client error. +`isInfo` | Checks if the status code is informational. +`isRedirect` | Checks if the status code is a redirect. +`isServerError` | Checks if the status code is a server error. +`isSuccess` | Checks if the status code is a success. (`OK`) +`isValid` | Checks if the status code is valid. + +## Reasons + +The reasons are defined in a [ResourceBundle](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/ResourceBundle.html) properties as follows: Status Code | Reason ----------- | ----------------------------------- @@ -175,30 +255,11 @@ Status Code | Reason `598` | Network Read Timeout Error `599` | Network Connect Timeout Error -## Usage with [Gradle](https://gradle.org/) or [Maven](http://maven.apache.org/) -Include the following in your `build.gradle` file: - -```gradle -dependencies { - implementation 'net.thauvin.erik.httpstatus:httpstatus:1.0.5' -} -``` - -or as a Maven artifact: - -```xml - - net.thauvin.erik.httpstatus - httpstatus - 1.0.5 - -``` - ## Command Line Usage You can query the reason phrase for status codes as follows: ```sh -$ java -jar httpstatus-1.0.5.jar 404 500 +$ java -jar httpstatus-1.1.0.jar 404 500 404: Not Found 500: Internal Server Error ``` @@ -206,7 +267,7 @@ $ java -jar httpstatus-1.0.5.jar 404 500 If no status code is specified, all will be printed: ```sh -$ java -jar httpstatus-1.0.5.jar +$ java -jar httpstatus-1.1.0.jar 100: Continue 101: Switching Protocols 102: Processing diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 0ee7361..0000000 --- a/appveyor.yml +++ /dev/null @@ -1,26 +0,0 @@ -version: "{branch} {build}" -skip_tags: true - -build: - verbosity: detailed - -build_script: - - gradlew.bat assemble --info --no-daemon - -test_script: - - gradlew.bat check --info --no-daemon - -branches: - only: - - master - -cache: - - C:\Users\appveyor\.gradle - -environment: - matrix: - - JAVA_HOME: C:\Program Files\Java\jdk1.8.0 - - JAVA_HOME: C:\Program Files (x86)\Java\jdk1.8.0 - -matrix: - fast_finish: true diff --git a/bld b/bld new file mode 100755 index 0000000..0880033 --- /dev/null +++ b/bld @@ -0,0 +1,2 @@ +#!/usr/bin/env sh +java -jar "$(dirname "$0")/lib/bld/bld-wrapper.jar" "$0" --build net.thauvin.erik.httpstatus.HttpStatusBuild "$@" \ No newline at end of file diff --git a/bld.bat b/bld.bat new file mode 100644 index 0000000..2810ee8 --- /dev/null +++ b/bld.bat @@ -0,0 +1,4 @@ +@echo off +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +java -jar "%DIRNAME%/lib/bld/bld-wrapper.jar" "%0" --build net.thauvin.erik.httpstatus.HttpStatusBuild %* \ No newline at end of file diff --git a/build.gradle b/build.gradle deleted file mode 100644 index f7ab512..0000000 --- a/build.gradle +++ /dev/null @@ -1,221 +0,0 @@ -plugins { - id 'checkstyle' - id 'java' - id 'jacoco' - id 'idea' - id 'application' - id 'maven-publish' - id 'signing' - id 'pmd' - id 'com.github.ben-manes.versions' version '0.38.0' - id 'net.thauvin.erik.gradle.semver' version '1.0.4' - id 'com.github.spotbugs' version '4.7.0' - id 'org.sonarqube' version '3.1.1' -} - -import com.github.spotbugs.snom.SpotBugsTask -import org.apache.tools.ant.taskdefs.condition.Os - -defaultTasks 'deploy' - -def deployDir = 'deploy' - -def mavenName = 'HttpStatus' -def mavenDescription = 'HttpStatus JSP Tag Library' -def mavenUrl = 'https://github.com/ethauvin/HttpStatus' -def mavenLicense = 'The BSD 3-Clause License' -def mavenLicenseUrl = 'http://opensource.org/licenses/BSD-3-Clause' -def mavenScmCon = 'https://github.com/ethauvin/HttpStatus.git' -def mavenScmDevCon = 'git@github.com:ethauvin/HttpStatus.git' - -group = 'net.thauvin.erik.httpstatus' - -mainClassName = 'net.thauvin.erik.httpstatus.Reasons' - -ext { - versions = [ - spotbugs: '4.2.2' - ] -} - -repositories { - mavenLocal() - mavenCentral() -} - -dependencies { - implementation 'javax.servlet:javax.servlet-api:4.0.1' - implementation 'javax.servlet.jsp:jsp-api:2.2.1-b03' - implementation 'javax.el:javax.el-api:3.0.1-b06' - - - spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.11.0' - spotbugsPlugins 'com.mebigfatguy.sb-contrib:sb-contrib:7.4.7' - - compileOnly "com.github.spotbugs:spotbugs-annotations:$versions.spotbugs" - testCompileOnly "com.github.spotbugs:spotbugs-annotations:$versions.spotbugs" - - testImplementation 'org.testng:testng:7.4.0' -} - -tasks.withType(JavaCompile) { - options.encoding = 'UTF-8' -} - -java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 - withJavadocJar() - withSourcesJar() -} - -javadoc { - doFirst { - title = mavenDescription + ' ' + project.version - } - options.source = 8 - options.tags = ['created'] - options.author = true - options.links('https://docs.oracle.com/javase/8/docs/api/') - options.addStringOption('Xdoclint:none', '-quiet') -} - -jar { - manifest.attributes('Main-Class': mainClassName) -} - -clean { - doLast { - project.delete(fileTree(deployDir)) - } -} - -test { - useTestNG() -} - -spotbugs { - toolVersion = versions.spotbugs - excludeFilter = file("$projectDir/config/spotbugs/excludeFilter.xml") -} - -pmd { - ignoreFailures = true - ruleSets = [] - ruleSetFiles = files("${projectDir}/config/pmd.xml") - consoleOutput = true -} - -tasks.withType(Checkstyle) { - reports { - xml.enabled = false - html.enabled = true - } -} - -publishing { - publications { - mavenJava(MavenPublication) { - from components.java - groupId project.group - artifactId rootProject.name - - pom { - name = mavenName - description = mavenDescription - url = mavenUrl - licenses { - license { - name = mavenLicense - url = mavenLicenseUrl - } - } - developers { - developer { - id = 'ethauvin' - name = 'Erik C. Thauvin' - email = 'erik@thauvin.net' - url = 'https://erik.thauvin.net/' - } - } - scm { - connection = 'scm:git:' + mavenScmCon - developerConnection = 'scm:git:' + mavenScmDevCon - url = mavenUrl - } - } - } - } - repositories { - maven { - name = "ossrh" - url = "https://oss.sonatype.org/service/local/staging/deploy/maven2/" - credentials(PasswordCredentials) - } - } -} - -signing { - useGpgCmd() - sign publishing.publications.mavenJava -} - -task copyToDeploy(type: Copy) { - from(configurations.runtime) { - exclude 'javax.servlet-api-*.jar' - exclude 'jsp-api-*.jar' - } - from jar - into deployDir -} - -task deploy(dependsOn: ['clean', 'build', 'copyToDeploy']) { - description = 'Copies all needed files to the ${deployDir} directory.' - group = 'Publishing' - outputs.dir deployDir - inputs.files copyToDeploy - mustRunAfter clean -} - -task release(dependsOn: ['wrapper', 'deploy', 'pandoc', 'publishToMavenLocal']) { - group = 'Publishing' - description = 'Releases new version.' -} - -task pandoc(type: Exec) { - group = 'Documentation' - def pandoc_args = ['--from', 'gfm', - '--to', 'html5', - '--metadata', "pagetitle=$mavenDescription", - '-s', - '-c', 'github-pandoc.css', - '-o', 'docs/README.html', - 'README.md'] - if (Os.isFamily(Os.FAMILY_WINDOWS)) { - commandLine(['cmd', '/c', 'pandoc'] + pandoc_args) - } else { - executable 'pandoc' - args pandoc_args - } - standardOutput = new ByteArrayOutputStream() - ext.output = { - return standardOutput.toString() - } -} - -jacocoTestReport { - reports { - xml.enabled true - } -} - -sonarqube { - properties { - property("sonar.projectKey", "ethauvin_HttpStatus") - property("sonar.sourceEncoding", "UTF-8") - } -} - -tasks.sonarqube { - dependsOn("jacocoTestReport") -} diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml deleted file mode 100644 index c5f6465..0000000 --- a/config/checkstyle/checkstyle.xml +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/config/pmd.xml b/config/pmd.xml index 32ca5ab..1039e40 100644 --- a/config/pmd.xml +++ b/config/pmd.xml @@ -1,120 +1,88 @@ - - Erik's Ruleset - - - - - - - - - + + + + + + + + value="//MethodDeclaration[@Name='hashCode' or @Name='equals' or @Name='toString']"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + @@ -122,148 +90,21 @@ - - - - - - - - - - - - - - - - - - - - - - - - - > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ^ignore$ - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - + + + \ No newline at end of file diff --git a/config/spotbugs/excludeFilter.xml b/config/spotbugs/excludeFilter.xml deleted file mode 100644 index ddb2db1..0000000 --- a/config/spotbugs/excludeFilter.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..0497b23 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +./gradlew deploy +[ $? -eq 0 ] && scp deploy/*.jar nix3.thauvin.us:/opt/lib/jtalk-ee/httpstatus diff --git a/docs/README.html b/docs/README.html deleted file mode 100644 index b04e36c..0000000 --- a/docs/README.html +++ /dev/null @@ -1,582 +0,0 @@ - - - - - - - HttpStatus JSP Tag Library - - - - - -

HttpStatus JSP Tag Library

-

Release Maven Central
-License (3-Clause BSD) Known Vulnerabilities Quality Gate Status
-Build Status Build status CircleCI

-

A simple JSP Tag Library to display the code, reason, cause and/or message for HTTP status codes in JSP error pages.

-

For example:

- -

or

- -

would display on a 501 status code:

-
Not Implemented
-
-

hs:cause

-

The <hs:cause/> tag displays the cause of current HTTP status code, if any. A shorthand for:

- -

Optional attributes are:

- - - - - - - - - - - - - - - - - -
AttributeDescription
defaultThe fallback value to output, if no cause is available.
escapeXmlConverts <, >, &, ', " to their corresponding entity codes. Value is true by default.
-

hs:code

-

The <hs:code/> tag displays the current HTTP status code, if any. A shorthand for:

- -

hs:message

-

The <hs:message/> tag displays the current error message, if any. A shorthand for:

- -

Optional attributes are:

- - - - - - - - - - - - - - - - - -
AttributeDescription
defaultThe fallback value to output, if no error message is available.
escapeXmlConverts <, >, &, ', " to their corresponding entity codes. Value is true by default.
-

hs:reason

-

The <hs:reason/> tag displays the reason for a HTTP status code, if any. Optional attributes are:

- - - - - - - - - - - - - - - - - - - - - -
AttributeDescription
codeThe HTTP status error code. If not specified the current status code is used.
defaultThe fallback value to output, if no reason is available.
escapeXmlConverts <, >, &, ', " to their corresponding entity codes. Value is true by default.
-

The reasons are defined in a ResourceBundle properties as follows:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Status CodeReason
100Continue
101Switching Protocols
102Processing
103Early Hints
200OK
201Created
202Accepted
203Non-Authoritative Information
204No Content
205Reset Content
206Partial Content
207Multi-Status
208Already Reported
218This is fine
226IM Used
300Multiple Choices
301Moved Permanently
302Found/Moved Temporarily
303See Other
304Not Modified
305Use Proxy
306Switch Proxy
307Temporary Redirect
308Permanent Redirect
400Bad Request
401Unauthorized
402Payment Required
403Forbidden
404Not Found
405Method Not Allowed
406Not Acceptable
407Proxy Authentication Required
408Request Timeout
409Conflict
410Gone
411Length Required
412Precondition Failed
413Request Entity/Payload Too Large
414Request-URI Too Long
415Unsupported Media Type
416Requested Range Not Satisfiable
417Expectation Failed
418I'm A Teapot
419Insufficient Space on Resource
420Method Failure
421Misdirected Request
422Unprocessable Entity
423Locked
424Failed Dependency
426Upgrade Required
428Precondition Required
429Too Many Requests
430Request Header Fields Too Large
431Request Header Fields Too Large
440Login Timeout
444No Response
449Retry With
450Blocked by Windows Parental Controls
451Unavailable For Legal Reasons
460Client Closed Connection Before Load Balancer Idle Timeout
463X-Forwarded-For Header with More than 30 IP Addresses
494Request Header Too Large
495SSL Certificate Error
496No SSL Certificate
497HTTP Request Sent to HTTPS Port
498Token Expired/Invalid
499Client Closed Request
500Internal Server Error
501Not Implemented
502Bad Gateway
503Service Unavailable
504Gateway Timeout
505HTTP Version Not Supported
506Variant Also Negotiates
507Insufficient Storage
508Loop Detected
509Bandwidth Limit Exceeded
510Not Extended
511Network Authentication Required
520Unknown Error
521Web Server Is Down
522Origin Connection Time-out
523Origin Is Unreachable
524A Timeout Occurred
525SSL Handshake Failed
526Invalid SSL Certificate
527Railgun Error
529Site is overloaded
530Site is frozen
598Network Read Timeout Error
599Network Connect Timeout Error
-

Usage with Gradle or Maven

-

Include the following in your build.gradle file:

-
dependencies {
-    implementation 'net.thauvin.erik.httpstatus:httpstatus:1.0.5'
-}
-
-

or as a Maven artifact:

- -

Command Line Usage

-

You can query the reason phrase for status codes as follows:

- -

If no status code is specified, all will be printed:

- - - diff --git a/docs/github-pandoc.css b/docs/github-pandoc.css deleted file mode 100644 index d7edd25..0000000 --- a/docs/github-pandoc.css +++ /dev/null @@ -1,425 +0,0 @@ -/* github-pandoc.css found at https://gist.github.com/dashed/6714393 */ -/*! normalize.css v2.1.3 | MIT License | git.io/normalize */ - -/* ========================================================================== - HTML5 display definitions - ========================================================================== */ - -/** - * Correct `block` display not defined in IE 8/9. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section, -summary { - display: block; -} - -/** - * Correct `inline-block` display not defined in IE 8/9. - */ - -audio, -canvas, -video { - display: inline-block; -} - -/** - * Prevent modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ - -audio:not([controls]) { - display: none; - height: 0; -} - -/** - * Address `[hidden]` styling not present in IE 8/9. - * Hide the `template` element in IE, Safari, and Firefox < 22. - */ - -[hidden], -template { - display: none; -} - -/* ========================================================================== - Base - ========================================================================== */ - -/** - * 1. Set default font family to sans-serif. - * 2. Prevent iOS text size adjust after orientation change, without disabling - * user zoom. - */ - -html { - font-family: sans-serif; /* 1 */ - -ms-text-size-adjust: 100%; /* 2 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/** - * Remove default margin. - */ - -body { - margin: 0; -} - -/* ========================================================================== - Links - ========================================================================== */ - -/** - * Remove the gray background color from active links in IE 10. - */ - -a { - background: transparent; -} - -/** - * Address `outline` inconsistency between Chrome and other browsers. - */ - -a:focus { - outline: thin dotted; -} - -/** - * Improve readability when focused and also mouse hovered in all browsers. - */ - -a:active, -a:hover { - outline: 0; -} - -/* ========================================================================== - Typography - ========================================================================== */ - -/** - * Address variable `h1` font-size and margin within `section` and `article` - * contexts in Firefox 4+, Safari 5, and Chrome. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -/** - * Address styling not present in IE 8/9, Safari 5, and Chrome. - */ - -abbr[title] { - border-bottom: 1px dotted; -} - -/** - * Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. - */ - -b, -strong { - font-weight: bold; -} - -/** - * Address styling not present in Safari 5 and Chrome. - */ - -dfn { - font-style: italic; -} - -/** - * Address differences between Firefox and other browsers. - */ - -hr { - -moz-box-sizing: content-box; - box-sizing: content-box; - height: 0; -} - -/** - * Address styling not present in IE 8/9. - */ - -mark { - background: #ff0; - color: #000; -} - -/** - * Correct font family set oddly in Safari 5 and Chrome. - */ - -code, -kbd, -pre, -samp { - font-family: monospace, serif; - font-size: 1em; -} - -/** - * Improve readability of pre-formatted text in all browsers. - */ - -pre { - white-space: pre-wrap; -} - -/** - * Set consistent quote types. - */ - -q { - quotes: "\201C" "\201D" "\2018" "\2019"; -} - -/** - * Address inconsistent and variable font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` affecting `line-height` in all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -/* ========================================================================== - Embedded content - ========================================================================== */ - -/** - * Remove border when inside `a` element in IE 8/9. - */ - -img { - border: 0; -} - -/** - * Correct overflow displayed oddly in IE 9. - */ - -svg:not(:root) { - overflow: hidden; -} - -/* ========================================================================== - Figures - ========================================================================== */ - -/** - * Address margin not present in IE 8/9 and Safari 5. - */ - -figure { - margin: 0; -} - -/* ========================================================================== - Forms - ========================================================================== */ - -/** - * Define consistent border, margin, and padding. - */ - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -/** - * 1. Correct `color` not being inherited in IE 8/9. - * 2. Remove padding so people aren't caught out if they zero out fieldsets. - */ - -legend { - border: 0; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * 1. Correct font family not being inherited in all browsers. - * 2. Correct font size not being inherited in all browsers. - * 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. - */ - -button, -input, -select, -textarea { - font-family: inherit; /* 1 */ - font-size: 100%; /* 2 */ - margin: 0; /* 3 */ -} - -/** - * Address Firefox 4+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. - */ - -button, -input { - line-height: normal; -} - -/** - * Address inconsistent `text-transform` inheritance for `button` and `select`. - * All other form control elements do not inherit `text-transform` values. - * Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. - * Correct `select` style inheritance in Firefox 4+ and Opera. - */ - -button, -select { - text-transform: none; -} - -/** - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Correct inability to style clickable `input` types in iOS. - * 3. Improve usability and consistency of cursor style between image-type - * `input` and others. - */ - -button, -html input[type="button"], /* 1 */ -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; /* 2 */ - cursor: pointer; /* 3 */ -} - -/** - * Re-set default cursor for disabled elements. - */ - -button[disabled], -html input[disabled] { - cursor: default; -} - -/** - * 1. Address box sizing set to `content-box` in IE 8/9/10. - * 2. Remove excess padding in IE 8/9/10. - */ - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/** - * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. - * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome - * (include `-moz` to future-proof). - */ - -input[type="search"] { - -webkit-appearance: textfield; /* 1 */ - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; /* 2 */ - box-sizing: content-box; -} - -/** - * Remove inner padding and search cancel button in Safari 5 and Chrome - * on OS X. - */ - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * Remove inner padding and border in Firefox 4+. - */ - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -/** - * 1. Remove default vertical scrollbar in IE 8/9. - * 2. Improve readability and alignment in all browsers. - */ - -textarea { - overflow: auto; /* 1 */ - vertical-align: top; /* 2 */ -} - -/* ========================================================================== - Tables - ========================================================================== */ - -/** - * Remove most spacing between table cells. - */ - -table { - border-collapse: collapse; - border-spacing: 0; -} - -.go-top { -position: fixed; -bottom: 2em; -right: 2em; -text-decoration: none; -background-color: #E0E0E0; -font-size: 12px; -padding: 1em; -display: inline; -} - -/* Github css */ - -html,body{ margin: auto; - padding-right: 1em; - padding-left: 1em; - max-width: 44em; color:black;}*:not('#mkdbuttons'){margin:0;padding:0}body{font:13.34px helvetica,arial,freesans,clean,sans-serif;-webkit-font-smoothing:subpixel-antialiased;line-height:1.4;padding:3px;background:#fff;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px}p{margin:1em 0}a{color:#4183c4;text-decoration:none}body{background-color:#fff;padding:30px;margin:15px;font-size:14px;line-height:1.6}body>*:first-child{margin-top:0!important}body>*:last-child{margin-bottom:0!important}@media screen{body{box-shadow:0 0 0 1px #cacaca,0 0 0 4px #eee}}h1,h2,h3,h4,h5,h6{margin:20px 0 10px;padding:0;font-weight:bold;-webkit-font-smoothing:subpixel-antialiased;cursor:text}h1{font-size:28px;color:#000}h2{font-size:24px;border-bottom:1px solid #ccc;color:#000}h3{font-size:18px;color:#333}h4{font-size:16px;color:#333}h5{font-size:14px;color:#333}h6{color:#777;font-size:14px}p,blockquote,table,pre{margin:15px 0}ul{padding-left:30px}ol{padding-left:30px}ol li ul:first-of-type{margin-top:0}hr{background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENDRjNBN0E2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENDRjNBN0I2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0NGM0E3ODY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0NGM0E3OTY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqqezsUAAAAfSURBVHjaYmRABcYwBiM2QSA4y4hNEKYDQxAEAAIMAHNGAzhkPOlYAAAAAElFTkSuQmCC) repeat-x 0 0;border:0 none;color:#ccc;height:4px;padding:0}body>h2:first-child{margin-top:0;padding-top:0}body>h1:first-child{margin-top:0;padding-top:0}body>h1:first-child+h2{margin-top:0;padding-top:0}body>h3:first-child,body>h4:first-child,body>h5:first-child,body>h6:first-child{margin-top:0;padding-top:0}a:first-child h1,a:first-child h2,a:first-child h3,a:first-child h4,a:first-child h5,a:first-child h6{margin-top:0;padding-top:0}h1+p,h2+p,h3+p,h4+p,h5+p,h6+p,ul li>:first-child,ol li>:first-child{margin-top:0}dl{padding:0}dl dt{font-size:14px;font-weight:bold;font-style:italic;padding:0;margin:15px 0 5px}dl dt:first-child{padding:0}dl dt>:first-child{margin-top:0}dl dt>:last-child{margin-bottom:0}dl dd{margin:0 0 15px;padding:0 15px}dl dd>:first-child{margin-top:0}dl dd>:last-child{margin-bottom:0}blockquote{border-left:4px solid #DDD;padding:0 15px;color:#777}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}table{border-collapse:collapse;border-spacing:0;font-size:100%;font:inherit}table th{font-weight:bold;border:1px solid #ccc;padding:6px 13px}table td{border:1px solid #ccc;padding:6px 13px}table tr{border-top:1px solid #ccc;background-color:#fff}table tr:nth-child(2n){background-color:#f8f8f8}img{max-width:100%}code,tt{margin:0 2px;padding:0 5px;white-space:nowrap;border:1px solid #eaeaea;background-color:#f8f8f8;border-radius:3px;font-family:Consolas,'Liberation Mono',Courier,monospace;font-size:12px;color:#333}pre>code{margin:0;padding:0;white-space:pre;border:0;background:transparent}.highlight pre{background-color:#f8f8f8;border:1px solid #ccc;font-size:13px;line-height:19px;overflow:auto;padding:6px 10px;border-radius:3px}pre{background-color:#f8f8f8;border:1px solid #ccc;font-size:13px;line-height:19px;overflow:auto;padding:6px 10px;border-radius:3px}pre code,pre tt{background-color:transparent;border:0}.poetry pre{font-family:Georgia,Garamond,serif!important;font-style:italic;font-size:110%!important;line-height:1.6em;display:block;margin-left:1em}.poetry pre code{font-family:Georgia,Garamond,serif!important;word-break:break-all;word-break:break-word;-webkit-hyphens:auto;-moz-hyphens:auto;hyphens:auto;white-space:pre-wrap}sup,sub,a.footnote{font-size:1.4ex;height:0;line-height:1;vertical-align:super;position:relative}sub{vertical-align:sub;top:-1px}@media print{body{background:#fff}img,pre,blockquote,table,figure{page-break-inside:avoid}body{background:#fff;border:0}code{background-color:#fff;color:#333!important;padding:0 .2em;border:1px solid #dedede}pre{background:#fff}pre code{background-color:white!important;overflow:visible}}@media screen{body.inverted{color:#eee!important;border-color:#555;box-shadow:none}.inverted body,.inverted hr .inverted p,.inverted td,.inverted li,.inverted h1,.inverted h2,.inverted h3,.inverted h4,.inverted h5,.inverted h6,.inverted th,.inverted .math,.inverted caption,.inverted dd,.inverted dt,.inverted blockquote{color:#eee!important;border-color:#555;box-shadow:none}.inverted td,.inverted th{background:#333}.inverted h2{border-color:#555}.inverted hr{border-color:#777;border-width:1px!important}::selection{background:rgba(157,193,200,0.5)}h1::selection{background-color:rgba(45,156,208,0.3)}h2::selection{background-color:rgba(90,182,224,0.3)}h3::selection,h4::selection,h5::selection,h6::selection,li::selection,ol::selection{background-color:rgba(133,201,232,0.3)}code::selection{background-color:rgba(0,0,0,0.7);color:#eee}code span::selection{background-color:rgba(0,0,0,0.7)!important;color:#eee!important}a::selection{background-color:rgba(255,230,102,0.2)}.inverted a::selection{background-color:rgba(255,230,102,0.6)}td::selection,th::selection,caption::selection{background-color:rgba(180,237,95,0.5)}.inverted{background:#0b2531;background:#252a2a}.inverted body{background:#252a2a}.inverted a{color:#acd1d5}}.highlight .c{color:#998;font-style:italic}.highlight .err{color:#a61717;background-color:#e3d2d2}.highlight .k,.highlight .o{font-weight:bold}.highlight .cm{color:#998;font-style:italic}.highlight .cp{color:#999;font-weight:bold}.highlight .c1{color:#998;font-style:italic}.highlight .cs{color:#999;font-weight:bold;font-style:italic}.highlight .gd{color:#000;background-color:#fdd}.highlight .gd .x{color:#000;background-color:#faa}.highlight .ge{font-style:italic}.highlight .gr{color:#a00}.highlight .gh{color:#999}.highlight .gi{color:#000;background-color:#dfd}.highlight .gi .x{color:#000;background-color:#afa}.highlight .go{color:#888}.highlight .gp{color:#555}.highlight .gs{font-weight:bold}.highlight .gu{color:#800080;font-weight:bold}.highlight .gt{color:#a00}.highlight .kc,.highlight .kd,.highlight .kn,.highlight .kp,.highlight .kr{font-weight:bold}.highlight .kt{color:#458;font-weight:bold}.highlight .m{color:#099}.highlight .s{color:#d14}.highlight .na{color:#008080}.highlight .nb{color:#0086b3}.highlight .nc{color:#458;font-weight:bold}.highlight .no{color:#008080}.highlight .ni{color:#800080}.highlight .ne,.highlight .nf{color:#900;font-weight:bold}.highlight .nn{color:#555}.highlight .nt{color:#000080}.highlight .nv{color:#008080}.highlight .ow{font-weight:bold}.highlight .w{color:#bbb}.highlight .mf,.highlight .mh,.highlight .mi,.highlight .mo{color:#099}.highlight .sb,.highlight .sc,.highlight .sd,.highlight .s2,.highlight .se,.highlight .sh,.highlight .si,.highlight .sx{color:#d14}.highlight .sr{color:#009926}.highlight .s1{color:#d14}.highlight .ss{color:#990073}.highlight .bp{color:#999}.highlight .vc,.highlight .vg,.highlight .vi{color:#008080}.highlight .il{color:#099}.highlight .gc{color:#999;background-color:#eaf2f5}.type-csharp .highlight .k,.type-csharp .highlight .kt{color:#00F}.type-csharp .highlight .nf{color:#000;font-weight:normal}.type-csharp .highlight .nc{color:#2b91af}.type-csharp .highlight .nn{color:#000}.type-csharp .highlight .s,.type-csharp .highlight .sc{color:#a31515} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index e708b1c..0000000 Binary files a/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 442d913..0000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew deleted file mode 100755 index 4f906e0..0000000 --- a/gradlew +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# 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 -# -# https://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. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat deleted file mode 100644 index 107acd3..0000000 --- a/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/lib/bld/bld-wrapper.jar b/lib/bld/bld-wrapper.jar new file mode 100644 index 0000000..808a03c Binary files /dev/null and b/lib/bld/bld-wrapper.jar differ diff --git a/lib/bld/bld-wrapper.properties b/lib/bld/bld-wrapper.properties new file mode 100644 index 0000000..bf89ff6 --- /dev/null +++ b/lib/bld/bld-wrapper.properties @@ -0,0 +1,6 @@ +bld.downloadExtensionJavadoc=false +bld.downloadExtensionSources=true +bld.extension-pmd=com.uwyn.rife2:bld-pmd:0.9.1 +bld.repositories=MAVEN_LOCAL,MAVEN_CENTRAL,RIFE2_SNAPSHOTS,RIFE2_RELEASES +rife2.downloadLocation= +rife2.version=1.6.3 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..9a3ab33 --- /dev/null +++ b/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + net.thauvin.erik.httpstatus + httpstatus + 1.1.0-SNAPSHOT + HttpStatus + HttpStatus JSP Tag Library + https://github.com/ethauvin/HttpStatus + + + The BSD 3-Clause License + http://opensource.org/licenses/BSD-3-Clause + + + + + jakarta.servlet + jakarta.servlet-api + 6.0.0 + compile + + + jakarta.servlet.jsp + jakarta.servlet.jsp-api + 3.1.1 + compile + + + jakarta.el + jakarta.el-api + 5.0.1 + compile + + + + + ethauvin + Erik C. Thauvin + erik@thauvin.net + https://erik.thauvin.net/ + + + + scm:git:https://github.com/ethauvin/HttpStatus.git + scm:git:git@github.com:ethauvin/HttpStatus.git + https://github.com/ethauvin/HttpStatus + + diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index b28649f..0000000 --- a/settings.gradle +++ /dev/null @@ -1,19 +0,0 @@ -/* - * This settings file was auto generated by the Gradle buildInit task - * by 'erik' at '12/2/15 1:19 PM' with Gradle 2.9 - * - * The settings file is used to specify which projects to include in your build. - * In a single project build this file can be empty or even removed. - * - * Detailed information about configuring a multi-project build in Gradle can be found - * in the user guide at https://docs.gradle.org/2.9/userguide/multi_project_builds.html - */ - -/* -// To declare projects as part of a multi-project build use the 'include' method -include 'shared' -include 'api' -include 'services:webservice' -*/ - -rootProject.name = 'httpstatus' \ No newline at end of file diff --git a/src/bld/java/net/thauvin/erik/httpstatus/HttpStatusBuild.java b/src/bld/java/net/thauvin/erik/httpstatus/HttpStatusBuild.java new file mode 100644 index 0000000..79cbac7 --- /dev/null +++ b/src/bld/java/net/thauvin/erik/httpstatus/HttpStatusBuild.java @@ -0,0 +1,128 @@ +/* + * HttpStatusBuild.java + * + * Copyright 2023 sErik C. Thauvin (erik@thauvin.net) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Neither the name of this project nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.thauvin.erik.httpstatus; + +import rife.bld.BuildCommand; +import rife.bld.Project; +import rife.bld.dependencies.Dependency; +import rife.bld.extension.PmdOperation; +import rife.bld.publish.PublishDeveloper; +import rife.bld.publish.PublishInfo; +import rife.bld.publish.PublishLicense; +import rife.bld.publish.PublishScm; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.List; + +import static rife.bld.dependencies.Repository.*; +import static rife.bld.dependencies.Scope.compile; +import static rife.bld.dependencies.Scope.test; +import static rife.bld.operations.JavadocOptions.DocLinkOption.NO_MISSING; + +public class HttpStatusBuild extends Project { + public HttpStatusBuild() { + pkg = "net.thauvin.erik.httpstatus"; + name = "HttpStatus"; + version = version(1, 1, 0, "SNAPSHOT"); + + var description = "HttpStatus JSP Tag Library"; + var url = "https://github.com/ethauvin/HttpStatus"; + + mainClass = "net.thauvin.erik.httpstatus.Reasons"; + + javaRelease = 17; + + downloadSources = true; + repositories = List.of(MAVEN_LOCAL, MAVEN_CENTRAL, SONATYPE_SNAPSHOTS); + + scope(compile) + .include(dependency("jakarta.servlet", "jakarta.servlet-api", version(6, 0, 0))) + .include(dependency("jakarta.servlet.jsp", "jakarta.servlet.jsp-api", version(3, 1, 1))) + .include(dependency("jakarta.el", "jakarta.el-api", version(5, 0, 1))); + scope(test) + .include(dependency("org.assertj", "assertj-joda-time", version(2, 2, 0))) + .include(dependency("org.junit.jupiter", "junit-jupiter", version(5, 9, 3))) + .include(dependency("org.junit.platform", "junit-platform-console-standalone", version(1, 9, 3))); + + javadocOperation().javadocOptions() + .docTitle(description + ' ' + version.toString()) + .docLint(NO_MISSING) + .link("https://jakarta.ee/specifications/platform/9/apidocs/"); + + publishOperation() + .repository(version.isSnapshot() ? repository(SONATYPE_SNAPSHOTS_LEGACY.location()) + .withCredentials(property("sonatype.user"), property("sonatype.password")) + : repository(SONATYPE_RELEASES.location()) + .withCredentials(property("sonatype.user"), property("sonatype.password"))) + .repository(MAVEN_LOCAL) + .info(new PublishInfo() + .groupId(pkg) + .artifactId(name.toLowerCase()) + .name(name) + .description(description) + .url(url) + .developer(new PublishDeveloper().id("ethauvin").name("Erik C. Thauvin").email("erik@thauvin.net") + .url("https://erik.thauvin.net/")) + .license(new PublishLicense().name("The BSD 3-Clause License") + .url("http://opensource.org/licenses/BSD-3-Clause")) + .scm(new PublishScm().connection("scm:git:" + url + ".git") + .developerConnection("scm:git:git@github.com:ethauvin/" + name + ".git") + .url(url)) + .signKey(property("sign.key")) + .signPassphrase(property("sign.passphrase"))); + } + + public static void main(String[] args) { + new HttpStatusBuild().start(args); + } + + @Override + public void publish() throws Exception { + super.publish(); + var pomPath = Path.of(MAVEN_LOCAL.getArtifactLocation(new Dependency(pkg, name.toLowerCase(), version)), + version.toString(), + name.toLowerCase() + '-' + version + ".pom"); + Files.copy(pomPath, Path.of(workDirectory.getAbsolutePath(), "pom.xml"), StandardCopyOption.REPLACE_EXISTING); + } + + @BuildCommand(summary = "Runs PMD analysis") + public void pmd() throws Exception { + new PmdOperation() + .fromProject(this) + .failOnViolation(true) + .ruleSets("config/pmd.xml") + .execute(); + } +} \ No newline at end of file diff --git a/src/main/java/net/thauvin/erik/httpstatus/Reasons.java b/src/main/java/net/thauvin/erik/httpstatus/Reasons.java index 14bc9a1..6147a78 100644 --- a/src/main/java/net/thauvin/erik/httpstatus/Reasons.java +++ b/src/main/java/net/thauvin/erik/httpstatus/Reasons.java @@ -1,7 +1,7 @@ /* * Reasons.java * - * Copyright (c) 2015-2021, Erik C. Thauvin (erik@thauvin.net) + * Copyright 2023 sErik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,7 +42,7 @@ import java.util.concurrent.ConcurrentHashMap; * Populates the {@link #REASON_PHRASES reason phrases} map from {@link #BUNDLE_BASENAME bundle properties}, and * implements accessor methods. * - * @author Erik C. Thauvin + * @author Erik C. Thauvin * @created 2015-12-02 * @since 1.0 */ @@ -87,7 +87,6 @@ public final class Reasons { * @param statusCode The status code. * @return The reason phrase, or null. */ - @SuppressWarnings({"WeakerAccess"}) public static String getReasonPhrase(final String statusCode) { return REASON_PHRASES.get(statusCode); } @@ -118,4 +117,4 @@ public final class Reasons { System.out.println("Total: " + REASON_PHRASES.size()); } } -} \ No newline at end of file +} diff --git a/src/main/java/net/thauvin/erik/httpstatus/StatusCode.java b/src/main/java/net/thauvin/erik/httpstatus/StatusCode.java new file mode 100644 index 0000000..fdcc6e2 --- /dev/null +++ b/src/main/java/net/thauvin/erik/httpstatus/StatusCode.java @@ -0,0 +1,152 @@ +/* + * StatusCode.java + * + * Copyright 2023 sErik C. Thauvin (erik@thauvin.net) + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Neither the name of this project nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 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 + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package net.thauvin.erik.httpstatus; + +import java.io.Serial; +import java.io.Serializable; + +/** + * The StatusCode bean implements methods to check the class of an HTTP status code. + * + * @author Erik C. Thauvin + */ +public class StatusCode implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + private int code; + + /** + * Creates a new StatusCode object. + */ + public StatusCode() { + // Default constructor. + } + + /** + * Creates a new StatusCode object. + * + * @param code The status code. + */ + public StatusCode(final int code) { + this.code = code; + } + + /** + * Returns the status code. + */ + public int getCode() { + return code; + } + + /** + * Returns the reason for the status code. + * + * @return The reason, or null. + * @see Reasons#getReasonPhrase(int) + */ + public String getReason() { + return Reasons.getReasonPhrase(code); + } + + /** + * Checks if the status code is a client error. (eg: Internal Server Error) + * + * @return true if the status code is a client error, false otherwise. + */ + public boolean isClientError() { + return code >= 400 && code < 500; + } + + /** + * Checks if the status code is a client or server error. + * + * @return true if the status code is an error, false otherwise. + */ + public boolean isError() { + return code >= 400 && code < 600; + } + + /** + * Checks if the status code is informational. + * + * @return true if the status code is informational, false otherwise. + */ + public boolean isInfo() { + return code >= 100 && code < 200; + } + + /** + * Checks if the status code is a redirect. + * + * @return true if the status code is a redirect, false otherwise. + */ + public boolean isRedirect() { + return code >= 300 && code < 400; + } + + /** + * Checks if the status code is a server error. + * + * @return true if the status code is a server error, false otherwise. + */ + public boolean isServerError() { + return code >= 500 && code < 600; + } + + /** + * Checks if the status code is a (OK) success. + * + * @return true if the status code is a success, false otherwise. + */ + public boolean isSuccess() { + return code >= 200 && code < 300; + } + + /** + * Checks if the status code is valid. + * + * @return true if the status code is valid, false otherwise. + */ + public boolean isValid() { + return code >= 100 && code < 600; + } + + /** + * Sets the status code. + * + * @param code The HTTP status code. + */ + public void setCode(final int code) { + this.code = code; + } +} diff --git a/src/main/java/net/thauvin/erik/httpstatus/Utils.java b/src/main/java/net/thauvin/erik/httpstatus/Utils.java index 2752b60..8cf691b 100644 --- a/src/main/java/net/thauvin/erik/httpstatus/Utils.java +++ b/src/main/java/net/thauvin/erik/httpstatus/Utils.java @@ -1,7 +1,7 @@ /* * Utils.java * - * Copyright (c) 2015-2021, Erik C. Thauvin (erik@thauvin.net) + * Copyright 2023 sErik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -38,7 +38,7 @@ import java.io.Writer; /** * The Utils class implements a collection of utility methods used throughout this project. * - * @author Erik C. Thauvin + * @author Erik C. Thauvin * @created 2015-12-03 * @since 1.0 */ @@ -66,24 +66,12 @@ public final class Utils { for (int i = 0; i < value.length(); i++) { final char c = value.charAt(i); switch (c) { - case '<': - escaped.append("<"); - break; - case '>': - escaped.append(">"); - break; - case '&': - escaped.append("&"); - break; - case '\'': - escaped.append("'"); - break; - case '"': - escaped.append("""); - break; - default: - escaped.append(c); - break; + case '<' -> escaped.append("<"); + case '>' -> escaped.append(">"); + case '&' -> escaped.append("&"); + case '\'' -> escaped.append("'"); + case '"' -> escaped.append("""); + default -> escaped.append(c); } } diff --git a/src/main/java/net/thauvin/erik/httpstatus/taglibs/CauseTag.java b/src/main/java/net/thauvin/erik/httpstatus/taglibs/CauseTag.java index e7bb05d..54b01a7 100644 --- a/src/main/java/net/thauvin/erik/httpstatus/taglibs/CauseTag.java +++ b/src/main/java/net/thauvin/erik/httpstatus/taglibs/CauseTag.java @@ -1,7 +1,7 @@ /* * CauseTag.java * - * Copyright (c) 2015-2021, Erik C. Thauvin (erik@thauvin.net) + * Copyright 2023 sErik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,16 +32,16 @@ package net.thauvin.erik.httpstatus.taglibs; +import jakarta.servlet.jsp.JspWriter; +import jakarta.servlet.jsp.PageContext; import net.thauvin.erik.httpstatus.Utils; -import javax.servlet.jsp.JspWriter; -import javax.servlet.jsp.PageContext; import java.io.IOException; /** * The <hs:cause> tag returns the cause (if any) for the current HTTP Status Error Code. * - * @author Erik C. Thauvin + * @author Erik C. Thauvin * @created 2015-12-03 * @since 1.0 */ @@ -54,16 +54,13 @@ public class CauseTag extends XmlSupport { final PageContext pageContext = (PageContext) getJspContext(); @SuppressWarnings("PMD.CloseResource") final JspWriter out = pageContext.getOut(); - String cause; + final Throwable cause = pageContext.getErrorData().getThrowable().getCause(); - try { - cause = pageContext.getErrorData().getThrowable().getCause().getLocalizedMessage(); - } catch (NullPointerException ignore) { - cause = defaultValue; + String message = defaultValue; + if (cause != null && cause.getLocalizedMessage() != null) { + message = cause.getLocalizedMessage(); } - Utils.outWrite(out, cause, defaultValue, escapeXml); - - + Utils.outWrite(out, message, defaultValue, escapeXml); } } \ No newline at end of file diff --git a/src/main/java/net/thauvin/erik/httpstatus/taglibs/CodeTag.java b/src/main/java/net/thauvin/erik/httpstatus/taglibs/CodeTag.java index 2753d6b..763157a 100644 --- a/src/main/java/net/thauvin/erik/httpstatus/taglibs/CodeTag.java +++ b/src/main/java/net/thauvin/erik/httpstatus/taglibs/CodeTag.java @@ -1,7 +1,7 @@ /* * CodeTag.java * - * Copyright (c) 2015-2021, Erik C. Thauvin (erik@thauvin.net) + * Copyright 2023 sErik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,15 +32,16 @@ package net.thauvin.erik.httpstatus.taglibs; -import javax.servlet.jsp.JspWriter; -import javax.servlet.jsp.PageContext; -import javax.servlet.jsp.tagext.SimpleTagSupport; +import jakarta.servlet.jsp.JspWriter; +import jakarta.servlet.jsp.PageContext; +import jakarta.servlet.jsp.tagext.SimpleTagSupport; + import java.io.IOException; /** * The <hs:code> tag returns the HTTP Status Error Code. * - * @author Erik C. Thauvin + * @author Erik C. Thauvin * @created 2015-12-03 * @since 1.0 */ diff --git a/src/main/java/net/thauvin/erik/httpstatus/taglibs/MessageTag.java b/src/main/java/net/thauvin/erik/httpstatus/taglibs/MessageTag.java index f6211df..7a72750 100644 --- a/src/main/java/net/thauvin/erik/httpstatus/taglibs/MessageTag.java +++ b/src/main/java/net/thauvin/erik/httpstatus/taglibs/MessageTag.java @@ -1,7 +1,7 @@ /* - * CauseTag.java + * MessageTag.java * - * Copyright (c) 2015-2021, Erik C. Thauvin (erik@thauvin.net) + * Copyright 2023 sErik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,17 +32,17 @@ package net.thauvin.erik.httpstatus.taglibs; +import jakarta.servlet.jsp.JspWriter; +import jakarta.servlet.jsp.PageContext; import net.thauvin.erik.httpstatus.Utils; -import javax.servlet.jsp.JspWriter; -import javax.servlet.jsp.PageContext; import java.io.IOException; /** * The <hs:message> tag returns the message (if any) for the current error. * - * @author Erik C. Thauvin - * @created 2021-03-16 + * @author Erik C. Thauvin + * @created 2022-03-16 * @since 1.0.5 */ public class MessageTag extends XmlSupport { @@ -55,7 +55,7 @@ public class MessageTag extends XmlSupport { @SuppressWarnings("PMD.CloseResource") final JspWriter out = pageContext.getOut(); final String message = (String) pageContext.getRequest().getAttribute( - javax.servlet.RequestDispatcher.ERROR_MESSAGE); + jakarta.servlet.RequestDispatcher.ERROR_MESSAGE); Utils.outWrite(out, message, defaultValue, escapeXml); } diff --git a/src/main/java/net/thauvin/erik/httpstatus/taglibs/ReasonTag.java b/src/main/java/net/thauvin/erik/httpstatus/taglibs/ReasonTag.java index 684449f..dccf365 100644 --- a/src/main/java/net/thauvin/erik/httpstatus/taglibs/ReasonTag.java +++ b/src/main/java/net/thauvin/erik/httpstatus/taglibs/ReasonTag.java @@ -1,7 +1,7 @@ /* * ReasonTag.java * - * Copyright (c) 2015-2021, Erik C. Thauvin (erik@thauvin.net) + * Copyright 2023 sErik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,18 +32,18 @@ package net.thauvin.erik.httpstatus.taglibs; +import jakarta.servlet.jsp.JspWriter; +import jakarta.servlet.jsp.PageContext; import net.thauvin.erik.httpstatus.Reasons; import net.thauvin.erik.httpstatus.Utils; -import javax.servlet.jsp.JspWriter; -import javax.servlet.jsp.PageContext; import java.io.IOException; /** * The <hs:reason> tag returns the Reason Phrase for the current (or specified) HTTP Status Error * Code. * - * @author Erik C. Thauvin + * @author Erik C. Thauvin * @created 2015-12-02 * @since 1.0 */ @@ -65,7 +65,7 @@ public class ReasonTag extends XmlSupport { Utils.outWrite(out, Reasons.getReasonPhrase(pageContext.getErrorData().getStatusCode()), defaultValue, escapeXml); } - } catch (IOException ignore) { + } catch (IOException ignored) { // Ignore. } } @@ -79,6 +79,4 @@ public class ReasonTag extends XmlSupport { public void setCode(final int statusCode) { this.statusCode = statusCode; } - - } diff --git a/src/main/java/net/thauvin/erik/httpstatus/taglibs/XmlSupport.java b/src/main/java/net/thauvin/erik/httpstatus/taglibs/XmlSupport.java index 8ef8ddc..31b9abb 100644 --- a/src/main/java/net/thauvin/erik/httpstatus/taglibs/XmlSupport.java +++ b/src/main/java/net/thauvin/erik/httpstatus/taglibs/XmlSupport.java @@ -1,7 +1,7 @@ /* * XmlSupport.java * - * Copyright (c) 2015-2021, Erik C. Thauvin (erik@thauvin.net) + * Copyright 2023 sErik C. Thauvin (erik@thauvin.net) * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,12 +32,12 @@ package net.thauvin.erik.httpstatus.taglibs; -import javax.servlet.jsp.tagext.SimpleTagSupport; +import jakarta.servlet.jsp.tagext.SimpleTagSupport; /** * Adds support for the default and escapeXml tag attributes. * - * @author Erik C. Thauvin + * @author Erik C. Thauvin * @created 2015-12-03 * @since 1.0 */ diff --git a/src/main/resources/META-INF/httpstatus.tld b/src/main/resources/META-INF/httpstatus.tld index 2f3d7c1..d7ea066 100644 --- a/src/main/resources/META-INF/httpstatus.tld +++ b/src/main/resources/META-INF/httpstatus.tld @@ -2,7 +2,7 @@