diff --git a/README.md b/README.md index bacb8be..e3ec3ce 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,9 @@ -spring-integration-extensions +Spring Integration Extensions ============================= -The Spring Integration Extensions project will serve as the repository for extension components for Spring Integration \ No newline at end of file +The Spring Integration Extensions project serves as the repository for extension components for Spring Integration. + +## Available Components + +* SMB Support +* Print Support \ No newline at end of file diff --git a/spring-integration-print/README.md b/spring-integration-print/README.md new file mode 100644 index 0000000..fb02625 --- /dev/null +++ b/spring-integration-print/README.md @@ -0,0 +1,70 @@ +Spring Integration Print Adapter +================================================= + +Welcome to the Spring Integration Adapter Template. This template is meant as a starting point for new Spring Integration Adapters. This temaplate provides the following +stubbed out components: + +* Outbound Channel Adapter +* Outbound Gateway +* Inbound Channel Adapter + +# STS issues to be aware of + +* [STS-1790](https://issuetracker.springsource.com/browse/STS-1790) - Allow for more flexibility in defining top level packages in the Spring STS Template Wizard +* [STS-2680](https://issuetracker.springsource.com/browse/STS-2680) - New Template Wizard projects aren't categorized on first launch + +# FAQ + +## I need to add AOP Advices to my Adapters + +Use FactoryBeans that wrap your adapter. See JPA Adapter for example. + +## More to come... + +# Building + +If you encounter out of memory errors during the build, increase available heap and permgen for Gradle: + + GRADLE_OPTS='-XX:MaxPermSize=1024m -Xmx1024m' + +To build and install jars into your local Maven cache: + + ./gradlew install + +To build api Javadoc (results will be in `build/api`): + + ./gradlew api + +To build reference documentation (results will be in `build/reference`): + + ./gradlew reference + +To build complete distribution including `-dist`, `-docs`, and `-schema` zip files (results will be in `build/distributions`) + + ./gradlew dist + +# Using SpringSource Tool Suite + + Gradle projects can be directly imported into STS + +# Using PLain Eclipse + +To generate Eclipse metadata (.classpath and .project files), do the following: + + ./gradlew eclipse + +Once complete, you may then import the projects into Eclipse as usual: + + *File -> Import -> Existing projects into workspace* + +Browse to the *'spring-integration'* root directory. All projects should import +free of errors. + +# Using IntelliJ IDEA + +To generate IDEA metadata (.iml and .ipr files), do the following: + + ./gradlew idea + +For more information, please visit the Spring Integration website at: +[http://www.springsource.org/spring-integration](http://www.springsource.org/spring-integration) diff --git a/spring-integration-print/build.gradle b/spring-integration-print/build.gradle new file mode 100644 index 0000000..025c7ad --- /dev/null +++ b/spring-integration-print/build.gradle @@ -0,0 +1,307 @@ +description = 'Spring Integration Print Adapter' + +buildscript { + repositories { + maven { url 'https://repo.springsource.org/plugins-snapshot' } + } + dependencies { + classpath 'org.springframework.build.gradle:docbook-reference-plugin:0.1.5' + } +} + +apply plugin: 'java' +apply from: "${rootProject.projectDir}/publish-maven.gradle" +apply plugin: 'eclipse' +apply plugin: 'idea' + +group = 'org.springframework.integration.print' + +repositories { + maven { url 'http://repo.springsource.org/libs-milestone' } + maven { url 'http://repo.springsource.org/plugins-release' } // for bundlor +} + +// ensure JDK 5 compatibility (GRADLE-18; INT-1578) +sourceCompatibility=1.5 +targetCompatibility=1.5 + +ext { + aspectjVersion = '1.6.8' + cglibVersion = '2.2' + commonsNetVersion = '3.0.1' + easymockVersion = '2.3' + groovyVersion = '1.8.5' + jacksonVersion = '1.9.2' + javaxActivationVersion = '1.1.1' + junitVersion = '4.8.2' + log4jVersion = '1.2.12' + mockitoVersion = '1.9.0' + // When changing Spring Versions - don't forget to update bundlor ranges + springVersion = '3.1.1.RELEASE' + springIntegrationVersion = '2.1.2.RELEASE' + springAmqpVersion = '1.1.0.RELEASE' + springDataMongoVersion = '1.1.0.M1' + springDataRedisVersion = '1.0.0.RELEASE' + springGemfireVersion = '1.1.1.RELEASE' + springSecurityVersion = '3.1.0.RELEASE' + springSocialTwitterVersion = '1.0.1.RELEASE' + springWsVersion = '2.0.3.RELEASE' +} + +dependencies { + compile "org.springframework.integration:spring-integration-core:$springIntegrationVersion" + compile "org.springframework:spring-tx:$springVersion" + compile("org.codehaus.jackson:jackson-mapper-asl:$jacksonVersion", optional) + compile("org.springframework.amqp:spring-rabbit:$springAmqpVersion") { + exclude group: 'org.springframework', module: 'spring-aop' + exclude group: 'org.springframework', module: 'spring-beans' + exclude group: 'org.springframework', module: 'spring-context' + exclude group: 'org.springframework', module: 'spring-core' + exclude group: 'org.springframework', module: 'spring-oxm' + exclude group: 'org.springframework', module: 'spring-tx' + } + + testCompile "org.springframework.integration:spring-integration-test:$springIntegrationVersion" +} + + +eclipse { + project { + natures += 'org.springframework.ide.eclipse.core.springnature' + } +} + +sourceSets { + test { + resources { + srcDirs = ['src/test/resources', 'src/test/java'] + } + } +} + +// See http://www.gradle.org/docs/current/userguide/dependency_management.html#sub:configurations +// and http://www.gradle.org/docs/current/dsl/org.gradle.api.artifacts.ConfigurationContainer.html +configurations { + jacoco //Configuration Group used by Sonar to provide Code Coverage using JaCoCo +} + +// dependencies that are common across all java projects +dependencies { + testCompile "cglib:cglib-nodep:$cglibVersion" + testCompile "junit:junit-dep:$junitVersion" + testCompile "log4j:log4j:$log4jVersion" + testCompile "org.easymock:easymock:$easymockVersion" + testCompile "org.easymock:easymockclassextension:$easymockVersion" + testCompile "org.hamcrest:hamcrest-all:1.1" + testCompile "org.mockito:mockito-all:$mockitoVersion" + testCompile "org.springframework:spring-test:$springVersion" + jacoco group: "org.jacoco", name: "org.jacoco.agent", version: "0.5.6.201201232323", classifier: "runtime" +} + +// enable all compiler warnings; individual projects may customize further +ext.xLintArg = '-Xlint:all' +[compileJava, compileTestJava]*.options*.compilerArgs = [xLintArg] + +test { + // suppress all console output during testing unless running `gradle -i` + logging.captureStandardOutput(LogLevel.INFO) + jvmArgs "-javaagent:${configurations.jacoco.asPath}=destfile=${buildDir}/jacoco.exec,includes=*" +} + +task sourcesJar(type: Jar) { + classifier = 'sources' + from sourceSets.main.allJava +} + +task javadocJar(type: Jar) { + classifier = 'javadoc' + from javadoc +} + +artifacts { + archives sourcesJar + archives javadocJar +} + +apply plugin: 'docbook-reference' + +reference { + sourceDir = file('src/reference/docbook') +} + +apply plugin: 'sonar' + +sonar { + + if (rootProject.hasProperty('sonarHostUrl')) { + server.url = rootProject.sonarHostUrl + } + + database { + if (rootProject.hasProperty('sonarJdbcUrl')) { + url = rootProject.sonarJdbcUrl + } + if (rootProject.hasProperty('sonarJdbcDriver')) { + driverClassName = rootProject.sonarJdbcDriver + } + if (rootProject.hasProperty('sonarJdbcUsername')) { + username = rootProject.sonarJdbcUsername + } + if (rootProject.hasProperty('sonarJdbcPassword')) { + password = rootProject.sonarJdbcPassword + } + } + + project { + dynamicAnalysis = "reuseReports" + withProjectProperties { props -> + props["sonar.core.codeCoveragePlugin"] = "jacoco" + props["sonar.jacoco.reportPath"] = "${buildDir.name}/jacoco.exec" + } + } + + logger.info("Sonar parameters used: server.url='${server.url}'; database.url='${database.url}'; database.driverClassName='${database.driverClassName}'; database.username='${database.username}'") +} + +task api(type: Javadoc) { + group = 'Documentation' + description = 'Generates aggregated Javadoc API documentation.' + title = "${rootProject.description} ${version} API" + options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED + options.author = true + options.header = rootProject.description + options.overview = 'src/api/overview.html' + source subprojects.collect { project -> + project.sourceSets.main.allJava + } + destinationDir = new File(buildDir, "api") + classpath = files(subprojects.collect { project -> + project.sourceSets.main.compileClasspath + }) +} + +task schemaZip(type: Zip) { + group = 'Distribution' + classifier = 'schema' + description = "Builds -${classifier} archive containing all " + + "XSDs for deployment at static.springframework.org/schema." + + subprojects.each { subproject -> + def Properties schemas = new Properties(); + def shortName = subproject.name.replaceFirst("${rootProject.name}-", '') + if (subproject.name.endsWith("-core")) { + shortName = '' + } + + subproject.sourceSets.main.resources.find { + it.path.endsWith('META-INF/spring.schemas') + }?.withInputStream { schemas.load(it) } + + for (def key : schemas.keySet()) { + File xsdFile = subproject.sourceSets.main.resources.find { + it.path.endsWith(schemas.get(key)) + } + assert xsdFile != null + into ("integration/${shortName}") { + from xsdFile.path + } + } + } +} + +task docsZip(type: Zip) { + group = 'Distribution' + classifier = 'docs' + description = "Builds -${classifier} archive containing api and reference " + + "for deployment at static.springframework.org/spring-integration/docs." + + from('src/dist') { + include 'changelog.txt' + } + + from (api) { + into 'api' + } + + from (reference) { + into 'reference' + } +} + +task distZip(type: Zip, dependsOn: [docsZip, schemaZip]) { + group = 'Distribution' + classifier = 'dist' + description = "Builds -${classifier} archive, containing all jars and docs, " + + "suitable for community download page." + + ext.baseDir = "${project.name}-${project.version}"; + + from('src/dist') { + include 'readme.txt' + include 'license.txt' + include 'notice.txt' + into "${baseDir}" + } + + from(zipTree(docsZip.archivePath)) { + into "${baseDir}/docs" + } + + from(zipTree(schemaZip.archivePath)) { + into "${baseDir}/schema" + } + + subprojects.each { subproject -> + into ("${baseDir}/libs") { + from subproject.jar + from subproject.sourcesJar + from subproject.javadocJar + } + } +} + +// Create an optional "with dependencies" distribution. +// Not published by default; only for use when building from source. +task depsZip(type: Zip, dependsOn: distZip) { zipTask -> + group = 'Distribution' + classifier = 'dist-with-deps' + description = "Builds -${classifier} archive, containing everything " + + "in the -${distZip.classifier} archive plus all dependencies." + + from zipTree(distZip.archivePath) + + gradle.taskGraph.whenReady { taskGraph -> + if (taskGraph.hasTask(":${zipTask.name}")) { + def projectNames = rootProject.subprojects*.name + def artifacts = new HashSet() + subprojects.each { subproject -> + subproject.configurations.runtime.resolvedConfiguration.resolvedArtifacts.each { artifact -> + def dependency = artifact.moduleVersion.id + if (!projectNames.contains(dependency.name)) { + artifacts << artifact.file + } + } + } + + zipTask.from(artifacts) { + into "${distZip.baseDir}/deps" + } + } + } +} + +artifacts { + archives distZip + archives docsZip + archives schemaZip +} + +task dist(dependsOn: assemble) { + group = 'Distribution' + description = 'Builds -dist, -docs and -schema distribution archives.' +} + +task wrapper(type: Wrapper) { + description = 'Generates gradlew[.bat] scripts' + gradleVersion = '1.0-rc-3' +} diff --git a/spring-integration-print/gradle.properties b/spring-integration-print/gradle.properties new file mode 100644 index 0000000..bebfcbc --- /dev/null +++ b/spring-integration-print/gradle.properties @@ -0,0 +1 @@ +version=1.0.0.BUILD-SNAPSHOT diff --git a/spring-integration-print/gradle/wrapper/gradle-wrapper.jar b/spring-integration-print/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..81dcde6 Binary files /dev/null and b/spring-integration-print/gradle/wrapper/gradle-wrapper.jar differ diff --git a/spring-integration-print/gradle/wrapper/gradle-wrapper.properties b/spring-integration-print/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..c1f2517 --- /dev/null +++ b/spring-integration-print/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu Jun 07 23:46:26 EDT 2012 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=http\://services.gradle.org/distributions/gradle-1.0-rc-3-bin.zip diff --git a/spring-integration-print/gradlew b/spring-integration-print/gradlew new file mode 100644 index 0000000..cf12650 --- /dev/null +++ b/spring-integration-print/gradlew @@ -0,0 +1,164 @@ +#!/bin/bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# 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 +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# 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\"`/" +APP_HOME="`pwd -P`" +cd "$SAVED" + +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" ] ; 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 businessSystem 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, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # 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=$((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 + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/spring-integration-print/gradlew.bat b/spring-integration-print/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/spring-integration-print/gradlew.bat @@ -0,0 +1,90 @@ +@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 + +@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= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@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 init + +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 init + +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 + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +: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 %CMD_LINE_ARGS% + +: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/spring-integration-print/publish-maven.gradle b/spring-integration-print/publish-maven.gradle new file mode 100644 index 0000000..8cac475 --- /dev/null +++ b/spring-integration-print/publish-maven.gradle @@ -0,0 +1,61 @@ +apply plugin: 'maven' + +ext.optionalDeps = [] +ext.providedDeps = [] + +ext.optional = { optionalDeps << it } +ext.provided = { providedDeps << it } + +install { + repositories.mavenInstaller { + customizePom(pom, project) + } +} + +def customizePom(pom, gradleProject) { + pom.whenConfigured { generatedPom -> + // respect 'optional' and 'provided' dependencies + gradleProject.optionalDeps.each { dep -> + generatedPom.dependencies.find { it.artifactId == dep.name }?.optional = true + } + gradleProject.providedDeps.each { dep -> + generatedPom.dependencies.find { it.artifactId == dep.name }?.scope = 'provided' + } + + // eliminate test-scoped dependencies (no need in maven central poms) + generatedPom.dependencies.removeAll { dep -> + dep.scope == 'test' + } + + // add all items necessary for maven central publication + generatedPom.project { + name = gradleProject.description + description = gradleProject.description + url = 'https://github.com/SpringSource/spring-integration' + organization { + name = 'SpringSource' + url = 'http://springsource.org' + } + licenses { + license { + name 'The Apache Software License, Version 2.0' + url 'http://www.apache.org/licenses/LICENSE-2.0.txt' + distribution 'repo' + } + } + scm { + url = 'https://github.com/SpringSource/spring-integration' + connection = 'scm:git:git://github.com/SpringSource/spring-integration' + developerConnection = 'scm:git:git://github.com/SpringSource/spring-integration' + } + + developers { + developer { + id = 'not specified' + name = 'Gunnar Hillert' + email = 'not specified' + } + } + } + } +} diff --git a/spring-integration-print/src/api/overview.html b/spring-integration-print/src/api/overview.html new file mode 100644 index 0000000..fb0198b --- /dev/null +++ b/spring-integration-print/src/api/overview.html @@ -0,0 +1,22 @@ + + +This document is the API specification for Spring Integration +
+
+

+ For further API reference and developer documentation, see the + Spring + Integration reference documentation. + That documentation contains more detailed, developer-targeted + descriptions, with conceptual overviews, definitions of terms, + workarounds, and working code examples. +

+ +

+ If you are interested in commercial training, consultancy, and + support for Spring Integration, please visit + http://www.springsource.com +

+
+ + diff --git a/spring-integration-print/src/dist/changelog.txt b/spring-integration-print/src/dist/changelog.txt new file mode 100644 index 0000000..18f390b --- /dev/null +++ b/spring-integration-print/src/dist/changelog.txt @@ -0,0 +1,15 @@ +Spring Integration Print Adapter CHANGELOG +========================================= + +For the full detailed changelog, see: +https://.... + + +Changes in version 1.0 GA (insert date here) +https://.... + + +*** GENERAL *** + +Upgraded Spring Framework dependency to ... +... diff --git a/spring-integration-print/src/dist/license.txt b/spring-integration-print/src/dist/license.txt new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/spring-integration-print/src/dist/license.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/spring-integration-print/src/dist/notice.txt b/spring-integration-print/src/dist/notice.txt new file mode 100644 index 0000000..f62045a --- /dev/null +++ b/spring-integration-print/src/dist/notice.txt @@ -0,0 +1,21 @@ + ======================================================================== + == NOTICE file corresponding to section 4 d of the Apache License, == + == Version 2.0, in this case for the Spring Integration distribution. == + ======================================================================== + + This product includes software developed by + the Apache Software Foundation (http://www.apache.org). + + The end-user documentation included with a redistribution, if any, + must include the following acknowledgement: + + "This product includes software developed by the Spring Framework + Project (http://www.springframework.org)." + + Alternatively, this acknowledgement may appear in the software itself, + if and wherever such third-party acknowledgements normally appear. + + The names "Spring", "Spring Framework", and "Spring Integration" must + not be used to endorse or promote products derived from this software + without prior written permission. For written permission, please contact + enquiries@springsource.com. diff --git a/spring-integration-print/src/dist/readme.txt b/spring-integration-print/src/dist/readme.txt new file mode 100644 index 0000000..2936c9e --- /dev/null +++ b/spring-integration-print/src/dist/readme.txt @@ -0,0 +1,13 @@ +Spring Integration Print Adapter +----------------------------------- + +To find out what has changed since any earlier releases, see 'changelog.txt'. + +Please consult the documentation located within the 'docs/reference' directory +of this release and also visit the official Spring Integration home at +http://www.springsource.org/spring-integration + +There you will find links to the forum, issue tracker, and several other resources. + +See https://github.com/SpringSource/spring-integration#readme for additional +information including instructions on building from source. diff --git a/spring-integration-print/src/main/java/org/springframework/integration/print/PrintHeaders.java b/spring-integration-print/src/main/java/org/springframework/integration/print/PrintHeaders.java new file mode 100644 index 0000000..98ba0ca --- /dev/null +++ b/spring-integration-print/src/main/java/org/springframework/integration/print/PrintHeaders.java @@ -0,0 +1,36 @@ +/* + * Copyright 2002-2012 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.print; + +/** + * Print adapter specific message headers. + * + * @author Gunnar Hillert + * @since 1.0 + */ +public class PrintHeaders { + + private static final String PREFIX = "print_"; + + public static final String EXAMPLE = PREFIX + "example_"; + + /** Noninstantiable utility class */ + private PrintHeaders() { + throw new AssertionError(); + } + +} diff --git a/spring-integration-print/src/main/java/org/springframework/integration/print/config/xml/PrintNamespaceHandler.java b/spring-integration-print/src/main/java/org/springframework/integration/print/config/xml/PrintNamespaceHandler.java new file mode 100644 index 0000000..0e648a9 --- /dev/null +++ b/spring-integration-print/src/main/java/org/springframework/integration/print/config/xml/PrintNamespaceHandler.java @@ -0,0 +1,35 @@ +/* + * Copyright 2002-2012 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.integration.print.config.xml; + +import org.springframework.integration.config.xml.AbstractIntegrationNamespaceHandler; + +/** + * The namespace handler for the Print namespace + * + * @author Gunnar Hillert + * @since 1.0 + * + */ +public class PrintNamespaceHandler extends AbstractIntegrationNamespaceHandler { + + /* (non-Javadoc) + * @see org.springframework.beans.factory.xml.NamespaceHandler#init() + */ + public void init() { + this.registerBeanDefinitionParser("outbound-channel-adapter", new PrintOutboundChannelAdapterParser()); + } +} diff --git a/spring-integration-print/src/main/java/org/springframework/integration/print/config/xml/PrintOutboundChannelAdapterParser.java b/spring-integration-print/src/main/java/org/springframework/integration/print/config/xml/PrintOutboundChannelAdapterParser.java new file mode 100644 index 0000000..ad626f8 --- /dev/null +++ b/spring-integration-print/src/main/java/org/springframework/integration/print/config/xml/PrintOutboundChannelAdapterParser.java @@ -0,0 +1,77 @@ +/* + * Copyright 2002-2012 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.integration.print.config.xml; + +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.integration.config.xml.AbstractOutboundChannelAdapterParser; +import org.springframework.integration.config.xml.IntegrationNamespaceUtils; +import org.springframework.integration.print.outbound.PrintMessageHandler; +import org.springframework.integration.print.support.PrintSides; +import org.springframework.util.StringUtils; +import org.w3c.dom.Element; + + +/** + * The parser for the Print Outbound Channel Adapter. + * + * @author Gunnar Hillert + * @since 2.2 + * + */ +public class PrintOutboundChannelAdapterParser extends AbstractOutboundChannelAdapterParser { + + @Override + protected boolean shouldGenerateId() { + return false; + } + + @Override + protected boolean shouldGenerateIdAsFallback() { + return true; + } + + @Override + protected AbstractBeanDefinition parseConsumer(Element element, ParserContext parserContext) { + + final BeanDefinitionBuilder printOutboundChannelAdapterBuilder = BeanDefinitionBuilder.genericBeanDefinition(PrintMessageHandler.class); + + String docFlavor = element.getAttribute("doc-flavor"); + String mimeType = element.getAttribute("mime-type"); + + if ((StringUtils.hasText(docFlavor) && !StringUtils.hasText(mimeType)) + || (!StringUtils.hasText(docFlavor) && StringUtils.hasText(mimeType))) { + parserContext.getReaderContext().error("Both the 'doc-flavor' and the 'mime-type' attribute are required", element); + } + else if (StringUtils.hasText(docFlavor) && StringUtils.hasText(mimeType)) { + printOutboundChannelAdapterBuilder.addConstructorArgValue(mimeType); + printOutboundChannelAdapterBuilder.addConstructorArgValue(docFlavor); + } + + String sides = element.getAttribute("sides"); + + PrintSides printSides = PrintSides.fromString(sides); + + printOutboundChannelAdapterBuilder.addPropertyValue("sides", printSides.getSides()); + + IntegrationNamespaceUtils.setValueIfAttributeDefined(printOutboundChannelAdapterBuilder, element, "copies"); + + return printOutboundChannelAdapterBuilder.getBeanDefinition(); + + } + +} diff --git a/spring-integration-print/src/main/java/org/springframework/integration/print/config/xml/PrintParserUtils.java b/spring-integration-print/src/main/java/org/springframework/integration/print/config/xml/PrintParserUtils.java new file mode 100644 index 0000000..65f51e7 --- /dev/null +++ b/spring-integration-print/src/main/java/org/springframework/integration/print/config/xml/PrintParserUtils.java @@ -0,0 +1,62 @@ +/* + * Copyright 2002-2012 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.integration.print.config.xml; + +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.integration.print.core.PrintExecutor; +import org.springframework.util.Assert; +import org.w3c.dom.Element; + + +/** + * Contains various utility methods for parsing Print Adapter + * specific namesspace elements as well as for the generation of the the + * respective {@link BeanDefinition}s. + * + * @author Gunnar Hillert + * @since 1.0 + * + */ +public final class PrintParserUtils { + + /** Prevent instantiation. */ + private PrintParserUtils() { + throw new AssertionError(); + } + + /** + * Create a new {@link BeanDefinitionBuilder} for the class {@link PrintExecutor}. + * Initialize the wrapped {@link PrintExecutor} with common properties. + * + * @param element Must not be null + * @param parserContext Must not be null + * @return The BeanDefinitionBuilder for the PrintExecutor + */ + public static BeanDefinitionBuilder getPrintExecutorBuilder(final Element element, + final ParserContext parserContext) { + + Assert.notNull(element, "The provided element must not be null."); + Assert.notNull(parserContext, "The provided parserContext must not be null."); + + final BeanDefinitionBuilder printExecutorBuilder = BeanDefinitionBuilder.genericBeanDefinition(PrintExecutor.class); + + return printExecutorBuilder; + + } + +} diff --git a/spring-integration-print/src/main/java/org/springframework/integration/print/config/xml/package-info.java b/spring-integration-print/src/main/java/org/springframework/integration/print/config/xml/package-info.java new file mode 100644 index 0000000..f71a115 --- /dev/null +++ b/spring-integration-print/src/main/java/org/springframework/integration/print/config/xml/package-info.java @@ -0,0 +1,4 @@ +/** + * Provides parser classes to provide Xml namespace support for the Print components. + */ +package org.springframework.integration.print.config.xml; diff --git a/spring-integration-print/src/main/java/org/springframework/integration/print/core/PrintExecutor.java b/spring-integration-print/src/main/java/org/springframework/integration/print/core/PrintExecutor.java new file mode 100644 index 0000000..804c3ff --- /dev/null +++ b/spring-integration-print/src/main/java/org/springframework/integration/print/core/PrintExecutor.java @@ -0,0 +1,98 @@ +/* + * Copyright 2002-2012 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.integration.print.core; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.integration.Message; +import org.springframework.integration.support.MessageBuilder; +import org.springframework.util.Assert; + +/** + * Bundles common core logic for the Print components. + * + * @author Gunnar Hillert + * @since 1.0 + * + */ +public class PrintExecutor implements InitializingBean { + + private static final Log logger = LogFactory.getLog(PrintExecutor.class); + + private volatile String exampleProperty; + + /** + * Constructor. + */ + public PrintExecutor() {} + + /** + * Verifies and sets the parameters. E.g. initializes the to be used + */ + public void afterPropertiesSet() { + Assert.hasText(this.exampleProperty, "exampleProperty must not be empty."); + } + + /** + * Executes the outbound Print Operation. + * + */ + public Object executeOutboundOperation(final Message message) { + + if (logger.isWarnEnabled()) { + logger.warn("Logic not implemented, yet."); + } + + return message.getPayload(); + + } + + /** + * Execute the Print operation. Delegates to + * {@link PrintExecutor#poll(Message)}. + */ + public Object poll() { + return poll(null); + } + + /** + * Execute a retrieving (polling) Print operation. + * + * @param requestMessage May be null. + * @return The payload object, which may be null. + */ + public Object poll(final Message requestMessage) { + + if (logger.isWarnEnabled()) { + logger.warn("Logic not implemented, yet."); + } + + return MessageBuilder.fromMessage(requestMessage).build(); + } + + /** + * Example property to illustrate usage of properties in Spring Integration + * components. Replace with your own logic. + * + * @param exampleProperty Must not be null + */ + public void setExampleProperty(String exampleProperty) { + Assert.hasText(exampleProperty, "exampleProperty must be neither null nor empty"); + this.exampleProperty = exampleProperty; + } + +} diff --git a/spring-integration-print/src/main/java/org/springframework/integration/print/core/package-info.java b/spring-integration-print/src/main/java/org/springframework/integration/print/core/package-info.java new file mode 100644 index 0000000..bf8bf0c --- /dev/null +++ b/spring-integration-print/src/main/java/org/springframework/integration/print/core/package-info.java @@ -0,0 +1,4 @@ +/** + * Provides core classes of the Print module. + */ +package org.springframework.integration.print.core; diff --git a/spring-integration-print/src/main/java/org/springframework/integration/print/outbound/PrintMessageHandler.java b/spring-integration-print/src/main/java/org/springframework/integration/print/outbound/PrintMessageHandler.java new file mode 100644 index 0000000..645f949 --- /dev/null +++ b/spring-integration-print/src/main/java/org/springframework/integration/print/outbound/PrintMessageHandler.java @@ -0,0 +1,97 @@ +/* + * Copyright 2002-2012 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.integration.print.outbound; + +import javax.print.Doc; +import javax.print.DocFlavor; +import javax.print.DocPrintJob; +import javax.print.PrintService; +import javax.print.PrintServiceLookup; +import javax.print.SimpleDoc; +import javax.print.attribute.HashPrintRequestAttributeSet; +import javax.print.attribute.PrintRequestAttributeSet; +import javax.print.attribute.standard.Copies; +import javax.print.attribute.standard.Sides; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.integration.Message; +import org.springframework.integration.handler.AbstractMessageHandler; +import org.springframework.util.Assert; + +/** + * Simple adapter to support printing of payloads. + * + * @author Gunnar Hillert + * @since 2.2 + */ +public class PrintMessageHandler extends AbstractMessageHandler { + + private static final Log LOG = LogFactory.getLog(PrintMessageHandler.class); + + private volatile Sides sides = Sides.ONE_SIDED; + private volatile Copies copies = new Copies(1); + + private final DocFlavor docFlavor; + + public PrintMessageHandler(String mimeType, String className) { + + Assert.hasText(className, "'className' must be neither null nor empty."); + Assert.hasText(mimeType, "'mimeType' must be neither null nor empty."); + + this.docFlavor = new DocFlavor(mimeType, className); + + } + + public PrintMessageHandler() { + this.docFlavor = DocFlavor.BYTE_ARRAY.AUTOSENSE; + } + + @Override + protected void handleMessageInternal(Message message) throws Exception { + + final PrintService printService = PrintServiceLookup.lookupDefaultPrintService(); + + Assert.notNull(printService, "Did not find a 'printService'."); + + if (LOG.isInfoEnabled()) { + LOG.info("Printing to default printer: " + printService.getName()); + } + + final Doc doc = new SimpleDoc(((String) message.getPayload()).getBytes(), docFlavor, null); + + final PrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet(); + + attributes.add(copies); + attributes.add(sides); + + final DocPrintJob job = printService.createPrintJob(); + job.print(doc, attributes); + + } + + public void setSides(Sides sides) { + Assert.notNull(sides, "'sides' must not be null"); + this.sides = sides; + } + + public void setCopies(int numberOfCopies) { + Assert.isTrue(numberOfCopies > 0, "'copies' must be greater than 0"); + this.copies = new Copies(numberOfCopies); + } + +} diff --git a/spring-integration-print/src/main/java/org/springframework/integration/print/outbound/package-info.java b/spring-integration-print/src/main/java/org/springframework/integration/print/outbound/package-info.java new file mode 100644 index 0000000..db8a1a2 --- /dev/null +++ b/spring-integration-print/src/main/java/org/springframework/integration/print/outbound/package-info.java @@ -0,0 +1,4 @@ +/** + * Provides Spring Integration components for doing outbound operations. + */ +package org.springframework.integration.print.outbound; diff --git a/spring-integration-print/src/main/java/org/springframework/integration/print/package-info.java b/spring-integration-print/src/main/java/org/springframework/integration/print/package-info.java new file mode 100644 index 0000000..6213701 --- /dev/null +++ b/spring-integration-print/src/main/java/org/springframework/integration/print/package-info.java @@ -0,0 +1,4 @@ +/** + * Root package of the Print Module. + */ +package org.springframework.integration.print; diff --git a/spring-integration-print/src/main/java/org/springframework/integration/print/support/PrintSides.java b/spring-integration-print/src/main/java/org/springframework/integration/print/support/PrintSides.java new file mode 100644 index 0000000..6225af7 --- /dev/null +++ b/spring-integration-print/src/main/java/org/springframework/integration/print/support/PrintSides.java @@ -0,0 +1,40 @@ +package org.springframework.integration.print.support; + +import javax.print.attribute.standard.Sides; + +import org.springframework.util.Assert; + +public enum PrintSides { + + DUPLEX("DUPLEX", Sides.DUPLEX), + ONE_SIDED("ONE_SIDED", Sides.ONE_SIDED), + TUMBLE("TUMBLE", Sides.TUMBLE), + TWO_SIDED_LONG_EDGE("TWO_SIDED_LONG_EDGE", Sides.TWO_SIDED_LONG_EDGE), + TWO_SIDED_SHORT_EDGE("TWO_SIDED_SHORT_EDGE", Sides.TWO_SIDED_SHORT_EDGE); + + private String id; + private Sides sides; + + PrintSides(String id, Sides sides) { + this.id = id; + this.sides = sides; + } + + public Sides getSides() { + return sides; + } + + public static PrintSides fromString(String id) { + + Assert.hasText(id, "'Enumeration id must not be null nor empty'"); + + for (PrintSides printSide : PrintSides.class.getEnumConstants()) { + if (printSide.id.equalsIgnoreCase(id)) { + return printSide; + } + } + + throw new IllegalArgumentException(String.format("No enumeration found for id '%s'", id)); + } + +} diff --git a/spring-integration-print/src/main/java/org/springframework/integration/print/support/PrintUtils.java b/spring-integration-print/src/main/java/org/springframework/integration/print/support/PrintUtils.java new file mode 100644 index 0000000..ce3f5b3 --- /dev/null +++ b/spring-integration-print/src/main/java/org/springframework/integration/print/support/PrintUtils.java @@ -0,0 +1,33 @@ +/* + * Copyright 2002-2012 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.integration.print.support; + + +/** + * Contains utility methods used by the Print components. + * + * @author Gunnar Hillert + * @since 1.0 + * + */ +public final class PrintUtils { + + /** Prevent instantiation. */ + private PrintUtils() { + throw new AssertionError(); + } + +} diff --git a/spring-integration-print/src/main/java/org/springframework/integration/print/support/package-info.java b/spring-integration-print/src/main/java/org/springframework/integration/print/support/package-info.java new file mode 100644 index 0000000..52518ee --- /dev/null +++ b/spring-integration-print/src/main/java/org/springframework/integration/print/support/package-info.java @@ -0,0 +1,4 @@ +/** + * Provides various support classes used across Spring Integration Print Components. + */ +package org.springframework.integration.print.support; diff --git a/spring-integration-print/src/main/resources/META-INF/spring.handlers b/spring-integration-print/src/main/resources/META-INF/spring.handlers new file mode 100644 index 0000000..9c2596d --- /dev/null +++ b/spring-integration-print/src/main/resources/META-INF/spring.handlers @@ -0,0 +1 @@ +http\://www.springframework.org/schema/integration/print=org.springframework.integration.print.config.xml.PrintNamespaceHandler diff --git a/spring-integration-print/src/main/resources/META-INF/spring.schemas b/spring-integration-print/src/main/resources/META-INF/spring.schemas new file mode 100644 index 0000000..53fe55e --- /dev/null +++ b/spring-integration-print/src/main/resources/META-INF/spring.schemas @@ -0,0 +1,2 @@ +http\://www.springframework.org/schema/integration/print/spring-integration-print-2.2.xsd=org/springframework/integration/print/config/xml/spring-integration-print-2.2.xsd +http\://www.springframework.org/schema/integration/print/spring-integration-print.xsd=org/springframework/integration/print/config/xml/spring-integration-print-2.2.xsd diff --git a/spring-integration-print/src/main/resources/META-INF/spring.tooling b/spring-integration-print/src/main/resources/META-INF/spring.tooling new file mode 100644 index 0000000..c0510f8 --- /dev/null +++ b/spring-integration-print/src/main/resources/META-INF/spring.tooling @@ -0,0 +1,4 @@ +# Tooling related information for the integration Print namespace +http\://www.springframework.org/schema/integration/print@name=integration Print Namespace +http\://www.springframework.org/schema/integration/print@prefix=int-print +http\://www.springframework.org/schema/integration/print@icon=org/springframework/integration/print/config/xml/spring-integration-print.gif diff --git a/spring-integration-print/src/main/resources/org/springframework/integration/print/config/xml/spring-integration-print-2.2.xsd b/spring-integration-print/src/main/resources/org/springframework/integration/print/config/xml/spring-integration-print-2.2.xsd new file mode 100644 index 0000000..429d838 --- /dev/null +++ b/spring-integration-print/src/main/resources/org/springframework/integration/print/config/xml/spring-integration-print-2.2.xsd @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + Defines a Print Outbound Channel Adapter, allowing you + to send payloadds to a connected printer using the Java + Print Service API. + + + + + + + + + + + + Channel from which messages will be printed. + When a message is sent to this channel it will + cause the payload to be printed. + + + + + + + + + + + Specifies the order for invocation when this endpoint is connected as a + subscriber to a SubscribableChannel. + + + + + + + + + + + Identifies the underlying Spring bean definition, which is an + instance of either 'EventDrivenConsumer' or 'PollingConsumer', + depending on whether the component's input channel is a + 'SubscribableChannel' or 'PollableChannel'. + + + + + + + Flag to indicate that the component should start automatically + on startup (default true). + + + + + + + + + + The number of copies to print. Defaults to 1 if not set. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-integration-print/src/main/resources/org/springframework/integration/print/config/xml/spring-integration-print.gif b/spring-integration-print/src/main/resources/org/springframework/integration/print/config/xml/spring-integration-print.gif new file mode 100644 index 0000000..41b369f Binary files /dev/null and b/spring-integration-print/src/main/resources/org/springframework/integration/print/config/xml/spring-integration-print.gif differ diff --git a/spring-integration-print/src/reference/docbook/SIAdapterLowerPrefix.xml b/spring-integration-print/src/reference/docbook/SIAdapterLowerPrefix.xml new file mode 100644 index 0000000..68c1390 --- /dev/null +++ b/spring-integration-print/src/reference/docbook/SIAdapterLowerPrefix.xml @@ -0,0 +1,73 @@ + + + Print Adapter + + The Spring Integration Print Adapter provides... + + + + Outbound Channel adapter + + + Outbound Gateway + + + Inbound Channel Adapter + + + +
+ Java Implementation + Each of the provided components will use the + org.springframework.integration.print.core.PrintExecutor + class... + +
+
+ Common Configuration Attributes + + Certain configuration parameters are shared amongst all Print + components and are described below: + + + auto-startup + + Lifecycle attribute signaling if this component should + be started during Application Context startup. + Defaults to true. + Optional. + + + id + + Identifies the underlying Spring bean definition, which + is an instance of either EventDrivenConsumer + or PollingConsumer. + Optional. + + +
+ +
+ Outbound Channel Adapter + + The Print Outbound channel adapter allows you to... + +
+
+ Outbound Gateway + + Outbound gateways are similar to outbound channel adapters except that it can also be used to + get a result on the reply channel after performing + the given... + +
+
+ Inbound Channel Adapter + + An inbound channel adapter is used to execute... + +
+ +
diff --git a/spring-integration-print/src/reference/docbook/history.xml b/spring-integration-print/src/reference/docbook/history.xml new file mode 100644 index 0000000..549be21 --- /dev/null +++ b/spring-integration-print/src/reference/docbook/history.xml @@ -0,0 +1,8 @@ + + + Change History + + + diff --git a/spring-integration-print/src/reference/docbook/images/logo.png b/spring-integration-print/src/reference/docbook/images/logo.png new file mode 100644 index 0000000..e1c2a0e Binary files /dev/null and b/spring-integration-print/src/reference/docbook/images/logo.png differ diff --git a/spring-integration-print/src/reference/docbook/index.xml b/spring-integration-print/src/reference/docbook/index.xml new file mode 100644 index 0000000..c1ac2a5 --- /dev/null +++ b/spring-integration-print/src/reference/docbook/index.xml @@ -0,0 +1,68 @@ + + + + Spring Integration Print Adapter + Print Adapter ${version} + Spring Integration + ${version} + + + + + + + + + + + + + + Gunnar Hillert + + + © SpringSource Inc., 2012 + + + + + + + What's new? + + + For those who are already familiar with Spring Integration, this + chapter + provides a brief overview of the new features of version 2.2. If you are + interested in the changes and features, that were introduced in + earlier + versions, please take a look at chapter: + + + + + + + + + + Integration Adapters + + This section covers the various Channel Adapters and Messaging + Gateways provided + by Spring Integration to support Message-based communication with + external systems. + + + + + + Appendices + + Advanced Topics and Additional Resources + + + + diff --git a/spring-integration-print/src/reference/docbook/resources.xml b/spring-integration-print/src/reference/docbook/resources.xml new file mode 100644 index 0000000..109faa9 --- /dev/null +++ b/spring-integration-print/src/reference/docbook/resources.xml @@ -0,0 +1,17 @@ + + + Additional Resources + +
+ Spring Integration Home + + The definitive source of information about Spring Integration is the + Spring Integration Home at + http://www.springsource.org. That site serves as a hub of + information and is the best place to find up-to-date announcements about the project as well as links to + articles, blogs, and new sample applications. + +
+ +
diff --git a/spring-integration-print/src/reference/docbook/whats-new.xml b/spring-integration-print/src/reference/docbook/whats-new.xml new file mode 100644 index 0000000..6910c61 --- /dev/null +++ b/spring-integration-print/src/reference/docbook/whats-new.xml @@ -0,0 +1,11 @@ + + + What's new? + + This chapter provides an overview of the new features and improvements + that have been added to the Print Adapter: + + + diff --git a/spring-integration-print/src/test/java/org/springframework/integration/print/PrintTests.java b/spring-integration-print/src/test/java/org/springframework/integration/print/PrintTests.java new file mode 100644 index 0000000..29468ab --- /dev/null +++ b/spring-integration-print/src/test/java/org/springframework/integration/print/PrintTests.java @@ -0,0 +1,38 @@ +package org.springframework.integration.print; + +import java.io.FileNotFoundException; +import java.io.InputStream; + +import javax.print.Doc; +import javax.print.DocFlavor; +import javax.print.DocPrintJob; +import javax.print.PrintException; +import javax.print.PrintService; +import javax.print.PrintServiceLookup; +import javax.print.SimpleDoc; +import javax.print.attribute.HashPrintRequestAttributeSet; +import javax.print.attribute.PrintRequestAttributeSet; +import javax.print.attribute.standard.Copies; +import javax.print.attribute.standard.Sides; + +public class PrintTests { + + public static void main(String args[]) throws FileNotFoundException, PrintException { + InputStream textStream = PrintTests.class.getResourceAsStream("/print.txt"); + DocFlavor myFormat = DocFlavor.INPUT_STREAM.AUTOSENSE; + Doc myDoc = new SimpleDoc(textStream, myFormat, null); + + PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); + + aset.add(new Copies(1)); + aset.add(Sides.ONE_SIDED); + + PrintService printService = PrintServiceLookup.lookupDefaultPrintService(); + + System.out.println("Printing to default printer: " + printService.getName()); + + DocPrintJob job = printService.createPrintJob(); + job.print(myDoc, aset); + } + +} diff --git a/spring-integration-print/src/test/java/org/springframework/integration/print/config/xml/PrintMessageHandlerParserTests-context.xml b/spring-integration-print/src/test/java/org/springframework/integration/print/config/xml/PrintMessageHandlerParserTests-context.xml new file mode 100644 index 0000000..cee6bc4 --- /dev/null +++ b/spring-integration-print/src/test/java/org/springframework/integration/print/config/xml/PrintMessageHandlerParserTests-context.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/spring-integration-print/src/test/java/org/springframework/integration/print/config/xml/PrintMessageHandlerParserTests.java b/spring-integration-print/src/test/java/org/springframework/integration/print/config/xml/PrintMessageHandlerParserTests.java new file mode 100644 index 0000000..e1cb98c --- /dev/null +++ b/spring-integration-print/src/test/java/org/springframework/integration/print/config/xml/PrintMessageHandlerParserTests.java @@ -0,0 +1,66 @@ +/* + * Copyright 2002-2012 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 + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ +package org.springframework.integration.print.config.xml; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import javax.print.DocFlavor; +import javax.print.attribute.standard.Copies; +import javax.print.attribute.standard.Sides; + +import org.junit.After; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.springframework.integration.channel.AbstractMessageChannel; +import org.springframework.integration.core.MessageHandler; +import org.springframework.integration.endpoint.EventDrivenConsumer; +import org.springframework.integration.print.core.PrintExecutor; +import org.springframework.integration.test.util.TestUtils; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + + +/** + * + * @author Gunnar Hillert + * @since 1.0 + * + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +public class PrintMessageHandlerParserTests { + + @Autowired + private MessageHandler messageHandler; + + @Test + public void testJpaMessageHandlerParser() throws Exception { + + + final DocFlavor docFlavor = TestUtils.getPropertyValue(messageHandler, "docFlavor", DocFlavor.class); + assertEquals(DocFlavor.STRING.TEXT_PLAIN, docFlavor); + + final Copies copies = TestUtils.getPropertyValue(messageHandler, "copies", Copies.class); + assertEquals(14, copies.getValue()); + + final Sides sides = TestUtils.getPropertyValue(messageHandler, "sides", Sides.class); + assertEquals(Sides.DUPLEX, sides); + + + } + +} diff --git a/spring-integration-print/src/test/java/org/springframework/integration/print/outbound/PrintMessageHandlerTest.java b/spring-integration-print/src/test/java/org/springframework/integration/print/outbound/PrintMessageHandlerTest.java new file mode 100644 index 0000000..7a08a77 --- /dev/null +++ b/spring-integration-print/src/test/java/org/springframework/integration/print/outbound/PrintMessageHandlerTest.java @@ -0,0 +1,17 @@ +package org.springframework.integration.print.outbound; + +import org.junit.Ignore; +import org.junit.Test; +import org.springframework.integration.support.MessageBuilder; + +public class PrintMessageHandlerTest { + + //@Test + //@Ignore + public void test() { + PrintMessageHandler handler = new PrintMessageHandler(); + + handler.handleMessage(MessageBuilder.withPayload("This is a test".getBytes()).build()); + } + +} diff --git a/spring-integration-print/src/test/java/org/springframework/integration/print/outbound/PrintOutboundChannelAdapterTest-context.xml b/spring-integration-print/src/test/java/org/springframework/integration/print/outbound/PrintOutboundChannelAdapterTest-context.xml new file mode 100644 index 0000000..612070e --- /dev/null +++ b/spring-integration-print/src/test/java/org/springframework/integration/print/outbound/PrintOutboundChannelAdapterTest-context.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/spring-integration-print/src/test/java/org/springframework/integration/print/outbound/PrintOutboundChannelAdapterTest.java b/spring-integration-print/src/test/java/org/springframework/integration/print/outbound/PrintOutboundChannelAdapterTest.java new file mode 100644 index 0000000..9a23ed5 --- /dev/null +++ b/spring-integration-print/src/test/java/org/springframework/integration/print/outbound/PrintOutboundChannelAdapterTest.java @@ -0,0 +1,27 @@ +package org.springframework.integration.print.outbound; + +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.integration.Message; +import org.springframework.integration.channel.DirectChannel; +import org.springframework.integration.support.MessageBuilder; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +public class PrintOutboundChannelAdapterTest { + + @Autowired + private DirectChannel channel; + + @Test + //@Ignore + public void test() { + final Message message = MessageBuilder.withPayload("This is a test.").build(); + channel.send(message); + } + +} diff --git a/spring-integration-print/src/test/resources/log4j.properties b/spring-integration-print/src/test/resources/log4j.properties new file mode 100644 index 0000000..5513e80 --- /dev/null +++ b/spring-integration-print/src/test/resources/log4j.properties @@ -0,0 +1,8 @@ +log4j.rootCategory=WARN, stdout + +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - <%m>%n + +log4j.category.org.springframework.integration=WARN +log4j.category.org.springframework.integration.print=INFO diff --git a/spring-integration-print/src/test/resources/print.txt b/spring-integration-print/src/test/resources/print.txt new file mode 100644 index 0000000..33eba42 --- /dev/null +++ b/spring-integration-print/src/test/resources/print.txt @@ -0,0 +1 @@ +Testing Print Capabilities \ No newline at end of file